簡體   English   中英

mmap()擁有內存塊

[英]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_POPULATEMAP_LOCKED標志

我實際上不明白您為什么在問題中說“擁有記憶”,對此我不太了解。 如果只想禁用內存過量使用,請告知。

您也可以mmap一些文件段。 我認為在這種情況下不會過度使用。 但是我只建議通過/proc/sys/vm/overcommit_memory禁用整個系統中的內存/proc/sys/vm/overcommit_memory

暫無
暫無

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

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