Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Virtueller Speicher und Seitentabelle

Nach dieser Lektion: Ich kann mit einer Seitentabelle eine virtuelle Adresse in eine physische Adresse umrechnen.

Lektion, 55 Min.4 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Warum jedes Programm eigene Adressen hat

Virtueller Speicher gibt jedem Prozess einen eigenen, zusammenhängend wirkenden Adressraum, den das Betriebssystem auf den echten Arbeitsspeicher abbildet. Das schützt Prozesse voreinander und erlaubt, mehr Speicher zu versprechen, als eingebaut ist.

Eine Hochschulbibliothek macht es ähnlich. Sie bestellen ein Buch mit der Signatur aus dem Katalog, und das Personal weiß, in welchem Regal es steht. Der Katalog ist hier die Seitentabelle.

Am Ende dieser Lektion

Notiz

Ich kann mit einer Seitentabelle eine virtuelle Adresse in eine physische Adresse umrechnen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Virtuelle Adressedie Adresse, die ein Programm benutzt
Physische Adressedie echte Stelle im Arbeitsspeicher
Seiteein Block des virtuellen Speichers fester Größe4096 Bytes
Rahmenein Block des echten Speichers, so groß wie eine Seite
Seitentabelledie Tabelle, die jede Seite ihrem Rahmen zuordnet
Offsetder Abstand vom Anfang einer Seite

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Jeder Prozess sieht seinen eigenen Adressraum

Ein Programm liest und schreibt an Adressen. Würden alle Prozesse echte Adressen benutzen, könnte ein fehlerhaftes Programm den Speicher eines anderen überschreiben. Deshalb arbeiten Programme mit virtuellen Adressen. Jeder Prozess beginnt bei seiner eigenen Adresse 0.

Die Hardware übersetzt bei jedem Zugriff die virtuelle in eine physische Adresse. Das ist die echte Stelle im Arbeitsspeicher. Das Bauteil dafür heißt Speicherverwaltungseinheit, kurz MMU.

Virtuell ist oft größer als echt belegt

Linux zeigt in der Datei status zwei Größen eines Prozesses. VmSize ist der virtuelle Adressraum, den der Prozess angefordert hat. VmRSS ist der Teil, der wirklich im Arbeitsspeicher liegt.

VmSize ist meist deutlich größer als VmRSS. Der Befehl unten zeigt beide Zeilen für das Programm grep selbst. Die Zahlen sind in Kilobyte und auf jeder Maschine anders.

Virtuelle und echte Größe von grep

Befehl
grep -E "VmSize|VmRSS" /proc/self/status

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Speicher wird in Seiten und Rahmen zerlegt

Das System schneidet den virtuellen Speicher in gleich große Stücke, die Seiten. Den echten Speicher schneidet es in gleich große Stücke, die Rahmen. Eine Seite passt genau in einen Rahmen. Unter Linux ist die Größe meist 4096 Bytes.

Eine Adresse besteht aus zwei Teilen: der Seitennummer und dem Offset, dem Abstand vom Anfang der Seite. Der Offset bleibt bei der Übersetzung gleich.

Die Seitengröße abfragen

Befehl
getconf PAGESIZE

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: eine Seitentabelle mit vier Seiten

SeiteRahmenIm Speicher?
03ja
1kein Rahmennein
25ja
31ja

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Beispiel: Adresse 700 übersetzen, Seitengröße 256

SchrittRechnungErgebnis
Seitennummer700 geteilt durch 256, ohne Rest2
Offsetder Rest dieser Teilung188
Rahmen laut TabelleEintrag für Seite 25
Physische Adresse5 mal 256, plus 1881468

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Seitennummer und Offset von Adresse 700

Befehl
python3 -c "a = 700; print(a // 256, a % 256)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Fehlt eine Seite, gibt es einen Seitenfehler

Steht in der Seitentabelle, dass die Seite nicht im Speicher ist, löst die Hardware einen Seitenfehler aus. Das Betriebssystem übernimmt: Es holt die Seite von der Festplatte in einen freien Rahmen und trägt sie in die Tabelle ein. Dann wiederholt das Programm den Zugriff.

Deshalb dürfen alle Seiten eines Prozesses zusammen größer sein als der Arbeitsspeicher. Nur die gerade genutzten müssen darin liegen.

Ein häufiger Fehler

Warnung

Viele halten einen Seitenfehler für einen Programmabsturz. Er ist aber normal und wird vom System unbemerkt behoben. Ein Absturz (Segmentation fault) droht nur, wenn die Adresse zu keiner gültigen Seite gehört oder die Rechte verletzt.

Die Seitentabelle schützt Prozesse voreinander

Jeder Prozess hat seine eigene Seitentabelle. Seite 2 von Prozess A und Seite 2 von Prozess B zeigen auf verschiedene Rahmen. Ein Prozess kann den Speicher eines anderen deshalb nicht einmal ansprechen.

Jeder Eintrag enthält auch Rechte: lesen, schreiben, ausführen. In /proc/self/maps listet Linux die Bereiche des eigenen Adressraums auf, jede Zeile mit Adressbereich und Rechten.

Die ersten Bereiche von head ansehen

Befehl
head -n 3 /proc/self/maps

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.