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

Mic*_*eyn 8 linux linux-kernel

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

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

基于我对mmap.c的Linux内核源代码的粗略检查,看起来MAP_POPULATE2.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;
...
Run Code Online (Sandbox Code Playgroud)

我的观察错了吗?

Jo *_*iss 8

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

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.
Run Code Online (Sandbox Code Playgroud)

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

希望这能澄清它!

  • 我认为措辞完全没有歧义。前几天当我和一位同事阅读时,我们将其解释为“自Linux 2.6.23起支持MAP_POPULATE(仅适用于私有映射)。也就是说,似乎是说它仅在更高版本的Linux中支持私有映射。核心。我推荐类似的东西,因为Linux 2.6.23 MAP_POPULATE可用于私有和共享映射。在2.6.23之前,仅支持共享映射。 (3认同)