Compatibilidad con el módulo de kernel

Es posible que una imagen genérica del kernel (GKI) no sea compatible con el controlador necesario para permitir que un dispositivo active particiones. Para habilitar un dispositivo para activar particiones y continuar con el inicio, se mejoró el elemento inicial init para que cargue los módulos de kernel presentes en un disco RAM. El disco RAM se divide en discos RAM de proveedores y genéricos. Los módulos de kernel del proveedor se almacenan en el disco RAM del proveedor. Puedes configurar el orden en el que se cargan los módulos de kernel.

Ubicación del módulo

El disco RAM es el sistema de archivos para el elemento inicial init, de la primera etapa y para la imagen de recuperación/fastbootd en dispositivos A/B y A/B virtuales. Es un initramfs compuesto por dos archivos cpio que el cargador de arranque concatena. El primer archivo cpio, que se almacena como el disco RAM del proveedor en la partición vendor-boot, contiene los siguientes componentes:

  • Módulos de kernel del proveedor init de la primera etapa, ubicados en /lib/modules/
  • Archivos de configuración modprobe, ubicados en /lib/modules/: modules.dep, modules.softdep, modules.alias, modules.options
  • Un archivo modules.load que indica qué módulos cargar durante el inicio de la primera etapa y en qué orden, en /lib/modules/
  • Módulos de kernel de recuperación del proveedor, para dispositivos A/B y A/B virtuales, en /lib/modules/
  • modules.load.recovery que indica los módulos que se cargarán y en qué orden, para dispositivos A/B y A/B virtuales, en /lib/modules

El segundo archivo cpio, que se proporciona con la GKI como el disco RAM de boot.img y se aplica sobre el primero, contiene first_stage_init y las bibliotecas de las que depende.

Carga de módulos en el elemento inicial de la primera etapa

El elemento inicial init de la primera etapa comienza leyendo los archivos de configuración de modprobe de /lib/modules/ en el disco RAM. Luego, lee la lista de módulos especificados en /lib/modules/modules.load (o, en el caso de la recuperación, /lib/modules/modules.load.recovery) y trata de cargar cada uno de esos módulos en orden, siguiendo la configuración especificada en los archivos cargados anteriormente. Es posible que se desvíe del orden solicitado para satisfacer dependencias estrictas o flexibles.

Compatibilidad con la compilación, elemento inicial de la primera etapa

Para especificar los módulos de kernel que se copiarán en el cpio del disco RAM del proveedor, inclúyelos en BOARD_VENDOR_RAMDISK_KERNEL_MODULES. La compilación ejecuta depmod en estos módulos y coloca los archivos de configuración de modprobe resultantes en el cpio del disco RAM del proveedor.

La compilación también crea un archivo modules.load y lo almacena en el cpio del disco RAM del proveedor. De forma predeterminada, contiene todos los módulos que se muestran en BOARD_VENDOR_RAMDISK_KERNEL_MODULES. Para anular el contenido de ese archivo, usa BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD, como se muestra en este ejemplo:

BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := \
    device/vendor/mydevice-kernel/first.ko \
    device/vendor/mydevice-kernel/second.ko \
    device/vendor/mydevice-kernel/third.ko

Compatibilidad con la compilación, Android completo

Al igual que en Android 10 y versiones anteriores, la compilación de la plataforma Android copia los módulos de kernel que se muestran en BOARD_VENDOR_KERNEL_MODULES en la partición del proveedor en /vendor/lib/modules. La compilación de la plataforma ejecuta depmod en estos módulos y copia los archivos de salida depmod en la partición del proveedor en la misma ubicación. El mecanismo para cargar módulos de kernel desde /vendor sigue siendo el mismo que para las versiones anteriores de Android. Tú decides cómo y cuándo cargar estos módulos, aunque, por lo general, esto se hace con secuencias de comandos init.rc.

Comodines y compilaciones de kernel integradas

Los proveedores que combinan la compilación del kernel de su dispositivo con la compilación de la plataforma de Android pueden tener un problema con el uso de las macros BOARD mencionadas anteriormente para especificar los módulos de kernel que se copiarán en el dispositivo. Si el proveedor desea evitar enumerar los módulos de kernel en los archivos de compilación de la plataforma del dispositivo, puede usar un comodín ($(wildcard device/vendor/mydevice/*.ko). Ten en cuenta que el comodín no funciona en el caso de una compilación de kernel integrada, ya que, cuando se invoca make y se expanden las macros en los archivos makefile, los módulos de kernel no se compilaron, por lo que las macros están vacías.

Para solucionar este problema, el proveedor puede hacer que su compilación de kernel cree un archivo ZIP que contenga los módulos de kernel que se copiarán en cada partición. Configura la ruta de acceso de ese archivo ZIP en BOARD_*_KERNEL_MODULES_ARCHIVE donde * es el nombre de la partición (como BOARD_VENDOR_KERNEL_MODULES_ARCHIVE). La compilación de la plataforma de Android extrae este archivo ZIP en la ubicación adecuada y ejecuta depmod en los módulos.

El archivo ZIP del módulo de kernel debe tener una regla make que garantice que la compilación de la plataforma pueda generar el archivo cuando sea necesario.

Recuperación

En versiones anteriores de Android, los módulos de kernel necesarios para la recuperación se especificaban en BOARD_RECOVERY_KERNEL_MODULES. En Android 12, los módulos de kernel necesarios para la recuperación aún se especifican con esta macro. Sin embargo, los módulos de kernel de recuperación se copian en el cpio del disco RAM del proveedor, en lugar del cpio del disco RAM genérico. De forma predeterminada, todos los módulos de kernel que se muestran en BOARD_RECOVERY_KERNEL_MODULES se cargan durante el elemento inicial init de la primera etapa. Si solo deseas que se cargue un subconjunto de estos módulos, especifica el contenido de ese subconjunto en BOARD_RECOVERY_KERNEL_MODULES_LOAD.

Para obtener información sobre cómo crear una partición de inicio del proveedor (que contiene el disco RAM del proveedor mencionado en esta página), consulta Particiones de inicio.