Ich versuche, Linux-Kernel-Module auf meinem Nitrogen-Board zu finden.
Ich habe die Kernel-Konfiguration entpackt /proc/config.gz
und sehe, dass der Kernel mit vielen Modulen kompiliert wurde.
Ich sehe nur eins rein /vendor/lib/modules
, null rein /system/lib/modules
.
Kann jemand erklären, wo Module installiert sind, wie Module installiert werden?
Linux-Kernel-Module werden auf zwei Arten erstellt: 1. als Teil einer ausführbaren Kernel-Binärdatei (komprimiertes Image), dh mit CONFIG_*=y
Optionen zur Erstellungszeit, oder 2. als separate Kernel-Objektdateien ( .ko
), die unter bestimmten Bedingungen geladen und entladen werden können, dh mit Optionen gebaut CONFIG_*=m
.
Im zweiten Fall werden die .ko
Dateien an einigen Standardspeicherorten abgelegt, normalerweise /lib/modules/
unter Linux und seinem Äquivalent unter Android /system/lib/modules/
oder /vendor/lib/modules/
. Diese Pfade sind in Binärdateien fest codiert, die sie laden, z. B. insmod
, modprobe
.
Bei Versionen vor Pie ( 1 ) wird der Android-Kernel standardmäßig ohne die Option erstellt CONFIG_MODULES=y
, sodass keine Kernel-Module als .ko
Dateien erstellt werden, die mit geladen oder entladen werden können insmod
, modprobe
oder rmmod
wie es bei Standard-Linux-Distributionen der Fall ist. Sie sind auch nicht ausgesetzt, /proc/modules
woher lsmod
Informationen gelesen werden. Jede Kernel-Komponente, die als Modul gebaut werden kann, hat jedoch einen Eintrag in /sys/module
.
Jetzt haben diejenigen Module, die als .ko
Datei kompiliert und geladen werden, eine entsprechende /sys/module/<module>/initstate
Datei, andere nicht. Sie können auf diese Weise bestätigen, ob geladene Module vorhanden sind:
~$ ls /sys/module/*/initstate
*.ko
Dateien auf meinem Emulator zu finden, kann sie aber anscheinend nirgendwo finden. Es ist ein API 30-Emulator, und ich kann die geladenen Module sehen (in /proc/modules
) und die entsprechende Datei existiert für /sys/module/*/initstate
, aber *.ko
es gibt keine Dateien (mit geschaut) find / -name "*.ko"
. Irgendeine Idee, wo sie sonst sein könnten?init
Sie können sich die Konfigurationsdateien ( *.rc
) in /system
und ansehen /vendor
, um zu sehen, wie und von wo Module beim Booten geladen werden. grep -riI <mod_name> /system /vendor /odm /product
oder find /system /vendor /odm /product -iname '*<mod_name>*'
(nicht anhängen .ko
) sollte zu einer Schlussfolgerung führen..ko
von Dateien in fs: source.android.com/devices/architecture/kernel/…Kernel-Module sind ein Stück Code, das in den Kernel-Speicher geladen wird. Es besteht aus mindestens zwei Funktionen wie int, cleanup. Wenn Sie sehen möchten, welche Module in den Kernelspeicher geladen werden, geben Sie einfach die Befehle ein: lsmod
oder cat /proc/modules
. Wenn Sie Kernelmodule im gesamten Speicher der Systempartition finden möchten: find / -name "*.ko"
.
Laden Sie das Kernel-Modul in den Speicher
insmod hello.ko
Kernelmodul entfernen
rmmod hello.ko
für mehr siehe dmesg log .
Chris Stratton