記憶體管理中的虛擬地址到實體地址翻譯

NO IMAGE
在虛存對映中,建立了檔案到虛存區的對映,那麼我們知道資料都是要放到物裡記憶體中才能執行的,為了完成從虛擬記憶體到實體記憶體的對映,引入了請頁機制。同虛擬儲存器一樣,物理儲存器也被分割為物理頁,在X86下這個大小為4K。為了將虛擬頁面同物理頁面關聯起來作業系統使用了頁表這個資料結構,它是存在於實體記憶體中的。對於頁表,為了幫助理解,我們可以先把它簡單的看做是一個有兩列的表格,左邊的是虛擬記憶體的頁號,右邊是實體記憶體的頁號。下面這圖是一個虛擬地址到實體地址的轉換的描述:

在圖中有個頁表基址暫存器,這個是儲存在每個程序的mm_struct中的一個欄位,叫pgd,它指明瞭這個程序的頁表在儲存器中的地址,要是把頁表看作是個陣列的話,那麼它就相當於是個陣列首地址。上面說了頁大小為4K,所以對一個頁來說地址中的低12位是被遮蔽的,這12位就是地址中的偏移量,我們在上圖看到,地址中的偏移量是不經過任何操作直接從虛擬地址複製到實體地址中的。
在上面也出現了一個有效位,它主要是檢測我們當前需要轉換的虛擬頁面在儲存器中是否有相應的物理頁面與它對應,若有則進行查詢,否則就會引發一個缺頁異常。
缺頁異常
當某個可執行檔案映像對映到程序使用者空間中並開始執行時,因為只有很少一部分虛擬頁面裝入到了實體記憶體,可能會遇到所訪問的資料不在實體記憶體,就是上面的有效位為0的情況。這時,處理器將向linux報告一個頁故障及其對應的故障原因。
當出現一個缺頁異常時,這個異常會導致控制轉移到核心的缺頁處理程式,這個程式將會執行以下一些步驟:
1)、核心會先判斷這個引發異常的地址A是否合法,也就是說A在某個區域中嗎,若不再則引發一個段錯誤,從而終止這個程序。

2)、試圖進行的儲存器訪問是否合法,也就是說我們是否對一個只讀的區域執行了寫操作。若是則執行一個保護異常。
當核心知道我們這個缺頁是因為對合法的虛擬地址進行合法的操作造成的,它是這樣來處理一個缺頁的:選擇一個犧牲頁面,如果這個犧牲頁面被修改過,那麼就將它交換出去,還入新的頁面並更新頁表。當缺頁處理程式返回時,CPU重新啟動引起缺頁的指令,這條指令將再次傳送地址A到MMU。這次,就能正常的翻譯地址A而不會產生缺頁中斷了。
對於上面的一個過程是在一級頁表中完成的,實際上都是多級頁表(2級或者3級等),其實地址翻譯的過程還是一樣的,下面這個圖就是對多級頁表的一個翻譯過程:
總之就是把一個虛擬地址分為好幾段,分別作為一級、二級、、K級的索引,當然別忘了我們的PGD,他在程式執行的過程中是儲存在CR3這個暫存器中的。
在虛擬頁到物理頁的翻譯過程中最重要的資料結構就是頁表了,是它打通了虛擬到物理的通道,頁表存在於主存中,程序只需要記住它的首地址。

閱讀(1226) | 評論(0) | 轉發(4) |