In Linux, the mmap(2) man page erklärt, dass eine anonyme MappingAnonym mmap null gefüllt?
. . . wird von keiner Datei unterstützt; sein Inhalt wird auf Null initialisiert.
The FreeBSD mmap(2) man page keine ähnliche Garantie über Null-Füllung machen, obwohl es Versprechen macht, die nach dem Ende einer Datei in einem nicht-anonymen Mapping-Bytes mit Nullen aufgefüllt werden.
Welche Varianten von Unix versprechen Null-initialisierten Speicher von anonymen mmaps zurück zu geben? Welche geben in der Praxis einen Null-initialisierten Speicher zurück, machen aber auf ihren Manpages keine solchen Versprechen?
Es ist mein Eindruck, dass Zero-Füllung teilweise aus Sicherheitsgründen ist. Ich frage mich, ob irgendwelche mmap-Implementierungen die Null-Füllung für eine Seite übersprungen, die mmapped, munmapped, dann wieder von einem einzigen Prozess mmapped wurde, oder ob irgendwelche Implementierungen eine neu zugeordnete Seite mit pseudozufälligen Bits oder einer von Null verschiedenen Konstante füllen.
P.S. Apparently, even brk and sbrk used to guarantee zero-filled pages. Meine Experimente unter Linux scheinen zu zeigen, auch wenn volle Seiten mit Nullen aufgefüllt auf Seitenfehler nach einem sbrk Aufruf ordnet sie, Teilseiten sind nicht:
#include <unistd.h>
#include <stdio.h>
int main() {
const intptr_t many = 100;
char * start = sbrk(0);
sbrk(many);
for (intptr_t i = 0; i < many; ++i) {
start[i] = 0xff;
}
printf("%d\n",(int)start[many/2]);
sbrk(many/-2);
sbrk(many/2);
printf("%d\n",(int)start[many/2]);
sbrk(-1 * many);
sbrk(many/2);
printf("%d\n",(int)start[0]);
}