Há dois tipos de módulos do kernel: módulos GKI independentes de hardware e módulos do fornecedor específicos do hardware. Nesta página, você encontra uma visão geral dos dois tipos de módulos.
Módulos GKI
Os módulos de imagem genérica do kernel (GKI) são usados para oferecer recursos do kernel que não são necessários para a inicialização, separados do kernel genérico principal. Com os módulos GKI, é possível escolher recursos específicos do kernel para usar, reduzindo o tamanho da imagem do kernel e o consumo de memória de tempo de execução. A redução no tamanho torna a GKI adequada para dispositivos Android Go e outros formatos com restrição de recursos.
Os módulos do GKI também oferecem um mecanismo para permitir que os fornecedores incorporem novos recursos upstream após o marco de congelamento da KMI. O código integrado não pode ser substituído sem a criação de outra imagem, enquanto o código entregue como um módulo pode ser substituído por outro módulo.
Os módulos do GKI usam a infraestrutura de assinatura de tempo de build do kernel para diferenciar o GKI de outros módulos no tempo de execução. Os módulos não assinados podem ser carregados desde que usem apenas símbolos que aparecem na lista de permissões ou fornecidos por outros módulos não assinados.
Há dois tipos lógicos de módulos GKI: módulo GKI protegido e módulo GKI não protegido.
Módulo GKI protegido
Um módulo GKI protegido é entregue pelo Google, não é restrito de forma alguma e se comporta como se fosse criado com o kernel após o carregamento. Além disso, os módulos GKI protegidos têm as seguintes características:
- Os módulos GKI protegidos têm acesso a símbolos do kernel não KMI que não estão disponíveis para módulos do fornecedor ou módulos GKI não protegidos.
- Os módulos GKI protegidos podem exportar símbolos que fazem parte da superfície da KMI desde que esses símbolos sejam citados em uma lista de símbolos.
- Os módulos GKI protegidos não podem ser substituídos por módulos do fornecedor.
Um módulo GKI protegido é a classe padrão de módulos GKI. Todos os módulos da GKI são considerados protegidos no momento do congelamento da KMI.
Módulo GKI desprotegido
Um módulo GKI desprotegido pode ser substituído por um módulo do fornecedor. Após o congelamento da KMI, um módulo GKI protegido pode ser reclassificado como desprotegido se a equipe do GKI decidir que os fornecedores precisam substituir a implementação padrão por uma versão que inclua novos recursos do Linux upstream. No próximo lançamento do GKI, os módulos desprotegidos serão reclassificados como protegidos depois que o código upstream for incluído em um kernel comum do Android (ACK). Os módulos GKI desprotegidos têm as seguintes características:
- Os módulos GKI desprotegidos têm o mesmo acesso aos símbolos exportados que os módulos do fornecedor.
- Os módulos GKI desprotegidos não podem exportar símbolos exportados por módulos GKI protegidos.
- Os módulos GKI desprotegidos precisam preservar todas as interfaces KMI como se fizessem parte do kernel principal.
- Módulos GKI desprotegidos podem ser substituídos por módulos do fornecedor.
Módulos do fornecedor
Um módulo do fornecedor é entregue por parceiros para implementar recursos específicos do SoC e do dispositivo. Qualquer módulo de kernel atual que não seja entregue como parte do kernel GKI pode ser entregue como um módulo do fornecedor.
Como um dos principais objetivos do projeto GKI é minimizar
o código específico do hardware no kernel principal, os fornecedores podem esperar que o kernel
GKI não inclua módulos que estejam gerenciando claramente o próprio hardware. Por exemplo, o fornecedor ABC Inc. pode esperar que configurações como CONFIG_ABC_SOC_SUPPORT
não sejam ativadas como módulos GKI integrados ou carregáveis sem suporte.
Se um driver ou framework do kernel existir no ACK, mas não for entregue como parte
do kernel GKI, os fornecedores poderão modificar o driver e entregá-lo como um módulo
do fornecedor. Essas modificações não são recomendadas para módulos não específicos do fornecedor, porque os mesmos recursos podem ser fornecidos com o kernel GKI em uma versão futura. Quando o kernel GKI contém recursos fornecidos por um módulo
do fornecedor, o módulo não é carregado. Por exemplo,
CONFIG_GREYBUS
não está definido para GKI no Android 11, então
os fornecedores podem oferecer módulos de fornecedor do Greybus. No entanto, o CONFIG_GREYBUS
pode ser
ativado como um módulo ou recurso integrado da GKI no Android 12. Nesse
caso, os módulos do fornecedor greybus não serão carregados. Uma prática recomendada é usar a versão upstream de drivers não específicos do fornecedor se eles forem entregues como módulos do fornecedor.
É possível entregar módulos de fornecedor na imagem vendor
ou
vendor_boot
. Os módulos necessários no início do processo de inicialização precisam estar em vendor_boot
.
Há um custo de tempo de inicialização associado ao carregamento de módulos de vendor_boot
.