Als Teil der Modul-Kernel-Anforderungen, die mit Android 8.0 eingeführt wurden, SoC-Kernel (System-on-Chip) müssen ladbare Kernel-Module unterstützen.
Kernel-Konfigurationsoptionen
Zur Unterstützung ladebarer Kernelmodule android-base.config enthält in allen gängigen Kerneln den folgenden Kernel-config-Optionen (oder deren Kernel-Version-Entsprechung):
CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODVERSIONS=y
Alle Geräte-Kernels müssen diese Optionen aktivieren. Kernelmodule sollten auch wann immer möglich das Entladen und Neuladen unterstützen.
Modulsignatur
Die Modulsignierung wird für GKI-Anbietermodule nicht unterstützt. Auf Geräten, die für Folgendes erforderlich sind:
unterstützen Verified Boot, Android erfordert Kernelmodule in den Partitionen
für die dm-verity aktiviert ist. Sie müssen dann keine Person mehr signieren.
Module auf ihre Authentizität.
Mit Android 13 wurde das Konzept der GKI-Module eingeführt. GKI-Module nutzen die Build-Zeit des Kernels
Signaturinfrastruktur, um zwischen GKI und anderen Modulen während der Laufzeit zu unterscheiden.
Nicht signierte Module dürfen geladen werden, solange sie nur Symbole verwenden, die auf der Zulassungsliste stehen
oder von anderen nicht signierten Modulen bereitgestellt werden.
Um das Signieren von GKI-Modulen während des GKI-Builds mit dem Build-Zeit-Schlüsselpaar des Kernels zu erleichtern,
Die GKI-Kernel-Konfiguration hat CONFIG_MODULE_SIG_ALL=y
aktiviert.
Um zu vermeiden, dass während der Build-Kernel-Builds für Geräte Nicht-GKI-Module signiert werden, müssen Sie
# CONFIG_MODULE_SIG_ALL is not set
als Teil Ihrer Kernel-Konfiguration
Fragmenten.
Dateispeicherorte
Bei Android 7.x und niedriger sind hingegen keine Kernel-Module (und
Unterstützung für insmod
und rmmod
), Android 8.x und
empfehlen den Einsatz
von Kernelmodulen. Die folgenden
Die Tabelle zeigt die mögliche Unterstützung von boardspezifischen Peripheriegeräten über drei
Android-Bootmodi
Bootmodus | Speicher | Anzeige | Wähltastatur | Akku | PMIC | Touchscreen | NFC, WLAN, Bluetooth |
Sensoren | Kamera |
---|---|---|---|---|---|---|---|---|---|
Recovery | |||||||||
Ladegerät | |||||||||
Android |
Neben der Verfügbarkeit im Android-Bootmodus können Kernelmodule auch kategorisiert nach ihrer Inhaberschaft (SoC-Anbieter oder ODM) Wenn Kernelmodule sind die Anforderungen für ihre Platzierung im Dateisystem folgt:
- Alle Kernel sollten integrierte Unterstützung für das Booten und Bereitstellen haben Partitionen.
- Kernelmodule müssen aus einer schreibgeschützten Partition geladen werden.
- Für Geräte mit verifiziertem Bootmodus sollten die Kernelmodule aus geprüften Partitionen geladen.
- Die Kernelmodule sollten sich nicht in
/system
befinden. - Für das Gerät erforderliche GKI-Module sollten über
/system/lib/modules
, ein symbolischer Link zu/system_dlkm/lib/modules
. - Kernelmodule vom SoC-Anbieter, die für vollständige Android- oder
Die Modi für das Ladegerät müssen sich in
/vendor/lib/modules
befinden. - Wenn eine ODM-Partition vorhanden ist: erforderliche Kernelmodule aus der ODM
für den vollen Android- oder Ladegerätmodus befinden,
/odm/lib/modules
Andernfalls sollten sich diese Module/vendor/lib/modules
- Kernelmodule vom SoC-Anbieter und ODM, die für die Wiederherstellung erforderlich sind
Modus sollte sich im
ramfs
für die Wiederherstellung unter/lib/modules
. - Kernelmodule, die sowohl für den Wiederherstellungsmodus als auch für die Vollversion von Android oder
Ladegerätmodi sollten sowohl im Wiederherstellungs-
rootfs
als auch im entweder die/vendor
- oder/odm
-Partition (wie beschrieben oben). - Die im Wiederherstellungsmodus verwendeten Kernelmodule sollten nicht von Modulen abhängig sein, die sich im
nur in
/vendor
oder/odm
, da diese Partitionen nicht im Wiederherstellungsmodus bereitgestellt. - Die Kernelmodule von SoC-Anbietern sollten nicht von ODM-Kernelmodulen abhängig sein.
Unter Android 7.x und niedriger: /vendor
und /odm
Partitionen werden nicht vorzeitig bereitgestellt. Unter Android 8.x und höher
um das Laden von Modulen aus
diesen Partitionen zu ermöglichen, wurden Vorkehrungen
um Partitionen frühzeitig bereitzustellen,
Nicht-A/B- und A/B-Geräte. Dies gilt auch für
sorgt dafür, dass die Partitionen sowohl im Android- als auch im Charger-Modus bereitgestellt werden.
Android-Build-Systemunterstützung
In BoardConfig.mk
definiert der Android-Build ein
BOARD_VENDOR_KERNEL_MODULES
, die eine vollständige Liste liefert
der für das Anbieter-Image vorgesehenen Kernelmodule. Die in den
Diese Variable wird unter /lib/modules/
in das Anbieter-Image kopiert.
und nach der Bereitstellung in Android
/vendor/lib/modules
(gemäß den oben genannten Anforderungen).
Beispielkonfiguration der Kernel-Module des Anbieters:
vendor_lkm_dir := device/$(vendor)/lkm-4.x BOARD_VENDOR_KERNEL_MODULES := \ $(vendor_lkm_dir)/vendor_module_a.ko \ $(vendor_lkm_dir)/vendor_module_b.ko \ $(vendor_lkm_dir)/vendor_module_c.ko
In diesem Beispiel wird ein vordefiniertes Repository des Anbieter-Kernelmoduls den Android-Build unter dem oben angegebenen Speicherort ab.
Das Wiederherstellungsabbild kann einen Teil der Anbietermodule enthalten. Das Android-
Build definiert die Variable BOARD_RECOVERY_KERNEL_MODULES
für
dieser Module. Beispiel:
vendor_lkm_dir := device/$(vendor)/lkm-4.x BOARD_RECOVERY_KERNEL_MODULES := \ $(vendor_lkm_dir)/vendor_module_a.ko \ $(vendor_lkm_dir)/vendor_module_b.ko
Der Android-Build führt depmod
aus, um den
Erforderliche modules.dep
-Dateien in /vendor/lib/modules
und /lib/modules
(recovery ramfs
).
Laden und Versionsverwaltung des Moduls
Alle Kernelmodule in einem Durchlauf von init.rc*
durch folgenden Aufruf laden
modprobe -a
. Dadurch wird der Aufwand für eine wiederholte Initialisierung vermieden.
der C-Laufzeitumgebung für das modprobe
-Binärprogramm. Die
Sie können das early-init
-Ereignis ändern, um modprobe
aufzurufen:
on early-init exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \ /vendor/lib/modules module_a module_b module_c ...
Normalerweise muss ein Kernelmodul mit dem Kernel kompiliert werden, den das Modul
verwendet werden soll (andernfalls verweigert der Kernel, das Modul zu laden).
CONFIG_MODVERSIONS
erkennt Schwachstellen und bietet so eine Abhilfe.
in der Binärschnittstelle (Application binary Interface, ABI) aus. Diese Funktion berechnet einen zyklischen
für den Prototyp jedes exportierten Symbols im
und speichert die Werte als Teil des Kernels. für Symbole, die von einem
werden die Werte auch im Kernelmodul gespeichert. Wenn der Parameter
Modul geladen wird, werden die Werte für die vom Modul verwendeten Symbole verglichen.
mit denen im Kernel. Wenn die Werte übereinstimmen, wird das Modul geladen.
sonst schlägt das Laden fehl.
So aktivieren Sie die Aktualisierung des Kernel-Images getrennt vom Anbieter-Image:
CONFIG_MODVERSIONS
aktivieren. Dadurch werden kleine Aktualisierungen
Kernel (z. B. Fehlerbehebungen im Langzeitsupport) unter Aufrechterhaltung der Kompatibilität
mit vorhandenen Kernel-Modulen im Anbieter-Image. Sie können jedoch
CONFIG_MODVERSIONS
behebt einen ABI-Fehler nicht selbst. Wenn die
eines exportierten Symbols in den Kernel-Änderungen, entweder aufgrund von
oder die Kernel-Konfiguration geändert hat,
beeinträchtigt die Kompatibilität mit Kernelmodulen, die dieses Symbol verwenden. In solchen Fällen
muss das Kernelmodul neu kompiliert werden.
Zum Beispiel ist die task_struct
-Struktur im Kernel (definiert in
include/linux/sched.h
) enthält viele Felder, die bedingt
je nach Kernel-Konfiguration. Das sched_info
ist nur vorhanden, wenn CONFIG_SCHED_INFO
aktiviert ist (was
tritt auf, wenn CONFIG_SCHEDSTATS
oder
CONFIG_TASK_DELAY_ACCT
aktiviert sind). Wenn diese Konfiguration
Status der Optionen ändert sich, das Layout der task_struct
-Struktur
und alle exportierten Schnittstellen aus dem Kernel, die
task_struct
geändert werden (z. B.
set_cpus_allowed_ptr
in kernel/sched/core.c
).
Kompatibilität mit zuvor kompilierten Kernelmodulen, die diese
Schnittstellen funktionieren nicht mehr, sodass diese Module mit dem neuen Kernel neu erstellt werden müssen.
Konfiguration.
Weitere Informationen zu CONFIG_MODVERSIONS
finden Sie in der
in der Kernel-Baumstruktur unter
Documentation/kbuild/modules.rst
.