背景
衆所周知,虛擬地址和實體地址的對映關係是頁表(Page Table)這個數據結構由系統來維護的,但是處理器是如何利用這個頁表來獲取實體地址來讀寫的呢。記憶體管理單元(MMU, Memory Management Unit)就是處理器上的的一個負責這個事情的硬體元件。CPU把虛擬地址放送給MMU,MMU把虛擬地址轉化為實體地址給記憶體匯流排上的地址匯流排。那麼MMU裡面發生了什麼呢?
MMU如何轉化虛擬地址到實體地址?
如何獲取頁表的
MMU透過暫存器CR3來獲取當前程序的頁表基址,
如何計算出來實體地址
透過虛擬地址可以推算出頁框(Frame)的索引和偏移量(Offset)。
TLB(Translation Lookaside Buffer)怎麼加速這個轉化過程?
TLB是一個儲存在MMU中的一個小快取,MMU使用頁表前會查詢TLB,如果TLB命中(TLB hit),就直接返回實體地址。如果未命中(TLB miss)的話,MMU去頁表查詢同時結果會快取到TLB。
TLB裡面的條目包含虛擬頁號(Virtual Page Number)和物理頁框號(Physical Frame Number)加上額外的一下控制位。
TLB的容量有限,所以需要某種高效的替換策略記得哪一個對映要被替換掉。我們可以選擇的策略有:
最近最少使用(LRU, Least Recently Used)
隨機替換(Random Replacement)
查詢過程中可能出現的錯誤
查詢過程中發現頁表不在記憶體中,可以透過檢視控制位的存在位(Present Bit)來檢查是否在記憶體中。
虛擬地址無效,就是無法在頁表找到對應的實體地址。
嘗試做一些非法操作比如嘗試使用一個只可以讀的實體地址來做寫的操作,MMU會檢視頁表項(Page Table Entry)的讀寫控制項來檢查合法性。
如果使用者態程式試圖訪問一個 User/Supervisor Bit (U/S) 位為 0 的頁面