Visão geral dos módulos do kernel

Existem dois tipos de módulos de kernel: módulos GKI independentes de hardware e módulos de fornecedores específicos de hardware. Esta página fornece uma visão geral de ambos os tipos de módulos.

Módulos GKI

Os módulos Generic Kernel Image (GKI) são usados ​​para fornecer funcionalidade de kernel que não requer inicialização, separada do kernel principal genérico. Com os módulos GKI, você pode escolher funcionalidades específicas do kernel para usar, geralmente reduzindo o tamanho da imagem do kernel e o consumo de memória em tempo de execução. A redução no tamanho torna o GKI adequado para dispositivos Android Go e outros formatos com recursos restritos.

Os módulos GKI também fornecem um mecanismo que permite aos fornecedores incorporar novos recursos upstream após o marco de congelamento do KMI. O código integrado não pode ser substituído sem a construção de outra imagem, enquanto o código entregue como um módulo pode ser substituído por outro módulo.

Os módulos GKI usam a infraestrutura de assinatura em tempo de construção do kernel para diferenciar entre GKI e outros módulos em tempo de execução. 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.

Existem dois tipos lógicos de módulos GKI: módulo GKI protegido e módulo GKI desprotegido .

Módulo GKI protegido

Um módulo GKI protegido é fornecido pelo Google, não é restrito de forma alguma e se comporta como se tivesse sido compilado com o kernel após o carregamento. Além disso, os módulos GKI protegidos possuem as seguintes características:

  • Os módulos GKI protegidos têm acesso a símbolos de kernel não KMI que não estão disponíveis para módulos de fornecedores ou módulos GKI desprotegidos.
  • Os módulos GKI protegidos podem exportar símbolos que se tornam parte da superfície 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 GKI são considerados protegidos no momento do congelamento do KMI.

Módulo GKI desprotegido

Um módulo GKI desprotegido pode ser substituído por um módulo do fornecedor. Após o congelamento do KMI, um módulo GKI protegido poderá 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. Na próxima versão do GKI, os módulos desprotegidos serão reclassificados como protegidos depois que o código upstream chegar a um Android Common Kernel (ACK). Os módulos GKI desprotegidos possuem as seguintes características:

  • Os módulos GKI desprotegidos têm o mesmo acesso aos símbolos exportados que os módulos do fornecedor.
  • Módulos GKI desprotegidos não podem exportar símbolos exportados por módulos GKI protegidos.
  • Os módulos GKI desprotegidos devem preservar todas as interfaces KMI como se fossem parte do kernel principal.
  • Módulos GKI desprotegidos podem ser substituídos por módulos do fornecedor.

Módulos de fornecedor

Um módulo de fornecedor é fornecido por parceiros para implementar SoC e funcionalidades específicas do dispositivo. Qualquer módulo de kernel existente que não seja entregue como parte do kernel GKI pode ser entregue como um módulo de fornecedor.

Como um dos principais objetivos do projeto GKI é minimizar o código específico de hardware no kernel principal, os fornecedores podem esperar que o kernel GKI não inclua módulos que gerenciam claramente seu próprio hardware. Por exemplo, o fornecedor ABC Inc pode esperar que configurações como CONFIG_ABC_SOC_SUPPORT não sejam habilitadas como módulos GKI integrados ou carregáveis ​​sem seu suporte.

Se um driver ou estrutura de 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. Tais modificações são desencorajadas para módulos não específicos do fornecedor porque a mesma funcionalidade pode ser entregue com o kernel GKI em uma versão futura. Quando o kernel GKI contém funcionalidade fornecida por um módulo do fornecedor, o módulo do fornecedor não será carregado. Por exemplo, CONFIG_GREYBUS não está definido para GKI no Android 11, portanto, os fornecedores podem fornecer módulos de fornecedores greybus. No entanto, CONFIG_GREYBUS pode ser habilitado como um módulo ou GKI integrado no Android 12, caso em que 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.

Você pode entregar módulos de fornecedor na imagem vendor ou vendor_boot . Os módulos necessários no início do processo de inicialização devem estar em vendor_boot . Há um custo de tempo de inicialização associado ao carregamento de módulos de vendor_boot .