我正在开发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
后,我发现我得到的代码是无效的参数,因此,根据手册页,“我们不喜欢addr,长度或偏移量(例如,它们太大,或者在页面边界上没有对齐)。“不过,我还不知道哪个是问题。
答案 0 :(得分:1)
鉴于0x400000
似乎是.text
Debian系统上的进程的amd64
地址(x86
不同),我怀疑你是因为失败了正如你所想的那样,你正试图映射现有的东西。不确定(以编程方式)确定哪些段被映射/可用的最佳方法,但您可以首先检查/proc/<pid>/maps
以查找许多“典型”进程,以查看系统如何为程序和库分配地址范围。地址空间随机化也会在那里引发一些额外的皱纹......
答案 1 :(得分:0)
这是我写了一段时间的例子,它是一个固定地址的mmap。它映射帧缓冲区以设置/清除像素:
http://stromberg.dnsalias.org/~strombrg/pbmonherc.html
videoBase = (unsigned char *) mmap((caddr_t) videoBase, VideoRamLength,
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_FIXED,
fd, VideoRamStart);
fd对/ dev / mem。
开放