Real Mode 8086
16位寄存器
20位位址
使用CS DS SS ED段寄存器
16位寄存器 << 4(基位址) + 16位位址
此乃實模式 Real Mode
Protect Mode 80386
保護模式實作思路
段式記憶體
GDTP (global descriptor table register)
LDTR (local descriptor table
每個段寄存器在CPU上都有一個擴充,
當一個段寄存器被改變(MOV, POP)後,CPU會根據LDTP,GDTR+段寄存器的偏移,取出新的段描述符,放到這個寄存器的影子中。
因為GDTR,LDTR的操作是特權指令,隻能在核心态中執行,使用者看不到段描述符表在哪裡,是以部分實作了保護。
最終的段值為 LDTR(GDTR) _+ 相應的段寄存器值的高13位
系統态和使用者态(如何區分是系統态還是使用者态呢?)
80386劃分4個特權級别0是核心态,3是使用者态
16位的段寄存器後3位,用來描述權限
typedef struct {
unsigned short seg_idx:13;
unsigned short ti:1;
unsigned short tpl:2 /*Request Privilege Level 要求的優先級别*/
} 段寄存器;
頁式記憶體
與段式之間的關系
建立在段式基礎之上。目前執行的權限就是存在相關的代碼段描述項中
邏輯位址 (段式)-> 線性位址 (頁式) -> 實體位址
所有的位址都要經過頁式的轉換,包括GDTR, LDTR等
線性位址
typedef struct {
unsigned int dir:10;
unsigned int page:10;
unsigned int offset:12;
} ;
為什麼要2級映射,而不是像段式那樣一步倒位?
如果像段式一步倒位,前面20位可以提供1M的頁面數的尋址。
那麼,就必須開一個大小為1M的連續數組,用以定位頁框下标。這個的設計,不需要頁目錄了大小是(4K),直接由1M大小的頁表定位頁面,然後,後面的12位的offset定位頁内位址。
而采用2層,就可以,在需要目錄項,頁面表目錄的時候動态的申請,而不是一次行的申請1M的連續的頁表目錄大小。類似于STL的deque資料結構。巧妙的設計。
頁面4k,為什麼?
上面說了,在需要目錄項,頁面表目錄的時候動态的申請。
申請目錄項:大小是1k,所占用的記憶體空間正好是4k,是以一個程序的頁目錄一個頁面。
申請頁表:一個頁表大小也是10位,大小1k,記憶體空間是4k。
是以,申請目錄項(一個程序一個),和頁表項都是一個頁面。
alpha CPU 64位cpu的頁面8K。
目錄項,頁表項
目錄項和頁表項都是高10位起作用,低22用不到。這22用來控制權限,虛存等。
PSE
頁目錄項中的ps為0: 頁面大小4k,采用2層;
ps為1: 頁面大小4M, 采用1層。