【问题标题】:Get starting address of a memory page in Linux获取Linux中内存页的起始地址
【发布时间】:2011-06-17 15:03:40
【问题描述】:

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

现在我的问题是如何从驻留在该页面中的内存地址获取页面的起始地址。所以基本上我需要实现代码中显示的 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");
  }
}

【问题讨论】:

    标签: linux memory handler signals


    【解决方案1】:

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

    page_start = addr & ~(PAGE_SIZE-1);
    

    【讨论】:

    • 谢谢,这是一个不错的方法:)!
    • -PAGE_SIZE 是写~(PAGE_SIZE-1) 的更好方式。
    【解决方案2】:

    要方便地了解您的页面大小,请使用sysconf(_SC_PAGESIZE)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-17
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多