In diesem Kapitel soll es um die Eigenschaften des Protected Mode gehen, die zum einen in den vorangegangenen Kapiteln nur erwähnt wurden und zum anderen erst die volle Nutzung der durch den Protected Mode bereitgestellten Funktionen erlauben. In dieses Kapitel fallen die Möglichkeiten des Prozessors zum Multitasking, zum Verwenden eines virtuellen Speichersystems und sogar die Möglichkeit, mehrere (!) 8086-Prozessoren hardwareseitig zu emulieren.
3.1 PagingPaging dient der Implementation eines virtuellen Speichersystems. Ein (Multitasking-) Betriebssystem ist durch die Verwendung des Paging in der Lage, weitaus größere Programme zu verwalten, als das ohne Paging möglich wäre. Außerdem können durch Paging mehrere Programme (bzw. Tasks) gleichzeitig im Speicher gehalten werden. Diese Möglichkeiten lassen sich mit der optimaleren Speichernutzung bei eingeschaltetem Paging-Mechanismus erklären: Durch geeignete Implementation werden nur die Speicherseiten belegt, die von Programmen bzw. Daten momentan auch wirklich benötigt werden.
Paging ist ein weiteres Verfahren, um logische (virtuelle) Adressen in physische Adressen umzuwandeln. Im Gegensatz zur "normalen" Speicheradressierung im Protected Mode mit Segmenten beliebiger Größe, basiert Paging auf Speicherblöcken konstanter, genau festgelegter Größe, den sogenannten Pageframes.
Die Speicherverwaltung ist aufgrund dieser konstanten Größe in der Lage, nicht benötigte Seiten auf ein anderes Medium (meist die Festplatte) auszulagern und den so freigewordenen Platz im Hauptspeicher mit einer neuen Seite zu belegen. Durch die konstante Seitengröße wird gleichzeitig die Fragmentierung des Hauptspeichers verhindert, die bei der Auslagerung beliebig großer Segmente auftreten würde. Weiterhin muß der von einem Programm benutzte Speicherbereich nicht physikalisch durchgängig im Speicher angelegt sein. Ein Speicherbereich, der beispielsweise über die Seiten 0, 3, 7 und 2 verteilt ist, kann wie ein durchgängiger, linearer Speicherbereich angesprochen werden. Die dabei notwendige Unterteilung in Speicherseiten geschieht für die laufenden Programme unsichtbar und wird vom Prozessor, also hardwaremäßig übernommen.
Paging bei IntelEingeschaltet wird der Paging-Mechanismus durch das Setzen des Bit 31 (PG, Paging-Bit) des Steuerregisters 0 (CR0). Dadurch wird der physische Speicher in Seiten zu jeweils 212=4096 Byte unterteilt und die Berechnung einer physischen Adresse in 3 Stufen durchgeführt (Vgl. Abb. 3.1).
Abb. 3.1: Umwandlung Selektor:Offset in physische Adresse
Die 32 Bit breite, lineare Adresse wird dabei zur Umwandlung in die physische Adresse in 2 Teile aufgeteilt. Die oberen 20 Bit geben die Nummer einer Speicherseite an. Die unteren 12 Bit werden als Offset in die selektierte Speicherseite interpretiert. Um eine physische Adresse zu bilden, wird dabei der Speicherseiten-Index (Bit 31..12) als Index in eine sogenannte Pagetable verwendet. Dieser Tabelle wird die phys. Basisadresse der jeweiligen Seite entnommen. Ein Eintrag in einer solchen Tabelle wird in Abb. 3.2 dargestellt.
Abb. 3.2: Eintrag in der Pagetable
Die oberen 20 Bit (Bit 31..12) des Tabelleneintrages enthalten die Speicherseitennummer. Der Eintrag 0 steht dabei für die Speicherseite 0 (0..4095), der Eintrag 1 für die Speicherseite 1 (4096..8191), der Eintrag 2 für die Speicherseite 2 (8192..12287) usw. Zusammen mit den unteren 12 Bit der linearen (logischen) Adresse bildet der Speicherseitenindex die endgültige physische Adresse.
Die in Abbildung 3.2 mit 0 gekennzeichneten Bits sind für zukünftige Prozessoren reserviert und müssen den Wert 0 enthalten. Die Bit 11, 10 und 9 stehen einer Speicherverwaltung (z.B. dem Betriebssystem) frei zur Verfügung (available, englisch, verfügbar) und können zum Beispiel für Zusatzinformationen genutzt werden.
Bit D steht für "dirty" und wird vom Prozessor gesetzt, wenn auf die entsprechende Seite ein Schreibzugriff durchgeführt wird. Dadurch wird der Speicherverwaltung signalisiert, daß diese Seite nicht ohne zusätzliche Maßnahmen aus dem Speicher entfernt werden kann.
Bit A ("accessed") wird vom Prozessor gesetzt, wenn "irgendein" Zugriff auf die entsprechende Speicherseite durchgeführt wurde (Lesen / Schreiben von Daten oder Programmbefehlen).
Bit P ("present") gibt an, ob sich die entsprechende Speicherseite momentan im Speicher befindet (P=1) oder ausgelagert wurde (P=0). Ist das P-Bit zurückgesetzt (die Speicherseite also nicht im Hauptspeicher) und versucht ein Programm auf die entsprechende Seite zuzugreifen, reagiert der Prozessor mit einer "Page-Fault"-Exception (Interrupt 14). Der Wert des P-Bits wird von der Speicherverwaltung festgelegt.
Die Bits PCD ("page cache disable") und PWT ("page write-through") sind nur beim 80486 definiert und dienen der Steuerung der Cache-Funktion auf Seitenbasis. Ist das PCD-Bit gesetzt, übernimmt der Prozessor aus dieser Seite geladene Daten nicht in seinen internen Cache. Über das PWT-Bit kann der Cache beeinflußt werden. Ist das Bit gesetzt, werden alle Schreibzugriffe auch in den Speicher übertragen ("write-through"). Ist es gelöscht, werden Schreibzugriffe nicht sofort in den Speicher übertragen ("write-back").
Die Bits U/S ("User/Supervisor") und R/W ("Read/Write") dienen der Realisierung eines einfachen Schutzkonzeptes auf Speicherseitenbasis. Sie beeinflussen jedoch nicht die eigentliche Adressbildung. Eine Speicherseite mit einem gesetzten U/S-Bit kann nur von Anwendungen bzw. Programmen der Privilegstufen 0, 1 und 2 benutzt werden. Der Versuch einer Anwendung in Stufe 3, auf eine Seite mit gesetztem U/S-Bit zuzugreifen, endet ebenfalls mit einer Page-Fault Exception (Interrupt 14). Das R/W-Bit legt fest, ob ein Schreibzugriff auf die entsprechende Speicherseite möglich ist. Ist das Bit gesetzt, kann auf die entsprechende Seite auch schreibend zugegriffen werden.
Abbildung 3.3 zeigt die Umwandlung von logischen in physische Adressen.
Abb. 3.3: Bildung der phys. Adresse
Da jeder Eintrag in der Pagetable 32 Bit belegt (4 Byte) und 220 (=1048576) Einträge bereitgestellt werden müssen, ergibt sich ein Speicherplatzbedarf von 4 MB (!) allein für die Pagetable! Hinzu kommt, daß die Pagetable in einem durchgehenden Block untergebracht werden müßte, um über einen Index darauf zugreifen zu können. Aus diesen Gründen wendet Intel bei seinen Prozessoren ein etwas anderes Prinzip an, das mit erheblich weniger Platz für die Pagetables auskommt.
Der 20 Bit breite Index in die Pagetable wird dabei noch einmal in zwei gleich große Komponenten aufgeteilt. Die oberen 10 Bit des 20 Bit breiten Seitenindexes werden als Index in ein sogenanntes Paging-Verzeichnis mit maximal 1024 (220) Einträgen interpretiert. Dieses Paging-Verzeichnis hält nun in seinen einzelnen Einträgen die Adresse jeweils einer Pagetable fest, in die die unteren 10 Bit als Index interpretiert werden. Abb 3.4 zeigt den kompletten Vorgang zur Bildung einer physischen Adresse.
Abb. 3.4: Bildung der physischen Adresse bei Intel-Prozessoren
Über ein weiteres Steuerregister (CR3) wird die Startadresse des Paging-Verzeichnis im Hauptspeicher festgelegt. Das Register enthält dazu in den oberen 20 Bit die physische Startadresse des Paging-Verzeichnis in der Form eines Speicherseitenindexes (ist der Inhalt der oberen 20 Bit z.B. 1234h, so befindet sich das so ausgewählte Paging-Verzeichnis in der phys. Speicherseite 1234h bzw. an der phys. Speicheradresse 1234h * 1000h = 1234000h, da 212= 4096d=1000h).
Die 12 niederwertigen Bit sind beim 80386 reserviert und sollten zurückgesetzt sein. Der 80486 verwendet die Bit 3 und 4 zur Steuerung des Cache. Bit 3 entspricht dabei dem Bit PWT ("Page-write-through") einer Speicherseite bezogen auf das gesamte Paging-Verzeichnis. Ähnlich verhält es sich mit Bit 4, daß dem Bit PCD ("Page-cache-disable") einer Speicherseite entspricht.
Einträge im Paging-Verzeichnis sind nach dem gleichen Prinzip aufgebaut wie Einträge in einer Pagetable. Unterschiede beschränken sich dabei nur auf Details, so wird das D-Bit ("dirty"-Bit) vom Prozessor ignoriert und das A-Bit ("accessed"-Bit) bei jedem Zugriff über die Tabelle gesetzt.
Die Umsetzung linearer in physische Adressen soll anhand des folgenden, konkreten Beispieles demonstriert werden.
Die logische (lineare) 32 Bit Adresse 14F0256Ah soll dabei in eine physische Adresse umgewandelt werden. Das CR3 Register (Start des Paging-Verzeichnisses) enthält den Wert 0002E000h.
Die Schritte zur Bildung einer physischen Adresse werden durch Abb. 3.5 illustriert.
|
Neben der eigentlichen Demonstration der Adressbildung bei eingeschaltetem Paging-Mechanismus zeigt das Beispiel auch das Problem, das beim Paging auftritt. Dem abschließenden Zugriff auf die gewünschte (physische) Adresse gehen insgesamt zwei 32 Bit Leseaktionen voraus: Eine Indizierung des Paging-Verzeichnisses und eine Indizierung der gefundenen Pagetable. Handelt es sich bei dem Zugriff um den ersten Zugriff auf die entsprechende Speicherseite, kommen zwei weitere Schreibzugriffe hinzu, die das "Accessed"- Bit in den jeweiligen Einträgen setzen. Da diese drei bzw. fünf Speicherzugriffe für eine (!) Lese- bzw.- Schreibaktion eine deutliche Verlangsamung des gesamten Systems nach sich ziehen würde, hat Intel ab dem 80386 den sogenannten Translation Lookaside Buffer (TLB) eingeführt.
Translation Lookaside Buffer (TLB)Bei dem TLB handelt es sich um einen chipinternen Cache, der maximal 32 Speicheradressen aufnehmen kann. Der Prozessor überprüft bei jeder Umsetzung von linearen in physische Adressen, ob der entsprechende Eintrag bereits im TLB gespeichert ist. Ist das der Fall, wird der bereits gespeicherte Wert benutzt und es ist kein weiterer Zugriff (für die Umsetzung) notwendig. Ist der Eintrag noch nicht im TLB verfügbar, wird nach dem oben beschriebenen Verfahren die Adresse ermittelt und im TLB festgehalten. Die Abfrage des TLB geschieht in einem parallel zur restlichen Verarbeitung durchgeführten Takt und führt (laut Intel) in rund 98 Prozent zum Erfolg. Die genaue Funktionsweise des TLB wird z.B. im Buch: Hummel: "80386 Referenzhandbuch" erläutert.
Das Beispielprogramm pm_03.asm entspricht dem Programm pm_02.asm, es initialisiert jedoch zusätzlich eine Pagetable für das erste MB des Speichers, legt ein entsprechendes Paging-Verzeichnis an und schaltet den Paging-Mechanismus ein. Zusätzlich dazu initialisiert das Programm den Standard VGA-Grafikmodus 13h (Anmerkung VGA) und zeigt ein Bild in diesem Grafikmodus an. Dabei wird das Bild, wie in diesem Grafikmodus üblich, an die physische Adresse A0000h (unter Nutzung eines für diesen Zweck angelegten Deskriptors) kopiert. Die Pagetable zeigt für diesen Bereich (A0000h..AFFFFh) auf den originalen Bereich (A0000h..AFFFF). Das Bild wird also unverändert dargestellt. Nachdem das Programm auf die Betätigung der ESC-Taste gewartet hat, kopiert es das gleiche Bild in den Bereich B0000h..BFFFFh. Die Pagetable-Einträge wurden jedoch so verändert, daß dieser Bereich nach A0000h..AFFFFh zeigt. Zu Testzwecken wurden dabei einige Einträge so verändert, daß sie nicht an ihren originalen Platz verweisen (z.B. zeigt die Seite B5000..B5FFFh nicht auf die Speicherseite A5000..A5FFFh, sondern in den Bereich AF000..AFFFFh). Als Ergebnis wird das Bild nicht mehr korrekt angezeigt. Das Beispiel illustriert damit, daß die letztendlich angesprochene physische Adresse nur von den Pagetables abhängt. Ein Betriebssystem könnte auf diese Weise auch nicht benötigte Seiten auslagern, neue Seiten dem Speicher hinzufügen oder die Anordnung der Seiten im Speicher verändern, ohne daß das ausgeführte Programm in irgendeiner Weise davon beeinflußt wird. |