iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

當你凝視linux, linux也在凝視你系列 第 17

Day17 探訪 mmap( )

此文章會在未來繼續補完

前言

前幾天我們講了虛擬記憶體,就提到了在系統內部管理虛擬記憶體的結構VMA,並且講解了VMA是放在 mm_struct 內部,並且利用鏈表與紅黑樹管理VMA,也講了一些操作VMA的方式,與c語言常用的函數 malloc() 與跟他長得很類似的一些函數。

mmap

mmap 是一種虛擬記憶體映射文件的方法,也就是將一個文件或是其他對象映射到行程的定址空間,實現文件的磁碟地址與空間中一段虛擬地址的一一對應關係,建立好映射關係之後,對於文件的讀寫變只要針對已經映射好的這個區域讀寫就可以完成目標了。

如同前幾天所說的, Linux 會利用 vm_area_struct 表示某段獨立的虛擬記憶體區域,因為不同的區域會有不同的性質,所以會用到多個表示不同類型的虛擬記憶體區域。如下圖來自此

原理與步驟

mmap 完成記憶體映射的過程,可以分成三個階段:

  1. 行程開始映射,並且在虛擬記憶體為映射分配區域

  2. 調用 mmap 實現文件物理地址和行程虛擬地址的一一映射關係。

  3. 行程實際對該映射空間存取,造成缺頁異常(page fault),此時才正式將文件內容移至實體記憶體。

優點

ref


上一篇
Day16 熟悉又陌生的 malloc()
下一篇
Day18 page fault, LRU, second chance
系列文
當你凝視linux, linux也在凝視你30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言