我正在 64 位 Linux 机器上开发一个程序,该程序需要将多个任意长度的数据数组映射到我无法控制的固定内存地址。我认为 mmap() 与 MAP_FIXED 和 MAP_ANONYMOUS 是要走的路,例如:
mmap((void *) 0x401000, 0x18e, PROT_NONE, MAP_ANONYMOUS | MAP_FIXED, -1, 0);
但是,每次我调用此函数时,它都会返回 MAP_FAILED。我已将fd设置为 -1,我知道某些系统需要它,地址是我的页面大小 (4096) 的倍数,并且长度是非负数,所以我想知道 0x401000 是否已经存在我的系统使用;我也尝试过 0x402000、0x403000 和 0x404000,结果相同。
关于 mmap(),我是否遗漏了什么,或者有没有办法找出这个地址已经有什么?更好的是,由于我无法控制我需要哪些地址,有没有更好的方法来避免遇到现有映射?
编辑:检查后errno
,我发现我得到的代码是一个无效参数,因此,根据手册页,“我们不喜欢 addr、length 或 offset(例如,它们太大或未对齐)在页面边界上)。” 不过,我还不能弄清楚哪一个是问题所在。