天天看點

核心代碼閱讀(1) - Intel CPU和段頁式記憶體管理

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層。      

CR0 寄存器最高PG位,是頁式映射機制的蹤開關。1是開啟頁式映射。

PAE 在Pentium Pro中作了位址擴充,增加了CR4寄存器,其中有一個PAE位。

繼續閱讀