Linux では、mmap(2) のマニュアル ページで、匿名マッピングが
. . . どのファイルにも支えられていません。その内容はゼロに初期化されます。
FreeBSD mmap(2) のマニュアル ページは、ゼロ フィルについて同様の保証を行っていませんが、非匿名マッピングのファイルの末尾の後のバイトはゼロ フィルであると約束しています。
匿名のmmapからゼロで初期化されたメモリを返すことを約束するUnixのフレーバーはどれですか? 実際にゼロ初期化されたメモリを返すが、man ページでそのような約束をしていないものはどれですか?
ゼロ埋めは部分的にセキュリティ上の理由によるものだというのが私の印象です。mmap 実装が、単一のプロセスによって mmap され、munmap され、次に再度 mmap されたページのゼロ埋めをスキップするかどうか、または実装が新しくマップされたページを疑似乱数ビットまたはゼロ以外の定数で埋めるかどうか疑問に思います。
PSどうやら、brk と sbrk でさえ、ゼロで埋められたページを保証するために使用されていました。Linux での私の実験では、sbrk 呼び出しによってページが割り当てられた後にページ フォールトで完全なページがゼロで埋められたとしても、部分的なページはそうではないことが示されているようです。
#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]);
}