как я могу определить, отображается ли конкретная страница в памяти?

Я хотел бы определить, была ли определенная страница уже отображена в памяти. Цель здесь - иметь возможность выполнить эту проверку перед вызовом 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: есть такая штука?

15
задан mathieu 3 December 2011 в 06:59
поделиться