硬體中的分頁:
32位的線性地址被分成3個域:
高10位:頁目錄表
中間10位:頁表
低12位:頁表內位移
使用二級頁表模式的目的在於減少每個進程頁表所需RAM數量。如果是一級頁表,則需高達220個表項,而二級模式只為進程實際使用的那些虛擬記憶體區請求頁表。
頁目錄項和頁表項有同樣的結構,均包含了一些屬性欄位。
評:段頁屬性欄位的設定很有意義,分段、分頁這種將記憶體結構化、組織化的方式,同時可以增加對某一段或頁的屬性描述資訊,對於記憶體管理來說很有意義,這種組織記憶體的方法思路,正如行政地區的劃分。
實體位址延伸(PAE)分頁機制:
這一部分在我的另一篇博文中有提到:http://www.bkjia.com/os/201202/120130.html
硬體快取:
為了縮小CPU和RAM之間的速度不匹配,引入了硬體調整緩衝記憶體。
多處理器系統的每一個處理器都有一個單獨的硬體快取,它們需要額外的硬體電路,用於保持不同CPU之間的快取內容的同步。只要一個CPU修改了它的硬體快取,它就必須檢查同樣的資料是否包含在其它的硬體快取中,如果是,它必須通知其它CPU用適當的值對其更新,這種活動叫做快取偵聽。這些活動由硬體處理,核心無需關心。
Linux對於所有的頁框都啟用快取,對於寫操作總是採用加回寫策略。
轉換後援緩衝器:
記錄上一次線性地址轉換得到的相應的物理地址,以便以後對同一線性地址的引用可以快速地得到轉換。
在多處理器系統中,每個CPU都有自己的TLB,稱為該CPU的本地TLB,與硬體快取相反,TLB中的對應項不必同步,這是因為運行在現有CPU上的進程可以使同一線性地址與不同物理地址發生聯絡。
Linux中的分頁:
在2.6.10版本及之前,Linux採用三級分頁模型,從2.6.11版本開始,採用四級分頁模型:
l 頁全域目錄(Page Global Directory)
l 頁上級目錄(Page Upper Directory)
l 頁中間目錄(Page Middle Directory)
l 頁表(Page Table)
對於沒有啟用實體位址延伸的32位系統,Linux取消了頁上級目錄和頁中間目錄,僅使用了兩級頁表。
啟用了實體位址延伸的32位系統,Linux取消了上級目錄,使用三級頁表。
對於64位系統,Linux根據硬體對線性地址位的劃分來決定採用三級或者四級頁表。
實體記憶體布局:
Linux核心安裝在RAM中從物理地址0x00100000開始的地方,也就是從第二個MB開始。
頁框0由BIOS使用,存放加電自檢期間檢查到的系統硬體。
物理地址從0x000a0000到0x000fffff的範圍通常留給BIOS全程,並且映射ISA圖形卡上的內部內在。
第一個MB內的其它頁框可能由特定電腦模型保留。
在啟動過程的早期階段,核心詢問BIOS並瞭解實體記憶體的大小,隨後,核心建立物理地址映射。
核心可能不會見到BIOS報告的所有實體記憶體:如果未啟用PAE支援來編譯,即使有更大的實體記憶體可供使用,核心也只能定址4GB大小的RAM。
進程頁表:
進程的線性地址空間分成兩部分:
從0x00000000到0xbfffffff的線性地址,無論進程運行在使用者態還是核心態都可以定址;
從0xc0000000到0xffffffff的線性地址,只有核心態的進程才能定址;
當進程運行在使用者態時,它產生的線性地址小於0xc0000000;當進程運行在核心態時,它執行核心代碼,所產生的地址大於等於0xc0000000。但某些情況下,核心為了檢索或存放資料必須訪問使用者態線性地址空間。
核心頁表:
核心維持著一組自己使用的頁表,駐留在所謂的主核心頁全域目錄中,系統初始化後,這組頁表還從未被任何進程或者任何核心線程直接使用;確切的說,主核心頁全域目錄的最高目錄項部分作為參考模型,為系統中每個普通進程對應的頁全域目錄提供參考模型。
那麼,核心如何初始化自己的頁表呢?核心映像剛剛被裝入記憶體後,CPU仍然運行於實模式,所以分頁功能沒有被啟用。
第一階段,核心建立一個有限的地址空間,包括核心的程式碼片段和資料區段、初始頁表和用於存放動態資料結構的共128KB大小的空間。這個最小限度的地址空間僅夠將核心裝入RAM和對其它初始化的核心資料結構。
第二階段,核心充分利用剩餘的RAM並適當建立分頁表。
由核心頁表所提供的最終映射必須把從0xc0000000,即第四個GB開始的線性地址轉化為從0開始的物理地址。
固定映射的線性地址:
固定映射的線性地址基本上是一種類似於0xffffc000這樣的常量線性地址,其對應的物理地址不必等於線性地址減去0xc000000,而是可以以任意方式建立。因此,每個固定映射的線性地址都映射一個實體記憶體的頁框。核心使用固定映射的線性地址來代替指標變數。
每個固定映射的線性地址都存線上性地址第四個GB的末端。
處理硬體快取:
為了使快取的命中率達到最佳化,核心在下列決策中考慮體繫結構:
一個資料結構中最常使用的欄位放在該資料結構內的低位移部分,以便它們能夠處於快取的同一行中。
註:聚集儲存的資料結構大小可能大於行的大小。
當為一大組資料結構分配空間時,核心試圖把它們都存放在記憶體中,以便所有快取行按同一方式使用。
作者 瘋狂伯德