英语
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 的注释。