Sind Kernelmodule spezifisch für Linux oder ein allgemeiner Mechanismus?

Sind Kernelmodule spezifisch für Linux oder ein allgemeiner Mechanismus?

Ich habe in Tanenbaums Buch über Betriebssysteme gelesen, dass es Schutzringe gibt und Ring 0 zum Kernel gehört. Kann man allgemein sagen, dass „Kernelmodule die E/A und Speicherverwaltung von Ring 0 handhaben“ oder ist „Kernelmodul“ spezifisch für Linux und beispielsweise für OpenBSD und MULTICS nicht anwendbar?

Antwort1

Die von Andrew Tanenbaum vorgestellten Ideen sind normalerweise nicht direkt auf Linux (oder einen herkömmlichen monolithischen Unix-Kernel) anwendbar. Die Antwort auf Ihre Frage ist viel einfacher als Sie vorschlagen: Ein Linux-Kernelmodul ist Kernelcode, der kompiliert und in eine separate Datei eingebunden wurde, anstatt in das Kernel-Image eingebunden zu sein. Diese separate Kernelobjektdatei (.ko) kann bei Bedarf zur Laufzeit in den Kerneladressraum geladen werden. Praktisch alle Treiber, die als Kernelmodule kompiliert werden können, können auch statisch in das Kernel-Image eingebunden werden, ohne dass sich die Funktionalität ändert, sobald der Code geladen wurde.

Der Modulcode ist Kernelcode und wird mit denselben Berechtigungen wie der gesamte andere Kernelcode ausgeführt. Ein Kernelmodul kann prinzipiell jeden Kernelcode ersetzen, aber um dies sauber zu tun, muss der Kernel selbst einen Mechanismus bereitstellen, in den sich das Modul einklinken kann.

Eine Randbemerkung zur Terminologie: Schutzringe sind ein Konzept, das mit dem Betriebssystem Multics eingeführt wurde. „Ring 0“ bis „Ring 3“ sind Begriffe, die spezifisch für Intel-Prozessoren sind. Andere Prozessorarchitekturen verwenden andere Begriffe, wie etwa Benutzer-/Supervisor-Modus. Obwohl Intel-Prozessoren vier verschiedene Berechtigungsstufen bieten, verwenden die meisten Betriebssysteme nur zwei: Ring 3 für Code auf Benutzerebene und Ring 0 für Kernel-Code, was den Benutzer-/Supervisor-Modi anderer Prozessoren entspricht. (Die Ausnahme ist OS/2, das drei Berechtigungsstufen verwendet.)

Das Konzept der Berechtigungsstufen wurde in letzter Zeit mit dem Aufkommen der Virtualisierungstechnologie auf Hardwareebene erweitert. Beispielsweise definiert die ARM-Architektur drei Berechtigungsstufen: Benutzer, Supervisor und Hypervisor. Scherzhaft wurde gesagt, dass auf Intel-basierten Maschinen schließlich vier Ringe verwendet werden: Ring 3 für Code auf Benutzerebene, Ring 0 für (virtuelle Maschinen-)Kernelcode, Ring -1 für Hypervisorcode und Ring -2 für den SMM-Modus.

Antwort2

Das Konzept des Kernels ist nicht auf alle Betriebssysteme anwendbar. Es ist weit verbreitet, aber wie es genau auf ein bestimmtes System angewendet wird, kann umstritten sein.

Bei Multiprogrammiersystemen, bei denen Programme voneinander isoliert sind, gibt es eine genaue Definition des Kernels: Der Kernel ist der Teil des Systems, der auf alles zugreifen kann. Der Kernel ist der Teil, der nicht isoliert ist. Die Rolle des Kernels besteht zumindest darin, den Isolationsmechanismus bereitzustellen, aber er kann mehr. In einer traditionellen Unix-Kernelarchitektur, zu der auch Linux gehört, enthält der Kernel auch Hardwaretreiber, Netzwerkprotokolle, Dateisystemtreiber usw.

Auf den meisten Systemen beruht die Isolation zwischen laufenden Programmen auf Hardwarefunktionen (Prozessorberechtigungsmodi, Speicherverwaltungseinheit). Der Kernel ist dann der Teil des Systems, der im Berechtigungsmodus des Prozessors ausgeführt wird, dem Modus, in dem die Berechtigungen des gesamten Systems gesteuert werden können. Auf x86-Prozessoren wird dieser Modus als „Ring 0“ bezeichnet. Beachten Sie, dass „Ring 0“ eine x86-Terminologie und kein allgemeines Konzept ist. Das allgemeine Konzept wird als „Kernelmodus“, „privilegierter Modus“ oder „Supervisormodus“ bezeichnet.

Die Aussage „Kernelmodule handhaben die E/A und Speicherverwaltung von Ring 0“ ergibt keinen Sinn. Der Kernel als Ganzes handhabt die Speicherverwaltung (auf der Ebene der Entscheidung, welcher Prozess welchen Speicher besitzt und an welcher Adresse er darauf zugreift) und die E/A (auf der Ebene des Kopierens von Daten in und aus Peripheriegeräten). Der Kernel als Ganzes läuft im Kernelmodus des Prozessors, also Ring 0 auf einem x86-Prozessor.

Ein Kernelmodul ist ein Teil des Kernels, der nach dem Booten geladen wird. Der einzige Unterschied zwischen einem Modul und Boot-Code besteht in der Art und Weise, wie er geladen wird. Code in einem Kernelmodul wird mit denselben Berechtigungen ausgeführt wie beim Booten geladener Kernelcode und kann dieselben Funktionen ausführen (jeder Code, der als Modul geladen werden kann, kann auch in das Boot-Image aufgenommen werden). Viele moderne Unix-Systeme verfügen über Kernelmodule, darunter Solaris, *BSD, Linux usw.

verwandte Informationen