커널 모듈 개요

커널 모듈에는 하드웨어 제약이 없는 GKI 모듈과 하드웨어와 관련이 있는 공급업체 모듈, 두 가지 유형이 있습니다. 이 페이지에서는 두 가지 유형의 모듈을 간략히 설명합니다.

GKI 모듈

GKI(일반 커널 이미지) 모듈은 일반 코어 커널과 별도로 부팅이 필요하지 않은 커널 기능을 제공하는 데 사용됩니다. GKI 모듈을 사용하면 사용할 특정 커널 기능을 선택할 수 있으므로 커널 이미지 크기와 런타임 메모리 소비를 줄이는 데 도움이 됩니다. 크기가 줄어들면 GKI를 Android Go 기기 및 기타 리소스 제한 폼 팩터에 활용할 수 있습니다.

GKI 모듈은 KMI Freeze 주요 일정 후에 공급업체가 새 업스트림 기능을 통합할 수 있는 메커니즘도 제공합니다. 기본 제공 코드는 다른 이미지를 빌드하지 않고는 교체할 수 없지만 모듈로 제공된 코드는 다른 모듈로 대체될 수 있습니다.

GKI 모듈은 커널의 빌드 시간 서명 인프라를 사용하여 런타임 시 GKI와 다른 모듈을 구별합니다. 서명되지 않은 모듈의 경우 로드하기 위해 허용 목록에 표시되거나 다른 서명되지 않은 모듈에서 제공하는 기호만 사용해야 합니다.

GKI 모듈에는 보호되는 GKI 모듈보호되지 않는 GKI 모듈, 두 가지 논리적 유형이 있습니다.

보호되는 GKI 모듈

보호되는 GKI 모듈은 Google이 제공하며 어떠한 방식으로도 제한되지 않습니다. 또한 로드 후 커널을 사용하여 빌드된 것처럼 동작합니다. 또한 보호되는 GKI 모듈에는 다음과 같은 특성이 있습니다.

  • 보호되는 GKI 모듈은 공급업체 모듈이나 보호되지 않는 GKI 모듈에서 사용할 수 없는 KMI 커널 기호가 아닌 기호에 액세스할 수 있습니다.
  • 보호되는 GKI 모듈은 기호가 기호 목록에 인용되는 한 KMI 노출 영역의 일부가 되는 기호를 내보낼 수 있습니다.
  • 보호되는 GKI 모듈은 공급업체 모듈에서 재정의할 수 없습니다.

보호되는 GKI 모듈은 GKI 모듈의 기본 클래스입니다. 모든 GKI 모듈은 KMI Freeze 시점에 보호된 것으로 간주합니다.

보호되지 않는 GKI 모듈

보호되지 않는 GKI 모듈은 공급업체 모듈에서 재정의할 수 있습니다. KMI Freeze 후, GKI팀이 공급업체에서 업스트림 Linux의 새 기능을 포함하는 버전으로 기본 구현을 재정의해야 한다고 결정하면 보호되는 GKI 모듈은 보호되지 않는 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의 GKI에는 CONFIG_GREYBUS가 설정되지 않으므로 공급업체는 그레이버스 공급업체 모듈을 제공할 수 있습니다. 그러나 CONFIG_GREYBUS는 Android 12에서 GKI 내장 또는 모듈로 사용 설정될 수 있습니다. 이 경우 그레이버스 공급업체 모듈은 로드되지 않습니다. 공급업체 관련 드라이버가 아닌 드라이버가 공급업체 모듈로 제공되면 해당 드라이버의 업스트림 버전을 사용하는 것이 좋습니다.

vendor 또는 vendor_boot 이미지에서 공급업체 모듈을 제공할 수 있습니다. 부팅 프로세스 초기에 필요한 모듈은 vendor_boot에 있어야 합니다. vendor_boot에서 모듈을 로드하는 데는 부팅 시간 비용이 발생합니다.