如何在userland中创建分段内存的映射?

时间:2017-10-13 22:03:28

标签: c++ c memory linux-kernel

在Linux中,mmap可用于在进程的虚拟地址空间中创建映射。其中一个用例是使用非常大的文件。不幸的是,它只能为已经连续的东西创建映射:它只接受一个offsetlength

我正在寻找一种解决方案,将内存中的多个段映射到一个连续的地址范围。这个用户将是在用户空间中运行的NTFS驱动程序,该驱动程序想要为实际上已在磁盘上分段的文件呈现连续的地址范围。根据我的理解,这对于在内核中运行的驱动程序是可行的,但我特意在用户空间中寻找解决方案。

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

我希望这可以解决我的问题。欢迎任何建议!

1 个答案:

答案 0 :(得分:1)

  

不幸的是,它只能为已经连续的内容创建映射:它只接受一个patchoffset

一次只接受一个lengthoffset,您可以多次拨打length

man 2 mmap开始,请注意mmap参数:

addr

首先创建一个大型映射(也许可能是void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); )。然后,重新映射部分映射的方式。要重新映射,请将起始地址传递到/dev/zero并使用addr

相关问题