In Linux, the mmap(2) man page wyjaśnia, że anonimowego odwzorowaniaAnonimowy mmap zero wypełniony?
. . . nie jest wspierany przez żaden plik; jego zawartość jest inicjowana do zera.
The FreeBSD mmap(2) man page nie czyni podobną gwarancję o zerowej nadzieniem, choć obiecuje, że bajtów od końca pliku w nieanonimowego mapowania są zero-wypełniony.
Jakie smaki Unix obiecują zwrócić zerową pamięć z anonimowych mmaps? Które z nich w praktyce zwracają pamięć zerową, ale nie zawierają takiej obietnicy na swoich stronach man?
Mam wrażenie, że wypełnianie zera jest częściowo ze względów bezpieczeństwa. Zastanawiam się, czy jakiekolwiek implementacje mmap pomijają wypełnianie zerowe dla strony, która została zmapowana, zmapowana, a następnie zmapowana ponownie przez pojedynczy proces, lub jeśli jakiekolwiek implementacje wypełnią nowo zmapowaną stronę pseudolosowymi bitami lub pewną stałą niezerową.
P.S. Apparently, even brk and sbrk used to guarantee zero-filled pages. Moje eksperymenty na Linuksa zdają się wskazywać, że nawet jeśli pełnych stron są zerowe wypełnione po winy strony po wezwaniem sbrk przydziela im częściowe strony nie są:
#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]);
}