Configurar funciones del núcleo como módulos GKI

Esta página cubre cómo configurar una nueva característica del kernel como un módulo GKI o configurar una característica del kernel integrada existente como un módulo GKI.

Configurar una nueva función como módulo GKI

  1. Para la nueva característica, edite gki_defconfig y configure el elemento de configuración de la característica del kernel requerida de n a m ( =m ). Establezca esta configuración tanto en arch/arm64/configs/gki_defconfig como arch/x86/configs/gki_defconfig .

  2. Agregue los archivos KO ( .ko ) generados para la función a la sección COMMON_GKI_MODULES_LIST de common/modules.bzl . Agregue los archivos en orden ordenado. Si no está seguro de todos los archivos generados, la compilación falla y enumera todos los archivos KO necesarios para agregarlos a la lista.

  3. Agregue el mismo conjunto de archivos KO del paso 2, ordenados en orden ascendente para la búsqueda binaria en tiempo de ejecución, a common/android/gki_{ARCH}_protected_modules para designar el módulo como módulo GKI protegido. Actualice la lista de exportaciones protegidas para incluir las del módulo recién agregado en common/android/abi_gki_protected_exports_{ARCH} usando tools/bazel run //common:kernel_aarch64_abi_update_protected_exports para aarch64 . Los módulos designados como módulos GKI protegidos aún deben ser aprobados por Google para ser módulos protegidos oficiales.

  4. Asegúrese de que los archivos KO recién agregados del paso 2 se copien en el kernel out/<androidX-YZ>/dist/system_dlkm.img y out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz . Los módulos en el archivo system_dlkm_staging_archive.tar.gz se pueden usar como entrada para generar system_dlkm.img en la compilación de la plataforma.

  5. Envíe sus cambios para su revisión. Los módulos GKI son una característica del kernel exclusiva de Android, por lo que no es necesario enviar parches de conversión de módulos en sentido ascendente. Sin embargo, debe seguir otras pautas para enviar parches de Android Common Kernel (ACK) .

Configurar una función incorporada del kernel como módulo GKI

  1. Para una característica incorporada del kernel existente, edite gki_defconfig y configure el elemento de configuración de la característica del kernel requerida de y a m ( =m ). Establezca esta configuración tanto en arch/arm64/configs/gki_defconfig como arch/x86/configs/gki_defconfig .

  2. Agregue los archivos KO ( .ko ) generados para la función a la sección COMMON_GKI_MODULES_LIST de common/modules.bzl . Agregue los archivos en orden ordenado. Si no está seguro de todos los archivos generados, la compilación falla y enumera todos los archivos KO necesarios para agregarlos a la lista.

  3. Agregue el mismo conjunto de archivos KO del paso 2, ordenados en orden ascendente para la búsqueda binaria en tiempo de ejecución, a common/android/gki_{ARCH}_protected_modules para designar el módulo como módulo GKI protegido. Actualice la lista de exportaciones protegidas para incluir las del módulo recién agregado en common/android/abi_gki_protected_exports_{ARCH} usando tools/bazel run //common:kernel_aarch64_abi_update_protected_exports para aarch64 . Los módulos designados como módulos GKI protegidos aún deben ser aprobados por Google para ser módulos protegidos oficiales.

  4. Asegúrese de que los archivos KO del módulo recién convertidos del paso 2 se copien en el kernel out/<androidX-YZ>/dist/system_dlkm.img y out/ androidX-YZ /dist/system_dlkm_staging_archive.tar.gz . Los módulos en el archivo system_dlkm_staging_archive.tar.gz se pueden usar como entrada para generar system_dlkm.img en la compilación de la plataforma.

  5. Envíe sus cambios para su revisión. Los módulos GKI son una característica del kernel exclusiva de Android, por lo que no es necesario enviar parches de conversión de módulos en sentido ascendente. Sin embargo, debe seguir las otras pautas para enviar parches de Android Common Kernel (ACK) .

Convertir un módulo GKI protegido a desprotegido

  1. Elimine el módulo que se está convirtiendo de protegido a desprotegido de la lista de módulos protegidos en common/android/gki_protected_modules .

  2. Actualice la lista de exportaciones protegidas para excluir las del módulo desprotegido recién convertido en common/android/abi_gki_protected_exports_{ARCH} usando tools/bazel run //common:kernel_aarch64_abi_update_protected_exports para aarch64 .

  3. Envíe sus cambios para su revisión. Los módulos GKI son una característica del kernel exclusiva de Android, por lo que no es necesario enviar parches de conversión de módulos en sentido ascendente. Sin embargo, debe seguir las otras pautas para enviar parches de Android Common Kernel (ACK) .

Guía rápida para la resolución de violaciones de símbolos de módulos GKI

Cuando los módulos sin firmar violan la protección de símbolos vigente para los módulos GKI, se pueden encontrar dos tipos de errores durante la carga del módulo, lo que resulta en fallas.

1. Módulo sin firmar que utiliza el símbolo protegido

Error:

module: Protected symbol: some_kernel_function (err -13)

Causa:

El archivo module.ko es un módulo de proveedor sin firmar e intenta resolver el símbolo exportado del módulo GKI some_kernel_function durante la carga, sin aparecer en la lista de símbolos de proveedores.

Resolución:

Si module.ko no es un módulo GKI protegido, la actualización de la lista de símbolos resolverá el error al incluir some_kernel_function en la lista de símbolos del proveedor. Alternativamente, use la versión GKI de module.ko .

2. Módulo sin firmar que exporta el símbolo protegido

Error:

module: exports protected symbol some_kernel_function

Causa:

El módulo que exporta some_kernel_function es un módulo GKI protegido y module.ko probablemente sea una versión personalizada sin firmar de ese módulo. Cuando module.ko intenta exportar some_kernel_function , que solo puede exportarse mediante un módulo GKI firmado, la carga falla y muestra este mensaje.

Resolución:

Esto se puede corregir utilizando la versión GKI del módulo que exporta some_kernel_function , si el módulo sin firmar es una versión personalizada.