2017-10-13 87 views
0

在Linux中,mmap可用于在进程的虚拟地址空间中创建映射。它的一个用例是处理非常大的文件。不幸的是,它只能创建一个已经连续开始的映射:它只接受一个offsetlength如何在用户空间中创建分段内存映射?

我正在寻找解决方案将内存中的几个段映射到一个连续的地址范围。这个用户可能是在用户空间运行的NTFS驱动程序,该用户空间想要为实际上在磁盘上碎片化的文件提供连续的地址范围。在我的理解中,对于在内核中运行的驱动程序,这是可能的,但我特别在用户空间中寻找解决方案。

该解决方案应该是C/C++。我对内核版本没有要求。到目前为止,我可以提出的最佳方法是编写一个知道如何从段跳转到段的迭代器,但我也希望与仅接受字符数组的库进行接口。

我希望这让我的问题。欢迎任何建议!

回答

1

不幸的是,它只能创造的东西的映射,这是已经连续入手:它接受只有一个offsetlength

它只接受一个offsetlength的时间,你可以调用不止一次mmap更多。

man 2 mmap,注意addr说法:

void *mmap(void *addr, size_t length, int prot, int flags, 
      int fd, off_t offset); 

开始通过创建一个大的映射(也许/dev/zero,也许)。然后,重新映射该映射的某些部分。要重新映射,请将起始地址传递到addr并使用MAP_FIXED

+0

感谢您的快速响应。手册页显示“MAP_FIXED - 不要将addr解释为提示:将映射放在该地址,_addr必须是页面大小的倍数。”。所以看起来你不能自由地粘贴你想要的任何地址。或者一旦创建了最初的mmap,这不再适用? – delins

+0

@delins:请注意'offset'也必须是页面大小的倍数。基本上,一切都必须是页面大小的倍数。这反映了处理器上的MMU如何工作。所以'mmap'可以让你把地址粘在一起,但是你想......只要这些地址是页面大小的倍数。 –

+0

这很不幸。单独的段可以具有任何大小,包括小于页面大小(理论最小值1字节)。不管! – delins

相关问题