linux - 将多个数据数组映射到任意固定内存地址

标签 linux mmap memory-mapping

我正在 64 位 Linux 机器上开发一个程序,该程序需要将任意长度的多个数据数组映射到我无法控制的固定内存地址。我认为带有 MAP_FIXED 和 MAP_ANONYMOUS 的 mmap() 是可行的方法,例如:

mmap((void *) 0x401000, 0x18e, PROT_NONE, MAP_ANONYMOUS | MAP_FIXED, -1, 0);

但是,每次调用此函数时,它都会返回 MAP_FAILED。我已将 fd 设置为 -1,我知道某些系统需要这样做,地址是我的页面大小 (4096) 的倍数,并且长度是非负数,所以我想知道 0x401000 是否已被我的系统使用;我还尝试了 0x402000、0x403000 和 0x404000,结果相同。

关于 mmap() 有什么我遗漏的吗,或者有没有办法找出这个地址已经有什么?更好的是,由于我无法控制我需要哪些地址,是否有更好的方法来避免遇到现有映射?

编辑:检查errno 后,我发现我得到的代码是一个无效参数,因此,根据手册页,“我们不如地址、长度或偏移量(例如,它们太大,或未在页面边界上对齐)。”不过,我还不能确定问题出在哪里。

最佳答案

鉴于0x400000似乎是 .text我的进程地址 amd64 Debian 系统(x86 是不同的),我怀疑你失败了,因为你正试图映射现有的东西,正如你所想的那样。不确定(以编程方式)确定哪些段已映射/可用的最佳方法,但您可以从检查 /proc/<pid>/maps 开始对于许多“典型”进程,以了解您的系统如何将地址范围分配给程序和库。地址空间随机化也在那里引发了一些额外的皱纹......

关于linux - 将多个数据数组映射到任意固定内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691595/

相关文章:

linux - Linux 中的资源清理

c - 这段代码的输出是什么,为什么?

C mmap() 共享内存写入在其他进程中看不到

c - 在 C 中使用 memset() 时出现总线错误?

c# - 启用写入映射到内存的文件

linux - 使用 mmap 访问 PCI-e 内存空间

Python 子进程管道 block

linux - 如何删除目标用户使用scp创建的目标文件夹

我们可以通过 mmap() 分配物理上连续的内存吗?

通过/dev/mem 与 PCI 设备通信