Virtuelle Speicherverwaltung
Moderne Betriebssysteme stellen so genannten virtuellen Speicher zur Verfügung. Diese Technik ist gekennzeichnet durch die Verwendung zweier verschiedener Adresstypen, physikalischen und virtuellen Adressen.
Prozesse verwenden grundsätzlich nur virtuelle Adressen. Diese werden von einer Untereinheit des Prozessors, der MMU, in physikalische Adressen umgerechnet. Die physikalischen Adressen werden dann vom Prozessor auf seinem Adressbus ausgegeben, um den Speicher anzusprechen.
Verwendet ein Prozess einen Segmentdeskriptor und einen Offset (die zusammen eine virtuelle Adresse darstellen) um ein Byte anzusprechen, werden in der MMU die folgenden Vorgänge ausgelöst:
in der Segmenttabelle wird die für das Segment zuständige Seitentabelle gesucht,
anhand des Offsets und der gegebenen Seitengrösse wird die Seite bestimmt, in der das referenzierte Byte liegt,
die Seitentabelle liefert die physikalische Adresse der Seite.
Eventuell treten dabei Ausnahmen auf, z.B. wenn der Segmentdeskriptor ungültig ist, der Offset grösser als die Segmentlänge ist, oder die Zugriffsart nicht erlaubt ist.
Ein so genannter Seitenfehler ist dann gegeben, wenn die angesprochene Seite keine physikalische Adresse besitzt. Dann muss das Betriebssystem dafür sorgen, dass eine geeignete andere Seite ausgelagert wird. Der dadurch freiwerdende physikalische Speicherbereich (ein Seitenrahmen) wird der angesprochenen Seite zugeordnet und der Inhalt der angesprochenen Seite von der Festplatte geladen. Danach wird der Prozess ohne negative Auswirkungen bis auf einen gewissen Zeitverlust an der unterbrochenen Stelle fortgesetzt. Diese Technik, einen grösseren Speicherbereich zu simulieren, als tatsächlich vorhanden ist, nennt man Paging.
Bei den gängigen Seiten- und Adressraumgrößen (4 kB, 4GB) ergibt sich das Problem, dass die Seitentabelle sehr viele Einträge hat, aber nicht alle benutzt sind. Dieses Problem wird durch Multilevel Page Tables gelöst. Bei einer Seitentabelle mit zwei Ebenen wird die virtuelle Adresse in drei Teile aufgespalten. Bei 4kB Seitengrösse dienen die niedrigwertigsten 12 Bits der Adresse als Offset in eine Seite. Die restlichen Adressbits werden in zwei Teile aufgespalten, der höherwertige Teil ist ein Index in die erste Ebene der Seitentabelle, der niederwertige Teil ein Index in die zweite Ebene der Seitentabelle. Dabei zeigt jeder Eintrag in der ersten Ebene der Seitentabelle auf eine Untertabelle der zweiten Ebene.
Ein zweiter Ansatz, riesige Seitentabellen zu vermeiden, ist der Ansatz der Inverted Page Tables. Dabei hat die Seitentabelle einen Eintrag für jeden Seitenrahmen des physikalischen Speichers. Der Eintrag enthält Informationen über den besitzenden Prozess und die virtuelle Seite. Damit bei einem Speicherzugriff die invertierte Seitentabelle nicht jedes mal durchsucht werden muss, werden Teile der Tabelle in einem als assoziativen Speicher organisierten Cache in der MMU abgelegt.
Prozesse verwenden grundsätzlich nur virtuelle Adressen. Diese werden von einer Untereinheit des Prozessors, der MMU, in physikalische Adressen umgerechnet. Die physikalischen Adressen werden dann vom Prozessor auf seinem Adressbus ausgegeben, um den Speicher anzusprechen.
Verwendet ein Prozess einen Segmentdeskriptor und einen Offset (die zusammen eine virtuelle Adresse darstellen) um ein Byte anzusprechen, werden in der MMU die folgenden Vorgänge ausgelöst:
in der Segmenttabelle wird die für das Segment zuständige Seitentabelle gesucht,
anhand des Offsets und der gegebenen Seitengrösse wird die Seite bestimmt, in der das referenzierte Byte liegt,
die Seitentabelle liefert die physikalische Adresse der Seite.
Eventuell treten dabei Ausnahmen auf, z.B. wenn der Segmentdeskriptor ungültig ist, der Offset grösser als die Segmentlänge ist, oder die Zugriffsart nicht erlaubt ist.
Ein so genannter Seitenfehler ist dann gegeben, wenn die angesprochene Seite keine physikalische Adresse besitzt. Dann muss das Betriebssystem dafür sorgen, dass eine geeignete andere Seite ausgelagert wird. Der dadurch freiwerdende physikalische Speicherbereich (ein Seitenrahmen) wird der angesprochenen Seite zugeordnet und der Inhalt der angesprochenen Seite von der Festplatte geladen. Danach wird der Prozess ohne negative Auswirkungen bis auf einen gewissen Zeitverlust an der unterbrochenen Stelle fortgesetzt. Diese Technik, einen grösseren Speicherbereich zu simulieren, als tatsächlich vorhanden ist, nennt man Paging.
Bei den gängigen Seiten- und Adressraumgrößen (4 kB, 4GB) ergibt sich das Problem, dass die Seitentabelle sehr viele Einträge hat, aber nicht alle benutzt sind. Dieses Problem wird durch Multilevel Page Tables gelöst. Bei einer Seitentabelle mit zwei Ebenen wird die virtuelle Adresse in drei Teile aufgespalten. Bei 4kB Seitengrösse dienen die niedrigwertigsten 12 Bits der Adresse als Offset in eine Seite. Die restlichen Adressbits werden in zwei Teile aufgespalten, der höherwertige Teil ist ein Index in die erste Ebene der Seitentabelle, der niederwertige Teil ein Index in die zweite Ebene der Seitentabelle. Dabei zeigt jeder Eintrag in der ersten Ebene der Seitentabelle auf eine Untertabelle der zweiten Ebene.
Ein zweiter Ansatz, riesige Seitentabellen zu vermeiden, ist der Ansatz der Inverted Page Tables. Dabei hat die Seitentabelle einen Eintrag für jeden Seitenrahmen des physikalischen Speichers. Der Eintrag enthält Informationen über den besitzenden Prozess und die virtuelle Seite. Damit bei einem Speicherzugriff die invertierte Seitentabelle nicht jedes mal durchsucht werden muss, werden Teile der Tabelle in einem als assoziativen Speicher organisierten Cache in der MMU abgelegt.