c++ - 如何从用户区的分段内存创建映射?

标签 c++ c memory linux-kernel

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

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

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

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

最佳答案

Unfortunately, it can only create a mapping for something that was already contiguous to start with: it accepts just one offset and length.

一次只接受一个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

关于c++ - 如何从用户区的分段内存创建映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738602/

相关文章:

c - 线程 1 : EXC_BAD_ACCESS (code=1, 地址=0x7ffeefc00000)

Python 在使用 __repr__ __str__ 时打印内存地址而不是列表?

c++ - 尝试读取 sizeof() 返回意外结果

c++ - 无法打开包含文件 'thread'

c - 结构中的结构定义

c++ - 一次打印从套接字接收到的一个字符

c - 将结构发送到 C 中的函数

c - 动态内存分配。我错过了什么?

c++ - 如何在 C++ 中读取不包含在 ascii 中的字符?

c++ - 提高或降低派生类中的访问修饰符如何破坏 C++ 封装?