커널 기능을 GKI 모듈로 구성

이 페이지에서는 새 커널 기능을 GKI 모듈로 구성하거나 기존 내장 커널 기능을 GKI 모듈로 구성하는 방법을 설명합니다.

새 기능을 GKI 모듈로 구성

  1. 새 기능의 경우 gki_defconfig를 수정하고 필요한 커널 기능의 구성 항목을 n에서 m(=m)으로 설정합니다. 이 설정을 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 모두에 설정합니다.

  2. 기능을 위해 생성된 KO(.ko) 파일을 common/modules.bzlCOMMON_GKI_MODULES_LIST 섹션에 추가합니다. 파일을 정렬된 순서로 추가합니다. 생성된 모든 파일에 대한 확신이 없는 경우 빌드에 실패하고 목록에 추가할 필수 KO 파일이 모두 나열됩니다.

  3. 런타임 시 바이너리 검색을 위해 오름차순으로 정렬된 2단계의 동일한 KO 파일 집합을 common/android/gki_{ARCH}_protected_modules에 추가하여 모듈을 보호된 GKI 모듈로 지정합니다. tools/bazel run //common:kernel_aarch64_abi_update_protected_exportsaarch64에 사용하여 common/android/abi_gki_protected_exports_{ARCH}에 새로 추가된 모듈 내보내기를 포함하도록 보호되는 내보내기 목록을 업데이트하세요. 보호된 GKI 모듈로 지정된 모듈은 Google의 승인을 받아야 공식 보호 모듈이 될 수 있습니다.

  4. 2단계에서 새로 추가된 KO 파일이 커널의 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz에 복사되었는지 확인하세요. system_dlkm_staging_archive.tar.gz 보관 파일에 있는 모듈을 플랫폼 빌드에서 system_dlkm.img를 생성하는 입력으로 사용할 수 있습니다.

  5. 검토를 위해 변경사항을 제출합니다. GKI 모듈은 Android 전용 커널 기능이므로 모듈 변환 패치는 업스트림으로 제출하지 않아도 됩니다. 하지만 다른 가이드라인에 따라 Android 일반 커널(ACK) 패치를 제출해야 합니다.

커널 내장 기능을 GKI 모듈로 구성

  1. 기존 내장 커널 기능의 경우 gki_defconfig를 수정하고 필요한 커널 기능의 구성 항목을 y에서 m(=m)으로 설정합니다. 이 설정을 arch/arm64/configs/gki_defconfigarch/x86/configs/gki_defconfig 모두에 설정합니다.

  2. 기능을 위해 생성된 KO(.ko) 파일을 common/modules.bzlCOMMON_GKI_MODULES_LIST 섹션에 추가합니다. 파일을 정렬된 순서로 추가합니다. 생성된 모든 파일에 대한 확신이 없는 경우 빌드에 실패하고 목록에 추가할 필수 KO 파일이 모두 나열됩니다.

  3. 런타임 시 바이너리 검색을 위해 오름차순으로 정렬된 2단계의 동일한 KO 파일 집합을 common/android/gki_{ARCH}_protected_modules에 추가하여 모듈을 보호된 GKI 모듈로 지정합니다. tools/bazel run //common:kernel_aarch64_abi_update_protected_exportsaarch64에 사용하여 common/android/abi_gki_protected_exports_{ARCH}에 새로 추가된 모듈 내보내기를 포함하도록 보호되는 내보내기 목록을 업데이트하세요. 보호된 GKI 모듈로 지정된 모듈은 Google의 승인을 받아야 공식 보호 모듈이 될 수 있습니다.

  4. 2단계에서 새로 추가된 KO 파일이 커널의 out/<androidX-Y.Z>/dist/system_dlkm.imgout/androidX-Y.Z/dist/system_dlkm_staging_archive.tar.gz에 복사되었는지 확인하세요. system_dlkm_staging_archive.tar.gz 보관 파일에 있는 모듈을 플랫폼 빌드에서 system_dlkm.img를 생성하는 입력으로 사용할 수 있습니다.

  5. 검토를 위해 변경사항을 제출합니다. GKI 모듈은 Android 전용 커널 기능이므로 모듈 변환 패치는 업스트림으로 제출하지 않아도 됩니다. 하지만 다른 가이드라인에 따라 Android 일반 커널(ACK) 패치를 제출해야 합니다.

보호되는 GKI 모듈을 비보호 모듈로 변환

  1. common/android/gki_protected_modules 사용 시 보호되는 모듈 목록 내 보호 상태에서 비보호 상태로 변환되는 모듈을 삭제합니다.

  2. tools/bazel run //common:kernel_aarch64_abi_update_protected_exportsaarch64에 사용하여 common/android/abi_gki_protected_exports_{ARCH}에 새로 변환된 비보호 모듈을 제외하도록 보호되는 내보내기 목록을 업데이트하세요.

  3. 검토를 위해 변경사항을 제출합니다. GKI 모듈은 Android 전용 커널 기능이므로 모듈 변환 패치는 업스트림으로 제출하지 않아도 됩니다. 하지만 다른 가이드라인에 따라 Android 일반 커널(ACK) 패치를 제출해야 합니다.

GKI 모듈 기호 위반 해결 방법에 관한 빠른 가이드

서명되지 않은 모듈이 GKI 모듈에 적용되는 기호 보호를 위반하면 모듈을 로드하는 중에 두 가지 유형의 오류가 발생하여 실패할 수 있습니다.

1. 보호된 기호를 사용하는 서명되지 않은 모듈

오류:

module: Protected symbol: some_kernel_function (err -13)

원인:

module.ko 파일은 서명되지 않은 공급업체 모듈이며 공급업체 기호 목록에 나열되지 않은 채로 로드 중에 GKI 모듈이 내보낸 기호 some_kernel_function을 확인하려고 시도합니다.

해결 방법:

module.ko가 보호되는 GKI 모듈이 아닌 경우 기호 목록을 업데이트하면 공급업체 기호 목록에 some_kernel_function이 포함되어 오류가 해결됩니다. 또는 module.ko의 GKI 버전을 사용하세요.

2. 보호되지 않은 기호를 내보내는 서명되지 않은 모듈

오류:

module: exports protected symbol some_kernel_function

원인:

some_kernel_function을 내보내는 모듈은 보호되는 GKI 모듈이며 module.ko는 이 모듈의 서명되지 않은 맞춤 버전일 가능성이 높습니다. module.ko가 서명된 GKI 모듈만 내보낼 수 있는 some_kernel_function을 내보내려고 하면 이 메시지가 표시되며 로드에 실패합니다.

해결 방법:

서명되지 않은 모듈이 맞춤 버전인 경우 some_kernel_function을 내보내는 모듈의 GKI 버전을 사용하여 수정할 수 있습니다.