x86-Programmierung und -Betriebsarten (Teil 4)

Priviligierungsstufen

Um die verschiedenen Tasks in einer Multitasking-Umgebung vor Fehlern in einem anderen Task zu schützen, wird jedem Task eine von vier Privilegierungsstufen zugeordnet. Der Betriebssystem-Kernel besitzt die höchste Privilegierung PL=0, Anwendungsprogramme dagegen die geringste Stufe PL=3. Ein Sprung zu einem Task höherer Privilegierungsstufe ist nur über ein Gate möglich.

Die höchste Privilegierungsstufe 0 besitzt üblicherweise der kritische Teil oder Kernel des Betriebssystems. Dieser umfasst zumeist die Routinen zur Speicherverwaltung, dem Ausführen von Task-Switches, die Behandlung von kritischen Fehlern et cetera. Viele Befehle, die den Status des Prozessors oder Computers direkt betreffen, wie beispielsweise LGDT (globale Deskriptortabelle laden) oder LMSW (MSW laden) können im Protected Mode nur von einem Programm ausgeführt werden, das die Privilegierungsstufe 0 aufweist. Damit soll verhindert werden, dass Anwendungsprogramme durch einen Programmierfehler das Betriebssystem zerstören oder Hacker Zugriff auf Daten bekommen.

Betriebssysteme verwalten aber den Computer nicht nur, sondern stellen auch bestimmte Funktionen zur Datenverwaltung, Zeichenausgabe et cetera zur Verfügung. In einem PC unter DOS geschieht dies beispielsweise durch den Interrupt 21h, dem DOS-Funktionsverteiler. Solche Betriebssystemfunktionen laufen meist mit PL=1. Auch Einheiten- und Gerätetreiber (beispielsweise zum Ansteuern der Schnittstellen und Laufwerke) arbeiten häufig auf dieser Stufe. Weniger kritische Betriebssystemfunktionen, zum Beispiel Unterstützungen für eine grafische Benutzeroberfläche (API), können dagegen die Stufe 2 aufweisen.

Die niedrigste Privilegierungsstufe aller Tasks besitzen Anwendungsprogramme, da diese den Computer nur benutzen, nicht aber steuern und kontrollieren sollen. Durch die niedrige Stufe (hohen PL) sind die Daten und Codes anderer Programme und des Betriebssystems sehr gut gegen Programmfehler geschützt. Unter DOS führt beispielsweise ein Programmierfehler, der versehentlich die Interrupt-Vektortabelle überschreibt, zu einem völligen Systemabsturz.

Im Protected Mode reagiert das Betriebssystem auf einen solchen Vorgang unter Ausgabe einer Fehlermeldung nur mit einem Abbruch des fehlerhaften Programms, alle anderen Tasks laufen unbeschädigt und unbeeinflusst weiter. Damit können Bugs, das heißt Programmfehler, besser entdeckt werden. Dies alles setzt natürlich voraus, dass das Betriebssystem (beispielsweise OS/2, Linux oder Windows NT) fehlerfrei ist, was wegen der Komplexität von Multitasking-Betriebssystemen leider keine Selbstverständlichkeit darstellt.