Visão geral dos módulos do kernel

Há dois tipos de módulos do kernel: independentes de hardware Módulos GKI e configurações específicas de hardware módulos do fornecedor. Esta página fornece uma visão geral dos dois tipos de módulos.

Módulos GKI

Os módulos genéricos de imagem do kernel (GKI, na sigla em inglês) são usados para fornecer kernel não exigido pela inicialização recursos separados do kernel genérico do núcleo. Com os módulos GKI, é possível escolher capacidades específicas do kernel para usar, muitas vezes reduzindo o tamanho da imagem do kernel e consumo de memória em tempo de execução. A redução de tamanho torna a GKI adequada para Dispositivos Android Go e outros formatos com recursos restritos.

Os módulos GKI também oferecem um mecanismo para permitir que os fornecedores incorporem novos recursos upstream após o marco de congelamento do KMI. Código integrado não pode ser substituído sem criar outra imagem, enquanto o código é entregue como um módulo pode ser substituído por outro.

Os módulos GKI usam a infraestrutura de assinatura do tempo de build do kernel para diferenciar entre GKI e outros módulos no ambiente de execução. Módulos não assinados podem ser carregados contanto que usem apenas símbolos que apareçam na lista de permissões ou sejam 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 desprotegido.

Módulo GKI protegido

um módulo GKI protegido é fornecido pelo Google, não é restrito de forma alguma; se comporta como se tivesse sido 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 kernel não KMI que não são disponíveis para módulos do fornecedor 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 estejam 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 dos módulos GKI. Todas as GKIs módulos 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 de fornecedor. Depois do congelamento do KMI, um módulo GKI protegido poderá ser reclassificado como desprotegido se a equipe de GKI decide que os fornecedores precisam substituir a implementação padrão com uma versão que inclui novos recursos do Linux upstream. No próximo com lançamento de GKI, os módulos desprotegidos serão reclassificados como protegidos após o código upstream chega em um kernel comum do Android (ACK). 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 o fornecedor módulos.
  • Os módulos GKI desprotegidos não podem exportar símbolos exportados por GKI protegida módulos.
  • Módulos GKI desprotegidos devem preservar interfaces KMI como se parte do núcleo do núcleo.
  • Módulos GKI desprotegidos podem ser substituídos por módulos do fornecedor.

Módulos do fornecedor

Um módulo de fornecedor é fornecido pelos parceiros para implementar SoC e dispositivos específicos recursos. Qualquer módulo do kernel atual que não seja entregue como parte do O kernel de GKI pode ser entregue como um módulo de fornecedor.

Como um dos principais objetivos do projeto de GKI é minimizar código específico de hardware no kernel principal, os fornecedores podem esperar que a GKI o kernel não vai incluir módulos que estejam gerenciando o próprio hardware com clareza. Para exemplo, a fornecedora ABC Inc. pode esperar configurações como CONFIG_ABC_SOC_SUPPORT não será ativado como integrado ou carregável módulos GKI sem o suporte deles.

Se houver um driver ou framework de kernel na ACK, mas não for entregue como parte do o kernel de GKI, os fornecedores podem modificar o driver e entregá-lo como fornecedor mais tarde neste módulo. 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 de GKI em uma versão futura. Quando o kernel de GKI contém recursos fornecidos por um 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 disponibilizar módulos de fornecimento do greenbus. No entanto, CONFIG_GREYBUS pode ser ativada como um módulo ou GKI integrado no Android 12, no caso em que os módulos de fornecedor do “graybus” 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 de fornecedores.

É possível exibir módulos do fornecedor no vendor ou no vendor_boot imagem. 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.