2016-08-04 20 views
1
char *p = (char*) mmap(...); 
....; /* check if p is not -1 */ 
a = *p; 

Beim Ausführen der letzten Anweisung tritt ein Seitenfehler auf. Der Fehlerhandler im Kernel weist eine Seite im physischen Speicher zu und kopiert 4 KB-Bytes aus der Datei in diese Seite und ändert dann den Seiteneintrag. Die Anweisung, die *p lautet, wird dieses Mal erneut erfolgreich ausgeführt.Wo ist der Pfadname der Datei, nachdem mmap aufgerufen wurde?

Wie aber kennt der Fehlerbehandler den Dateinamen und den Pfad, die der Seite zugeordnet sind. Wo ist der Dateiname (oder fd) gespeichert? Und der Offset in der Datei.

Was passiert, wenn eine Seite im Datensegment eines Prozesses ausgelagert wird (in eine Auslagerungsdatei, denke ich)? Woher weiß der Kernel, wohin er kopiert werden muss, wenn die Seite später ausgetauscht werden muss?

Antwort

0

Der Handler kennt den Dateinamen oder den Pfad nicht, da er diese nicht verwendet (Sie können es erkennen, denn selbst wenn die Datei nach der Erstellung des Mappings aus dem Dateisystem gelöscht wird, wird das Mapping fortgesetzt funktionieren einwandfrei, der Dateiinhalt bleibt solange gültig, bis alle offenen Dateideskriptoren und Speicherabbildungen geschlossen sind.

Es verwendet nicht die fd entweder; Sie dürfen close die fd direkt an die mmap Anruf übergeben, und die Zuordnung bleibt gültig (das ist in der Tat notwendig auf einigen Systemen mit niedrigen ulimit s für offene Datei behandelt; Sie können 10.000 Dateien gleichzeitig zuordnen, aber Sie konnte nicht offen halten fd s für alle von ihnen, wenn die ulimit für FDS war 1000).

Was passiert ist, dass bei mmap Zeit der virtuelle Speicher-Manager für das Betriebssystem erstellt eine Reihe von virtuellen Speicher Tabellen, die grundsätzlich sagen, "dieser Speicher wird von den folgenden Festplattensektoren unterstützt". Es verwendet einen sehr ähnlichen Prozess beim Abrufen von Daten, die in die Auslagerungsdatei geschrieben wurden und wieder eingelesen werden müssen. Die einzigen Unterschiede bestehen darin, wie aggressiv Speicher und Festplatte synchronisiert werden, ob die Zuordnung zu einem bestimmten Festplattensektor statisch oder dynamisch ist. obwohl selbst bei "echten" Dateien der Plattensektor sich ändern kann, wenn Sie zB in ein Copy-on-Write-Dateisystem schreiben, muss der Speicher geschrieben (swap) oder einfach weggelassen werden (mmap -ed) Datei ohne schmutzige Seiten)

Es gibt mehrere Schichten der virtuellen Speicheradressübersetzung beteiligt, die sich durch CPU und OS unterscheiden, so dass die genaue Mechanik unterscheidet, aber die Grundidee ist, dass nach mmap Sie umgehen die Verzeichnisstruktur und interagieren mit den zugrunde liegenden Festplattensektoren auf eine Weise, die Dinge wie Namen und Pfade ignoriert.

+0

Danke, ShadowRanger. In diesem Fall lag ich falsch in diesem Thread, oder? http://stackoverflow.com/questions/38850533/how-does-the-page-fault-handler-know-where-to-get-the-4k-bytes/38975619#38975619 Ich dachte, ich hätte die Antwort gefunden. – xiaokaoy