mmap記憶體對映原理

2021-10-05 23:31:21 字數 1257 閱讀 6975

mmap記憶體對映的實現過程,總的來說可以分為三個階段:

(一)程序啟動對映過程,並在虛擬位址空間中為對映建立虛擬對映區域

1、程序在使用者空間呼叫庫函式mmap,原型:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

2、在當前程序的虛擬位址空間中,尋找一段空閒的滿足要求的連續的虛擬位址

3、為此虛擬區分配乙個vm_area_struct結構,接著對這個結構的各個域進行了初始化

4、將新建的虛擬區結構(vm_area_struct)插入程序的虛擬位址區域鍊錶或樹中

(二)呼叫核心空間的系統呼叫函式mmap(不同於使用者空間函式),實現檔案實體地址和程序虛擬位址的一一對映關係

5、為對映分配了新的虛擬位址區域後,通過待對映的檔案指標,在檔案描述符表中找到對應的檔案描述符,通過檔案描述符,鏈結到核心「已開啟檔案集」中該檔案的檔案結構體(struct file),每個檔案結構體維護著和這個已開啟檔案相關各項資訊。

6、通過該檔案的檔案結構體,鏈結到file_operations模組,呼叫核心函式mmap,其原型為:int mmap(struct file *filp, struct vm_area_struct *vma),不同於使用者空間庫函式。

7、核心mmap函式通過虛擬檔案系統inode模組定位到檔案磁碟實體地址。

8、通過remap_pfn_range函式建立頁表,即實現了檔案位址和虛擬位址區域的對映關係。此時,這片虛擬位址並沒有任何資料關聯到主存中。

(三)程序發起對這片對映空間的訪問,引發缺頁異常,實現檔案內容到物理記憶體(主存)的拷貝

9、程序的讀或寫操作訪問虛擬位址空間這一段對映位址,通過查詢頁表,發現這一段位址並不在物理頁面上。因為目前只建立了位址對映,真正的硬碟資料還沒有拷貝到記憶體中,因此引發缺頁異常。

10、缺頁異常進行一系列判斷,確定無非法操作後,核心發起請求調頁過程。

11、調頁過程先在交換快取空間(swap cache)中尋找需要訪問的記憶體頁,如果沒有則呼叫nopage函式把所缺的頁從磁碟裝入到主存中。

12、之後程序即可對這片主存進行讀或者寫的操作,如果寫操作改變了其內容,一定時間後系統會自動回寫髒頁面到對應磁碟位址,也即完成了寫入到檔案的過程。

注:修改過的髒頁面並不會立即更新回檔案中,而是有一段時間的延遲,可以呼叫msync()來強制同步, 這樣所寫的內容就能立即儲存到檔案裡了。

參考:

mmap記憶體對映原理

mmap概念 mmap是一種記憶體對映檔案的方法,即將乙個檔案或者其它物件對映到程序的位址空間,實現檔案磁碟位址和程序虛擬位址空間中一段虛擬位址的一一對映關係。特點 實現這樣的對映關係後,程序就可以採用指標的方式讀寫操作這一段記憶體,而系統會自動回寫髒頁面到對應的檔案磁碟上,即完成了對檔案的操作而不...

linux記憶體對映mmap原理分析

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...

linux記憶體對映mmap原理分析

一直都對記憶體對映檔案這個概念很模糊,不知道它和虛擬記憶體有什麼區別,而且對映這個詞也很讓人迷茫,今天終於搞清楚了。下面,我先解釋一下我對對映這個詞的理解,再區分一下幾個容易混淆的概念,之後,什麼是記憶體對映就很明朗了。首先,對映 這個詞,就和數學課上說的 一一對映 是乙個意思,就是建立一種一一對應...