【发布时间】:2012-01-11 20:40:18
【问题描述】:
我想检测特定页面是否已经映射到内存中。这里的目标是能够在使用固定内存地址调用 mmap 之前执行此检查。以下代码说明了这种情况下默认情况下会发生什么:mmap 静默地重新映射原始内存页面。
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int page_size;
void *ptr;
page_size = getpagesize();
ptr = mmap(0, 10 * page_size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (ptr == MAP_FAILED) {
printf ("map1 failed\n");
return 1;
}
((int *)ptr)[0] = 0xdeadbeaf;
ptr = mmap(ptr, 2 * page_size, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);
if (ptr == MAP_FAILED) {
printf ("map2 failed\n");
return 1;
}
if (((int *)ptr)[0] != 0xdeadbeaf) {
printf ("oops, data gone !\n");
}
return 0;
}
我知道我可以打开并解析 /proc/self/maps 以确定已分配的内存范围,并从中推断我是否可以安全地使用 mmap 请求特定的内存范围,但我正在寻找合适的 API:有这种事吗?
【问题讨论】:
-
不能直接用MAP_FIXED看看能不能成功吗?
-
哈,我的示例代码不正确(即,第二个 mmap(刚刚编辑)缺少 MAP_FIXED)。我的观点是,如果内存范围已经分配,MAP_FIXED 不能确保您得到错误(如果您对此有疑问,可以运行代码或阅读相关手册页)
-
顺便说一句,如果你想知道 MAP_FIXED 有什么好处,我也想:)
-
@MerickOWA 根据手册页,
MAP_FIXED将覆盖映射页面:如果 addr 和 len 指定的内存区域与任何现有映射的页面重叠,则重叠现有映射的一部分将被丢弃。 所以你不应该依赖MAP_FIXED。