5

我有一组文件,其长度都是我的操作系统(FreeBSD 10)的页面大小的倍数。我想将mmap()这些文件放到 RAM 的连续页面中,让我能够将文件集合视为一个大型数据数组。

最好使用可移植函数,我怎样才能找到足够大的未映射地址空间区域,以便我可以确定mmap()对该区域的一系列调用会成功?

4

2 回答 2

6

按着这些次序:

  1. 首先通过枚举文件并将它们的大小相加来计算所需的总大小。
  2. 使用 .映射此大小的匿名内存的单个区域mmap。如果这失败了,你就输了。
  3. 保存指针和unmap区域(实际上,如果您的系统具有固定地址隐式取消映射任何先前的重叠区域,unmap则可能没有必要)。mmap
  4. MAP_FIXED使用适当的标志映射此地址的第一个文件。
  5. 按文件大小增加地址。
  6. 循环到第 4 步,直到所有文件都被映射。

这应该可以完全移植到任何 POSIX 系统,但某些操作系统可能有阻止这种方法的怪癖。试试看。

于 2016-01-01T21:38:40.033 回答
2

您可以mmap使用一个大区域,其中大小是所有文件大小的总和,使用MAP_PRIVATE | MAP_ANON和保护PROT_NONE这将防止操作系统不必要地提交内存费用。

这将保留但不提交内存。

然后,您可以在打开文件并filename1[baseAddr, size1)打开filename2[baseAddr + size1, baseAddr + size1 + size2)依此类推。

我相信这方面的标志是MAP_FIXED | MAP_PRIVATE.

于 2016-01-01T21:43:28.853 回答