天天看點

實模式/保護模式,GDT/LDT的含義

1、實模式、保護模式

CPU啟動時有兩種模式,分别是:實模式 和 保護模式

實模式:不能使用多線程。不能實作權限分級。還不能通路20位以上位址線,也就是說隻能通路1M記憶體(!!!)

位址轉換公式是:實體位址 = 線性位址 = 段位址*16 + 段偏移

保護模式:作業系統(system子產品中的head.s程式)接管CPU後,會使CPU進入保護模式.

包括CPU權限分級. 多任務,記憶體分頁等各種功能。

2、位址轉換步驟

位址轉換:查全GDT-->

查LDT --> 找到段(确定段基址) -->

确定線性位址 = 段基址 + 偏移 --> 實體位址 = 線性位址 + 分頁 

(1)全局描述符表GDT(Global Descriptor Table)在整個系統中,全局描述符表GDT隻有一張(一個處理器對應一個GDT),GDT可以被放在記憶體的任何位置,但CPU必須知道GDT的入口,也就是基位址放在哪裡,Intel的設計者門提供了一個寄存器GDTR用來存放GDT的入口位址,程式員将GDT設定在記憶體中某個位置之後,可以通過LGDT指令将GDT的入口位址裝入此寄存器,從此以後,CPU就根據此寄存器中的内容作為GDT的入口來通路GDT了。GDTR中存放的是GDT在記憶體中的基位址和其表長界限。

實模式/保護模式,GDT/LDT的含義

(2)段選擇子(Selector)由GDTR通路全局描述符表(GDT)是通過“段選擇子”(實模式下的段寄存器(我個人了解的CS寄存器))來完成的,如圖三①步。段選擇子是一個16位的寄存器(同實模式下的段寄存器相同)如圖四

實模式/保護模式,GDT/LDT的含義

段選擇子包括三部分:描述符索引(index)、TI、請求特權級(RPL)。他的index(描述符索引)部分表示所需要的段的描述符 在描述符表的位置(我的了解是根據這個CS寄存器裡面的index去GDT或LDT中找對應的段),由這個位置再根據在GDTR中存儲的描述符表基址就可以找到相應的描述符(如圖三①步)。然後用描述符表中的段基址加上邏輯位址(SEL:OFFSET)的OFFSET就可以轉換成線性位址(如圖三②步),段選擇子中的TI值隻有一位0或1,0代表選擇子是在GDT選擇,1代表選擇子是在LDT選擇。請求特權級(RPL)則代表選擇子的特權級,共有4個特權級(0級、1級、2級、3級)。

關于特權級的說明:任務中的每一個段都有一個特定的級别。每當一個程式試圖通路某一個段時,就将該程式所擁有的特權級與要通路的特權級進行比較,以決定能否通路該段。系統約定,CPU隻能通路同一特權級或級别較低特權級的段。

例如給出邏輯位址:21h:12345678h轉換為線性位址 a. 選擇子SEL=21h=0000000000100 0 01b 他代表的意思是:選擇子的index=4即100b選擇GDT中的第4個描述符;TI=0代表選擇子是在GDT選擇;左後的01b代表特權級RPL=1 b. OFFSET=12345678h若此時GDT第四個描述符中描述的段基址(Base)為11111111h,則線性位址=11111111h+12345678h=23456789h

3)局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若幹張,每個任務可以有一張。我們可以這樣了解GDT和LDT:GDT為一級描述符表,LDT為二級描述符表。如圖

實模式/保護模式,GDT/LDT的含義

LDT和GDT從本質上說是相同的,隻是LDT嵌套在GDT之中。LDTR記錄局部描述符表的起始位置,與GDTR不同LDTR的内容是一個段選擇子。由于LDT本身同樣是一段記憶體,也是一個段,是以它也有個描述符描述它,這個描述符就存儲在GDT中,對應這個表述符也會有一個選擇子,LDTR裝載的就是這樣一個選擇子。LDTR可以在程式中随時改變,通過使用lldt指令。如上圖,如果裝載的是Selector 2則LDTR指向的是表LDT2。

舉個例子:如果我們想在表LDT2中選擇第三個描述符所描述的段的位址12345678h。 

1. 首先需要裝載LDTR使它指向LDT2 使用指令lldt将Select2裝載到LDTR 

