## 硬件中的分頁:
32位的線性地址被分成3個域:
高10位:頁目錄表
中間10位:頁表
低12位:頁表內偏移
使用二級頁表模式的目的在于減少每個進程頁表所需RAM數量。如果是一級頁表,則需高達220個表項,而二級模式只為進程實際使用的那些虛擬內存區請求頁表。
頁目錄項和頁表項有同樣的結構,均包含了一些屬性字段。
評:段頁屬性字段的設置很有意義,分段、分頁這種將內存結構化、組織化的方式,同時可以增加對某一段或頁的屬性描述信息,對于內存管理來說很有意義,這種組織內存的方法思路,正如行政區域的劃分。
### 物理地址擴展(PAE)分頁機制:
這一部分在我的另一篇博文中有提到:[http://blog.csdn.net/crazyingbird/article/details/7175559](http://blog.csdn.net/crazyingbird/article/details/7175559)
### 硬件高速緩存:
為了縮小CPU和RAM之間的速度不匹配,引入了硬件調整緩沖內存。
多處理器系統的每一個處理器都有一個單獨的硬件高速緩存,它們需要額外的硬件電路,用于保持不同CPU之間的高速緩存內容的同步。只要一個CPU修改了它的硬件高速緩存,它就必須檢查同樣的數據是否包含在其它的硬件高速緩存中,如果是,它必須通知其它CPU用適當的值對其更新,這種活動叫做高速緩存偵聽。這些活動由硬件處理,內核無需關心。
Linux對于所有的頁框都啟用高速緩存,對于寫操作總是采用加回寫策略。
### 轉換后援緩沖器:
記錄上一次線性地址轉換得到的相應的物理地址,以便以后對同一線性地址的引用可以快速地得到轉換。
在多處理器系統中,每個CPU都有自己的TLB,稱為該CPU的本地TLB,與硬件高速緩存相反,TLB中的對應項不必同步,這是因為運行在現有CPU上的進程可以使同一線性地址與不同物理地址發生聯系。
## Linux中的分頁:
在2.6.10版本及之前,Linux采用三級分頁模型,從2.6.11版本開始,采用四級分頁模型:
* 頁全局目錄(Page?Global?Directory)
* 頁上級目錄(Page?Upper?Directory)
* 頁中間目錄(Page?Middle?Directory)
* 頁表(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的末端。
### 處理硬件高速緩存:
為了使高速緩存的命中率達到最優化,內核在下列決策中考慮體系結構:
一個數據結構中最常使用的字段放在該數據結構內的低偏移部分,以便它們能夠處于高速緩存的同一行中。
注:聚集存儲的數據結構大小可能大于行的大小。
當為一大組數據結構分配空間時,內核試圖把它們都存放在內存中,以便所有高速緩存行按同一方式使用。