Wenn Sie mehr darüber erfahren, wie Betriebssysteme und die Hardware, auf der sie ausgeführt werden, funktionieren und miteinander interagieren, werden Sie möglicherweise überrascht sein, dass es zu Kuriositäten oder einer Unterauslastung von „Ressourcen“ kommt. Warum ist das so? Der heutige SuperUser Q & A-Beitrag enthält die Antwort auf die Frage eines neugierigen Lesers.
Die heutige Frage-Antwort-Sitzung wird uns mit freundlicher Genehmigung von SuperUser zur Verfügung gestellt - einer Unterteilung von Stack Exchange, einer Community-gesteuerten Gruppierung von Q & A-Websites.
Foto mit freundlicher Genehmigung von Lemsipmatt (Flickr) .
Die Frage
SuperUser-Reader AdHominem möchte wissen, warum x86-CPUs nur zwei von vier Ringen verwenden:
Nur Linux- und Windows-basierte x86-Systeme werden verwendet Ring 0 für den Kernel-Modus und Ring 3 für den Benutzermodus. Warum unterscheiden Prozessoren überhaupt vier verschiedene Ringe, wenn sie ohnehin nur zwei davon verwenden? Hat sich dies mit der AMD64-Architektur geändert?
Warum verwenden x86-CPUs nur zwei von vier Ringen?
Die Antwort
Der SuperUser-Mitarbeiter Jamie Hanrahan hat die Antwort für uns:
Es gibt zwei Hauptgründe.
Das erste ist, dass, obwohl die x86-CPUs vier Ringe Schutz bieten, die Granularität des Schutzes nur auf Segmentebene liegt. Das heißt, jedes Segment kann zusammen mit anderen Schutzfunktionen wie z. B. schreibgeschützt auf einen bestimmten Ring (Berechtigungsstufe) eingestellt werden. Es sind jedoch nicht so viele Segmentdeskriptoren verfügbar. Die meisten Betriebssysteme wünschen sich eine wesentlich feinere Granularität des Speicherschutzes, z. B. für einzelne Seiten.
Geben Sie also den seitentabellenbasierten Schutz ein. Die meisten, wenn nicht alle modernen x86-Betriebssysteme ignorieren den Segmentierungsmechanismus mehr oder weniger (so weit sie können) und verlassen sich auf den Schutz, der durch die niederwertigen Bits in Seitentabelleneinträgen verfügbar ist. Eines davon wird als "privilegiertes" Bit bezeichnet. Dieses Bit steuert, ob sich der Prozessor in einer der "privilegierten" Ebenen befinden muss, um auf die Seite zuzugreifen. Die "privilegierten" Ebenen sind PL 0, 1 und 2 . Da es sich jedoch nur um ein Bit handelt, beträgt die Anzahl der verfügbaren „Modi“ für den Speicherschutz auf Seite-für-Seite-Schutzstufe nur zwei: Auf eine Seite kann im nicht privilegierten Modus zugegriffen werden oder nicht. Daher nur zwei Ringe. Um vier mögliche Ringe für jede Seite zu haben, müssten sie zwei Schutzbits in jedem Seitentabelleneintrag haben, um eine von vier möglichen Ringenummern zu codieren (genau wie die Segmentdeskriptoren). Sie tun es jedoch nicht.
Der andere Grund ist der Wunsch nach Portabilität des Betriebssystems. Es geht nicht nur um x86; Unix lehrte uns, dass ein Betriebssystem für mehrere Prozessorarchitekturen relativ portabel sein kann und dass es eine gute Sache ist. Einige Prozessoren unterstützen nur zwei Ringe. Da die Betriebssystemimplementierer nicht von mehreren Ringen in der Architektur abhängig waren, machten sie die Betriebssysteme portabler.
Es gibt einen dritten Grund, der für die Windows NT-Entwicklung spezifisch ist. Die Designer von NT (David Cutler und sein Team, die Microsoft von DEC Western Region Labs engagiert hat) hatten umfangreiche Erfahrungen mit VMS. Tatsächlich gehörten Cutler und einige der anderen zu den ursprünglichen Designern von VMS. Der VAX-Prozessor, für den VMS entwickelt wurde, verfügt über vier Ringe (VMS verwendet vier Ringe).
Aber die Komponenten, die in VMS ausgeführt wurden Ringe 1 und 2 (Record Management Services bzw. CLI) wurden im NT-Design nicht berücksichtigt. Ring 2 In VMS ging es nicht wirklich um die Sicherheit des Betriebssystems, sondern darum, die CLI-Umgebung des Benutzers von einem Programm zum nächsten zu erhalten, und Windows hatte dieses Konzept nicht. Die CLI wird wie gewohnt ausgeführt. Wie bei VMS Ring 1 , der RMS-Code in Ring 1 musste anrufen Ring 0 ziemlich oft und Ringübergänge sind teuer. Es stellte sich als weitaus effizienter heraus, einfach dorthin zu gehen Ring 0 und damit fertig sein, anstatt viel zu haben Ring 0 Übergänge innerhalb der Ring 1 Code (wieder nicht, dass NT sowieso so etwas wie RMS hat).
Warum x86 vier Ringe implementiert hat, während Betriebssysteme sie nicht verwendeten, sprechen Sie von Betriebssystemen, die weitaus neuer sind als x86. Viele der Systemprogrammierungsfunktionen von x86 wurden lange vor der Implementierung von NT- oder echten Unix-Kerneln entwickelt, und sie wussten nicht wirklich, was das Betriebssystem verwenden würde. Erst als wir auf x86 Paging erhielten, konnten wir echte Unix-ish- oder VMS-ähnliche Kernel implementieren.
Moderne x86-Betriebssysteme ignorieren nicht nur die Segmentierung weitgehend (sie richten lediglich die C-, D- und S-Segmente mit einer Basisadresse von 0 und einer Größe von 4 GB ein; F- und G-Segmente werden manchmal verwendet, um auf wichtige Datenstrukturen des Betriebssystems zu verweisen ) ignorieren sie auch weitgehend Dinge wie „Taskstatus-Segmente“. Der TSS-Mechanismus wurde eindeutig für das Umschalten des Thread-Kontexts entwickelt, hat jedoch zu viele Nebenwirkungen, sodass moderne x86-Betriebssysteme dies „von Hand“ tun. Das einzige Mal, wenn x86 NT Hardwareaufgaben ändert, sind einige wirklich außergewöhnliche Bedingungen, wie z. B. eine Doppelfehlerausnahme.
In Bezug auf die x64-Architektur wurden viele dieser nicht mehr genutzten Funktionen weggelassen. Zu ihrer Ehre sprach AMD tatsächlich mit Betriebssystem-Kernelteams und fragte, was sie von x86 brauchten, was sie nicht brauchten oder nicht wollten und was sie hinzufügen möchten. Segmente auf x64 existieren nur in der sogenannten Restform, es gibt keine Taskstatusumschaltung usw., und Betriebssysteme verwenden weiterhin nur zwei Ringe.
Haben Sie der Erklärung etwas hinzuzufügen? Ton aus in den Kommentaren. Möchten Sie weitere Antworten von anderen technisch versierten Stack Exchange-Benutzern lesen? Den vollständigen Diskussionsthread finden Sie hier .