Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从userland中的分段内存创建映射?_C++_C_Memory_Linux Kernel - Fatal编程技术网

C++ 如何从userland中的分段内存创建映射?

C++ 如何从userland中的分段内存创建映射?,c++,c,memory,linux-kernel,C++,C,Memory,Linux Kernel,在Linux中,可以使用mmap在进程的虚拟地址空间中创建映射。它的一个用例是处理非常大的文件。不幸的是,它只能为已经连续的对象创建映射:它只接受一个偏移量和长度 我正在寻找一种解决方案,将内存中的几个段映射到一个连续的地址范围。这种类型的用户可能是在用户空间中运行的NTFS驱动程序,该驱动程序希望为实际上已在磁盘上碎片化的文件提供一个连续的地址范围。据我所知,对于在内核中运行的驱动程序来说,这是可能的,但我特别在用户空间中寻找解决方案 解决方案应该是C/C++。我对内核版本没有任何要求。到目前

在Linux中,可以使用mmap在进程的虚拟地址空间中创建映射。它的一个用例是处理非常大的文件。不幸的是,它只能为已经连续的对象创建映射:它只接受一个偏移量和长度

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

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

我希望这能把我的问题讲清楚。欢迎任何意见

不幸的是,它只能为已经连续的对象创建映射:它只接受一个偏移量和长度

它一次只接受一个偏移量和长度,您可以多次调用mmap

从中,请注意addr参数:

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

首先创建一个大型映射,可能是/dev/zero。然后,重新映射该映射的部分内容。要重新映射,请将起始地址传递给addr并使用MAP_FIXED。

感谢您的快速响应。手册页状态MAP_FIXED-不要将addr解释为提示:将映射正好放在该地址。地址必须是页面大小的倍数。。所以,似乎你不能自由地将任何你想要的地址粘在一起。或者,一旦创建了初始mmap,这种情况就不再适用了?@delins:请注意,偏移量也必须是页面大小的倍数。基本上,所有内容都必须是页面大小的倍数。这反映了处理器上的MMU的工作方式。所以mmap可以让你按照自己的意愿把地址粘在一起。。。只要那个些地址是页面大小的倍数,那个就太不幸了。各个段可以具有任何大小,包括小于页面大小的理论最小1字节。无论如何,这是个好主意!没有一种体系结构可以映射小于页面大小的内存区域。