linux 虛擬記憶體初識
一個執行程式時,虛擬記憶體技術如何運作:
虛擬記憶體空間的大小是由程式計數器的定址能力來決定的
採用虛擬技術,就存在兩個記憶體空間:
虛擬記憶體空間,其中的地址叫做“虛擬地址”
實體記憶體空間,其中的地址叫做“實體地址”
處理器運算器、應用程式設計人員 只看到 虛擬記憶體空間和虛擬地址
處理器片外的地址匯流排 只看到 物理空間和實體地址
採用虛擬技術,一個應用程式從編寫到被執行,需要進行兩次對映
第一次是對映到虛擬記憶體空間,即使用虛擬地址為程式編址
第二次是對映到實體記憶體空間,即把執行的程式複製到實體記憶體
程式設計時的地址與程式的業務邏輯有關->虛擬地址 == 邏輯地址(???)
第二次對映由軟體和硬體共同完成
硬體:儲存管理單元MMU
軟體:作業系統的記憶體管理模組(會建立一個表格A)
表格A:以虛擬地址為索引,記錄了程式段所佔用的實體記憶體的實體地址
表格A是儲存管理單元把虛擬地址裝換為實際地址的依據
表格A == 對映記錄表 == 虛擬地址/實體地址記錄表
虛擬技術的實現,是建立在應用程式可以分段,並且“任何時候正在使用的資訊總是所有儲存資訊的一小部分”的區域性特性基礎之上
處理器運算器、應用程式設計人員的角度來看,它面對的是一個封裝的虛擬記憶體空間
封裝的虛擬記憶體空間 == MMU+對映記錄表+實體記憶體
多個執行程式時,虛擬記憶體技術如何運作:
1.每個程式都有一個大小與處理器定址空間相等的虛擬記憶體空間
2.在一個具體時刻,處理器只能使用其中一個程式的對映記錄表
3.使用程式對映記錄表可方便的實現實體記憶體的共享
對映記錄表是系統由虛擬記憶體進入實體記憶體的唯一介面,這裡可以設定保護措施
段基址+段內偏移地址 ==虛擬地址(得到段描述符項) –(段機制)–>線性地址 –(分頁機制)–>實體地址
[AAA]
段描述符:段描述符是GDT和LDT表中的一個數據結構項,用來向處理器提供一個有關段的位置和大小資訊以及訪問控制的狀態資訊。
DPL:00代表系統,01代表使用者
①段基址給出該段的基礎地址,用於形成線性地址;
②段界限說明該段的長度,用於儲存空間保護;
③儲存權位元組說明該段的訪問許可權、該段當前在記憶體中的存在性,以及該段所在的特權級。
Linux內部檔案示例:
段選擇符:又稱端選擇子,是段的一個16位識別符號。
請求特權級RPL(Request Privilege Level):RPL>=DPL才能得到相應的請求
RPL(00,11)
表指示標誌TI(Table Index):0代表GDTR、1代表LDPR
索引值(Index):3-15位
Linux段選擇結構示例:
段描述符表: 是段描述符的一個數組。
描述表的基址(Base Address),核心用GDTR,程序用LDTR。
[AAA]索引值(Index)+ 描述表的基址(Base Address)->段描述符 (含線性地址)
線性地址[兩級頁表的地址轉換]:
分頁單元中,頁目錄是唯一的,它的地址放在CPU的cr3暫存器中
DIRECTORY+CR3 -> 目錄項(linux中DIRECTORY == 0)
目錄項+TABLE -> 頁起始地址
頁起始地址+OFFSET -> 實體地址
linux系統的本質是有目錄DIRECTORY==頁目錄PGD + 中間頁目錄PMD ,但是為了迎合CPU,通過讓DIRECTORY中的中間頁目錄PMD恆為0的實現了普通分頁機制
Example: