在 Linux 中,mmap
可用于在进程的虚拟地址空间中创建映射。它的一个用例是处理非常大的文件。不幸的是,它只能为一开始就已经连续的东西创建一个映射:它只接受一个 offset
和 length
。
我正在寻找一种将内存中的多个段映射到一个连续地址范围的解决方案。它的用户是在用户空间中运行的 NTFS 驱动程序,它希望为实际上已在磁盘上碎片化的文件提供连续的地址范围。据我所知,这对于在内核中运行的驱动程序是可能的,但我特别在用户空间中寻找解决方案。
解决方案应该是C/C++。我对内核版本没有要求。到目前为止,我能想到的最佳方法是编写一个知道如何从一个段跳到另一个段的迭代器,但我还想与只接受字符数组的库进行交互。
我希望这能解决我的问题。欢迎任何建议!
最佳答案
Unfortunately, it can only create a mapping for something that was already contiguous to start with: it accepts just one
offset
andlength
.
一次只接受一个offset
和length
,可以多次调用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
。
关于c++ - 如何从用户区的分段内存创建映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738602/