A GKI e os módulos dela podem ser atualizados de forma independente do restante da partição, porque os módulos da GKI residem em uma partição dinâmica separada na superimagem chamada system_dlkm. Os módulos de GKI são assinados pelo Google usando o par de chaves de tempo de build do kernel e são compatíveis apenas com o GKI com que foram criados.
Não há estabilidade de ABI entre o GKI e os módulos do GKI. Para que os módulos sejam carregados
corretamente durante a execução, o GKI e os módulos do GKI precisam ser criados e atualizados
juntos.
Implementar suporte à partição system_dklm
A partição system_dlkm está localizada na partição super como outra partição dinâmica. Essa partição pode conter:
- Módulos do kernel assinados no momento da criação do Google
depmodartefatos
Versão system_dlkm
A criação de system_dlkm é um processo semelhante à criação de outras partições
dinâmicas. Siga estas etapas para adicionar system_dlkm ao build:
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_dlkmNa lista de partições, adicione
system_dlkm:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm(Opcional) Para dispositivos A/B e A/B virtual, adicione a seguinte linha ao arquivo
device.mkdo seu dispositivo:AB_OTA_PARTITIONS += system_dlkm
Identifique os módulos do kernel a serem copiados para system_dlkm.
Para que os módulos sejam carregados corretamente durante a execução, o GKI e os módulos do GKI precisam ser criados
juntos. Portanto, é necessário identificar os módulos do kernel no build do GKI para a arquitetura de destino e fornecer isso 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 do kernel dos módulos GKI necessários para o dispositivo como uma entrada do 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 Android 14
Simplificamos a implementação com as macros (BOARD_*_KERNEL_MODULES) 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 build, 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 do GKI
5.15 de pré-criados:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Ativar system_dlkm no tempo de execução
Dependendo do sistema de arquivos usado como somente leitura, adicione
o seguinte ao fstab para ativar a partição system_dlkm durante a 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çã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 ficam
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,
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 oferece um caso de teste do 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