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:
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 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