天天看點

linux記憶體管理-段式和頁式管理

該博文參考國嵌視訊和http://www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html,在此感謝作者。

一、位址類型

實體位址:CPU通過位址總線的尋址,找到真實的實體記憶體對應位址。  

邏輯位址:程式代碼經過編譯後出現在 彙程式設計式中位址。

線性位址(虛拟位址):在32位CPU架構下,可以表示4G的位址空間,用16進制表示就是0x00000000---0Xffff ffff 

他們之間關系?

linux記憶體管理-段式和頁式管理

二、段式管理、頁式管理

2.1段式管理

2.2.1段式管理(16位CPU)

16位CPU内部擁有20位的位址線,它的尋址範圍2^20即1M的記憶體空間,但是16位CPU用于存放位址的寄存器(IP,sp)隻有16位,即隻能通路64K記憶體空間。

如何使用16位址寄存器通路1M記憶體空間??

為了能夠通路1M的記憶體空間,CPU采用記憶體分段的管理模式,并在CPU内部加入了段寄存器。16位CPU将1M記憶體空間分為若幹邏輯段,每個邏輯段的要求如下:

1、  邏輯段的起始位址(段位址)必須是16倍數,即最後4個二進制必須全部為0

2、  邏輯段的最大容量為64K(why?因為16位CPU存放位址寄存器隻有16位)

實體位址的形成方式:

         由于段位址必須是16倍數,是以值一般形式為XXXX0H,即前16位二進制是變化的,後四位是固定的0,鑒于段位址的這種特性,可以隻儲存前16位二進制位來儲存整個段基位址,是以每次使用時要段寄存器乘以16得到實際段位址。

邏輯位址=段基位址:偏移位址

其中:段基位址儲存到段寄存器中,偏移位址儲存另個寄存器中

線性位址= 段基位址*16+偏移位址

2.2.2段式管理(32位CPU)

在32位CPU兩種工作方式:由實模式和保護模式組成。

1、  實模式:記憶體管理與 16位CPU是一緻的。

2、  保護模式:(一般X86運作模式)

段基位址長達32位,每個段的最大容量可達4G,段寄存器的值時段位址的“選擇器”(selecor),用該“選擇器”從記憶體中得到一個32位的段位址,存儲單元的

實體位址=該段基位址(Base)+段内偏移位址(offset)

linux記憶體管理-段式和頁式管理

2.2頁式管理(分頁管理)

概念

1、  線性位址頁:從管理和效率的角度出發,線性位址被分為固定長度的組,稱為頁(page)。例如32位機器,線性位址最大可為4G,如果用4KB為頁容量,這樣将線性位址劃分為2^20個頁。

2、  實體頁:另一類“頁”,稱為“實體頁”,或者是“頁框、頁幀”。分頁單元把所有的實體記憶體也劃分為固定長度的管理機關,它的長度一般與線性位址頁是相同。

如何将兩者之間的映射?通過頁式管理實作映射。

linux記憶體管理-段式和頁式管理

頁式管理具體流程:

linux記憶體管理-段式和頁式管理

說明:

1、  分頁單元中,頁目錄的位址放在CPU的CR3寄存器中,是進行位址轉換的起始點。

2、  每個程序,都有其獨立的虛拟位址空間,運作一個程序,首先需要将它的頁目錄位址放到CR3寄存器中,将其他程序儲存下來。

3、  每一個32位的線性位址被劃分三部分:頁目錄索引(10位):頁表索引(10位):偏移(12位)

下面是位址轉換的步驟:

第一步:裝入程序的頁目錄位址(作業系統在排程程序時,把這個位址裝入CR3)

第二步:根據線性位址前十位,在頁目錄中,找到對應的索引項 即頁表位址。

第三步:根據線性位址中間十位,在頁表中,找到對應的索引項 即頁的起始位址。

第四步:将頁的起始位址與線性位址最後12位相加,等到實體位址。

1、  這樣的二級模式是否支援尋址4G的實體位址空間?為什麼?

支援。因為頁目錄支援尋址2^10個頁表,每個頁表支援尋址2^10個頁,每個頁由2^12=4Kbyte組成,即2^10* 2^10*2^12=4Gbyte滿足。

2、  由上圖實體位址的頁容量多大?有什麼決定的?

在二級模式下,頁容量由線性位址[bit11:0]決定,頁容量=2^12=4Kbyte。

根據上面的分段管理和分頁管理,得出下圖

linux記憶體管理-段式和頁式管理

該圖源于/www.cnblogs.com/image-eye/archive/2011/07/13/2105765.html部落格

三、linux記憶體管理

Linux核心的設計并沒有全部采用intel所提供的段機制,僅僅是有限度使用了分段機制。這不僅簡化了linux核心的設計,而且為了把linux移植到其他平台創造了條件,因為很多RISC處理器并不支援段機制。

為什麼是linux核心設計有限度使用分段機制?

因為linux核心中記憶體管理中:所有的段的基位址均為0,即每個段的邏輯位址與線性位址保持一緻(即邏輯位址的偏移量值與線性線性的位址值相同),而完成利用了分頁機制。

         前面介紹的i386的二級頁管理架構,有些CPU使用三級或四級架構。在linux2.6.29核心為每種CPU提供統一界面,四級頁管理架構,來相容二級三級 四級管理架構的CPU。四級架構詳見下面:

linux記憶體管理-段式和頁式管理

其中:

1、頁全局目錄(page global directory):多級頁表的抽象最高層

2、頁上級目錄(page upper directory):即pud

3、頁中間目錄( page middle directory):即pmd 頁表的中間層

4、頁表(page table entry):pte

5、頁:即具體實體位址

繼續閱讀