Unter Linux erklärt die Manpage mmap (2) , dass eine anonyme Zuordnung
ist. . . wird von keiner Datei unterstützt; sein Inhalt wird auf Null initialisiert.
Die FreeBSD mmap (2) Manpage macht keine ähnliche Version Garantie auf Null-Füllung, obwohl es verspricht, dass Bytes nach dem Ende einer Datei in einem nicht anonymen Mapping Nullen sind.
Welche Varianten von Unix versprechen, null-initialisierten Speicher von anonymen mmaps zurückzugeben? Welche geben in der Praxis den Null-initialisierten Speicher zurück, machen aber auf ihren Manpages keine solchen Versprechen?
Ich habe den Eindruck, dass die Nullfüllung teilweise aus Sicherheitsgründen erfolgt. Ich frage mich, ob irgendwelche mmap-Implementierungen das Zero-Filling für eine Seite überspringen, die mmapped, munmapped, dann erneut mit einem einzigen Prozess mapped wurde, oder ob irgendwelche Implementierungen eine neu zugeordnete Seite mit pseudozufälligen Bits oder einer von Null verschiedenen Konstante füllen. p>
P.S. Anscheinend haben sogar brk und sbrk verwendet, um Seiten mit Null zu garantieren. Meine Experimente auf Linux scheinen darauf hinzuweisen, dass, selbst wenn ganze Seiten mit Seitenfehlern gefüllt sind, nachdem ein sbrk-Aufruf sie zugewiesen hat, unvollständige Seiten nicht:
sind %Vor% Es ist schwer zu sagen, welche versprechen was, ohne einfach alle man-Seiten oder andere Release-Dokumentation erschöpfend aufzuzählen, aber der zugrunde liegende Code, der MAP_ANON
verarbeitet, wird (gewöhnlich? immer?) auch verwendet, um bss-Platz für ausführbare Dateien zuzuordnen Der BSS-Raum muss null sein. Also ist es verdammt wahrscheinlich.
Wenn Sie "Ihre alten Werte zurückgeben" (oder einige Werte ungleich null, aber höchstwahrscheinlich Ihre alten), wenn Sie die Zuordnung aufheben und neu zuordnen, scheint es sicher möglich zu sein, wenn ein System "faul" wäre. über die Aufhebung der Freigabe. Ich habe nur ein paar Systeme benutzt, die mmap
an erster Stelle unterstützen (BSD und Linux-Derivate) und keiner ist so faul, zumindest nicht in der Kernel-Code-Behandlung mmap
.
Der Grund, warum sbrk
eine "neugewachsene" Seite auffüllen kann oder auch nicht, hängt wahrscheinlich mit dem Verlauf oder dem Fehlen davon zusammen. Der aktuelle FreeBSD-Code stimmt mit dem überein, was ich von den alten, pre mmap
days her kenne: Es gibt zwei halbgeheime Variablen, minbrk
und curbrk
, und sowohl brk
als auch sbrk
rufen nur% co_de auf % (der echte Systemaufruf), wenn sie SYS_break
auf einen Wert verschieben, der mindestens curbrk
ist. (Eigentlich sieht das etwas kaputt aus: minbrk
hat das at-mindest-Verhalten, aber brk
fügt sein Argument nur zu sbrk
hinzu und ruft curbrk
auf. Scheint harmlos, da der Kernel prüft, in SYS_break
in sys_obreak()
, also wird ein zu negatives /sys/vm/vm_unix.c
mit sbrk()
fehlschlagen.)
Ich müsste mir die Linux C-Bibliothek anschauen (und dann vielleicht auch den Kernel-Code), aber es kann einfach Versuche ignorieren, "die Pause zu verringern", und einfach einen "logischen Bruch" -Wert in libc aufzeichnen. Wenn Sie EINVAL
und keine Anforderungen für die Rückwärtskompatibilität haben, können Sie mmap()
und brk()
vollständig in libc implementieren, indem Sie anonyme Zuordnungen verwenden, und es wäre trivial, beide sozusagen als "Nur-Wachstum" zu implementieren .