GKI y los módulos GKI se pueden actualizar independientemente del resto de la partición porque los módulos GKI residen en una partición dinámica separada en la superimagen llamada system_dlkm
. Los módulos GKI están firmados por Google utilizando el par de claves de tiempo de compilación del kernel y solo son compatibles con el GKI con el que están construidos. No hay estabilidad ABI entre GKI y los módulos GKI; Para que los módulos se carguen correctamente durante el tiempo de ejecución, GKI y los módulos GKI deben crearse y actualizarse juntos.
Implementar soporte de partición system_dklm
La partición system_dlkm
se encuentra en la superpartición como otra partición dinámica. Esta partición puede contener:
- Módulos del kernel firmados en tiempo de compilación de Google
- artefactos
depmod
Construir system_dlkm
Crear system_dlkm
es un proceso similar al de crear otras particiones dinámicas. Realice los siguientes pasos para agregar system_dlkm
a su compilación:
En
BoardConfig.mk
, agregue las siguientes entradas:BOARD_USES_SYSTEM_DLKMIMAGE := true BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE) TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
En la lista de particiones, agregue
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Opcional) Para dispositivos A/B y A/B virtuales, agregue la siguiente línea en el archivo
device.mk
de su dispositivo:AB_OTA_PARTITIONS += system_dlkm
Identificar los módulos del kernel para copiarlos en system_dlkm
Para que los módulos se carguen correctamente en tiempo de ejecución, GKI y los módulos GKI deben construirse juntos. Por lo tanto, debe identificar los módulos del kernel en la compilación de GKI para la arquitectura de destino y proporcionarlos como fuente para la partición system_dlkm
durante la compilación de la plataforma.
Para Android 13
Apunte BOARD_SYSTEM_DLKM_SRC
a una carpeta que contenga los archivos de objetos del kernel de los módulos GKI necesarios para el dispositivo como entrada al sistema de compilación para generar la partición system_dlkm
. Por ejemplo:
Proporcione la fuente de los módulos GKI en una carpeta y apunte BOARD_SYSTEM_DLKM_SRC
a esa carpeta. Por ejemplo:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
En el momento de la compilación, los módulos enumerados en BOARD_SYSTEM_DLKM_SRC
se instalan en $ANDROID_PRODUCT_OUT/system_dlkm
.
Para Android 14
Hemos simplificado la implementación con las macros ( BOARD_*_KERNEL_MODULES
) que se utilizan para otras particiones *_dlkm
. La lista de módulos GKI necesarios para el dispositivo debe estar referenciada por la macro BOARD_SYSTEM_KERNEL_MODULES
. En el momento de la compilación, estos módulos se instalan en $ANDROID_PRODUCT_OUT/system_dlkm
. Cualquier módulo en la partición vendor_dlkm
que tenga dependencias de los módulos en la partición system_dlkm
genera referencias correctas en el archivo modules.dep
para la partición vendor_dlkm
. Debido a estas dependencias entre particiones representadas por modules.dep
, cuando se carga un módulo de proveedor, cualquier módulo GKI requerido se carga automáticamente.
Por ejemplo, para instalar todos los módulos GKI en la partición system_dlkm
para GKI arm64
kernel 5.15
desde versiones prediseñadas:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Montar system_dlkm
en tiempo de ejecución
Dependiendo del sistema de archivos que se utilice como sistema de archivos de solo lectura, agregue lo siguiente en su fstab
para montar la partición system_dlkm
en tiempo de ejecución:
ext4
como sistema de archivos de solo lectura
system_dlkm /system_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb
erofs
como sistema de archivos de sólo lectura
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
Montaje de particiones y carga de módulos.
Durante first_stage_init
, la partición system_dlkm
se monta en /system_dlkm
como un sistema de archivos de solo lectura. Si el montaje se realiza correctamente, estarán disponibles enlaces simbólicos en /system/lib/modules
que apuntan a /system_dlkm/lib/modules
.
Un proceso de proveedor, como un script .rc
, puede luego cargar los módulos del kernel según el orden especificado en modules.load
. El proceso del proveedor debe utilizar el enlace simbólico /system/lib/modules
para cargar los módulos. Si es necesario, el proceso del proveedor también puede cargar los módulos más adelante.
SELinux
Cada archivo en la partición system_dlkm
está etiquetado con el contexto del archivo system_dlkm_file
. Para cargar el archivo de módulos GKI en la partición system_dlkm
, el proceso del proveedor responsable de cargar los módulos necesita una sepolicy
en el dominio del proveedor.
Por ejemplo, dlkm_loader
utilizado por Cuttlefish para cargar módulos GKI tiene los siguientes permisos en el archivo de política shared/sepolicy/vendor/dlkm_loader.te
:
allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;
Validar la partición system-dlkm
Google proporciona un caso de prueba de GKI VTS para verificar la partición system_dlkm
. Para invocar manualmente la prueba, utilice el siguiente comando atest
:
atest -c vts_dlkm_partition_test