Partição DLKM de Fornecedor/ODM

O Android 11 apresenta o conceito de imagem do kernel genérico e a partição de inicialização do fornecedor. A partição de inicialização do fornecedor armazena os módulos do kernel compatíveis com GKI e é carregada pelo primeiro estágio init. Os módulos do kernel anteriores ao lançamento do Android 11 também são armazenados em partições do fornecedor e ODM e são carregados pelos processos do fornecedor.

Para Android 11 ou superior, o kernel e todos os módulos do kernel podem ser atualizados independentemente do restante das partições. Para habilitar atualizações para módulos de kernel armazenados na partição do fornecedor (sem uma atualização de partição do fornecedor), mova todos os módulos de partição do fornecedor para uma nova partição chamada Vendor DLKM (módulo de kernel dinamicamente carregável). Você pode então atualizar esta partição de forma independente. Da mesma forma, você pode mover todos os módulos do kernel armazenados na partição ODM para uma nova partição chamada ODM DLKM . Esta partição também pode ser atualizada de forma independente.

Localização da partição

As partições vendor_dlkm e odm_dlkm estão localizadas na super partição como outra partição dinâmica.

conteúdo de vendor_dlkm em /vendor/lib/modules

  • Módulos do kernel do fornecedor
  • arquivos de configuração modprobe
  • Um arquivo modules.load

conteúdo odm_dlkm em /odm/lib/modules

  • Módulos do kernel ODM
  • arquivos de configuração modprobe
  • Um arquivo modules.load

Consulte Suporte ao módulo do kernel para obter mais detalhes sobre os arquivos de configuração do módulo do kernel.

Criar suporte

A construção vendor_dlkm e odm_dlkm é um processo semelhante à construção de outras partições dinâmicas.

exemplo de construção de vendor_dlkm

Crie vendor_dlkm conforme mostrado no exemplo abaixo.

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

Substitua <GROUP_NAME> pelo nome apropriado do grupo de atualização. O grupo de atualização deve ser o grupo no qual a partição do fornecedor está.

Para dispositivos A/B e A/B virtuais, device.mk

AB_OTA_PARTITIONS += vendor_dlkm

fstab

Adicione a seguinte entrada para vendor_dlkm a fstab. Altere os sinalizadores de acordo com o dispositivo. Use CL Add vendor_dlkm to CF como um exemplo.

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

exemplo de compilação odm_dlkm

Crie odm_dlkm conforme mostrado no exemplo abaixo.

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

AB_OTA_PARTITIONS += odm_dlkm

fstab

Adicione a seguinte entrada para odm_dlkm a fstab. Altere os sinalizadores de acordo com o dispositivo. Use CL Add odm_dlkm to CF como um exemplo.

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

Copiando módulos do kernel em uma partição

Para selecionar os módulos do kernel que você deseja copiar na partição vendor_dlkm , liste-os em BOARD_VENDOR_KERNEL_MODULES .

Se você deseja substituir o conteúdo de modules.load , pode especificá-lo em BOARD_VENDOR_KERNEL_MODULES_LOAD .

No momento da compilação, os módulos listados em BOARD_VENDOR_KERNEL_MODULES são instalados em $ANDROID_PRODUCT_OUT/vendor_dlkm/lib/modules . Um link simbólico é criado em /vendor/lib/modules que leva a /vendor_dlkm/lib/modules .

Da mesma forma, para selecionar os módulos do kernel que deseja copiar para a partição odm_dlkm , liste-os em BOARD_ODM_KERNEL_MODULES . A construção da plataforma executa depmod nos módulos e copia os arquivos de saída depmod na imagem. A construção cria um arquivo modules.load e o armazena na imagem. Este arquivo contém todos os módulos listados em BOARD_ODM_KERNEL_MODULES .

Se você deseja substituir o conteúdo de modules.load , pode especificá-lo em BOARD_ODM_KERNEL_MODULES_LOAD .

No momento da compilação, os módulos listados em BOARD_ODM_KERNEL_MODULES serão instalados em $ANDROID_PRODUCT_OUT/odm_dlkm/lib/modules . Um link simbólico será criado em /odm/lib/modules que leva a /odm_dlkm/lib/modules .

Sempre use /vendor/lib/modules e /odm/lib/modules para fornecedores e módulos de kernel ODM.

Nunca use /vendor_dlkm/lib/modules. Dispositivos sem uma partição vendor_dlkm instalam BOARD_VENDOR_KERNEL_MODULES em /vendor/lib/modules . Isso é problemático porque /vendor_dlkm/lib/modules não existe.

Nunca use /odm_dlkm/lib/modules. Dispositivos sem uma partição odm_dlkm instalam BOARD_ODM_KERNEL_MODULES em /odm/lib/modules . Isso é problemático porque /odm_dlkm/lib/modules não existe.

Montagem de partição e carregamento de módulo

Durante first_stage_init , as partições vendor_dlkm e odm_dlkm são montadas nas partições /vendor_dlkm e /odm_dlkm , respectivamente. Quando isso acontece, os links simbólicos em /vendor/lib/modules e /odm/lib/modules ficam disponíveis.

Um processo de fornecedor (como um script '.rc') pode carregar os módulos do kernel com base na ordem especificada em modules.load . O processo do fornecedor também pode carregar os módulos posteriormente, se necessário.

Para obter a documentação referente à criação de uma partição de inicialização do fornecedor (que contém o RAMDisk do fornecedor), consulte Kernel Module Support .