我正在 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/