[英]Get starting address of a memory page in Linux
在我的代碼中,我需要跟蹤一些正在修改的頁面。 最初我只給它們讀訪問權限,但是在信號處理程序上我給它們讀和寫訪問權限(我不打算解釋所有這些的目的,實際上信號處理程序中有更多的代碼,我'我沒有顯示)。
現在我的問題是如何從駐留在該頁面中的內存地址中獲取該頁面的起始地址。 所以基本上我需要在代碼中實現這里顯示的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 中(我猜也是在其他操作系統中),頁面在頁面邊界處對齊。 因此,如果您知道PAGE_SIZE
,那么您可以通過屏蔽低地址位來簡單地獲取頁面的開頭。
page_start = addr & ~(PAGE_SIZE-1);
要輕松了解您的頁面大小,請使用sysconf(_SC_PAGESIZE)
。
您可以使用該地址(unsigned long)/pagesize 和 *pagesize。 這為您提供了邏輯地址的第一頁地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.