2. 通過邏輯位址(SEL:OFFSET)通路時SEL的index=3代表選擇第三個描述符;TI=1代表選擇子是在LDT選擇,此時LDTR指向的是LDT2,是以是在LDT2中選擇,此時的SEL值為1Ch(二進制為11 1 00b)。OFFSET=12345678h。邏輯位址為1C:12345678h 

3. 由SEL選擇出描述符,由描述符中的基址(Base)加上OFFSET可得到線性位址,例如基址是11111111h,則線性位址=11111111h+12345678h=23456789h 

4. 此時若再想通路LDT1中的第三個描述符,隻要使用lldt指令将選擇子Selector 1裝入再執行2、3兩步就可以了(因為此時LDTR又指向了LDT1) 由于每個程序都有自己的一套程式段、資料段、堆棧段,有了局部描述符表則可以将每個程序的程式段、資料段、堆棧段封裝在一起,隻要改變LDTR就可以實作對不同程序的段進行通路。

因為CPU使用的logical addr。為了使CPU能正常工作,我們需要提供給它的各種寄存器以logical addr。   2.  維護多程序切換資訊。        A.gdtr寄存器指向GDT在記憶體中的首位址。用CS,DS中的内容做為segment selector。        B.CS前13位作為index,最低2位用來判斷CPU是運作在0級還是3級(DPL),剩下那位指明通路GDT還是LDT。           GDT/LDT的表項裡有DPL, CPU通路它時要對比CS最低兩位和GDT表項中的DPL,通過了檢查才可以繼續通路.        C.TSS(狀态段)是一個特殊的段。程序切換前把CPU寄存器壓棧入内

保護模式下的段寄存器 由 16位的選擇器 與 64位的段描述符寄存器 構成 

段描述符寄存器: 存儲段描述符

選擇器:存儲段描述符的索引

實模式/保護模式,GDT/LDT的含義

PS:原先實模式下的各個段寄存器作為保護模式下的段選擇器,80486中有6個(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同時提供6個段左右機器目前運作的位址空間。由選擇器CS對應表示的段仍為代碼段,選擇器SS對應表示的段仍為堆棧段

-----------------------------------------------我是分割線------------------------

段描述符:

實模式/保護模式,GDT/LDT的含義

P,present位,1表示所描述的段存在(有效),為0表示所描述的段無效,使用該描述符會引起異常

DPL,Descriptor privilege,描述符特權級别,說明所描述段的特權級别

DT,描述符類型位,1說明目前描述符為存儲段描述符,0為系統描述符或門描述符.

TYPE:

位0:A(accessed)位,表明描述符是否已被通路;把選擇子裝入段寄存器時,該位被标記為1

位3:E(EXECUTABLE?)位,0說明所描述段為資料段;1為可執行段(代碼段)

當為資料段時,

位1為W位,說明該資料段是否可寫(0隻讀,1可寫)

位2為ED位,說明該段的擴充方向(0向高位擴充,1向低位擴充)

當為可執行段是,

位1為R位,說明該執行段是否可讀(0隻執行,1可讀)

位2為C位,0說明該段不是一緻碼段(普通代碼段),1為一緻碼段

G為粒度位,0說明LIMIT粒度為位元組,1為4K位元組.

D位:

1.在可執行段中,D為1,表示使用32位位址,32/8位操作數;為0表示使用16位位址,16/8位操作數

2.在由SS尋址的段描述符(堆棧段?)中,D為1表示隐含操作(如PUSH/POP)使用ESP為堆棧指針,/

為0使用SP(隐含操作:未明确定義段屬性類型USE16/USE32?66H,67H?)

3.在向低擴充的存儲段中,D為1,表示段的上限為4G;為0上限為64K

存儲段描述符的結構表示:

實模式/保護模式,GDT/LDT的含義

分段管理可以把虛拟位址轉換成線性位址,而分頁管理可以進一步将線性位址轉換成實體位址。當CR0中的PG位置1時,啟動分頁管理功能,為0時,這禁止啟動分頁管理功能,并且把線性位址作實體位址使用。

虛拟位址轉為線性位址:

線性位址= 段基指 + 偏移位址

32位線性位址轉為實體位址:

32位分為:

頁目錄索引:占最高10位,訓示頁目錄表中第幾個頁表描述符

頁表索引:占12位到21位,也是10位。訓示這頁表中第幾個頁描述符

頁描述符:線性位址的低12位為頁内偏移量。

實模式/保護模式,GDT/LDT的含義