Los módulos de GKI y GKI se pueden actualizar de forma independiente del resto de la partición, ya que los módulos de GKI residen en una partición dinámica separada en la superimagen llamada system_dlkm
. Google firma los módulos de GKI con el par de claves de tiempo de compilación del kernel, y solo son compatibles con el GKI con el que se compilan.
No hay estabilidad de ABI entre GKI y los módulos de GKI. Para que los módulos se carguen correctamente durante el tiempo de ejecución, GKI y los módulos de GKI deben compilarse y actualizarse juntos.
Implementa la compatibilidad con la 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 lo siguiente:
- Módulos de kernel firmados por Google en tiempo de compilación
depmod
artefactos
Compilación system_dlkm
La compilación de system_dlkm
es un proceso similar a la compilación de otras particiones dinámicas. Sigue estos pasos para agregar system_dlkm
a tu compilación:
En
BoardConfig.mk
, agrega 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, agrega
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Opcional) Para los dispositivos A/B y A/B virtuales, agrega la siguiente línea en el archivo
device.mk
de tu dispositivo:AB_OTA_PARTITIONS += system_dlkm
Identifica los módulos del kernel que se copiarán en system_dlkm
Para que los módulos se carguen correctamente en el tiempo de ejecución, se deben compilar juntos el GKI y los módulos de GKI. Por lo tanto, debes identificar los módulos del kernel en la compilación del 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
Apunta BOARD_SYSTEM_DLKM_SRC
a una carpeta que contenga los archivos de objeto del kernel de los módulos de GKI necesarios para el dispositivo como entrada al sistema de compilación para generar la partición system_dlkm
. Por ejemplo:
Proporciona la fuente de los módulos de GKI en una carpeta y apunta 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 que se enumeran en BOARD_SYSTEM_DLKM_SRC
se instalan en $ANDROID_PRODUCT_OUT/system_dlkm
.
Para Android 14
Optimizamos la implementación con las macros (BOARD_*_KERNEL_MODULES
) que se usan para otras particiones de *_dlkm
. La macro BOARD_SYSTEM_KERNEL_MODULES
debe hacer referencia a la lista de módulos del GKI requeridos para el dispositivo. 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 en los módulos de la partición system_dlkm
genera referencias correctas en el archivo modules.dep
para la partición vendor_dlkm
. Debido a las dependencias entre particiones representadas por modules.dep
, cuando se carga un módulo del proveedor, se carga automáticamente cualquier módulo de GKI requerido.
Por ejemplo, para instalar todos los módulos de GKI en la partición system_dlkm
para el kernel arm64
de GKI 5.15
desde compilaciones previas, haz lo siguiente:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Cómo activar system_dlkm
en el tiempo de ejecución
Según el sistema de archivos que se use como sistema de archivos de solo lectura, agrega lo siguiente a tu fstab
para activar la partición system_dlkm
en el 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 solo lectura
system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb
Carga de módulos y montaje de particiones
Durante first_stage_init
, la partición system_dlkm
se activa en /system_dlkm
como un sistema de archivos de solo lectura. Si la operación de montaje se realiza correctamente, estarán disponibles los vínculos simbólicos en /system/lib/modules
que apuntan a /system_dlkm/lib/modules
.
Luego, un proceso del proveedor, como una secuencia de comandos .rc
, puede cargar los módulos del kernel según el orden especificado en modules.load
. El proceso del proveedor debe usar el vínculo 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 de la partición system_dlkm
está etiquetado con el contexto del archivo de system_dlkm_file
. Para cargar el archivo de módulos de GKI en la partición system_dlkm
, el proceso del proveedor responsable de cargar los módulos necesita un sepolicy
en el dominio del proveedor.
Por ejemplo, dlkm_loader
que usa Cuttlefish para cargar módulos de GKI tiene los siguientes permisos en el archivo de política en 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;
Valida la partición system-dlkm
Google proporciona un caso de prueba de VTS de GKI para verificar la partición system_dlkm
. Para invocar la prueba de forma manual, usa el siguiente comando atest
:
atest -c vts_dlkm_partition_test