2008年1月8日 星期二

Linux Memory Paging - 3

Linux Kernel 有自己專屬的 Page Directory 及 Page Table
在系統初始化時,會先建立 2個 Page Table -- 包含 2048個 Page,共 8MB 的記憶體空間
這 8MB 是 Linux 開機最少需要的記憶體大小,而且保留給 Kernel 使用

Kernel Page Global Directory 是以變數 swapper_pg_dir 表示
其資料結構可視為含有 1024 個元素的 pgd_t 型態的陣列
實體記憶體位址為 0x00101000

Kernel Page Table (第 0及第 1個 Table) 是以變數 pg0pg1 表示
其資料結構可視為含有 1024個元素的 pte_t 型態的陣列
實體記憶體位址分別為 0x001020000x00103000

Linux Page 初始化的動作定義於 arch/i386/kernel/head.S
因為開機時僅需要 8MB,所以只要初始化 2個 Page Table 便可,即 pg0 及 pg1
其餘的 Page Table 均填入 0 的值

又為了讓這 2個 Page Table 可以被 Real Mode 及 Protect Mode 所存取
Kernel Page Global Directory 中的第 0、第 768個 Entry以及第 1、第 769個 Entry
分別會設為相同的 Page Table 的實體記憶體位址,如圖所示


初始化完成後,得到以下的結果:
swapper_pg_dir[0] = swapper_pg_dir[768] = 0x00102007
swapper_pg_dir[1] = swapper_pg_dir[769] = 0x00103007
pg0 加上 pg1 定址到實體記憶體 0x00000000 - 0x007FFFFF,共 8MB 的分頁

根據 pgd_t 及 pte_t 的欄位格式可得知:
1) bit 0-11 為 0x007,表示 Enable 旗號 Present、Read/Write、User/Supervisor
2) bit 12-31 為 Base Address

沒有留言: