Wo werden Kernel-Module installiert?

Ich versuche, Linux-Kernel-Module auf meinem Nitrogen-Board zu finden.

Ich habe die Kernel-Konfiguration entpackt /proc/config.gzund 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?

Theoretisch könnten sie sich in einer Startup-Ramdisk befinden. Es ist auch möglich, Module zu bauen, aber nicht zu packen (in diesem Fall wären sie nicht verwendbar, aber es sind seltsamere Dinge passiert). Wenn Sie ein bestimmtes Ziel haben, sollten Sie dies in Ihrer Frage bearbeiten - dh versuchen Sie, ein Modul zu finden, von dem Sie glauben, dass es verfügbar ist, das aber nicht geladen wurde?

Antworten (2)

Linux-Kernel-Module werden auf zwei Arten erstellt: 1. als Teil einer ausführbaren Kernel-Binärdatei (komprimiertes Image), dh mit CONFIG_*=yOptionen 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 .koDateien 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 .koDateien erstellt werden, die mit geladen oder entladen werden können insmod, modprobeoder rmmodwie es bei Standard-Linux-Distributionen der Fall ist. Sie sind auch nicht ausgesetzt, /proc/moduleswoher lsmodInformationen gelesen werden. Jede Kernel-Komponente, die als Modul gebaut werden kann, hat jedoch einen Eintrag in /sys/module.

Jetzt haben diejenigen Module, die als .koDatei kompiliert und geladen werden, eine entsprechende /sys/module/<module>/initstateDatei, andere nicht. Sie können auf diese Weise bestätigen, ob geladene Module vorhanden sind:

~$ ls /sys/module/*/initstate
Obwohl Standard- Android möglicherweise keine ladbaren Module verwendet, haben viele aktuelle Geräte dies seit Jahren.
Ja, ich habe mehr als 20 Module auf meinem Gerät.
@IrfanLatif Ich habe versucht, die *.koDateien 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 *.koes gibt keine Dateien (mit geschaut) find / -name "*.ko". Irgendeine Idee, wo sie sonst sein könnten?
@WilliamReed OEMs / ROM-Entwickler können die ladbaren Moduldateien anders benennen. initSie können sich die Konfigurationsdateien ( *.rc) in /systemund ansehen /vendor, um zu sehen, wie und von wo Module beim Booten geladen werden. grep -riI <mod_name> /system /vendor /odm /productoder find /system /vendor /odm /product -iname '*<mod_name>*'(nicht anhängen .ko) sollte zu einer Schlussfolgerung führen.
Offizielle Anleitung zum Platzieren .kovon 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: lsmododer 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 .