此文章會在未來繼續補完
前幾天我們講了虛擬記憶體,就提到了在系統內部管理虛擬記憶體的結構VMA,並且講解了VMA是放在 mm_struct
內部,並且利用鏈表與紅黑樹管理VMA,也講了一些操作VMA的方式,與c語言常用的函數 malloc()
與跟他長得很類似的一些函數。
mmap 是一種虛擬記憶體映射文件的方法,也就是將一個文件或是其他對象映射到行程的定址空間,實現文件的磁碟地址與空間中一段虛擬地址的一一對應關係,建立好映射關係之後,對於文件的讀寫變只要針對已經映射好的這個區域讀寫就可以完成目標了。
如同前幾天所說的, Linux 會利用 vm_area_struct
表示某段獨立的虛擬記憶體區域,因為不同的區域會有不同的性質,所以會用到多個表示不同類型的虛擬記憶體區域。如下圖來自此
mmap
完成記憶體映射的過程,可以分成三個階段:
行程開始映射,並且在虛擬記憶體為映射分配區域
調用 mmap
實現文件物理地址和行程虛擬地址的一一映射關係。
行程實際對該映射空間存取,造成缺頁異常(page fault),此時才正式將文件內容移至實體記憶體。