Partición DLKM de proveedor/ODM

Android 11 presenta el concepto de la imagen genérica del kernel y la partición de arranque del proveedor. La partición de arranque del proveedor almacena los módulos del kernel compatibles con GKI y se carga mediante el inicio 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 de proveedores los cargan.

Para Android 11 o superior, el kernel y todos los módulos del kernel se pueden actualizar independientemente 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), mueva todos los módulos de la partición del proveedor a una nueva partición denominada DLKM del proveedor (módulo del kernel cargable dinámicamente). A continuación, puede actualizar esta partición de forma independiente. De manera similar, puede 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 están ubicadas en la súper partición como otra partición dinámica.

contenido de vendor_dlkm en /vendor/lib/modules

  • Módulos del núcleo del proveedor
  • archivos de configuración modprobe
  • Un archivo de modules.load

Contenido de odm_dlkm en /odm/lib/modules

  • Módulos del núcleo ODM
  • archivos de configuración modprobe
  • Un archivo de modules.load

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

Construir soporte

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

ejemplo de compilación de vendor_dlkm

Cree vendor_dlkm como se muestra en el ejemplo a continuación.

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

Reemplace <GROUP_NAME> con el nombre apropiado 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 Virtual A/B, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Agregue la siguiente entrada para vendor_dlkm a fstab. Cambiar banderas según el dispositivo. Utilice el CL Añadir vendor_dlkm a CF como ejemplo.

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

ejemplo de compilación odm_dlkm

Genere odm_dlkm como se muestra en el siguiente ejemplo.

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 Virtual A/B, device.mk

AB_OTA_PARTITIONS += odm_dlkm

fstab

Agregue la siguiente entrada para odm_dlkm a fstab. Cambiar banderas según el dispositivo. Utilice CL Agregar odm_dlkm a CF como ejemplo.

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

Copiar módulos del kernel en una partición

Para seleccionar los módulos del núcleo que desea copiar en la partición vendor_dlkm , enumérelos en BOARD_VENDOR_KERNEL_MODULES .

Si desea anular el contenido de modules.load , puede especificarlo en BOARD_VENDOR_KERNEL_MODULES_LOAD .

En el momento de la compilación, los módulos enumerados en BOARD_VENDOR_KERNEL_MODULES se instalan en $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules . Se crea un enlace simbólico en /vendor/lib/modules que conduce a /vendor_dlkm/lib/modules .

De manera similar, para seleccionar los módulos del kernel que desea copiar en la partición odm_dlkm , enumérelos en BOARD_ODM_KERNEL_MODULES . La compilación de la plataforma ejecuta depmod en los módulos y copia los archivos de salida 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 enumerados en BOARD_ODM_KERNEL_MODULES .

Si desea anular el contenido de modules.load , puede especificarlo en BOARD_ODM_KERNEL_MODULES_LOAD .

En el momento de la compilación, los módulos enumerados en BOARD_ODM_KERNEL_MODULES se instalarán en $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules . Se creará un enlace simbólico en /odm/lib/modules que conduce a /odm_dlkm/lib/modules .

Utilice siempre /vendor/lib/modules y /odm/lib/modules para los módulos de kernel de proveedor y ODM.

Nunca use /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 use /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.

Montaje de particiones y carga de módulos

Durante first_stage_init , las particiones vendor_dlkm y odm_dlkm se montan en las /vendor_dlkm y /odm_dlkm , respectivamente. Cuando esto sucede, los enlaces simbólicos en /vendor/lib/modules y /odm/lib/modules quedan disponibles.

Un proceso de proveedor (como un script '.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 en un momento posterior, 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), consulte Compatibilidad con el módulo del kernel .