簡體   English   中英

帶有MAP_NORESERVE的mmap是否會保留物理內存?

[英]Does mmap with MAP_NORESERVE reserve physical memory?

mmap文檔說明關於標志MAP_NORESERVE。

不要為此映射保留交換空間。 保留交換空間時,可以保證可以修改映射。 如果沒有保留交換空間,如果沒有可用的物理內存,則可能在寫入時獲得SIGSEGV。

實際上我想要的只是保留虛擬內存地址而不是分配實際的物理內存。 可以使用帶有MAP_NORESERVE的mmap完成嗎? 如果我想使用任何物理內存,我會使用MAP_FORED再次在地址范圍內使用MAP_NORESERVE通過mmap分配的地址范圍內。

總而言之,我希望內核不為使用帶有MAP_NORSERVE標志的mmap分配的內存保留任何物理頁面。 它是否真的像這樣工作,或者如果內核有足夠的物理內存,內核是否會分配物理頁面?

Mmap()是管理{地址,物理內存,磁盤塊}之間關聯的方法之一。此關聯的所有三個成員都是資源。 關聯保存在頁表條目(PTE)中

mmap()實際上做的是:

  • [可能]在用戶進程內分配一個地址范圍。 此范圍必須包含連續的地址(不應與現有范圍重疊)
  • 為請求的范圍創建PTE,並使它們指向地址范圍內的頁面
  • 使PTE指向文件mmap()ed
  • [可能]分配和預取(某些)頁面
  • [也許]保留一些后備存儲。

上述步驟中的許多(3個中的3個)是可選的,並且取決於mmap()調用中提供的實際參數和標志。 (fd可能為-1:創建匿名映射,start-adress可能為NULL:mmap應分配(先前)未使用的內存范圍)

在調用mmap()之后,內核中的pagefault-handler應該能夠找到要做的事情。 (將物理ram附加到頁面;刷新和分離;分配和COW,......)

保留交換空間意味着調用者信任將來任何時候都有足夠的交換空間。 交換空間由所有進程共享,因此永遠不能保證有足夠的空間。 預分配它(或多或少)可以保證調用進程總是足夠的。 (當不是:mmap()應該失敗)

在linux mmap上只設置虛擬內存映射,無論是否使用MAP_NORESERVE,在觸摸內存之前都不會分配物理內存。

MAP_FIXED與此無關,它在您指定的虛擬(非物理)地址處設置虛擬內存映射,如果在該地址沒有映射空間,則會失敗。

只需使用普通的mmap() 實現mmap的任何足夠現代的操作系統(即,過去,什么,1995?)也實現了請求分頁,只有在實際寫入頁面時才會保留頁面。

暫無
暫無

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

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