Implementar uma partição do módulo GKI

Os módulos GKI e GKI podem ser atualizados independentemente do restante da partição porque os módulos GKI residem em uma partição dinâmica separada na superimagem chamada system_dlkm. Os módulos GKI são assinados pelo Google usando o kernel de tempo de build e são compatíveis apenas com a GKI com que foram criadas. Não há estabilidade de ABI entre os módulos GKI e GKI. Para que os módulos sejam carregados corretamente durante a execução, eles precisam ser criados e atualizados juntos.

Implementar suporte à partição system_dklm

A partição system_dlkm está localizada na superpartição como outra partição dinâmica. Essa partição pode conter:

  • Módulos de kernel assinados do tempo de build do Google
  • depmod artefatos

Versão system_dlkm

A criação de system_dlkm é um processo semelhante à criação de outros partições diferentes. Siga as etapas abaixo para adicionar system_dlkm ao build:

  1. Em BoardConfig.mk, adicione as seguintes entradas:

    BOARD_USES_SYSTEM_DLKMIMAGE := true
    BOARD_SYSTEM_DLKMIMAGE_FILE_SYSTEM_TYPE := $(TARGET_RO_FILE_SYSTEM_TYPE)
    TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm
    
  2. Na lista de partições, adicione system_dlkm: BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm

  3. (Opcional) Para dispositivos A/B e A/B virtuais, adicione a seguinte linha no arquivo device.mk do dispositivo:

    AB_OTA_PARTITIONS += system_dlkm
    

Identificar módulos do kernel para copiar em system_dlkm

Para que os módulos sejam carregados no momento da execução, os módulos GKI e GKI precisam ser criados juntas. Portanto, você precisa identificar os módulos do kernel no build de GKI para o arquitetura de destino e a forneça como origem para a partição system_dlkm durante a criação da plataforma.

Para o Android 13

Aponte BOARD_SYSTEM_DLKM_SRC para uma pasta que contenha os módulos GKI necessários. arquivos de objeto do kernel para o dispositivo como uma entrada para o sistema de build gerar system_dlkm. Exemplo:

Forneça a origem dos módulos do GKI em uma pasta e aponte BOARD_SYSTEM_DLKM_SRC para essa pasta. Exemplo:

  BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging

No momento da build, os módulos listados em BOARD_SYSTEM_DLKM_SRC são instalados em $ANDROID_PRODUCT_OUT/system_dlkm.

Para o Android 14

Simplificamos a implementação com as macros (BOARD_*_KERNEL_MODULES) sendo usados para outros *_dlkm partições. A lista de módulos GKI necessários para o dispositivo precisa ser referenciada pela macro BOARD_SYSTEM_KERNEL_MODULES. No tempo de build, esses módulos estão instalados no $ANDROID_PRODUCT_OUT/system_dlkm. Qualquer módulo na partição vendor_dlkm que tenha dependências dos módulos na partição system_dlkm gera referências corretas no arquivo modules.dep para a partição vendor_dlkm. Devido às dependências entre partições representadas por modules.dep, quando um módulo de fornecedor for carregado, qualquer módulo GKI necessário será carregado automaticamente.

Por exemplo, para instalar todos os módulos GKI na partição system_dlkm para o kernel arm64 GKI 5.15 de pré-criados:

 BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)

Ativar system_dlkm durante a execução

Dependendo do sistema de arquivos usado como somente leitura, adicione o seguinte ao fstab para montar a partição system_dlkm no momento da execução:

ext4 como um sistema de arquivos somente leitura

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

erofs como um sistema de arquivos somente leitura

  system_dlkm /system_dlkm erofs ro wait,logical,first_stage_mount,slotselect,avb

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

Durante o first_stage_init, a partição system_dlkm é montada no /system_dlkm como um sistema de arquivos somente leitura. Em uma montagem bem-sucedida, os links simbólicos em /system/lib/modules que apontam para /system_dlkm/lib/modules estão disponíveis.

Um processo do fornecedor, como um script .rc, pode carregar os módulos do kernel com base na ordem especificada em modules.load. O processo do fornecedor precisa usar o link simbólico /system/lib/modules para carregar os módulos. Se necessário, o processo do fornecedor também pode carregar os módulos mais tarde.

SELinux

Cada arquivo na partição system_dlkm é rotulado com o contexto do arquivo system_dlkm_file. Para carregar o arquivo de módulos GKI na partição system_dlkm, faça o seguinte: o processo do fornecedor responsável pelo carregamento dos módulos precisa de um sepolicy o domínio do fornecedor.

Por exemplo, a dlkm_loader usada pelo Cuttlefish para carregar módulos GKI tem a propriedade as seguintes permissões no arquivo de política em shared/sepolicy/vendor/dlkm_loader.te:

allow dlkm_loader self:capability sys_module;
allow dlkm_loader system_dlkm_file:dir r_dir_perms;
allow dlkm_loader system_dlkm_file:file r_file_perms;
allow dlkm_loader system_dlkm_file:system module_load;

Validar a partição system-dlkm

O Google fornece um caso de teste VTS de GKI para verificar a partição system_dlkm. Para invoque o teste manualmente, use o seguinte comando atest:

  atest -c vts_dlkm_partition_test