커널 모듈에는 하드웨어에 구애받지 않는 GKI 모듈 과 하드웨어별 공급업체 모듈이라는 두 가지 유형이 있습니다. 이 페이지에서는 두 가지 유형의 모듈에 대한 개요를 제공합니다.
GKI 모듈
GKI(일반 커널 이미지) 모듈은 일반 코어 커널과 별도로 부팅이 필요하지 않은 커널 기능을 제공하는 데 사용됩니다. GKI 모듈을 사용하면 사용할 특정 커널 기능을 선택하여 커널 이미지 크기와 런타임 메모리 소비를 줄이는 경우가 많습니다. 크기가 줄어들기 때문에 GKI는 Android Go 기기 및 기타 리소스가 제한된 폼 팩터에 매우 적합합니다.
GKI 모듈은 KMI 동결 일정 이후 공급업체가 새로운 업스트림 기능을 통합할 수 있는 메커니즘도 제공합니다. 내장 코드는 다른 이미지를 빌드하지 않고는 교체할 수 없지만, 모듈로 제공된 코드는 다른 모듈로 교체할 수 있습니다.
GKI 모듈은 커널의 빌드 시 서명 인프라를 사용하여 런타임 시 GKI와 다른 모듈을 구별합니다. 서명되지 않은 모듈은 허용 목록에 표시되거나 다른 서명되지 않은 모듈에서 제공하는 기호만 사용하는 한 로드가 허용됩니다.
GKI 모듈에는 보호된 GKI 모듈 과 보호되지 않은 GKI 모듈 이라는 두 가지 논리적 유형이 있습니다.
보호된 GKI 모듈
보호된 GKI 모듈은 Google에서 제공하고 어떠한 방식으로도 제한되지 않으며 로드 후 커널을 사용하여 빌드된 것처럼 작동합니다. 또한 보호되는 GKI 모듈에는 다음과 같은 특징이 있습니다.
- 보호된 GKI 모듈은 공급업체 모듈이나 보호되지 않은 GKI 모듈에서 사용할 수 없는 비KMI 커널 기호에 액세스할 수 있습니다.
- 보호된 GKI 모듈은 해당 기호가 기호 목록에 인용되어 있는 한 KMI 표면의 일부가 되는 기호를 내보낼 수 있습니다.
- 보호되는 GKI 모듈은 공급업체 모듈로 재정의될 수 없습니다.
보호된 GKI 모듈은 GKI 모듈의 기본 클래스입니다. 모든 GKI 모듈은 KMI 정지 시 보호되는 것으로 간주됩니다.
보호되지 않은 GKI 모듈
보호되지 않은 GKI 모듈은 공급업체 모듈에 의해 재정의될 수 있습니다. KMI 동결 후 GKI 팀이 공급업체가 업스트림 Linux의 새로운 기능을 포함하는 버전으로 기본 구현을 재정의해야 한다고 결정하면 보호된 GKI 모듈이 보호되지 않은 모듈로 재분류될 수 있습니다. 다음 GKI 릴리스에서는 업스트림 코드가 Android 일반 커널(ACK)에 도착한 후 보호되지 않은 모듈이 보호되는 모듈로 재분류됩니다. 보호되지 않는 GKI 모듈에는 다음과 같은 특징이 있습니다.
- 보호되지 않은 GKI 모듈은 내보낸 기호에 대해 공급업체 모듈과 동일한 액세스 권한을 갖습니다.
- 보호되지 않은 GKI 모듈은 보호된 GKI 모듈에서 내보낸 기호를 내보낼 수 없습니다.
- 보호되지 않는 GKI 모듈은 핵심 커널의 일부인 것처럼 모든 KMI 인터페이스를 유지해야 합니다.
- 보호되지 않은 GKI 모듈은 공급업체 모듈에 의해 재정의될 수 있습니다.
공급업체 모듈
공급업체 모듈은 SoC 및 장치별 기능을 구현하기 위해 파트너가 제공합니다. GKI 커널의 일부로 제공되지 않는 기존 커널 모듈은 공급업체 모듈로 제공될 수 있습니다.
GKI 프로젝트의 주요 목표 중 하나는 핵심 커널에서 하드웨어 관련 코드를 최소화하는 것이므로 공급업체는 GKI 커널에 자체 하드웨어를 명확하게 관리하는 모듈이 포함되지 않을 것이라고 예상할 수 있습니다. 예를 들어 공급업체 ABC Inc에서는 CONFIG_ABC_SOC_SUPPORT
와 같은 구성이 지원 없이는 내장 또는 로드 가능한 GKI 모듈로 활성화되지 않을 것으로 예상할 수 있습니다.
커널 드라이버 또는 프레임워크가 ACK에 있지만 GKI 커널의 일부로 제공되지 않는 경우 공급업체는 드라이버를 수정하여 공급업체 모듈로 제공할 수 있습니다. 향후 릴리스에서는 동일한 기능이 GKI 커널과 함께 제공될 수 있으므로 공급업체별 모듈이 아닌 경우 이러한 수정을 권장하지 않습니다. GKI 커널에 공급업체 모듈에서 제공하는 기능이 포함되어 있으면 공급업체 모듈이 로드되지 않습니다. 예를 들어 Android 11에서는 CONFIG_GREYBUS
GKI에 설정되지 않으므로 공급업체가 그레이버스 공급업체 모듈을 제공할 수 있습니다. 그러나 CONFIG_GREYBUS
Android 12에서 GKI 내장 또는 모듈로 활성화될 수 있으며, 이 경우 그레이버스 공급업체 모듈은 로드되지 않습니다. 가장 좋은 방법은 공급업체 모듈로 제공되는 비공급업체 특정 드라이버의 업스트림 버전을 사용하는 것입니다.
vendor
또는 vendor_boot
이미지에서 공급업체 모듈을 제공할 수 있습니다. 부팅 프로세스 초기에 필요한 모듈은 vendor_boot
에 있어야 합니다. vendor_boot
에서 모듈을 로드하는 것과 관련된 부팅 시간 비용이 있습니다.