Los GKI y los módulos de 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 independiente en la superimagen llamada system_dlkm
. Google firma los módulos de GKI con el par de claves del tiempo de compilación del kernel y solo son compatibles con el GKI con el que se compilan.
No hay estabilidad de ABI entre los módulos de GKI y GKI. Para que los módulos se carguen correctamente durante el tiempo de ejecución, los módulos de GKI y GKI se deben compilar y actualizar 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 durante el tiempo de compilación
depmod
artefactos
Compilación system_dlkm
La compilación de system_dlkm
es un proceso similar al de la compilación de otras particiones dinámicas. Realiza los siguientes 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 dispositivos A/B y A/B virtuales, agrega la siguiente línea al 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 durante el tiempo de ejecución, los módulos de GKI y GKI deben compilarse juntos. Por lo tanto, debes identificar los módulos de 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
Dirige 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:
Proporciona la fuente de los módulos de GKI en una carpeta y dirige BOARD_SYSTEM_DLKM_SRC
a
esta carpeta. Por ejemplo:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
En el tiempo de 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 *_dlkm
. La macro BOARD_SYSTEM_KERNEL_MODULES
debe hacer referencia a la lista de módulos de GKI necesarios 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 de partición cruzada que representa modules.dep
, cuando se carga un módulo de proveedor, cualquier módulo de GKI requerido se carga automáticamente.
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)
Activa system_dlkm
durante el tiempo de ejecución
Según el sistema de archivos que se use como sistema de archivos de solo lectura, agrega lo siguiente en tu fstab
para activar la partición system_dlkm
durante el tiempo de ejecución:
ext4
como un 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
Activación de particiones y carga de módulos
Durante first_stage_init
, la partición system_dlkm
se activa en /system_dlkm
como un sistema de archivos de solo lectura. Si el montaje se realiza correctamente, estarán disponibles los vínculos simbólicos en /system/lib/modules
que apuntan a /system_dlkm/lib/modules
.
Un proceso de proveedor, como una secuencia de comandos .rc
, puede cargar los módulos de 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 de 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, el dlkm_loader
que usa Cuttlefish para cargar módulos de GKI tiene los siguientes permisos en el archivo de políticas 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 invocarla manualmente, usa el siguiente comando atest
:
atest -c vts_dlkm_partition_test