Ring (CPU)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Schema der Ringe beim x86-System mit Gates zur Kommunikation

Der Ring, auch Domain genannt, bezeichnet (im Umfeld der Betriebssystem-Programmierung und des Multitaskings) eine Privilegierungs- bzw. Sicherheitsstufe eines Prozesses. Diese schränkt den Prozess gegebenenfalls ein bezüglich des auf der CPU nutzbaren Befehlssatzes und des verwendbaren Speicherbereichs. Die Nutzung von Privilegierungsebenen ist sinnvoll, um die Hardware zu abstrahieren und um Prozesse voneinander abzuschotten.

Im innersten Ring (höchste Berechtigungsstufe) läuft im Allgemeinen das Betriebssystem, evtl. sogar nur dessen Kernel. Das Betriebssystem „darf alles“, insbesondere direkte Hardwarezugriffe und das Eingreifen in die RAM-Bereiche anderer Prozesse. Anwendungsprogramme sind im Allgemeinen auf den äußersten Ring beschränkt (niedrigste Berechtigungsstufe). Für Operationen, welche einen Hardwarezugriff erfordern, müssen Anwendungsprogramme Betriebssystem-Dienste beauftragen.

Umsetzung[Bearbeiten]

Der Befehlssatz wird für unprivilegierte Prozesse („Userland“) derart eingeschränkt, dass sie nicht direkt auf die Hardware zugreifen können und sich auch nicht aus ihrer Privilegierungsebene befreien können. Der Zugriff auf den Speicherbereich anderer Prozesse wird meist durch Speichervirtualisierung verhindert. Somit wird gewährleistet, dass Prozesse z. B. im Ring 3 in keinem Fall Prozesse im Ring 0 oder auch andere Prozesse im Ring 3 beeinflussen können. Da die unprivilegierten Prozesse auf Hardware nicht direkt zugreifen können, existieren sogenannte „Gates“ auf den darunterliegenden Ring, um auf der Programmierschnittstelle des Kernels die notwendigen Aktionen anzufordern.

Prozesse im Ring 0 befinden sich im sogenannten Kernel-Modus (engl. kernel mode) – alle anderen im Benutzer-Modus (engl. user mode). Jeder Wechsel von einem Ring zum anderen erfordert in der CPU einen Kontextwechsel, der einige Rechenzeit in Anspruch nimmt.

Ablauf Betriebssystemaufruf[Bearbeiten]

Meist legt der Prozess niedriger Berechtigung an einer bestimmten Stelle Daten ab, welchen Service des Betriebssystems er wünscht, sowie dessen Aufruf-Parameter. Anschließend löst er einen Softwareinterrupt aus, was ihn selbst unterbricht; die CPU wechselt in den Ring 0 und setzt die Ausführung mit einer speziellen Betriebssystem-Routine fort, welche den Auftrag annimmt und bearbeitet. Ist die Bearbeitung abgeschlossen, so endet diese Betriebssystem-Routine, die CPU wechselt wieder in Ring 3 und setzt den niedrig-berechtigten Prozess an der Unterbrechungsstelle fort.

Voraussetzung[Bearbeiten]

Die CPU muss extern oder intern über eine MMU (Speicher-Verwaltungseinheit, engl. „Memory Management Unit“) verfügen, die sowohl die Umsetzung zwischen virtuellen und physikalischen Speicheradressen vornimmt, als auch die Auswertung der Deskriptoren der virtuellen Speicherseiten. Darüber hinaus muss die CPU über die Möglichkeit verfügen, den zuletzt ausgeführten Befehl zu wiederholen: Bei einer Zugriffsverletzung – ein Prozess greift auf nicht zugelassene Befehle oder Speicherseiten zu, die nicht physikalisch vorhanden sind – wird eine Exception ausgelöst, deren Ursache das Betriebssystem auswerten muss und gegebenenfalls den letzten Befehl wiederholt.

Diese Berechtigungsmodi werden sowohl von x86-Prozessoren (ab 80286) als auch von RISC-Prozessoren und anderen Typen unterstützt.

x86-Prozessor-Systeme[Bearbeiten]

Intel 80286-kompatible Prozessoren unterscheiden vier Privilegierungsstufen: Ring 0, 1, 2 und 3. Dabei stellt Ring 0, genannt „supervisor mode“, die höchste Privilegierungsstufe dar, die bis zur Stufe 3 (Ring 3) immer weiter eingeschränkt wird. Beispiele für Assembler-Anweisungen, die im Ring 0, jedoch nicht im Ring 3 ausgeführt werden dürfen sind z. B. „cli“ und „sti“. Mit diesen Anweisungen wird die Behandlung von (maskierbaren) Hardwareinterrupts ab- bzw. eingeschaltet.

