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

标签 linux linux-kernel

在我看来,MAP_POPULATE 不仅仅用于私有(private)映射,这与手册页所说的相矛盾:

MAP_POPULATE (since Linux 2.5.46) Populate (prefault) page tables for a mapping. For a file mapping, this causes read-ahead on the file. Later accesses to the mapping will not be blocked by page faults. MAP_POPULATE is only supported for private mappings since Linux 2.6.23.

基于我对 mmap.c 的 Linux 内核源代码的粗略检查,看起来 MAP_POPULATEMAP_PRIVATEversions going back as far as 2.6.34 中完全没有关系.

这是来自 mmap.c 的最新代码的摘录从 3.14 内核实现开始:

...
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;
...

我的观察有误吗?

最佳答案

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

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 进行私有(private)映射,但至少需要 Linux 2.6.23。

希望这能澄清它!

关于带有 MAP_POPULATE 的 Linux mmap(),手册页似乎提供了错误的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23502361/

相关文章:

linux - IOCTL Linux 设备驱动程序

linux - 找不到 3.16.0-rc4-00142-g47ea8dd-dirty 的内核头文件

c -/proc/[pid]/pagemaps 和/proc/[pid]/maps | Linux

c - 是否可以循环接收/读取以从套接字读取所有数据

c++ - 为什么我的 C++ 代码在 Linux 上运行而不在 Windows 上运行,RAM 内存有问题吗?

c - 使用 bash 从 C 执行一组命令而不将它们存储在文件中

android - AOSP 设备节点访问权限

linux - 如何将 64GB USB 的文件系统从 FAT32 更改为允许我将 35GB 文件从 x86_64 Linux 机器放入 USB 的系统?

linux - linux下修改网络接口(interface)名称,忽略文件70-persistent-net.rules

linux - 获取文件的纳秒精度 atime、mtime、ctime 字段(stat?)