[英]mmap() owning memory block
我有一個mmap()調用,我嘗試使用MAP_ANONYMOUS
映射64MB,如下所示:
void *block = mmap(0, 67108864, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (block == MAP_FAILED)
exit(1);
我知道要真正擁有內存,我需要打入那塊內存。 我想添加某種0或空字符串來實際擁有內存。 我該怎么做? 我嘗試了以下操作,但是顯然存在段錯誤(我知道為什么會這樣):
char *temp = block;
for (int i = 0; i < 67108864; i++) {
*temp = '0';
temp++;
}
通過在該區塊中分配某些內容,我實際上將如何獲得該區塊的所有權?
謝謝!
您的進程已經擁有該內存,但是我認為您想要的是使其駐留。 也就是說,您希望內核為mmap
ed區域分配物理內存。
內核為該進程分配了一個虛擬內存區域(VMA),但這僅指定了一個有效區域,實際上並未分配物理頁面(或有時稱為幀的幀)。 要使內核在頁面表中分配條目,您要做的就是強制頁面錯誤。
強制頁面錯誤的最簡單方法是像執行操作一樣觸摸內存。 但是,由於頁面大小幾乎可以確定為4096字節,因此您實際上只需要每4096字節讀取一個字節,從而減少了實際需要做的工作量。
最后,由於要設置頁面PROT_READ
,因此實際上您將要從每個頁面讀取而不是嘗試寫入。
您提出的問題不是很好。 我不明白為什么您認為進程不擁有通過mmap
獲得的內存 ?
您新的由mmap
內存區域只有PROT_READ
(因此您只能讀取內部的零),並且您需要將其設置為PROT_READ|PROT_WRITE
才能寫入內部。
但是,一旦mmap
返回,您的進程已經“擁有”了內存。
如果該過程以PID 1234,則可以順序地讀取(或許與cat /proc/1234/maps
在不同的終端)其內存映射通/proc/1234/maps
; 從您的進程內部,使用/proc/self/maps
。
也許您對內存過量使用感興趣; 有一種方法可以禁用它。
mincore(2) , msync(2) , mlock(2)系統調用可能會讓您感興趣。
也許您想要mmap(2)的MAP_POPULATE
或MAP_LOCKED
標志
我實際上不明白您為什么在問題中說“擁有記憶”,對此我不太了解。 如果只想禁用內存過量使用,請告知。
您也可以mmap
一些文件段。 我認為在這種情況下不會過度使用。 但是我只建議通過/proc/sys/vm/overcommit_memory
禁用整個系統中的內存/proc/sys/vm/overcommit_memory
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.