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 par de chaves de tempo de compilação do kernel e são compatíveis apenas com o GKI com o qual 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 devem ser compilados 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. Esta partição pode conter:
- Módulos de kernel assinados em tempo de compilação do Google
- artefatos
depmod
Construir system_dlkm
Construir system_dlkm
é um processo semelhante à construção de outras partições dinâmicas. Execute as etapas a seguir para adicionar system_dlkm
à sua compilação:
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
Na lista de partições, adicione
system_dlkm
:BOARD_GOOGLE_SYSTEM_DYNAMIC_PARTITIONS_PARTITION_LIST := system_dlkm
(Opcional) Para dispositivos A/B e A/B virtuais, adicione a seguinte linha no arquivo
device.mk
do seu dispositivo:AB_OTA_PARTITIONS += system_dlkm
Identifique os módulos do kernel para copiar para system_dlkm
Para que os módulos sejam carregados com êxito em tempo de execução, os módulos GKI e GKI devem ser criados juntos. Portanto, você deve identificar os módulos do kernel na construção do GKI para a arquitetura de destino e fornecê-los como origem para a partição system_dlkm
durante a construção da plataforma.
Para Android 13
Aponte BOARD_SYSTEM_DLKM_SRC
para uma pasta que contém os arquivos de objeto do kernel dos módulos GKI necessários para o dispositivo como uma entrada para o sistema de compilação para gerar a partição system_dlkm
. Por exemplo:
Forneça a origem dos módulos GKI em uma pasta e aponte BOARD_SYSTEM_DLKM_SRC
para essa pasta. Por exemplo:
BOARD_SYSTEM_DLKM_SRC := kernel/prebuilts/5.10/arm64/system_dlkm_staging
No momento da construção, 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
) sendo usadas para outras partições *_dlkm
. A lista de módulos GKI necessários para o dispositivo deve ser referenciada pela macro BOARD_SYSTEM_KERNEL_MODULES
. No momento da construçã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 a essas dependências de partição cruzada 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 GKI arm64
kernel 5.15
a partir de pré-construídos:
BOARD_SYSTEM_KERNEL_MODULES := $(wildcard kernel/prebuilts/5.15/arm64/*.ko)
Monte system_dlkm
em tempo de execução
Dependendo do sistema de arquivos que está sendo usado como sistema de arquivos somente leitura, adicione o seguinte em seu fstab
para montar a partição system_dlkm
em tempo de 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 first_stage_init
, a partição system_dlkm
é montada em /system_dlkm
como um sistema de arquivos somente leitura. Em uma montagem bem-sucedida, links simbólicos em /system/lib/modules
apontando para /system_dlkm/lib/modules
estão disponíveis.
Um processo de fornecedor, como um script .rc
, pode então carregar os módulos do kernel com base na ordem especificada em modules.load
. O processo do fornecedor deve 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 posteriormente.
SELinux
Cada arquivo na partição system_dlkm
é rotulado com o contexto de arquivo de 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 uma sepolicy
no domínio do fornecedor.
Por exemplo, dlkm_loader
usado pelo Cuttlefish para carregar módulos 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;
Valide a partição system-dlkm
O Google fornece um caso de teste GKI VTS para verificar a partição system_dlkm
. Para invocar manualmente o teste, use o seguinte comando atest
:
atest -c vts_dlkm_partition_test