close

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 DirectoryMiddle 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   範圍從0X000a00000x000fffff的實體記憶體位址通常保留給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的電腦的典型型態。範圍從0x07ff00000x07ff2fff的實體位址所儲存的是與系統之硬體裝置有關的資訊,這是由BIOSPOST階段所寫入的。

為了避免把核心載入到一群非連續的頁框,Linux寧可跳過RAM的第一個MB。顯然,沒有被PC架構保留的頁框,會被Linux用來儲存動態指派頁面。

arrow
arrow
    全站熱搜

    Aminzai 發表在 痞客邦 留言(0) 人氣()