remap_file_pages() 系统调用

remap_file_pages() 系统调用用于创建非线性映射,即文件中页面的内存映射顺序不是顺序的。相比于重复调用 mmap(2),使用 remap_file_pages() 的优势在于前者不需要内核创建额外的 VMA(虚拟内存区域)数据结构。

支持非线性映射需要在内核虚拟内存子系统中包含大量重要的非平凡代码,包括热路径。此外,为了使非线性映射工作,内核需要一种方法来区分普通页表条目和带有文件偏移量的条目 (pte_file)。内核为此目的在 PTE 中保留一个标志。PTE 标志是稀缺资源,尤其是在某些 CPU 架构上。如果能够释放该标志用于其他用途,那就太好了。

幸运的是,实际使用 remap_file_pages() 的用户并不多。仅已知一种企业级 RDBMS 实现会在 32 位系统上使用该系统调用,以映射大于 32 位虚拟地址空间线性能够容纳的文件。由于 64 位系统已广泛可用,此用例不再关键。

该系统调用已被弃用,现在已被仿真替代。该仿真创建新的 VMA 而不是非线性映射。对于 remap_file_pages() 的少数用户来说,它的运行速度会较慢,但 ABI 仍然保留。

仿真的一种副作用(除了性能之外)是,由于额外的 VMA,用户更容易达到 vm.max_map_count 限制。有关该限制的更多详细信息,请参见 DEFAULT_MAX_MAP_COUNT 的注释。