如何找到地址 space 中的漏洞?
How to find holes in the address space?
我有一组文件,其长度都是我的操作系统 (FreeBSD 10) 页面大小的倍数。我想 mmap()
这些文件到连续的 RAM 页面,使我能够将一组文件视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址区域 space 以便我可以确定对该区域的一系列 mmap()
调用将会成功?
按照以下步骤操作:
- 首先通过枚举文件并求和它们的大小来计算所需的总大小。
- 用
mmap
映射此大小的单个匿名内存区域。如果失败,你就输了。
- 保存指针和
unmap
区域(实际上,如果您的系统 mmap
具有固定地址,则可能不需要 unmap
隐式取消映射任何先前的重叠区域)。
- 使用适当的
MAP_FIXED
标志映射此地址的第一个文件。
- 按文件大小递增地址。
- 循环到第 4 步,直到映射完所有文件。
这应该可以完全移植到任何 POSIX 系统,但某些操作系统可能有一些怪癖会阻止此方法。试试吧。
您可以 mmap
一个大区域,其中的大小是所有文件大小的总和,使用 MAP_PRIVATE | MAP_ANON
和保护 PROT_NONE
可以防止 OS 免于承担不必要的内存费用。
这将保留但不提交内存。
然后您可以在 [baseAddr, size1)
打开文件 filename1
并在 [baseAddr + size1, baseAddr + size1 + size2)
打开 filename2
,依此类推。
我相信这方面的标志是 MAP_FIXED | MAP_PRIVATE
。
我有一组文件,其长度都是我的操作系统 (FreeBSD 10) 页面大小的倍数。我想 mmap()
这些文件到连续的 RAM 页面,使我能够将一组文件视为一个大型数据数组。
最好使用可移植函数,我怎样才能找到足够大的未映射地址区域 space 以便我可以确定对该区域的一系列 mmap()
调用将会成功?
按照以下步骤操作:
- 首先通过枚举文件并求和它们的大小来计算所需的总大小。
- 用
mmap
映射此大小的单个匿名内存区域。如果失败,你就输了。 - 保存指针和
unmap
区域(实际上,如果您的系统mmap
具有固定地址,则可能不需要unmap
隐式取消映射任何先前的重叠区域)。 - 使用适当的
MAP_FIXED
标志映射此地址的第一个文件。 - 按文件大小递增地址。
- 循环到第 4 步,直到映射完所有文件。
这应该可以完全移植到任何 POSIX 系统,但某些操作系统可能有一些怪癖会阻止此方法。试试吧。
您可以 mmap
一个大区域,其中的大小是所有文件大小的总和,使用 MAP_PRIVATE | MAP_ANON
和保护 PROT_NONE
可以防止 OS 免于承担不必要的内存费用。
这将保留但不提交内存。
然后您可以在 [baseAddr, size1)
打开文件 filename1
并在 [baseAddr + size1, baseAddr + size1 + size2)
打开 filename2
,依此类推。
我相信这方面的标志是 MAP_FIXED | MAP_PRIVATE
。