Problem: Nutzeradressraum besteht aus mehreren Bereichen, die aus unterschiedlichen Quellen stammen können.
(In task_struct eingebettet)
Lösung:
1:m
n:1
Rudimentäres Konzept einer Virtualisierung
(MMU: Memory Management Unit à gibts nur bei Linux!)
ê Hauptproblem: fast alle Mapping/Unmapping-Operationen geschehen in Interrupt-Routinen! Statusinformationen sind in vm_area_struct, struct page und in PTEs (Page-Table-Entries) verteilt!
Vorgehensweise (Strategie):
Null-mapping:
Ist bei einem
Aufruf vom do_map() file == null, dann spricht man von einem
anonymen Mapping. Wird auf Speicherseiten lesend zugegriffen,
wird ein Verweis auf immer dieselbe leere Seite eingefügt. Bei
Schreiben einer Seite in einem anonymen Virtuellen Speicherbereich,
wird eine leere Seite initialisiert.
Es gibt eine reservierte
Speicherseite, die nur Null-Bytes enthält. Diese Seite wird
mehrfach eingebettet, aber read-only. beim ersten
Schreibzugriff wird durch wp_page() eine andere (gelöschte)
Seite eingeblendet à anonymes
Mapping
File-Mapping: (startet mit leeren
PTE)
nopage() holt die gewünschte Seite. Bei
RW-Mapping und beim ersten Schreibzugriff wird die Seite auf dirty
gesetzt.
Sys V ist vollkommen getrennt.
ê Der Swapping-Code ist separat von Virtualisierungs-Architektur
à treten sich gegenseitig auf die Füße.
à
neue Architektur!