在linux分頁機制中有幾個概念需要了解,線性位址,實體地址,頁目錄表,頁表,頁目錄項,頁表項。
首先為了防止乙個程序非法跨越到另乙個程序或者乙個程序非法跨越到核心中,linux中使用了線性位址。線性位址是乙個程序執行過程中產生的位址,在32位的系統中其位址空間為0x00000000 - 0xffffffff,其中0xc00000000 - 0xbfffffff無論是使用者程序還是核心程序都可以訪問。0xcfffffff - 0xffffffff只有核心態程序可以訪問。當程序執行在使用者態的時候產生的位址小於0xc00000000,執行在核心態的時候產生的線性位址大於0xc00000000,但是某些需要訪問使用者態的時候也會產生使用者態線性位址。
32位的線性位址按照10/10/12的分為三個部分,第乙個10位用於在頁目錄表中索引頁表位址,第二個10用於在索引的到的頁表中索引特定的頁,最後的12位為在頁中的偏移。在linux核心0.11版本中,總共有乙個頁目錄表,乙個頁目錄表的大小是4k。頁目錄中儲存著頁目錄項,每個頁目錄項為32位。也就是說每個頁目錄表總共有1024個頁表。每個頁目錄項的32位有20位用於索引頁表,其他的位用於表示頁目錄項的屬性。同理,每個頁表也是4k,掌控1024個頁。
p--位0是存在(present)標誌,用於指明表項對位址轉換是否有效。p=1表示有效;p=0表示無效。在頁轉換過程中,如果說涉及的頁目錄或頁表的表項無效,則會導致乙個異常。如果p=0,那麼除表示表項無效外,其餘位可供程式自由使用,如圖4-18b所示。例如,作業系統可以使用這些位來儲存已儲存在磁碟上的頁面的序號。
r/w--位1是讀/寫(read/write)標誌。如果等於1,表示頁面可以被讀、寫或執行。如果為0,表示頁面唯讀或可執行。當處理器執行在超級使用者特權級(級別0、1或2)時,則r/w位不起作用。頁目錄項中的r/w位對其所對映的所有頁面起作用。
u/s--位2是使用者/超級使用者(user/supervisor)標誌。如果為1,那麼執行在任何特權級上的程式都可以訪問該頁面。如果為0,那麼頁面只能被執行在超級使用者特權級(0、1或2)上的程式訪問。頁目錄項中的u/s位對其所對映的所有頁面起作用。
x86結構中,linux核心**加上初始化必要的一些資料,被裝載在物理記憶體從1m開始的位址上(1m以內的位址留給bios或者其他特殊的用途)。雖然核心的大小是不確定的,但通常0-8m的位址範圍足夠儲存這些內容。這些內容依次為:核心**、已初始化的核心資料、未初始化的核心資料。
核心剛剛被裝入記憶體時,分頁功能還未啟用,為了允許cpu在實模式和保護模式之間切換的過程中,都能對這8m的位址進行訪問,核心需要建立兩張臨時的頁表,其結果是將0x00000000-0x007fffff和0xc0000000-0xc07fffff的線性位址同時對映到0x00000000-0x007fffff的實體地址上。這兩張頁表我們稱為臨時核心頁表pg0和pg1。
將我們需要對映的線性位址按照10/10/12個bit位展開,就可以知道我們需要的是哪4項了。
0x00000000 -> 0x000 / 0x000 / 0x000
0x007fffff -> 0x001 / 0x3ff / 0xfff
0xc0000000 -> 0x300 / 0x000 / 0x000
0xc07fffff -> 0x301 / 0x3ff / 0xfff
取出對應頁目錄項的前10bit,可以知道我們需要初始化的4個頁目錄項為0x0、0x1、0x300、0x301。其中0x0和0x300對應pg0,0x1和0x301對應pg1。
至此建立起臨時頁表,下一步建立核心最終頁表。
Linux的分頁機制
先前我們介紹段機制的時候說到,x86的段機制把程式的邏輯位址轉換成線性位址,這裡要講的分頁機制是把線性位址對映成實體地址,也就說說,x86其實是用了兩套機制把邏輯位址轉換成實體地址的。我們也提到linux核心是怎樣繞過段機制從而讓x86的分段機制看起來不起作用的,我們還說到這樣的處理造成了段的資料保...
linux分段分頁機制
mmu使用分段單元硬體把邏輯位址轉換為虛擬位址,再使用分頁單元硬體把虛擬位址轉換為實體地址。因為這兩部分表示乙個獨一無二的邏輯位址,虛擬位址作為這個段位址另一種形式,當然也需要這兩個部分作為轉換的 原材料。這裡涉及乙個叫做段的暫存器,它的作用是放段選擇符 識別符號 共有六種 cs 儲存指向 的段的選...
Linux之分段機制和分頁機制
通用作業系統的設計原則 盡量縮短系統的平均響應時間並提高系統的吞吐率,在單位時間內為盡可能多的為使用者請求提供服務。如對於整個系統來說,注重所有任務的平均響應時間而不關心單個任務的響應時間,對於某個單個任務來說,注重每次執行的平均響應時間而不關心某次特定執行的響應時間。比如記憶體管理中的lru替換策...