带/ dev/zero的mmap

Met*_*est 14 c linux gcc memory-management mmap

假设我使用/ dev/zero为mmap分配一个大内存(40MB),如下所示.

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0);
Run Code Online (Sandbox Code Playgroud)

我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我认为现代Linux内核使用Demand分页).因此,例如,当第一页被触摸并因此被带入物理存储器时,内核将其所有4096字节初始化为零,然后当触摸第二页时,它执行相同的操作,依此类推.

我的理解是否正确?

Jen*_*edt 12

是的,如果您第一次触摸它们,页面才会存在.

顺便说一句,MAP_ANONYMOUS在这种情况下你可以使用标志,不需要打开文件描述符/dev/null.

  • @MetallicPriest没什么.任何未初始化的非文件支持的内存,这是某些其他进程或内核内存的潜在泄漏. (7认同)
  • 如果你不想用零填充空格,请使用/ dev/urandom而不是/ dev/zero?:)内核没有业务给你内存,可能包含在同一内存中运行的其他人程序的剩余内容 - 这是一个安全风险. (3认同)
  • @MetallicPriest,本质上内核创建整个零页没有任何开销。这不是“memset”或类似的东西,但通常效率更高。 (2认同)
  • '内核创建整页零.这不是memset' - 你确定吗?创建一个可读的零页面 - 是的,没有memset.但是当你尝试写入尚未写入的"零"页面时,pagefault处理程序将调用memset:[clear_page func](http://lxr.linux.no/#linux+v3.1.5/arch/x86 /include/asm/page_32.h#L39); 来自:handle_mm_fault-> handle_pte_fault-> do_anonymous_page-> alloc_zeroed_user_highpage_movable-> clear_user_highpage-> clear_user_page-> clear_page (2认同)
  • @Jonathan Leffler,内核不会将其他人的页面(也就是其他进程的页面)提供给任何其他进程.我认为你"确实"意思是这个,但你的声明听起来如果用户想要的话,用户可以用一些sysctl/proc条目强制执行该选项..我个人会使用-1而不是匿名mmap的任何文件描述符.为什么一个人想要使用零源(这是`/ dev/zero`本质上是什么)因为匿名获取"分页"的虚拟页面已经归零了我相信.事实上,读取`/ proc/<pid>/maps`,我们发现anon映射的页面已经归零了. (2认同)