Warum haben schreibgeschützte Speicherbereiche schmutzige Seiten?

8

Führen Sie (zum Beispiel) den folgenden Befehl aus, um die Liste der Speicherzuordnungsseiten abzurufen:

pmap -x `pidof bash`

Ich habe diese Ausgabe erhalten: Geben Sie hier die Bildbeschreibung ein Warum sind einige schreibgeschützte Seiten als "schmutzig" markiert, dh geschrieben, die ein Zurückschreiben erfordern? Wenn sie schreibgeschützt sind, sollte der Prozess nicht in der Lage sein, darauf zu schreiben ... (Im angegebenen Beispiel sind schmutzige Seiten immer 4 kB groß, aber ich habe andere Fälle mit anderen Werten gefunden.)

Ich habe auch die / proc / pid / smaps überprüft und diese Seiten werden als "Private Dirty" beschrieben.

RicoRico
quelle

Antworten:

7

Eine schmutzige Seite erfordert nicht unbedingt ein Zurückschreiben. Eine schmutzige Seite wurde geschrieben, seit der Kernel sie zuletzt als sauber markiert hat. Die Daten müssen nicht immer wieder in der Originaldatei 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 fehlerhaft sind, sich jedoch im Bereich einer Speicherzuordnungsdatei befinden, sind normalerweise Datenseiten, die Konstanten enthalten, die zur Laufzeit initialisiert werden müssen, sich jedoch nach der Initialisierung nicht ändern. Beispielsweise können sie statische Daten enthalten, in die Zeiger eingebettet sind. Die Zeigerwerte hängen von der Adresse ab, an der das Programm oder die Bibliothek zugeordnet ist. Sie müssen daher nach dem Start des Programms berechnet werden, wobei die Seite zu diesem Zeitpunkt gelesen und geschrieben wird. Nachdem die Zeiger berechnet wurden, ändert sich der Inhalt der Seite in dieser Instanz des Programms nie mehr, sodass die Seite in schreibgeschützt geändert werden kann. Siehe „Jagd nach Schmutzige Speicherseite“ von stosb für ein Beispiel mit Codefragmenten.

In seltenen Fällen werden schreibgeschützte, ausführbare, private und schmutzige Seiten angezeigt. Dies geschieht bei einigen Linkern, die Code und Daten freier mischen, oder bei der Just-in-Time-Kompilierung.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe es nicht überprüft, aber ich vermute, dass Sie auch schreibgeschützte, ausführbare, private Dirty Pages mit nicht PIC-freigegebenen Objekten erhalten können. Ich scheine mich zu erinnern, dass dies der Grund ist, warum gemeinsam genutzte PIC-Objekte de facto erforderlich geworden sind.
Andrew Henle
2

Zusätzlich zu den Fällen listet Gilles auf:

Wenn sich ein Prozess verzweigt, markiert der Kernel möglicherweise alle seine schmutzigen Seiten als schreibgeschützt und sie werden zwischen dem Elternteil und dem 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. Dies erspart das Kopieren von Seiten, die von beiden Prozessen letztendlich nicht erneut geändert werden. (Beachten Sie, dass in dieser Situation die Seiten in der Hardware als schreibgeschützt markiert sind, dem Kernel jedoch bekannt ist, dass sie beschreibbar sind.)

Eric Postpischil
quelle