GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie lautet die Reihenfolge, in der das Linux-Kernel-Modul beim Start geladen wird? Wie wird ihnen Priorität eingeräumt?

Sie werden nicht automatisch beim Start oder zu einem anderen Zeitpunkt geladen, obwohl viele von ihnen beim Booten geladen werden. Es gibt drei verschiedene Mechanismen, durch die dies geschieht:

  • Userspace-Anfrage: Das deckt alles ab, von Init-Diensten über udev bis hin zur Befehlszeile. Init oder udev sind wahrscheinlich die einfachsten Mittel, wenn Sie ein bestimmtes Modul beim Booten laden möchten.

  • Hotplug-Gerät: Wenn Sie etwas z. B. an USB oder PCI anschließen, erkennt der Kernel dies und fordert ein geeignetes Modul an, basierend darauf, wie sich das Gerät identifiziert.

  • Erforderliches Protokoll oder andere Implementierung :Wenn der Kernel etwas tun muss, wie z. B. ein Dateisystem lesen, und feststellt, dass ihm das Wissen dazu fehlt, fordert er ein Modul an.

Beachten Sie, dass ich für die letzten beiden den Ausdruck „ein Modul anfordern“ verwendet habe – das liegt daran, dass der Kernel tatsächlich über einen Userspace-Daemon geladen wird, kmod was /sbin/modprobe ausführt . Laut Wolfgang Mauerer in Linux Kernel Architecture , gibt es im 2.6er Kernel nur ~100 verschiedene Stellen, an denen er einen internen request_module() aufruft Funktion.

modprobe verwendet eine Datenbank mit installierten MODULE_ALIAS's. Diese werden im Quellcode des Moduls explizit angegeben oder von seiner MODULE_DEVICE_TABLE abgeleitet, die eine Liste von OEM-Geräte-IDs ist, die das Modul bedient.


Viele Systeme sind so eingerichtet, dass sie ein initrd oder initramfs verwenden. Dies sind Dateisystem-Images, die vom Bootloader geladen und dem Kernel zur Verfügung gestellt werden, bevor dieser die Root-Partition einhängt. Dadurch können Treiber, die zum Mounten der Root-Partition erforderlich sind (Festplattentreiber, Dateisystemtreiber, Device-Mapper oder Treiber für logische Volumes, …) als Module kompiliert und aus dem initrd/initramfs geladen werden.

Die Startskripte auf der initrd (/linuxrc ) oder initramfs (/init ) lädt normalerweise einige Module und sucht das Root-Dateisystem. Jede Distribution hat ihr eigenes Setup. Ubuntu verwendet ein initramfs, das aus Komponenten im initramfs-tools zusammengesetzt wird Paket und neu generiert für jeden Kernel basierend auf den notwendigen Treibern zum Mounten des Root-Dateisystems.

Nachdem das Root-Dateisystem gemountet wurde, werden während des Systemstarts die in /etc/modules aufgelisteten Module angezeigt (Debian, …) oder /etc/modules.conf (Red Hat, Arch, …) geladen werden. Diese Datei listet normalerweise nur wenige Module auf, wenn überhaupt. Die meisten Module werden bei Bedarf geladen.

Wenn der Kernel Hardware erkennt, für die ihm ein Treiber fehlt, oder bestimmte andere Komponenten wie Netzwerkprotokolle oder kryptografische Algorithmen, ruft er /sbin/modprobe auf um das Modul zu laden. Für Hardwaretreiber übergibt der Kernel Namen, die die PCI-ID, die USB-ID oder eine andere systematische Bezeichnung der Hardware kodieren. Es gibt eine Tabelle in /lib/modules/$VERSION/modules.alias die diese systematischen Bezeichnungen auf Modulnamen abbildet. Diese Tabelle wird von depmod generiert und gelesen von modprobe .

Wenn Sie ein zusätzliches Kernelmodul haben, das Sie manuell für ein Hardwaregerät kompiliert haben, legen Sie es in /lib/modules/$VERSION/local ab (erstellen Sie die local Unterverzeichnis, falls es nicht existiert) und führen Sie depmod -a aus um die Alias-Datenbank neu zu generieren. Wenn das Modul für ein ungewöhnliches Feature ist, das der Kernel nicht automatisch erkennen kann, legen Sie es in /lib/modules/$VERSION/local ab , führen Sie depmod -a aus um seine Abhängigkeiten zu analysieren, und fügen Sie den Modulnamen zu /etc/modules hinzu .


Linux
  1. Linux – Was sind die verschiedenen Möglichkeiten zum Festlegen von Dateiberechtigungen usw. unter Gnu/Linux?

  2. Linux – Wie stellt man die Prozessoraffinität eines Prozesses unter Linux ein?

  3. Wie setze ich den Namen eines Threads in Linux pthreads?

  4. So stellen Sie die IP-Adresse von C in Linux ein

  5. Wie kodiere ich ein Linux-Kernel-Modul?

Wie man einen Linux-Kernel im 21. Jahrhundert kompiliert

So laden oder entladen Sie ein Linux-Kernel-Modul

So überprüfen Sie die Kernel-Version in Linux

So stellen oder ändern Sie die Zeitzone in Linux

So ändern Sie die Priorität eines Prozesses in Linux

So richten Sie die UFW-Firewall unter Linux ein