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 da GKI são assinados pelo Google usando o par de chaves do kernel e são compatíveis apenas com a GKI em que foram criados. Não há estabilidade de ABI entre os módulos GKI e GKI. Para que os módulos sejam carregados corretamente durante o tempo de execução, os módulos GKI e GKI precisam ser criados e atualizados juntos.

Implementar o 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 do kernel assinados pelo Google no momento da build
  • depmod artefatos

Versão system_dlkm

A criação de system_dlkm é um processo semelhante à criação de outras partições dinâmicas. 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 durante a execução, os módulos GKI e GKI precisam ser criados juntos. Portanto, você precisa identificar os módulos do kernel no build de GKI para a arquitetura de destino e fornecê-los como origem para a partição system_dlkm durante o build da plataforma.

Para o Android 13

Aponte BOARD_SYSTEM_DLKM_SRC para uma pasta que contenha os arquivos de objeto de kernel dos módulos GKI necessários para o dispositivo como uma entrada para o sistema de build para gerar a partição 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

Aprimoramos a implementação com as macros (BOARD_*_KERNEL_MODULES) sendo usadas para outras partições *_dlkm. A lista de módulos GKI necessários para o dispositivo precisa ser referenciada pela macro BOARD_SYSTEM_KERNEL_MODULES. No momento da criação, esses módulos sã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 do fornecedor é carregado, qualquer módulo GKI necessário é 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 sistema de arquivos somente leitura

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

Montagem de partições e carregamento de módulos

Durante a 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

Todos os arquivos na partição system_dlkm são rotulados com o contexto de arquivo de system_dlkm_file. Para carregar o arquivo de módulos de GKI na partição system_dlkm, o processo do fornecedor responsável por carregar os módulos precisa de um sepolicy no domínio do fornecedor.

Por exemplo, dlkm_loader usado pelo Cuttlefish para carregar módulos do GKI tem 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 de VTS do GKI para verificar a partição system_dlkm. Para invocar o teste manualmente, use o seguinte comando atest:

  atest -c vts_dlkm_partition_test