Warum verwenden x86-CPUs nur zwei von vier Ringen?
Wenn Sie mehr darüber erfahren, wie Betriebssysteme und die Hardware, auf der sie laufen, funktionieren und miteinander interagieren, werden Sie möglicherweise überrascht sein, was als seltsam empfunden wird oder dass die "Ressourcen" nicht ausgenutzt werden. Warum das? Der heutige Q & A-Beitrag von SuperUser hat die Antwort auf die Frage eines neugierigen Lesers.
Die heutige Question & Answer-Sitzung wird dank SuperUser zur Verfügung gestellt - einer Unterteilung von Stack Exchange, einer Community-basierten 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:
Es werden nur Linux- und Windows-basierte x86-Systeme verwendet Ring 0 für den Kernel-Modus und Ring 3 für den Benutzermodus. Warum unterscheiden Prozessoren sogar vier verschiedene Ringe, wenn sie ohnehin nur zwei davon verwenden? Hat sich das bei der AMD64-Architektur geändert??
Warum verwenden x86-CPUs nur zwei von vier Ringen?
Die Antwort
SuperUser-Mitarbeiter Jamie Hanrahan hat die Antwort für uns:
Es gibt zwei Hauptgründe.
Erstens: Die x86-CPUs bieten zwar vier Speicherschutzringe, die Granularität des Schutzes ist jedoch nur auf der Ebene der einzelnen Segmente. Das heißt, jedes Segment kann auf einen bestimmten Ring (Berechtigungsstufe) gesetzt werden, zusammen mit anderen Schutzfunktionen wie schreibgeschützt. Es gibt jedoch nicht so viele Segmentbeschreibungen. Die meisten Betriebssysteme wünschen sich eine viel feinere Granularität des Speicherschutzes, wie… für einzelne Seiten.
Geben Sie also einen seitentabellenbasierten Schutz ein. Die meisten, wenn nicht alle, modernen x86-Betriebssysteme ignorieren mehr oder weniger den Segmentierungsmechanismus (so gut sie dies ohnehin 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" Stufen befinden muss, um auf die Seite zuzugreifen. Die "privilegierten" Stufen sind PL 0, 1 und 2. Es ist jedoch nur ein Bit. Bei der seitenweisen Schutzstufe gibt es nur zwei Arten von "Modi", die den Speicherschutz betreffen: Eine Seite kann aus dem nicht privilegierten Modus heraus aufgerufen werden oder nicht. Also 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 Ringnummern zu kodieren (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 hat uns gelehrt, dass ein Betriebssystem für mehrere Prozessorarchitekturen relativ portabel sein kann und dass es eine gute Sache war. Und einige Prozessoren unterstützen nur zwei Ringe. Da die Betriebssystemumsetzer nicht von mehreren Ringen in der Architektur abhängig waren, wurden die Betriebssysteme tragbarer.
Es gibt einen dritten Grund, der spezifisch für die Windows NT-Entwicklung ist. Die Designer von NT (David Cutler und sein Team, die Microsoft von DEC Western Region Labs eingestellt hat) hatten bereits umfassende Erfahrung mit VMS. Cutler und einige andere gehörten zu den ursprünglichen Designern von VMS. Und der VAX-Prozessor, für den VMS entwickelt wurde, hat vier Ringe (VMS verwendet vier Ringe)..
Aber die Komponenten, die in VMS lief Ringe 1 und 2 (Record Management Services bzw. die CLI) wurden vom NT-Design ausgeschlossen. Ring 2 Bei VMS ging es nicht wirklich um die Sicherheit des Betriebssystems, sondern darum, die CLI-Umgebung des Benutzers von einem Programm zum anderen zu erhalten, und Windows hatte dieses Konzept nicht. Die CLI wird als normaler Prozess 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 viel effizienter heraus, einfach zu gehen Ring 0 und sei damit fertig anstatt viel zu haben Ring 0 Übergänge innerhalb der Ring 1 Code (wieder nicht, dass NT sowieso etwas wie RMS hat).
Warum x86 vier Ringe implementiert hat, während Betriebssysteme sie nicht verwendet haben, sprechen Sie von Betriebssystemen, die weitaus jünger als x86 sind. Viele der Systemprogrammierungsfunktionen von x86 wurden lange vor der Implementierung von NT- oder echten Unix-Kernel-Kerneln entwickelt, und sie wussten nicht wirklich, was das Betriebssystem verwenden würde. Erst wenn wir auf x86 paging waren, konnten wir echte Unix-ish oder VMS-ähnliche Kernel implementieren.
Moderne x86-Betriebssysteme ignorieren die Segmentierung nicht nur weitgehend (sie richten lediglich die Segmente C, D und S 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 hinzuweisen ) ignorieren sie auch weitgehend Dinge wie "Task State Segmente". Der TSS-Mechanismus wurde eindeutig für den Thread-Kontextwechsel konzipiert, hat jedoch zu viele Nebenwirkungen, so dass moderne x86-Betriebssysteme dies "von Hand" tun. Das einzige Mal, wenn x86 NT Hardwareaufgaben ändert, gilt für einige wirklich außergewöhnliche Bedingungen, beispielsweise eine Ausnahme mit doppeltem Fehler.
In Bezug auf die x64-Architektur wurden viele dieser nicht verwendeten Funktionen ausgelassen. AMD hat sich tatsächlich mit Betriebssystemkernel-Teams unterhalten und gefragt, was sie von x86 brauchen, was sie nicht brauchen oder nicht wollen und was sie gerne hinzufügen möchten. Segmente auf x64 existieren nur in einer Form, die als Restsubstanz bezeichnet werden kann, das Wechseln der Taskzustände ist nicht vorhanden usw., und Betriebssysteme verwenden weiterhin nur zwei Ringe.
Haben Sie der Erklärung etwas hinzuzufügen? Sound off in den Kommentaren. Möchten Sie mehr Antworten von anderen technisch versierten Stack Exchange-Benutzern lesen? Hier geht es zum vollständigen Diskussionsthread.