Heim > System-Tutorial > LINUX > Hauptteil

Detaillierte Erläuterung des Linux-Kernel-Space und des User-Space

王林
Freigeben: 2024-02-13 21:36:15
nach vorne
1039 Leute haben es durchsucht

Linux-Treiber werden normalerweise im Kernel-Space ausgeführt, können aber auch im User-Space ausgeführt werden. Im Folgenden analysieren wir die Konzepte von Kernel-Space und User-Space im Detail und wie man sie beurteilt.

Linux vereinfacht den Segmentierungsmechanismus, sodass die virtuelle Adresse und die lineare Adresse immer konsistent sind. Daher beträgt der virtuelle Adressraum von Linux auch 0 ~ 4G. Der Linux-Kernel teilt diesen 4G-Byte-Speicherplatz in zwei Teile. Die höchsten 1 GByte (von der virtuellen Adresse 0xC0000000 bis 0xFFFFFFFF) werden vom Kernel verwendet und als „Kernelraum“ bezeichnet. Die unteren 3G-Bytes (von der virtuellen Adresse 0x00000000 bis 0xBFFFFFFF) werden von jedem Prozess verwendet und als „Benutzerraum“ bezeichnet. Da jeder Prozess über Systemaufrufe in den Kernel gelangen kann, besteht der Linux-Kernel aus allen Prozessen im System. Aus einer bestimmten Prozessperspektive kann jeder Prozess also über 4 GByte virtuellen Speicherplatz verfügen

.

Linux verwendet einen zweistufigen Schutzmechanismus: Stufe 0 für den Kernel und Stufe 3 für Benutzerprogramme. Wie aus der Abbildung ersichtlich ist (die Abbildung kann hier nicht dargestellt werden), verfügt jeder Prozess über einen eigenen privaten Benutzerbereich (0 ~ 3G). Dieser Bereich ist für andere Prozesse im System unsichtbar. Die obersten 1 GB des virtuellen Kernelspeichers werden von allen Prozessen und dem Kernel gemeinsam genutzt.

Detaillierte Erläuterung des Linux-Kernel-Space und des User-Space

Der Kernel-Space speichert Kernel-Code und -Daten, während der User-Space des Prozesses den Code und die Daten des Benutzerprogramms speichert. Ob Kernel-Space oder User-Space, sie befinden sich alle im virtuellen Raum. Obwohl der Kernel-Speicherplatz die obersten 1 GB jedes virtuellen Speichers einnimmt, beginnt die Zuordnung zum physischen Speicher immer bei der niedrigsten Adresse (0x00000000). Für den Kernelraum ist seine Adresszuordnung eine sehr einfache lineare Zuordnung. 0xC0000000 ist die Verschiebung zwischen der physischen Adresse und der linearen Adresse, die im Linux-Code als PAGE_OFFSET bezeichnet wird.

Wie kommuniziert man also zwischen Kernel-Space und User-Space? Die Kommunikation erfolgt im Allgemeinen über Systemaufrufe.

Wie kann festgestellt werden, ob ein Treiber ein Benutzermodus-Treiber oder ein Kernel-Modus-Treiber ist? Was sind die Kriterien für die Beurteilung?

Treiber im Benutzerbereichsmodus greifen im Allgemeinen über Systemaufrufe auf die Hardware zu, z. B. durch Zuordnen des E/A-Bereichs des Treibers zum Benutzerbereich usw. Daher sind Systemaufrufe die Hauptgrundlage für die Beurteilung. Darüber hinaus unterscheidet sich die verknüpfte Liste im Benutzermodus von der verknüpften Liste im Kernelmodus. Der Benutzermodus verwendet printf und der Kernelmodus verwendet printk. Jeder Anwendungsbereich im Benutzermodus ist virtuell und relativ unabhängig, im Kernelmodus jedoch nicht unabhängig, daher muss bei der Programmierung sehr vorsichtig vorgegangen werden. Natürlich kann die Kommunikation zwischen Programmen im Benutzermodus und im Kernelmodus über ioctl, sysfs, proc usw. erfolgen.

Kernelmodus und Benutzermodus

Wenn eine Aufgabe (ein Prozess) einen Systemaufruf ausführt und zur Ausführung im Kernel-Code gefangen ist, sagen wir, dass sich der Prozess im Kernel-Laufzustand (oder einfach Kernel-Zustand genannt) befindet. Zu diesem Zeitpunkt führt der Prozessor den Kernelcode mit der höchsten Berechtigungsstufe (Stufe 0) aus. Wenn sich ein Prozess im Kernel-Modus befindet, verwendet der ausgeführte Kernel-Code den Kernel-Stack des aktuellen Prozesses. Jeder Prozess verfügt über einen eigenen Kernel-Stack. Wenn ein Prozess den eigenen Code des Benutzers ausführt, befindet er sich im Benutzerausführungsstatus (Benutzerstatus). Das heißt, der Prozessor läuft im Benutzercode mit der niedrigsten Berechtigungsstufe (Stufe 3). Wenn ein Benutzerprogramm ausgeführt wird und plötzlich durch ein Interrupt-Programm unterbrochen wird, kann man symbolisch auch sagen, dass sich das Benutzerprogramm im Kernel-Status des Prozesses befindet. Weil der Interrupt-Handler den Kernel-Stack des aktuellen Prozesses verwendet. Dies ähnelt in gewisser Weise dem Status eines Prozesses im Kernelmodus.

Kontext verarbeiten und Kontext unterbrechen

Der Prozessor befindet sich immer in einem der folgenden Zustände:

1. Kernelstatus, der im Prozesskontext ausgeführt wird. Der Kernel repräsentiert den Prozess, der im Kernelraum ausgeführt wird

2. Kernel-Status, läuft im Interrupt-Kontext, der Kernel repräsentiert die Hardware, die im Kernel-Bereich läuft;

3. Benutzermodus, läuft im Benutzerbereich.

Benutzerraumanwendungen gelangen über Systemaufrufe in den Kernelraum. Zu diesem Zeitpunkt muss der Benutzerraumprozess viele Variablen und Parameterwerte an den Kernel übergeben. Wenn der Kernelmodus ausgeführt wird, müssen auch einige Registerwerte und Variablen des Benutzerprozesses gespeichert werden. Der sogenannte „Prozesskontext“ kann als Parameter betrachtet werden, der vom Benutzerprozess an den Kernel übergeben wird, sowie als vollständiger Satz von Variablen und Registerwerten, die zu diesem Zeitpunkt vom Kernel und der Umgebung gespeichert werden sollen .

Die Hardware löst das Signal aus, wodurch der Kernel den Interrupt-Handler aufruft und in den Kernelraum eintritt. Während dieses Vorgangs müssen auch einige Variablen und Parameter der Hardware an den Kernel übergeben werden, und der Kernel verwendet diese Parameter, um die Interrupt-Verarbeitung durchzuführen. Der sogenannte „Interrupt-Kontext“ kann tatsächlich als Parameter angesehen werden, die von der Hardware und einigen anderen Umgebungen übergeben werden, die der Kernel speichern muss (hauptsächlich die Prozessumgebung, die derzeit unterbrochen ist).

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Linux-Kernel-Space und des User-Space. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:lxlinux.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!