Paging — Änderungen 2997 → 2998

Zeile 1: Zeile 1:
−
Paging ist ein Mechanismus, der auf vielen Architekturen zum Einsatz kommt. Dabei wird zwischen physikalischem und virtuellem Speicher unterschieden. Der virtuelle Speicher wird in gleich große Blocke, so genannte Pages, unterteilt. Dann kann jeder Page ein physikalischer Speicherbereich zugeordnet werden.
+
Paging ist ein Mechanismus, der auf vielen Architekturen zum Einsatz kommt, um virtuellen Speicher zur Verfügung zu stellen. Virtueller Speicher bedeutet, dass auf dem Prozessor ausgeführte Programme nicht mehr direkt mit Speicheradressen arbeiten, die sich direkt auf den physisch als Hardware vorhandenen RAM beziehen, sondern eine Abstraktionsschicht eingeführt wird.
  
−
Durch das Paging lassen sich weitere Features, wie z.B. [[Swapping]], leichter implementieren. Auch ist durch Paging Speicherschutz gewährleistet, da jeder Prozess einen eigenen virtuellen Adressraum bekommt und somit von den anderen Prozessen abgeschirmt ist.
+
Durch den Einsatz von virtuellem Speicher werden Programme unabhängig davon, an welcher physischen Speicheradresse sie laufen. Dadurch kann vor allem das Problem der Speicherfragmentierung gelöst werden, da Speicherbereiche nicht mehr physisch zusammenhängend sein müssen, um Programmen zusammenhängend zu erscheinen.
 +
 
 +
Durch das Paging lassen sich außerdem weitere Features, wie z.B. [[Swapping]], leichter implementieren. Auch ist durch Paging Speicherschutz gewährleistet, da jeder Prozess einen eigenen virtuellen Adressraum (''Speicherkontext'') zugeordnet bekommen kann und somit von den anderen Prozessen abgeschirmt ist.
 +
 
 +
== Funktionsweise ==
 +
Der virtuelle Speicher wird zunächst in gleich große Blöcke, so genannte Pages, unterteilt. In der x86-Architektur sind dies Blöcke zu je 4 Kilobytes. Einen Speicherkontext kann man sich vereinfacht als eine riesige Tabelle vorstellen, die jedem virtuellen Block einen gleich großen Block irgendwo im physischen Speicher zuweist.
 +
 
 +
Die folgende Tabelle dient als (von den Zahlen her völlig sinnfreie) Veranschaulichung dieser Übersetzung. Wenn das Programm jetzt auf die Speicheradresse 0x1234 zugreift, wird in Wirklichkeit auf die physische Adresse 0x3234 zugegriffen. Es muss nicht jede virtuelle Adresse ''gemappt'' (d.h. einer physischen Adresse zugewiesen) sein - der virtuelle Adressraum ist im Allgemeinen auch größer als der installierte physische Speicher (auf i386 beispielsweise 4 GB). Wird auf eine nicht gemappte Adresse zugegriffen, z.B. 0x25a2 im Beispiel, wird eine Exception (x86: Page Fault) ausgelöst.
 +
 
 +
{| border="1" cellpadding="5"
 +
! Virtuell    || Physisch
 +
|-
 +
| 0x0000 bis 0x0fff || 0xa000
 +
|-
 +
| 0x1000 bis 0x1fff || 0x3000
 +
|-
 +
| 0x2000 bis 0x2fff || --
 +
|-
 +
| ... || ...
 +
|}
 +
 
 +
In der Praxis handelt es sich dabei nicht um eine einzige riesige Tabelle, die wie erwähnt zu großen Teilen ohnehin leer bleiben und Speicher verschwenden würde. Stattdessen benutzt man ein zwei- oder mehrstufiges System.
 +
 
 +
Beim i386 bildet ein ''Page Directory'' einen Speicherkontext ab. Dabei handelt es sich um eine Tabelle, die virtuellen Speicherblöcken von 4 MB Größe die physische Adresse einer ''Page Table'' zuweist oder den Speicherbereich als frei markiert.
 +
 
 +
Die Page Table ist anschließend dafür zuständig, innerhalb "ihrer" 4 MB die Zuordnung der einzelnen 4K-Pages vorzunehmen. Beim Zugriff auf die Adresse 0x456789 wird also zunächst festgestellt, dass die Pagetable für den Bereich 4 bis 8 MB zuständig ist (0x400000 sind 4 MB), und ihre Adresse im Page Directory nachgeschlagen. Anschließend wird innerhalb der Page Table nachgeschlagen, was die physische Adresse für die Bytes 0x56000 bis 0x56fff dieses 4-MB-Blocks ist. Angenommen die Page Table ordnet diesen die physische Adresse 0xabcde000 zu, dann liegt der gesuchte Speicher an 0xabcde789.
  
 
== Einschalten des Paging-Mechanismus ==
 
== Einschalten des Paging-Mechanismus ==