【发布时间】:2013-07-06 17:27:53
【问题描述】:
In Linux, the mmap(2) man page 解释说匿名映射
。 . .没有任何文件支持;它的内容被初始化为零。
The FreeBSD mmap(2) man page 没有对零填充做出类似的保证,但它确实承诺在非匿名映射中文件末尾之后的字节是零填充的。
哪些 Unix 版本承诺从匿名 mmap 返回零初始化内存?哪些在实践中返回零初始化内存,但在他们的手册页上没有做出这样的承诺?
在我的印象中,零填充部分是出于安全原因。我想知道是否有任何 mmap 实现跳过了对被 mmaped、munmapped、然后由单个进程再次 mmaped 的页面进行零填充,或者是否有任何实现用伪随机位或一些非零常量填充新映射的页面。
附: Apparently, even brk and sbrk used to guarantee zero-filled pages.我在 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]);
}
【问题讨论】: