Handelt es sich bei einem Gerätetreiber unter Linux um ein Programm / einen Prozess oder nur um eine Bibliothek?

23

Ist ein Gerätetreiber ein Programm, das alleine ausgeführt wird, oder ist es nur eine Bibliothek (eine Gruppe von Funktionen), die in den Speicher geladen wird und Programme können eine ihrer Funktionen aufrufen (so dass es nicht alleine ausgeführt wird).

Und wenn es sich um ein Programm handelt, hat es eine Prozess-ID. Kann ich zum Beispiel einen Gerätetreiber genauso beenden, wie ich jeden anderen Prozess beenden kann?

user255688
quelle
1
Sie können einen Treiber mit rmmod "entladen", aber nur, wenn er nicht verwendet wird.
pjc50

Antworten:

35

Unter Linux sind viele Gerätetreiber Teil des Kernels, keine Bibliotheken oder Prozesse. Programme interact mit diesen unter Verwendung von Gerätedateien ( in der Regel in /dev) und verschiedenen Systemaufrufen wie open, read, write, ioctl...

Es gibt jedoch Ausnahmen. Einige Gerätetreiber verwenden eine Mischung aus Kernel-Treiber-Stubs und User-Space-Bibliotheken ( z . B. mit UIO). Andere werden vollständig im User-Space implementiert, normalerweise über einer Bit-Banging-Schnittstelle (UART oder GPIO). In beiden Fällen sind sie im Allgemeinen in Bearbeitung, sodass Sie keinen separaten Prozess sehen, sondern nur den Prozess, der das Gerät verwendet.

Um einen Gerätetreiber zu "beenden", müssen Sie alle Prozesse stoppen, die ihn verwenden, und dann die Kernelmodule (vorausgesetzt, er ist als Module erstellt) und optional alle anderen Module entfernen, die er verwendet und die nicht mehr benötigt werden. Sie können die Module auf Ihrem System Liste mit lsmodund entladen sie mit rmmododer modprobe -r, welche beide nur funktioniert , wenn lsmodzeigt , dass sie keine Benutzer haben.

Stephen Kitt
quelle
2
Wenn Sie mutig genug sind und Ihr Kernel mit kompiliert wurde CONFIG_MODULE_FORCE_UNLOAD, können Sie versuchen rmmod -f, Module zu entladen, die gerade verwendet werden / nicht zum Entfernen vorgesehen sind / usw. Abgesehen davon, dass ein Kernel einen unzuverlässigen Zustand aufweist, beflecken Sie auch den Kernel.
Ruslan
9

Sie müssen zuerst definieren, was ein Fahrer ist. Ich definiere es als ein Programm oder eine Subroutine, die ein Gerät (wie Ihre Kamera) oder ein Subsystem (wie ein Dateisystem) steuert. Ob dies direkt über das Systemprogramm oder über Kernel-Server oder User-Land-Prozesse geschieht, sollte für diese im Wesentlichen semantische Frage grundsätzlich keine Rolle spielen.

In einigen Fällen bietet Linux nur ein in Software geschriebenes generisches Protokoll an, bei dem der eigentliche "Treiber" ein Gerätebaum ist. Dies ist eine Konfiguration der Hardware-Parameter und der zu verwendenden Software, aus denen ein Treiber besteht.

Im Allgemeinen werden Treiberschnittstellen und -protokolle mithilfe von Kernelmodulen implementiert, die nach Bedarf geladen werden und durch Gerätebäume oder udev-Regeln definiert sind. Ein Kernelmodul ist im engeren Sinne kein Prozess oder keine Bibliothek.

Eine Bibliothek ist nur ein statischer Satz von Code, der in einen bestimmten Prozess geladen werden kann. Moderne Betriebssysteme laden diese Bibliotheken in den gemeinsamen Speicher. Ein Prozess kann selbst auf eine beliebige Anzahl von gemeinsam genutzten Bibliotheken verweisen.

Ein Prozess ist ein laufendes Programm, in dem das Systemprogramm oder der Kernel Ressourcen wie Systemspeicher und CPU-Zeit zugewiesen hat. Kernelmodule können selbst diesem Muster folgen oder nicht, werden jedoch unter Linux nicht als defacto-Prozesse angesehen.

Um Ihre Frage zu beantworten, muss ein Treiber nicht bearbeitet werden, aber es kann sein. Während der Code in einer Bibliothek vorhanden sein kann, wird der Treiber weiterhin über ein Programm in memery geladen, unabhängig davon, ob es sich um den Kernel in Form von Kernelmodulen oder Userland-Prozessen handelt.

Es wird mehr zu einem semantischen Argument, wenn man bedenkt, wie die Gesamtheit eines Fahrers tatsächlich ist. Man könnte sagen, ein Treiber ist immer ein Programm, aber manchmal ist er nicht wie im Fall von Gerätebäumen. Es kann sich auch um einen Userland-Prozess, eine Gerätebaumdatei, Udev-Regeln und ein Kernel-Modul handeln, bei denen sowohl der Prozess als auch das Modul Bibliotheken verwenden die Logik eines Fahrers.

jdwolf
quelle
0

Ein Linux-Gerätetreiber ist im Wesentlichen eine Kernel-Space-Bibliothek . Die Aufrufe werden hauptsächlich von den übergeordneten Treibern oder von den User-Space-Prozessen initiiert, die sie verwenden.

Hiervon gibt es nur wenige Ausnahmen:

  • Kernel-Threads können auch von Treibern gestartet / gestoppt werden. Hierbei handelt es sich im Wesentlichen um Prozesse ohne Benutzerbereich.
  • Interrupt-Handler werden von der Hardware und nicht von den User-Space-Prozessen initiiert.

In anderen Systemen, wie im GNU Hurd, sind die Treiber im Wesentlichen Dämonen, mit denen die Prozesse interagieren können. Unter Linux sind die Treiber Bibliotheken. Beide Konzepte haben jedoch Vor- und Nachteile.

sagt Peter, stell Monica wieder her
quelle