GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum haben schreibgeschützte speicherabgebildete Regionen schmutzige Seiten?

Eine schmutzige Seite erfordert nicht unbedingt ein Zurückschreiben. Eine schmutzige Seite ist eine Seite, auf die geschrieben wurde, seit der Kernel sie zuletzt als sauber markiert hat. Die Daten müssen nicht immer in die Originaldatei zurück gespeichert werden.

Die Seiten sind privat und nicht freigegeben, sodass sie nicht wieder in der Originaldatei gespeichert werden. Es wäre unmöglich, eine schmutzige Seite durch eine schreibgeschützte Datei zu sichern. Wenn die Seite aus dem RAM entfernt werden muss, wird sie im Swap gespeichert.

Seiten, die schreibgeschützt, privat und schmutzig sind, sich aber im Bereich einer speicherabgebildeten Datei befinden, sind normalerweise Datenseiten, die Konstanten enthalten, die zur Laufzeit initialisiert werden müssen, sich aber nach der Initialisierung nicht ändern. Beispielsweise können sie statische Daten enthalten, die Zeiger einbetten; Die Zeigerwerte hängen von der Adresse ab, an der das Programm oder die Bibliothek abgebildet wird, also müssen sie berechnet werden, nachdem das Programm gestartet wurde, wobei die Seite in diesem Stadium gelesen und geschrieben wird. Nachdem die Zeiger berechnet wurden, ändert sich der Inhalt der Seite in dieser Instanz des Programms nie, sodass die Seite in den schreibgeschützten Zustand geändert werden kann. Siehe „Hunting Down Dirty Memory Pages“ von stosb für ein Beispiel mit Codefragmenten.

Sie können seltener schreibgeschützte, ausführbare, private, schmutzige Seiten sehen; diese treten bei einigen Linkern auf, die Code und Daten freier mischen, oder bei Just-in-Time-Kompilierung.


Zusätzlich zu den Fällen, die Gilles auflistet:

Wenn sich ein Prozess verzweigt, kann der Kernel alle seine schmutzigen Seiten als schreibgeschützt markieren, und sie werden zwischen Eltern und Kind geteilt. Wenn einer der Prozesse auf die Seite schreibt, tritt eine Ausnahme auf, und der Kernel kopiert die Seite und markiert sie als beschreibbar. Das erspart das Kopieren von Seiten, die letztlich durch beide Prozesse nicht wieder verändert werden. (Beachten Sie, dass in dieser Situation die Seiten in der Hardware als schreibgeschützt markiert sind, aber vom Kernel als beschreibbar bekannt sind.)


Linux
  1. Warum ist mmap() schneller als sequentielles IO?

  2. Schnellerer Weg zum Verschieben der Speicherseite als mremap()?

  3. Was sind speicherabgebildete Seiten und anonyme Seiten?

  4. mmap:wird die zugeordnete Datei sofort in den Speicher geladen?

  5. Warum wächst die MAP_GROWSDOWN-Zuordnung nicht?

Linux – Warum zeigt Linux sowohl mehr als auch weniger Speicher an, als ich physisch installiert habe?

Manpage-Zitatzeichen?

Linux – Wie kann sichergestellt werden, dass die Speicherseiten einer gemeinsam genutzten Bibliothek von mehreren Prozessen gemeinsam genutzt werden?

6 Gründe, warum Linux nicht mehr Apps hat

Warum ist Kernel Shared Memory 0 auf Ubuntu 12.04?

Warum zeigt mein System nur 3,2 GiB RAM an, wenn ich definitiv 4,0 GiB habe