更新時間:2020-12-16 17:35:29 來源:動力節點 瀏覽1862次
首先,我們要知道一個概念:MMU(內存管理單元),MMU可以通過CPU將線性地址轉換成物理地址。我們再來看Linux的內存管理,Linux內存管理機制分為頁式管理和段式管理兩種管理機制,對于段式內存管理機制,是將指令中結合段寄存器使用的32位邏輯地址映射為32位的物理地址。
隨著操作系統的發展,提出了保護模式和虛擬內存管理的概念, Intel在分段機制的基礎上實現了包含模式和虛擬內存管理,后來出現了分頁機制并逐漸成為內存管理機制的主流。Intel出于兼容性的考慮,保留了段式內存管理機制,段寄存器用做選擇子,段基地址及其他的某些屬性存放在內存中,稱為段描述符表。
段式內存管理機制的靈活性和效率都比較差,這樣就需要采用頁式管理機制。頁式管理就是通過分頁單元將線性地址轉換為物理地址,其中一個重要的任務就是把請求的訪問類型與線性地址的訪問權限進行對比,如果該內存訪問無效,則產生一個缺頁的異常。
內核把線性地址分為4KB大小的頁面,其中的每個頁面都可以映射到物理地址空間的任意4KB大小的地址。在該映射過程中,連續的線性地址映射到物理地址空間中不一定是連續的,分頁單元把所有的RAM分成固定長度的物理頁,每一個物理頁( Page Frame)包含一個頁。
把線性地址映射到物理地址的數據結構稱為頁表,該頁表存放在主存中,并在啟用分頁單元之前由內核對頁表進行初始化。由于引入了頁式管理,因此32位的線性地址分為3個區域,分別為 Directory(目錄)、Table(頁表)及0 Offset(偏移)。目錄是線性地址的最高10位,用做頁面表目錄的下標,指向一個頁面表;頁表是線性地址的中間10位,用做具體頁面表中的下標,指向具體的物理頁面;偏移則是線性地址的最低12位,用于指向具體物理頁面內的偏移量。對于每一個活動進程都有一個分配的頁目錄,正在使用的頁目錄的物理地址存放在cr3控制寄存器中。線性地址的 Directory字段決定了頁目錄中的目錄項,目錄項指向某個頁表,線性地址的 Tab le字段則決定了頁表中的頁表項,0 cfset字段決定頁框內的偏移量,由于該字段包含了12位,因此每頁包含了4096字節的數據。
線性地址到物理地址的映射,先從cr3寄存器中獲得頁面目錄的基地址,然后以 Directory字段為下標,在目錄中取得相應的頁面表的基地址,之后以線性地址中的Page字段為下標,取得相應的頁面描述項,最后將頁面描述項中給出的頁面基地址與線性地址中的0ffset字段相加得到具體的物理地址。
由于大型的服務器需要大于4GB的RAM來同時運行大量的進程,因此必須擴展32位的X86結構所支持的RAM,Inte通過把處理器引腳數從32擴展到36滿足了這些需求。從 Pent ium Pro開始,Inte對物理地址的寬度進行了擴展,即物理地址擴展(PAE)機制,這樣可以把32位的線性地址轉換為36位的物理地址,該機制中通過設置cr4控制寄存器中的物理地址擴展標志來激活PAE。為了支持PAE也改変了分頁機制,64B的RAM分為2的24次方個物理頁,頁表項的物理地址字段從20位擴展到24位,同時引入了頁目錄指針表的頁表新級別,由4個64位表項構成。cr3寄存器包含了27位的頁目錄指針表基地址字段,當把線性地址映射到4KB的頁時,32位線性地址中的0~11位為4KB頁中的偏移量,12~20位指向頁表512項中的一個,2139位指向頁目錄512項中的一個,30~31位指向頁目錄指針表4項中的一項,對于cr3則指向一個目錄指針表。
Linux內存管理機制看起來很復雜,實際上只需要集合Linux的內核和系統結構,加以分析,理解起來事半功倍。本站的Linux教程里面對Linux的內存管理機制和Linux內核都有詳細的講解,想學好Linux的小伙伴千萬不要錯過哦!
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習