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