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

mat*_*ieu 15 c unix linux mmap

我想检测特定页面是否已在内存中映射.这里的目标是能够在使用固定内存地址调用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;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我可以打开并解析/ proc/self/maps来确定已经分配了哪个内存范围并从中推断出如果我可以安全地使用mmap请求特定的内存范围但是我正在寻找合适的API:是否有这样的一个东西 ?

Ric*_*ell 8

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