1. 程式人生 > >記憶體管理圖解---------頁目錄表 頁表

記憶體管理圖解---------頁目錄表 頁表

 

上圖反映瞭如下資訊:

1、  程序的4G 線性空間被劃分成三個部分:程序空間(0-3G)、核心直接對映空間(3G – high_memory)、核心動態對映空間(VMALLOC_START  -  VMALLOC_END)

2、  三個空間使用同一張頁目錄表,通過 CR3 可找到此頁目錄表。但不同的空間在頁目錄表中頁對應不同的項,因此互相不衝突

3、  核心初始化以後,根據實際實體記憶體的大小,計算出 high_memory、VMALLOC_START、VMALLOC_END 的值。併為“核心直接對映”空間建立好對映關係,所有的實體記憶體都可以通過此空間進行訪問。

4、  “程序空間”和“核心動態對映空間”的對映關係是動態建立的(通過缺頁異常)

假設在有三個線性地址 addr1, addr2, addr3 ,分別屬於三個線性空間,但是最終都對映到物理頁面1:

1、  三個地址對應不同的頁表和頁表項

2、  但是頁表項的高 20bit 肯定是1,表示物理頁面的索引號是1

3、  同時,根據高 20 bit,可以從 mem_map[] 中找到對應的 struct page 結構,struct page 用於管理實際的物理頁面(紅線)

4、  從線性地址,根據頁目錄表,頁表,可以找到實體地址

5、  Struct page 和實體地址之間很容易互相轉換

6、  從實體地址,可以很容易的反推出在核心直接對映空間的線性地址(藍線)。要想得到在程序空間或者核心動態對映空間的對應的線性地址,則需要遍歷相應的“虛存區間”連結串列。

 
關於頁目錄表:


1、  每個程序有一個屬於自己的頁目錄表,可通過 CR3 暫存器找到 
2、  而核心也有一個獨立於其它程序的頁目錄表,儲存在 swapper_pg_dir[] 陣列中

3、  當程序切換的時候,只需要將新程序的頁目錄把地址載入到 CR3 暫存器中即可

4、  建立一個新程序的時候,需要為它分配一個 page,作為頁目錄表,並將 swapper_pg_dir[] 的高 256 項拷貝過來,低 768 項則清0