将多个数据阵列映射到任意固定的内存地址

时间:2012-07-27 16:07:25

标签: 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后,我发现我得到的代码是无效的参数,因此,根据手册页,“我们不喜欢addr,长度或偏移量(例如,它们太大,或者在页面边界上没有对齐)。“不过,我还不知道哪个是问题。

2 个答案:

答案 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。

开放