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

Linux – Woher kennt der Linux-Kernel Geräte-Major- und Minor-Nummern?

Soweit ich weiß, erkennt der Kernel Hardware, fügt Informationen zu sysfs hinzu, erstellt ein Gerät in /dev und generiert dann ein udev-Ereignis. Meine Frage ist, machen Gerätetreiber das alles oder ist es der Kernel selbst? Wenn die Treiber dies tun, kennen sie die Major- und Minor-Nummer des Geräts, um die Datei in devtmps zu erstellen.

Ich verstehe auch (vielleicht falsch), dass es udev ist, das modprobe aufruft, um die Treiber zu laden, die ein Gerät handhaben.

Mir wurde gesagt, dass sie dies mit dem Inhalt der uevent-Umgebungsvariablen von MODALIAS tun und somit alle Module laden, deren Aliase mit dieser Zeichenfolge (dem richtigen Treiber) übereinstimmen. Kurz gesagt:Was sind die Schritte der Hardwareerkennung unter Linux und wer führt jeden Schritt aus:der Kernel selbst, der Treiber im Kernel oder udev im Userspace. Danke.

Akzeptierte Antwort:

Der Kernel kennt Gerätenummern, weil er über Gerätenummern entscheidet. Jeder Treiber registriert die Gerätenummern, die er verwaltet. Die Nummern sind entweder im Quellcode fest codiert oder werden in einigen Fällen dynamisch zugewiesen. Das sysfs-Dateisystem ermöglicht es Anwendungen wie udev, die vom Kernel unterstützten Geräte zu erkennen. Siehe Wie erhält udev Gerätenummern für die von ihm erstellten Geräte? für weitere Details.

Der Initialisierungscode des Treibers sucht nach der Hardware und registriert Geräte basierend auf der Hardware, die er während der Suche gefunden hat. Einige Arten von Hardware unterstützen keine Sondierung; Beispielsweise bietet der ISA-Bus (ein weitgehend veralteter Bus auf PC-Computern) keine Möglichkeit, angeschlossene Hardware aufzulisten, sodass der Treiber nur versuchen kann, zu kommunizieren und zu beten, dass nicht ein anderes Peripheriegerät an derselben Adresse angeschlossen ist. Auf einigen Plattformen enthält der Bootloader einen Gerätebaum, der die verfügbaren Peripheriegeräte beschreibt und wo sie zugeordnet sind, und der Linux-Kernel aktiviert Treiber basierend auf diesen Informationen. Es gibt drei Möglichkeiten, wie ein Treiber für ein Peripheriegerät geladen werden kann.

  • Der Treiber kann als Teil des Kernel-Image enthalten sein.
  • Der Treiber kann als Modul kompiliert und explizit geladen werden (z. B. durch Einfügen in /etc/modules oder in einem initramfs).
  • Es gibt einen Mechanismus zum automatischen Laden bestimmter Treiber basierend auf Informationen, die von Bustypen gemeldet werden, die angeschlossene Peripheriegeräte zusammen mit einer universellen Identifikationsnummer auflisten können, wie z. B. PCI (der Hauptbus in modernen PCs) und USB. Der Kernel führt modprobe aus und übergibt ihm einen symbolischen Namen, der die Identifikation des Peripheriegeräts codiert, was ein Alias ​​für den „echten“ Namen des Treibermoduls ist. Siehe Werden Treibermodule automatisch geladen und entladen?
Verwandte:Linux – Wie erstellt man einen Patch, der Einrückungsunterschiede im Code ignoriert?
Linux
  1. So überprüfen Sie die Betriebssystem- und Linux-Version

  2. Sind die Major- und Minor-Nummer eindeutig?

  3. Linux:So finden Sie den für ein Gerät verwendeten Gerätetreiber

  4. Linux – Wie plant der Linux-Kernel die CPU zwischen User Space-Prozessen/Threads und Kernel-Tasks/Jobs?

  5. Wie debuggt man den Linux-Kernel mit GDB und QEMU?

Wie der Linux-Kernel mit Interrupts umgeht

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

Linux – Wie finde ich den Treiber (Modul), der mit einem Gerät unter Linux verbunden ist?

Wie man die Gruppen eines Linux-Benutzers kennt

So erkennen und verwalten Sie Geräte unter Linux

Wie lädt Linux das 'initrd'-Image?