Met*_*est 1 linux memory signals handler
在我的代码中,我需要跟踪一些正在修改的页面.最初我只提供对它们的读访问权限,但是在信号处理程序上我给它们进行读写访问(我不打算解释所有这些的目的是什么,并且信号处理程序中实际上有更多的代码,我'没有显示).
现在我的问题是如何从位于该页面的内存地址获取页面的起始地址.所以基本上我需要在代码中实现此处显示的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");
}
}
Run Code Online (Sandbox Code Playgroud)
在Linux中(在其他操作系统中,我猜),页面在页面边界处对齐.因此,如果您了解自己PAGE_SIZE,那么您可以通过屏蔽较低地址位来简单地获取页面的开头.
page_start = addr & ~(PAGE_SIZE-1);
Run Code Online (Sandbox Code Playgroud)