Particiones de DLKM de proveedor y de ODM

Android 11 introduce el concepto de la imagen genérica del kernel y la partición de inicio del proveedor. La partición de inicio del proveedor almacena módulos de kernel compatibles con GKI y se carga mediante la inicialización de la primera etapa. Los módulos de kernel anteriores al lanzamiento de Android 11 también se almacenan en particiones de proveedores y ODM, y los procesos del proveedor los cargan.

En Android 11 o versiones posteriores, el kernel y todos los módulos del kernel se pueden actualizar de forma independiente del resto de las particiones. Para habilitar las actualizaciones de los módulos de kernel almacenados en la partición del proveedor (sin una actualización de la partición del proveedor), mueve todos los módulos de la partición del proveedor a una partición nueva llamada Vendor DLKM (módulo de kernel cargable de forma dinámica). Luego, puedes actualizar esta partición de forma independiente. De manera similar, puedes mover todos los módulos de kernel almacenados en la partición de ODM a una partición nueva llamada ODM DLKM. Esta partición también se puede actualizar de forma independiente.

Ubicación de la partición

Las particiones vendor_dlkm y odm_dlkm se encuentran en la superpartición como otra partición dinámica.

Provider_dlkm contenido en /vendor/lib/modules

  • Módulos de kernel del proveedor
  • Archivos de configuración modprobe
  • Un archivo modules.load

Contenido de odm_dlkm en /odm/lib/modules

  • Módulos de kernel del ODM
  • Archivos de configuración modprobe
  • Un archivo modules.load

Consulta Compatibilidad con el módulo de kernel para obtener más detalles sobre los archivos de configuración del módulo de kernel.

Cómo obtener asistencia

La compilación de vendor_dlkm y odm_dlkm es un proceso similar a la compilación de otras particiones dinámicas.

Ejemplo de compilación de vendor_dlkm

Compila vendor_dlkm como se muestra en los siguientes ejemplos.

BoardConfig.mk

BOARD_USES_VENDOR_DLKMIMAGE := true
BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm
BOARD_<GROUP_NAME>_PARTITION_LIST += vendor_dlkm

Reemplaza <GROUP_NAME> por el nombre correcto del grupo de actualización. El grupo de actualización debe ser el grupo en el que se encuentra la partición del proveedor.

Para dispositivos A/B y A/B virtuales, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Agrega la siguiente entrada para vendor_dlkm a fstab. Cambia las marcas según el dispositivo. Usa el comando Add vendor_dlkm to CF como ejemplo.

vendor_dlkm /vendor_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Ejemplo de compilación de odm_dlkm

Compila odm_dlkm como se muestra en los siguientes ejemplos.

BoardConfig.mk

BOARD_USES_ODM_DLKIMAGE := true
BOARD_ODM_DLKIMAGE_FILE_SYSTEM_TYPE := ext4
TARGET_COPY_OUT_ODM_DLKM := odm_dlkm
BOARD_<group_name>_PARTITION_LIST += odm_dlkm

Para dispositivos A/B y A/B virtual, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Agrega la siguiente entrada para odm_dlkm a fstab. Cambia las marcas según el dispositivo. Usa el comando Add odm_dlkm to CF como ejemplo.

odm_dlkm /odm_dlkm ext4 noatime,ro,errors=panic wait,logical,first_stage_mount,slotselect,avb

Cómo copiar módulos de kernel en una partición

Para seleccionar los módulos del kernel que deseas copiar en la partición vendor_dlkm, indícalos en BOARD_VENDOR_KERNEL_MODULES.

Si quieres anular el contenido de modules.load, puedes especificarlo en BOARD_VENDOR_KERNEL_MODULES_LOAD.

En el tiempo de compilación, los módulos que se enumeran en BOARD_VENDOR_KERNEL_MODULES se instalan en $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules. Se crea un vínculo simbólico en /vendor/lib/modules que dirige a /vendor_dlkm/lib/modules.

De manera similar, para seleccionar los módulos del kernel que deseas copiar en la partición odm_dlkm, indícalos en BOARD_ODM_KERNEL_MODULES. La compilación de la plataforma ejecuta depmod en los módulos y copia los archivos de salida de depmod en la imagen. La compilación crea un archivo modules.load y lo almacena en la imagen. Este archivo contiene todos los módulos que se enumeran en BOARD_ODM_KERNEL_MODULES.

Si quieres anular el contenido de modules.load, puedes especificarlo en BOARD_ODM_KERNEL_MODULES_LOAD.

En el tiempo de compilación, los módulos que se enumeran en BOARD_ODM_KERNEL_MODULES se instalan en $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules. Se crea un vínculo simbólico en /odm/lib/modules que dirige a /odm_dlkm/lib/modules.

Siempre usa /vendor/lib/modules y /odm/lib/modules para los módulos de kernel del proveedor y del ODM.

Nunca uses /vendor_dlkm/lib/modules. Los dispositivos sin una partición vendor_dlkm instalan BOARD_VENDOR_KERNEL_MODULES en /vendor/lib/modules directamente. Esto es problemático, ya que /vendor_dlkm/lib/modules no existe.

Nunca uses /odm_dlkm/lib/modules. Los dispositivos sin una partición odm_dlkm instalan BOARD_ODM_KERNEL_MODULES en /odm/lib/modules directamente. Esto es problemático, ya que /odm_dlkm/lib/modules no existe.

Activación de particiones y carga de módulos

Durante first_stage_init, las particiones vendor_dlkm y odm_dlkm se activan en los directorios /vendor_dlkm y /odm_dlkm, respectivamente. Cuando esto sucede, los symlinks en /vendor/lib/modules y /odm/lib/modules están disponibles.

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 también puede cargar los módulos más adelante, si es necesario.

Para obtener documentación sobre la creación de una partición de inicio del proveedor (que contiene el RAMDisk del proveedor), consulta Compatibilidad con módulos de kernel.