Existen dos tipos de módulos de kernel: los módulos de GKI independientes del hardware y los módulos de proveedores específicos del hardware . En esta página, se proporciona una descripción general de ambos tipos de módulos.
Módulos de GKI
Los módulos de imagen genérica del kernel (GKI) se usan para entregar capacidades del kernel que no son necesarias para el arranque, separadas del kernel genérico principal. Con los módulos de GKI, puedes elegir capacidades específicas del kernel para usar, lo que suele reducir el tamaño de la imagen del kernel y el consumo de memoria en el tiempo de ejecución. La reducción de tamaño hace que GKI sea adecuado para dispositivos Android Go y otros factores de forma con recursos limitados.
Los módulos de GKI también proporcionan un mecanismo para permitir que los proveedores incorporen nuevas funciones ascendentes después del hito de congelación de KMI. El código integrado no se puede reemplazar sin compilar otra imagen, mientras que el código entregado como módulo se puede reemplazar por otro módulo.
Los módulos de GKI usan la infraestructura de firma de tiempo de compilación del kernel para diferenciar entre GKI y otros módulos en el tiempo de ejecución. Se permite que se carguen los módulos sin firma, siempre que solo usen símbolos que aparezcan en la lista de entidades permitidas o que proporcionen otros módulos sin firma.
Existen dos tipos lógicos de módulos de GKI: el módulo de GKI protegido y el módulo de GKI no protegido.
Módulo de GKI protegido
Google entrega un módulo de GKI protegido, no está restringido de ninguna manera y se comporta como si se compilara con el kernel después de la carga. Además, los módulos de GKI protegidos tienen las siguientes características:
- Los módulos de GKI protegidos tienen acceso a símbolos de kernel que no son de KMI y que no están disponibles para los módulos de proveedores ni los módulos de GKI no protegidos.
- Los módulos de GKI protegidos pueden exportar símbolos que se convierten en parte de la superficie de KMI, siempre que esos símbolos se citen en una lista de símbolos.
- Los módulos de GKI protegidos no pueden anularse con módulos de proveedores.
Un módulo de GKI protegido es la clase predeterminada de los módulos de GKI. Todos los módulos de GKI se consideran protegidos en el momento de la congelación de KMI.
Módulo de GKI no protegido
Un módulo de GKI no protegido puede anularse con un módulo de proveedores. Después de la congelación de KMI, un módulo de GKI protegido podría reclasificarse como no protegido si el equipo de GKI decide que los proveedores deben anular la implementación predeterminada con una versión que incluya funciones nuevas de Linux ascendente. En la próxima versión de GKI, los módulos no protegidos se reclasifican como protegidos después de que el código ascendente llega a un kernel común de Android (ACK). Los módulos de GKI no protegidos tienen las siguientes características:
- Los módulos de GKI no protegidos tienen el mismo acceso a los símbolos exportados que los módulos de proveedores.
- Los módulos de GKI no protegidos no pueden exportar símbolos exportados por módulos de GKI protegidos.
- Los módulos de GKI no protegidos deben conservar cualquier interfaz de KMI como si fuera parte del kernel principal.
- Los módulos de GKI no protegidos pueden anularse con módulos de proveedores.
Módulos de proveedores
Los socios entregan un módulo de proveedores para implementar capacidades específicas del SoC y del dispositivo. Cualquier módulo de kernel existente que no se entregue como parte del kernel de GKI se puede entregar como un módulo de proveedores.
Dado que uno de los objetivos principales del proyecto GKI es minimizar el código específico del hardware en el kernel principal, los proveedores pueden esperar que el kernel de GKI no incluya módulos que administren claramente su propio hardware. Por ejemplo, el proveedor ABC Inc. puede esperar que las configuraciones como CONFIG_ABC_SOC_SUPPORT no se habiliten como módulos de GKI integrados o cargables sin su compatibilidad.
Si existe un controlador o framework de kernel en ACK, pero no se entrega como parte del kernel de GKI, los proveedores pueden modificar el controlador y entregarlo como un módulo de proveedores. No se recomiendan esas modificaciones para los módulos que no son específicos del proveedor, ya que las mismas capacidades se pueden entregar con el kernel de GKI en una versión futura. Cuando el kernel de GKI contiene capacidades proporcionadas por un módulo de proveedores, este no se carga. Por ejemplo, CONFIG_GREYBUS no está configurado para GKI en Android 11, por lo que los proveedores pueden entregar módulos de proveedores de greybus. Sin embargo, CONFIG_GREYBUS se puede habilitar como un módulo integrado o de GKI en Android 12, en cuyo caso no se cargarán los módulos de proveedores de greybus. Se recomienda usar la versión ascendente de los controladores que no son específicos del proveedor si se entregan como módulos de proveedores.
Puedes entregar módulos de proveedores en la vendor o la
vendor_boot
imagen. Los módulos necesarios al principio del proceso de arranque deben estar en vendor_boot.
Hay un costo de tiempo de arranque asociado con la carga de módulos desde vendor_boot.