Implementa una partición del módulo de GKI

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:

  1. 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
    
  2. En la lista de particiones, agrega system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (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