如何找到地址 space 中的漏洞?

How to find holes in the address space?

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

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

按照以下步骤操作:

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

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

您可以 mmap 一个大区域,其中的大小是所有文件大小的总和,使用 MAP_PRIVATE | MAP_ANON 和保护 PROT_NONE 可以防止 OS 免于承担不必要的内存费用。

这将保留但不提交内存。

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

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