磁碟與記憶體的對映就是檔案對映,說這個問題之前我們先說下swap,因為
這個問題讓我很容易想起swap,linux swap 是交換分割槽的意思,在記憶體不
夠的情況下,作業系統先把記憶體與磁碟的swap區進行乙個「對映」,然後把
這些記憶體解放出來放入記憶體中,為之後的程序的騰出一塊記憶體空間,等到自
己的程序再次被喚醒時候,再把磁碟裡面的記憶體換進來。這裡有檔案和記憶體之間
的對映奧,可是mmap與swap設計思想上是完全不同的,乙個針對的物理記憶體
乙個針對的是虛擬記憶體。
在說mmap之前我們先說一下普通的讀寫檔案的原理,程序呼叫read或是write
後會陷入核心,因為這兩個函式都是系統呼叫,進入系統呼叫後,核心開始讀寫
檔案,假設核心在讀取檔案,核心首先把檔案讀入自己的核心空間,讀完之後
程序在核心回歸使用者態,核心把讀入核心記憶體的資料再copy進入程序的使用者態內
存空間。實際上我們同一份檔案內容相當於讀了兩次,先讀入核心空間,再從核心
空間讀入使用者空間。
mmap是系統呼叫,mmap的作用是將程序的虛擬位址空間和檔案在磁碟的位置做一一
對映,做對映之後,讀寫檔案雖然同樣是呼叫read和write但是觸發的機制已經不一
樣了(mmap是file_operations中的成員這麼一說是不是了然了),實際上我們這麼
說是不太合理的因為一一對映並不是mmap一開始就全部完成對映的。
mmap只會返回來乙個指標,指向程序邏輯位址空間的乙個位置。這個時候的過程是這
樣的,首先read會改寫為讀記憶體操作,讀記憶體的時候,系統發現該位址對應的物理記憶體
是空的,觸發缺頁機制,缺頁機制先在swap尋找對應的頁面,發現沒有然後再去通過mmap
建立的對映關係,從硬碟上將檔案讀入物理記憶體。也就是說mmap把檔案直接對映到了使用者
空間,沒有經歷核心空間。
mmap可以對映檔案進入使用者的虛擬記憶體,實際上,他也可以把裝置的記憶體對映入使用者的
虛擬記憶體,因為我們一般都需要核心去讀寫裝置,如果把裝置的物理記憶體直接對映入空間
就跟上述一樣,省去一次的核心copy。
檔案對映mmap
學習文獻 標頭檔案 include include 定義函式 void mmap void start,size t length,int prot,int flags,int fd,off t offsize 函式說明 mmap 用來將某個檔案內容對映到記憶體中,對該記憶體區域的訪問即是直接對該檔...
MMAP檔案對映
mmap檔案對映 mmap 系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read write 等操作。注 實際上,mmap 系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔...
檔案對映mmap
磁碟與記憶體的對映就是檔案對映,說這個問題之前我們先說下swap,因為 這個問題讓我很容易想起swap,linux swap 是交換分割槽的意思,在記憶體不 夠的情況下,作業系統先把記憶體與磁碟的swap區進行乙個 對映 然後把 這些記憶體解放出來放入記憶體中,為之後的程序的騰出一塊記憶體空間,等到...