2016-08-04 31 views
1
char *p = (char*) mmap(...); 
....; /* check if p is not -1 */ 
a = *p; 

運行最後一條語句時,發生頁面錯誤。內核中的錯誤處理程序將在物理內存中分配頁面,並將4K字節從文件複製到該頁面中,然後修改頁面條目。讀取*p的指令將在此次成功執行。調用mmap後文件的路徑名稱在哪裏?

但是,錯誤處理程序如何知道與頁面相關的文件名和路徑。文件名(或fd)在哪裏存儲?和文件中的偏移量。

如果一個進程的數據段中的一個頁面被換出(我想是一個交換文件)會怎麼樣?內核如何知道從何時開始複製頁面以後需要交換頁面?

回答

0

處理程序不知道文件名或路徑,因爲它不使用這些文件(可以告訴,因爲即使在創建映射後從文件系統中刪除該文件,映射也會繼續工作得很好;文件內容保持有效,直到所有打開的文件描述符和內存映射關閉)。

它不使用fd; closefd在調用mmap之後立即傳遞給mmap,映射仍然有效(對於打開的文件句柄,這在某些系統中是必需的,對於低的ulimit;您可以一次映射10,000個文件,但是您如果fds的ulimit爲1000,則不能對所有人持有開放fd s)。

發生什麼事情是,在mmap時間,操作系統的虛擬內存管理器設置了一堆虛擬內存表,這些虛擬內存表基本上表示「該內存由以下磁盤扇區支持」。它在檢索已寫入交換文件並且必須重新讀入的數據時使用了非常類似的過程。唯一的區別在於內存和磁盤同步化程度如何,映射到特定磁盤扇區是靜態還是動態(儘管即使對於「真實」文件,磁盤扇區也可能隨着運行而改變,例如,當寫入寫時複製文件系統時),存儲器是必須被寫入(交換)還是可以簡單地被丟棄(mmap -ed文件沒有髒頁)在內存壓力下等

有幾層虛擬內存地址轉換涉及CPU和操作系統的不同,所以確切的機制有所不同,但基本思想是在mmap ing之後,您正繞過目錄結構並以忽略名稱和路徑之類的方式與底層磁盤扇區進行交互。

+0

謝謝ShadowRanger。在這種情況下,我在這個線程中錯了,是不是? http://stackoverflow.com/questions/38850533/how-does-the-page-fault-handler-know-where-to-get-the-4k-bytes/38975619#38975619我以爲我找到了答案。 – xiaokaoy

相關問題