【发布时间】:2012-01-20 10:22:07
【问题描述】:
假设我使用 /dev/zero 使用 mmap 分配了一个大内存(40MB),如下所示。
fd = open("/dev/zero", O_RDWR);
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0);
我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代 Linux 内核使用按需分页)。因此,例如,当第一页被触摸并因此被带入物理内存时,内核会将其所有 4096 字节初始化为零,然后当第二页被触摸时,它也会这样做,依此类推。
我的理解正确吗?
【问题讨论】:
-
只要触摸意味着写,是的。否则,如果你只是从零页读取,实际上只有一个零页,它会在第一次写入时被 COW'ed。
-
这在 Android 5.0 上会失败,因为 SELinux 会阻止这种奇怪的事情。这就是 chroot 中的 Inkscape 无法在 Android 上启动的原因。
标签: c linux memory-management gcc mmap