我如何检测一个特定的页面是否映射到内存中?

我想检测一个特定的页面是否已经映射到内存中。 这里的目标是能够在调用具有固定内存地址的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; } 

我明白,我可以打开和parsing/ PROC /自我/地图找出哪些内存范围已经分配,​​并推断,如果我可以安全地请求一个特定的内存范围与Mmap,但我正在寻找一个适当的API:是否有这样的一个东西 ?

Solutions Collecting From Web of "我如何检测一个特定的页面是否映射到内存中?"

msync(addr,len,0)和检查ENOMEM似乎工作(用一个相当肤浅的测试)。

这不是“重新映射”内存,而是在不同的地址创建另一个映射(因为你给它的那个已经被占用了,并且它被当作暗示处理)。 旧的仍然有效,因为你覆盖了ptr变量,所以你只是失去了引用。

如果你想创建多个映射到相同的内存,像看看shm_open(2)

如果你只是想检查地址是否映射,那么@MerickOWA指出的MAP_FIXED技巧应该可以工作。

编辑0:

你对MAP_FIXED是正确的,在这种情况下没有帮助。 你可能会尝试的是mincore(2) 。 它返回的错误之一是:

ENOMEM addr to addr + length contained unmapped memory.

在QNX上,可以使用mem_offset()posix_mem_offset()并检查输出中contig_len的内容,并将其与length输入参数进行比较。