获取Linux中内存页面的起始地址

时间:2011-06-17 15:03:41

标签: linux memory handler signals

在我的代码中,我需要跟踪一些正在修改的页面。最初我只提供对它们的读访问权限,但是在信号处理程序上我给它们进行读写访问(我不打算解释所有这些的目的是什么,并且信号处理程序中实际上有更多的代码,我'没有显示)。

现在我的问题是如何从位于该页面的内存地址获取页面的起始地址。所以基本上我需要在代码中实现此处显示的 get_page_start_addr 。到目前为止,我只是为一个页面做了这个,我的程序知道它的起始地址。但是现在,因为我需要为多个页面执行此操作,所以我需要从任意内存地址获取页面的起始地址,因为mprotect只接受起始页面地址作为有效参数。

static void memory_change_handler(int sig, siginfo_t *si, void *unused)
{
  long addr = (long)si->si_addr;
  long page_start_addr = get_page_start_addr( addr );

  if (mprotect((void*)page_start_addr, pagesize, PROT_READ | PROT_WRITE) == -1)
  {
    print_error();
    handle_error("mprotect");
  }
}

3 个答案:

答案 0 :(得分:7)

在Linux中(在其他操作系统中,我猜),页面在页面边界处对齐。因此,如果您知道自己的PAGE_SIZE,那么您可以通过屏蔽较低的地址位来简单地获取页面的开头。

page_start = addr & ~(PAGE_SIZE-1);

答案 1 :(得分:1)

要便于了解您的网页大小,请使用sysconf(_SC_PAGESIZE)

答案 2 :(得分:0)

您可以使用该地址(无符号长)/ pagesize和* pagesize。 这将为您提供逻辑地址的首页地址。