Linux的分頁功能
Linux採用了一種共同的分頁模型,可適用於32位元和64位元架構。
因為32位元架構有兩層分頁就夠了,但64位元架構需要較多酚頁層。所以到2.6.10版時,Linux採用了三層分頁模型。到2.6.11版起,Linux採用了四層分頁模型。
l 頁面全域目錄(Page Global Directory)
l 頁面上層目錄(Page Upper Directory)
l 頁面中間表格(Page Middle Directory)
l 頁面表格
[頁面全域目錄]包含的是幾個[頁面上層目錄]的位址。[頁面上層目錄]包含是幾個[頁面中間目錄表格]的位址。[頁面中間目錄表格]包含的是幾個[頁面表格]的位址。每個頁面表格項目會指向一個頁框。因此線性位址可切割成五個部分。
對沒有PAE功能的32位元架構而言,兩個分頁就夠了。基本上,Linux會把Upper Directory和Middle Directroy欄位消去,也就是將它們的位元清為0。頁面上層目錄和頁面中間目錄在指標序列中的位址被保留下來,所以就能讓相同程式在32位元和64位元架構上使用。
Linux對行程的處理極為仰賴分頁功能。事實上,線性位址會自動轉譯成實體位址,使得下列設計目標可行:
l 指派不同實體位址空間給每個行程,以有效防止定址錯誤。
l 區分頁面(資料群)和頁框(主記憶體中的實體位址)。這可以讓原本儲存在某個頁框的頁面,存入磁碟後,有可重載到另一個頁框。這就是虛擬記憶體機制的基本要素。
實體記憶體配置
在開機的階段,核心必須建立一個實體位址配置圖(Physical address map),指出哪些範圍的實體記憶體位址可供核心使用,以及哪些範圍不能使用(可能這些是因為那些實體位址所對應的是硬體I/O共用記憶體,或是因為相應的頁框中含有BIOS資料)
核心會把下列頁框保留:
l 落在不可使用的實體記憶體範圍的頁框
l 含有核心程式和初始設定資料結構的頁框
基本原則,Linux核心會把實體記憶體位址0X00100000開始備安裝到RAM裡,也就是在第二個MB。所需的頁框總數取決於核心的組態。基本的組態會讓核心載入至RAM時少於3MB。
為什麼核心載入RAM時不從第一個可用的MB開始為前點呢? 因為PC架構有幾個特性必須考量。
l 頁框0已經被BIOS用來儲存Power-On Self-Test(開機自動測試,簡稱POST)階段所偵測出來的。
l 範圍從0X000a0000到0x000fffff的實體記憶體位址通常保留給BIOS常式,用來對應ISA繪圖顯示卡的內部記憶體。
l 第一個MB裡其他的頁框可能會被特定的電腦模式保留下來。(EX:IBM ThinkPad會把0xa0頁框對應到0x9f頁框)
開機過程的早期,核心會查詢BIOS,以了解實體記憶體的大小。新近的電腦中,核心還會調用一個BIOS程序,以建立一份實體位址範圍清單及其相應的記憶體類型。
起值 | 終值 | 類型 |
0x00000000 | 0x0009ffff | 可用 |
0x000f0000 | 0x000fffff | 保留 |
0x00100000 | 0x07feffff | 可用 |
0x07ff0000 | 0x07ff2fff | ACPI資料 |
0x07ff3000 | 0x07ffffff | ACPI NVS |
0xffff0000 | 0xffffffff | 保留 |
如上表所表示具有128MB RAM的電腦的典型型態。範圍從0x07ff0000到0x07ff2fff的實體位址所儲存的是與系統之硬體裝置有關的資訊,這是由BIOS在POST階段所寫入的。
為了避免把核心載入到一群非連續的頁框,Linux寧可跳過RAM的第一個MB。顯然,沒有被PC架構保留的頁框,會被Linux用來儲存動態指派頁面。
留言列表