2

好吧。我非常困惑於virtual address spaces中使用的memory mapped file的概念。在虛擬地址空間中使用內存映射文件

在下面的鏈接中,我已經使用了Google。

http://en.wikipedia.org/wiki/Virtual_address_space

我發現了一個部分

  Then the application's executable file is mapped into the Virtual Address Space. 
      Addresses in the process VAS are mapped to bytes in the exe file. 
      The OS manages the mapping: 

        0           4GB 
     VAS  |---vvvvvvv------------------------------------| 
     mapping  |-----| 
     file bytes  app.exe 

     The v's are values from bytes in the mapped file. 

現在這是什麼內存映射文件已經做了特殊工藝在特定的虛擬地址空間(在最後陳述混淆上面的部分)?

爲什麼顯式需要包含用於創建對應特定進程的內存映射文件的代碼?

+0

它描述瞭如何使用內存映射將您運行的可執行代碼加載到內存中。 – Barmar

回答

3

首先需要了解的是物理地址和虛擬地址之間的區別。當您的程序將數據寫入特定的(虛擬)存儲器地址時,寫入地址將被轉換爲RAM芯片上的實際地址。如果沒有爲特定的虛擬地址編寫物理地址,則通常會遇到訪問衝突或分段錯誤。

工作方式是內存管理單元(MMU)生成一個CPU異常,導致執行跳轉到內核錯誤處理程序。在訪問衝突的情況下,您的流程終止。

內核能夠做一些其他聰明的東西。如果進程空閒,它可能會將進程使用的一些物理內存複製到交換文件中(並從mmu中刪除條目),當您訪問上述地址時,CPU異常不會中止程序。相反,內核將首先暫停你的過程。然後它會將交換文件中的數據複製回內存,重新編程MMU。然後內核將恢復您的進程,進程將訪問內存,就像它一直在那裏一樣。就過程而言,沒有什麼特別的事情發生。這個過程被稱爲Demand Paging

當你mmap一個文件,內核有效地執行需求分頁,但從你讀取指定的文件,而不是從交換文件。這個過程是完全一樣的。 CPU訪問異常會導致文件中的數據被讀入到您正常存儲器訪問的RAM中。當你關閉文件時,內存被寫回到解除分配的文件中。最大的好處是你可以用指針來使用文件中的數據。

希望這有助於

相關問題