Particiones DLKM del proveedor y del ODM

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

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 del 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 nueva partición llamada Vendor DLKM (módulo del kernel cargable de forma dinámica). Luego, puedes actualizar esta partición de forma independiente. Del mismo modo, puedes mover todos los módulos del kernel almacenados en la partición ODM a una nueva partición 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.

Contenido de vendor_dlkm en /vendor/lib/modules

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

Contenido de odm_dlkm en /odm/lib/modules

  • Módulos de kernel del ODM
  • Archivos de configuración de 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.

Consigue ayuda

La creación de vendor_dlkm y odm_dlkm es un proceso similar al 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 adecuado 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 CL 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 virtuales, 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 CL Add odm_dlkm to CF como ejemplo.

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

Copia módulos del kernel en una partición

Para seleccionar los módulos del kernel que deseas copiar en la partición vendor_dlkm, inclúyelos en BOARD_VENDOR_KERNEL_MODULES.

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

En el momento de la compilación, los módulos que se indican 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, enuméralos 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 indican en BOARD_ODM_KERNEL_MODULES.

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

En el momento de la 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 lleva a /odm_dlkm/lib/modules.

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

Nunca uses /vendor_dlkm/lib/modules. Los dispositivos sin una partición de vendor_dlkm instalan BOARD_VENDOR_KERNEL_MODULES directamente en /vendor/lib/modules. 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 directamente en /odm/lib/modules. Esto es problemático, ya que /odm_dlkm/lib/modules no existe.

Carga de módulos y montaje de particiones

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 vínculos simbólicos en /vendor/lib/modules y /odm/lib/modules están disponibles.

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 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 arranque del proveedor (que contiene el RAMDisk del proveedor), consulta Compatibilidad con módulos del kernel.