簡體   English   中英

如何分配具有執行權限的內存?

[英]How to allocate a memory with execute permissions?

我想分配一個具有執行權限的內存。 所以我使用mprotect來更改權限。為了獲得頁面對齊的內存,我使用了一個valloc函數。

void * temp = (void *) valloc(x);

然后

if( mprotect(temp, BLOCK_SIZE, (PROT_READ | PROT_WRITE |PROT_EXEC))) {
   exit(-1);
}

現在我想為這個分配的塊添加更多內存。 因此我使用realloc函數。

void * new_temp = (void *) realloc(temp, 1024);

這個重新分配會自動將分配的內存的權限更改為我之前設置的內存嗎? 如果realloc將整個塊移動到另一個位置,那么先前分配的內存的權限和新分配的內存是什么?

應該再次使用mprotect來獲取執行權限內存。 而且有一個API realloc像頁面大小邊界上valloc

嘗試使用另一個valloc分配新區域,並復制舊內容。 更好的是,停止使用已棄用的valloc ,並將其替換為posix_memalign調用,或直接使用mmap進行非常大的分配。 使用mremap你可以有效realloc頁對齊的內存區域。

應該再次使用mprotect來獲取執行權限內存。

虛擬內存按頁面組織。 mprotect()更改給定虛擬內存塊中所有頁面上的標志。 它獨立於實際的內存分配。 IOW,你必須在realloc之后再次調用mprotect()來重新應用權限。 而且你必須再次為整個區域調用它,因為realloc()可以代替將現有的塊返回指針擴展到新的。

現在考慮一下,我認為可能需要在realloc()之前調用mprotect() realloc()來從舊內存區域中刪除exec權限。 malloc() / realloc()是用於管理應用程序虛擬內存中內存的libc函數,而mprotect()是一個獨立於應用程序虛擬內存本身運行的系統調用。

是否有一個API來重新分配頁面大小邊界,如valloc。

非常懷疑它。

在內存分配密集型應用程序中, realloc()很少能夠擴展現有的塊,並且通常最終會分配新的塊+ memcpy()+ free舊塊。 如果之前realloc()性能是可接受的,那么它的手工編碼版本(考慮更嚴格的對齊)也應該沒問題。

BTW,POSIXv6有一個名為posix_memalign()的新函數。 valloc的手冊頁是一個有趣的讀物,主要是為什么不應該首先使用valloc()。

PS你也可以隨時使用標准POSIX函數來查找頁面大小sysconf(_SC_PAGESIZE); 並自己對齊內存緩沖區。 顯然你必須分配new_size+(sysconf(_SC_PAGESIZE)-1)字節才能有足夠的內存來重新對齊指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM