Bei einem 32-Bit-Betriebssystem beträgt die Größe des Adressraums (auch virtueller Adressraum oder linearer Adressraum genannt) 4G (d. h. 2 hoch 32). Dies bedeutet, dass ein Prozess einen maximalen Adressraum von 4G haben kann.
Der Kern des Betriebssystems ist der Kernel, der von gewöhnlichen Anwendungen getrennt ist und Zugriff auf geschützten Speicherplatz und zugrunde liegende Hardwaregeräte hat. Um die Sicherheit des Kernels zu gewährleisten, verhindern moderne Betriebssysteme normalerweise, dass Benutzerprozesse den Kernel direkt bedienen.
Normalerweise wird dies durch die Aufteilung des virtuellen Adressraums in zwei Teile erreicht, den Kernelraum und den Benutzerraum. Was das Linux-Betriebssystem betrifft, werden die höchsten 1 GByte (von der virtuellen Adresse 0xC0000000 bis 0xFFFFFFFF) vom Kernel verwendet und als Kernelraum bezeichnet. Die unteren 3G-Bytes (von der virtuellen Adresse 0x00000000 bis 0xBFFFFFFF) werden von einzelnen Prozessen verwendet und als Benutzerbereich bezeichnet.
Mit anderen Worten, vom 4G-Adressraum jedes Prozesses ist das höchste 1G dasselbe, nämlich der Kernelraum. Nur das verbleibende 3G ist der verfügbare Platz für den Prozess selbst.
Das lässt sich so verstehen: „Der maximale 1G-Kernel-Speicherplatz wird von allen Prozessen gemeinsam genutzt!“ Die folgende Abbildung zeigt die Zuteilung des 4G-Adressraums für jeden Prozess (Bilder stammen aus dem Internet):
Daher unterteilt die CPU Anweisungen in privilegierte und nicht privilegierte Anweisungen. Diese gefährlichen Anweisungen dürfen nur vom Betriebssystem und den zugehörigen Modulen verwendet werden, und normale Anwendungen können nur solche Anweisungen verwenden, die keine Katastrophe verursachen.
Zum Beispiel unterteilt die CPU von Intel die Berechtigungsstufen in 4 Stufen: Ring0~Ring3. Tatsächlich verwenden Linux-Systeme nur zwei Runlevel, Ring0 und Ring3 (dasselbe gilt für Windows-Systeme).
Wenn ein Prozess auf Ring3-Ebene ausgeführt wird, spricht man davon, dass er im Benutzermodus ausgeführt wird, während er, wenn er auf Ring0-Ebene ausgeführt wird, im Kernelmodus ausgeführt wird.
Kernelmodus und BenutzermodusIm Kernel-Modus läuft der Prozess im Kernel-Adressraum und die CPU kann zu diesem Zeitpunkt beliebige Anweisungen ausführen. Der laufende Code unterliegt keinen Einschränkungen und kann frei auf jede gültige Adresse zugreifen oder direkt auf den Port zugreifen. Im Benutzermodus läuft der Prozess im Benutzeradressraum und der ausgeführte Code unterliegt vielen Prüfungen durch die CPU. Sie können nur auf die virtuelle Adresse der Seite zugreifen, auf die im Benutzermodus zugegriffen werden kann, die im Seitentabelleneintrag angegeben ist, der ihre Adresse zuordnet Platz und kann nur direkt auf die zugänglichen Ports zugreifen, die in der I/O-Berechtigungs-Bitmap im Task-Status-Segment (TSS) angegeben sind.
Für das vorherige DOS-Betriebssystem gab es kein Konzept für Kernel-Space, User-Space, Kernel-Status und Benutzerstatus. Es kann davon ausgegangen werden, dass der gesamte Code im Kernelmodus ausgeführt wird, sodass vom Benutzer geschriebener Anwendungscode leicht zum Absturz des Betriebssystems führen kann.
Für Linux isoliert das Design zur Unterscheidung von Kernel-Space und User-Space den Betriebssystemcode (der Betriebssystemcode ist viel robuster als der Anwendungscode) und den Anwendungscode.
Selbst wenn in einer einzelnen Anwendung ein Fehler auftritt, hat dies keinen Einfluss auf die Stabilität des Betriebssystems, sodass andere Programme weiterhin normal laufen können (Linux ist ein Multitasking-System!).
„Die Unterscheidung zwischen Kernel-Space und User-Space dient also im Wesentlichen der Verbesserung der Stabilität und Verfügbarkeit des Betriebssystems.“Tatsächlich wird die gesamte Systemressourcenverwaltung im Kernelbereich abgeschlossen. Zum Beispiel das Lesen und Schreiben von Festplattendateien, das Zuweisen und Wiederverwenden von Speicher, das Lesen und Schreiben von Daten von Netzwerkschnittstellen usw.
Unsere Anwendung kann solche Vorgänge nicht direkt ausführen. Aber wir können solche Aufgaben über die vom Kernel bereitgestellte Schnittstelle erledigen.
Wenn eine Anwendung beispielsweise eine Datei auf der Festplatte lesen möchte, kann sie einen „Systemaufruf“ an den Kernel initiieren und dem Kernel mitteilen: „Ich möchte eine bestimmte Datei auf der Festplatte lesen.“
Tatsächlich wird eine spezielle Anweisung verwendet, um dem Prozess zu ermöglichen, vom Benutzerstatus in den Kernel-Status (in den Kernel-Bereich) zu gelangen. Im Kernel-Bereich kann die CPU beliebige Anweisungen ausführen, einschließlich des Lesens von Daten von der Festplatte. Der spezifische Prozess besteht darin, zuerst die Daten in den Kernelraum einzulesen, sie dann in den Benutzerraum zu kopieren und vom Kernelmodus in den Benutzermodus zu wechseln.
Zu diesem Zeitpunkt ist die Anwendung vom Systemaufruf zurückgekehrt, hat die gewünschten Daten erhalten und kann problemlos mit der Ausführung fortfahren. Um es einfach auszudrücken: Die Anwendung lagert High-Tech-Aufgaben (das Lesen von Dateien von der Festplatte) an den Systemkernel aus, und der Systemkernel erledigt diese Aufgaben professionell und effizient.
Für einen Prozess ist der Prozess des Betretens des Kernelraums vom Benutzerraum und der schließlichen Rückkehr zum Benutzerraum sehr kompliziert. Beispielsweise verfügt das Konzept „Stack“, mit dem wir häufig in Berührung kommen, tatsächlich über einen Stapel im Kernelmodus und im Benutzermodus.
Bei der Ausführung im Userspace nutzt der Prozess den Stack im Userspace, und bei der Ausführung im Kernelspace nutzt der Prozess den Stack im Kernelspace. Daher verfügt jeder Prozess unter Linux über zwei Stapel, einen für den Benutzermodus und einen für den Kernelmodus.
Die folgende Abbildung beschreibt kurz die Konvertierung zwischen Benutzermodus und Kernelmodus:
Da Prozesse im Benutzermodus in den Kernelmodus wechseln müssen, um Systemressourcen zu nutzen, schauen wir uns an, auf wie viele Arten ein Prozess vom Benutzermodus in den Kernelmodus wechseln kann.
Zusammenfassend gibt es drei Möglichkeiten: 系统调用、软中断和硬件中断
. Jede dieser drei Methoden erfordert viel Betriebssystemwissen, daher werde ich hier nicht weiter darauf eingehen.
Als nächstes werfen wir einen Blick auf die Struktur des gesamten Linux-Systems aus der Perspektive des Kernel-Space und des User-Space. Es lässt sich grob in drei Teile unterteilen, von unten nach oben: Hardware -> Kernel-Space -> User-Space. Wie im Bild unten gezeigt (dieses Bild stammt aus dem Internet):
Auf der Hardware steuert der Code im Kernelbereich die Nutzung von Hardwareressourcen. Der Code im Benutzerbereich kann die Hardwareressourcen im System nur über die vom Kernel bereitgestellte Systemaufrufschnittstelle (System Call Interface) nutzen. Tatsächlich ist nicht nur Linux, sondern auch das Design der Windows-Betriebssysteme ähnlich.
Tatsächlich können wir die Aktivität jedes Prozessors zu einem bestimmten Zeitpunkt als eine der folgenden drei zusammenfassen:
Die oben genannten drei Punkte umfassen fast alle Situationen. Wenn beispielsweise die CPU im Leerlauf ist, führt der Kernel einen leeren Prozess aus, der sich im Prozesskontext befindet, aber im Kernelraum ausgeführt wird.
Hinweis: Die Interrupt-Service-Routinen von Linux-Systemen werden nicht im Kontext des Prozesses ausgeführt. Sie werden in einem dedizierten Interrupt-Kontext ausgeführt, der von allen Prozessen unabhängig ist.
Der Grund für die spezielle Ausführungsumgebung besteht darin, sicherzustellen, dass das Interrupt-Serviceprogramm so schnell wie möglich auf die Interrupt-Anforderung reagieren und diese verarbeiten und dann schnell beendet werden kann.
Die meisten modernen Betriebssysteme schützen die Sicherheit und Stabilität des Betriebssystems selbst durch die Gestaltung von Kernel-Space und User-Space. Wenn wir Informationen über Betriebssysteme lesen, stoßen wir daher häufig auf Konzepte wie Kernel-Space, User-Space, Kernel-Modus und Benutzermodus. Ich hoffe, dieser Artikel kann Ihnen helfen, diese grundlegenden Konzepte zu verstehen.
Das obige ist der detaillierte Inhalt vonWas sind Linux-Kernel-Space und User-Space?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!