【发布时间】: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