Um Prozesse in einem geschützten Bereich (Ring > 0) ablaufen zu lassen, wird der physikalische Arbeitsspeicher in virtuelle Speicherseiten aufgeteilt. Zu jeder Speicherseite existiert eine Tabelle, in der unter anderem gespeichert ist, in welchem Level (Ring) der Programmcode, der innerhalb dieser Speicherseite gespeichert ist, ausgeführt wird. Diese Auswertung nimmt die MMU meist extern vor.

Mit der Einführung des AMD64-Opcodes, den auch Intel für einige seiner Prozessoren als Intel 64 übernommen hat, existiert im Speicherseitendeskriptor zusätzlich das NX-Flag (engl. „No eXecution“), das eine Unterscheidung zwischen Daten und Programmcode ermöglicht, um so Sicherheitslücken durch Pufferüberläufe vorzubeugen. Der Pufferüberlauf wird zwar nicht direkt verhindert, Programmcode in Datenseiten kann dabei aber nicht ausgeführt werden.

Betriebssysteme auf x86[Bearbeiten]

Die verbreiteten Betriebssysteme für x86 (dazu gehören DOS (mit EMM386.EXE-Speichermanager), Linux und Windows) nutzen lediglich zwei der vier möglichen CPU-Ringe. Im Ring 0 werden der Kernel und alle Hardwaretreiber ausgeführt, während die Anwendungssoftware im unprivilegierten Ring 3 arbeitet. Damit bleibt die Portabilität des Betriebssystems auch auf Prozessorarchitekturen gewährleistet, die nur zwei Ringe unterscheiden können. OS/2 benutzt allerdings Ring 2 für Grafiktreiber.[1] Eine speziell angepasste Version des Speichermanagers EMM386 aus dem Entwicklungskit für DOS Protected Mode Services (für Novell DOS 7, OpenDOS 7.01 und DR-DOS 7.02 und höher) lässt DPMS auf Ring 1 statt auf Ring 0 laufen und erleichtert so das Debugging von Software, die DPMS nutzt.

Die verstärkt verwendeten Virtualisierungslösungen verwenden auch Ring 1. Hierbei wird der Betriebssystemkern aus Ring 0 in Ring 1 verschoben, der Hypervisor residiert dann als darüberliegende Schicht in Ring 0 und verwaltet einen oder mehrere in Ring 1 laufende Betriebssystemkerne. Dies kann allerdings auch durch Rootkits ausgenutzt werden, um Schadcode unbemerkt vom Anwender auf dem Ring 0 ausführen zu lassen (siehe auch Virtual Machine Based Rootkit).

Um die Verwendung von Hypervisoren zu vereinfachen, führen neuere CPUs von Intel und AMD einen neuen „Ring -1“ ein, so dass der Betriebssystemkern in Ring 0 verbleibt, während der Hypervisor als darüberliegende Schicht in Ring -1 residiert. Dabei verwaltet er einen oder mehrere Betriebssystemkerne in Ring 0.

Nicht-x86-Systeme[Bearbeiten]

Die bei x86-Prozessoren vorgenommene Einteilung in vier Ringe wurde schon früher eingesetzt, z. B. bei der VAX. Der Alpha-Prozessor unterstützt einen zusätzlichen geschützten Bereich für dessen PAL-Code, welcher als Ring −1 aufgefasst werden könnte. Die Honeywell 6180, das erste System mit Hardware-Unterstützung für dieses Konzept, kannte acht Ringe.

Bei vielen aktuellen Prozessoren wird oft nur zwischen Supervisor- („alles ist erlaubt“) und User-Modus (eingeschränkte Zugriffe auf Speicherbereiche/​Systemressourcen/​CPU-Register) unterschieden. Der Schutz des Arbeitsspeichers erfolgt über die Seitenverwaltungseinheit MMU der CPU.

Dieses Prinzip lässt sich auch auf x86-Systemen anwenden, indem der Speicher über die Segmentierung als Flat Memory angelegt wird. Dabei läuft die CPU nur in den Privilegierungsstufen 0 und 3.

Einzelnachweise[Bearbeiten]

  1. Presentation Device Driver Reference for OS/2 auf warpspeed.com (englisch)