如何在地址空间找到漏洞?

时间:2016-01-01 21:22:33

标签: c posix freebsd mmap address-space

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

最好使用便携式功能,如何找到一个足够大的未映射地址空间区域,以便确保对该区域的一系列mmap()次呼叫成功?

2 个答案:

答案 0 :(得分:5)

请按照以下步骤操作:

  1. 首先计算枚举文件并将其大小相加所需的总大小。
  2. 使用mmap映射此大小的单个匿名内存区域。如果失败了,你就输了。
  3. 保存指针并unmap区域(实际上,如果系统的unmap具有固定地址,则可能不需要mmap隐藏任何先前重叠区域。
  4. 使用相应的MAP_FIXED标记映射此地址的第一个文件。
  5. 按文件大小增加地址。
  6. 循环到第4步,直到所有文件都被映射为。
  7. 这应该可以完全移植到任何POSIX系统,但是某些操作系统可能有防止这种方法的怪癖。试试吧。

答案 1 :(得分:1)

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

这将保留但不提交内存。

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

我相信这个标志是MAP_FIXED | MAP_PRIVATE