带有MAP_POPULATE的Linux mmap(),手册页似乎给出了错误的信息

时间:2014-05-06 18:34:54

标签: linux linux-kernel

在我看来,MAP_POPULATE不仅仅是私有映射,与手册页所说的相反:

  

MAP_POPULATE(自Linux 2.5.46起)填充(prefault)页表   映射。对于文件映射,这会导致对文件进行预读。   以后访问映射不会被页面错误阻止。   自Linux以来,MAP_POPULATE仅支持私有映射   2.6.23。

根据我对mmap.c的Linux内核源代码的粗略检查,看起来MAP_POPULATEversions going back as far as 2.6.34中的MAP_PRIVATE完全没有任何关系。

以下是3.14内核实现中来自mmap.c的最新代码的摘录:

...
1364         addr = mmap_region(file, addr, len, vm_flags, pgoff);
1365         if (!IS_ERR_VALUE(addr) &&
1366             ((vm_flags & VM_LOCKED) ||
1367              (flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE))
1368                 *populate = len;
1369         return addr;
...

我的观察错了吗?

1 个答案:

答案 0 :(得分:6)

自您提出问题后,措辞已更新:

Before: MAP_POPULATE is only supported for private mappings since Linux 2.6.23.
After:  MAP_POPULATE is supported for private mappings only since Linux 2.6.23.

换句话说,您可以将MAP_POPULATE用于私有映射,但至少需要Linux 2.6.23。

希望这能澄清它!