天天看點

【存儲管理】Linux分頁機制(i386)

雖然x386是支援分段和分頁(基于前面分段實作的)兩個機制的,而Linux系統變項隻支援分頁機制。

(1)i386段式管理:邏輯位址(如8086分段機制,CS,SS,DS,ES),線性位址(linux中虛拟位址一樣),實體位址(晶片級尋址單元);i386在實位址模式,對位址,沒有保護和檢查,無法建構真正的OS;保護模式下,增加FS,GS。段寄存器存放段選擇符,根據段寄存器的低3位判别級别和取GDTR,LDTR,高13位找到段描述符(8位元組,含有段基址,段大小,描述符類型code or data)。

(2)i386頁式管理(頁大小固定,換出換入便于管理):其實由于i386使用段式管理,位址映射就要經曆段式和頁式兩級管理,邏輯位址經段式管理成為線性位址,線性位址經頁式管理成為實體位址;i386頁式管理采用兩級分頁機制(頁面目錄,頁目錄)。如果dir和page合并時,我們有1K*1K和表項,就有4G個記憶體尋址範圍;如果隻用一級表項即隻有頁面表,則有2^20個頁表項,若程序通路不到4G記憶體,大多數頁表項是空的,浪費空間,需占用4B*1M需1K個頁面;如果用兩級,但是可映射小位址時dir為空,則相應的頁目錄表項我就可以不使用,如有4M位址,我們隻需要使用一個頁目錄項,4B*1K隻存放到一個頁面。

(3)i386擴充頁式管理:頁框指向4MB的實體位址,則Linux不使用中間頁表,此時目錄項中高20位隻有高10位是有用的指向一頁資料,4MB為邊界。

(4)i386實體位址擴充頁式管理(PAE):4KB映射時,頁表中實體位址字段變為24位,則結構體變為36位,是以一個4KB的頁面隻能有512個頁表項了,同理頁目錄項(8位)隻能有512個頁目錄表項了。cr3和4個pdpt先進行選擇頁目錄項。

(5)linux頁式管理,由于要考慮64位CPU的實作,增加中間目錄選項PMD,但隻有一個表項,做過度作用。由于i386的段式管理,linux姿勢将段式管理走走場,預先定義好__USER_DS,__USER_CS,__KERNEL_DS,__KERNEL_CS(linux統一堆棧段和資料段)。所有程序都共用一個GDT,不使用LDT。但每一個程序都有頁面目錄PGD,根據高10位找到頁目錄項的索引(含有一個頁表),目錄項中高20位指向一個頁面表(其餘位可表示通路權限和狀态),在後面添加12個0即可得到頁面表指針(頁面表也是以4KB為基址);根據中間10位找到頁表中的索引(含有一頁資料),頁面表中高20位指向實體位址的頁面,添加低12位即可得記憶體頁面中的起始位址。

【存儲管理】Linux分頁機制(i386)
【存儲管理】Linux分頁機制(i386)