在Linux中,mmap(2)手册解释了匿名映射
. . .不由任何文件支持;其内容初始化为零。
FreeBSD mmap(2)手册没有对零填充做出类似的保证,尽管它承诺非匿名映射中文件结束后的字节将被填充为零。
哪些Unix版本承诺从匿名mmap返回零初始化内存?哪些实际上返回零初始化内存,但在手册页上没有这样的承诺?
我的印象是,零填充部分是出于安全原因。我想知道是否有任何mmap实现跳过了对由单个进程进行mmapped、munmapped,然后再次由该进程进行mmapped的页面的零填充,或者是否有任何实现使用伪随机位或某些非零常数填充新映射的页面。
P.S. 显然,即使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]);
}