1. 程式人生 > >80386的記憶體定址機制複習

80386的記憶體定址機制複習

題外話:

“不試試怎麼知道不行。”金句啊金句。

80x86的記憶體定址機制複習2011.06.03

80386處理器的工作模式

80386處理器有三種工作模式:真實模式保護模式 和 虛擬86模式

模式的切換:真實模式和保護模式之間可以相互轉換,保護模式和虛擬86模式之間可以相互轉換,而真實模式虛擬86模式之間不可以相互轉換

DOS系統運行於真實模式下,Windows系統執行與保護模式下。

真實模式

80386處理器被複位加電的時候以真實模式啟動。

真實模式下的定址方式是和8086一樣的,(段暫存器內容-段地址)SA(16bit)*16+EA(16bit)(偏移地址),其中32位的地址線只是用了低

20位(16+4=20)定址空間為2^20B = 1MB

真實模式下80386不能對記憶體進行分頁管理,指令定址的地址就是記憶體中的實際的實體地址,所以在真實模式下,所有的段都是可讀可寫可執行的。

真實模式下80386的中斷方式和8086相同,利用中斷向量表定位中斷服務程式的地址,其中中斷向量結構為4個位元組,其中2個位元組為SA2個位元組為EA

真實模式到保護模式的轉換:初始化控制暫存器、GDTRLDTRIDTRTR等管理暫存器以及頁表,然後通過載入CR0PE0)為1 轉換成保護模式。

保護模式

保護模式下32位地址線全部使用到,定址空間高達4GB

保護模式支援4個優先順序,分別是

ring0~ring3

保護模式到真實模式的轉換:建立全域性描述符表GDT、中斷描述符表IDT等,通過設定CR0 PE 0)為 0 轉換成保護模式。

虛擬86模式

是為了可以在保護模式下執行8086程式而設定的。例如:CMD命令執行的“MS-DOS應用程式”在Windows作業系統中執行。

虛擬86模式是以保護模式為基礎的一個執行模式。其中採用8086的定址方式定址空間為1M

80386的記憶體定址機制

80386 在真實模式下定址跟8086一樣。

重點在保護模式下:

段描述表(Segment Table):分為全域性描述表(GDT Global ...) 和 區域性描述表 (LDT

 local ...),其中段描述表裡存放 段描述符

段描述符(Segment Descriptor):優先順序,是否可讀寫可執行,等描述段的引數,共64

段選擇器(Segment Selector)16段暫存器,存放段選擇器,存放段描述表的“索引”。

GDTGDT全域性描述表只有一個,包含系統中所有任務都可用的段描述符,包含作業系統中程式碼段資料段堆疊段以及各個任務的LDT等,由GDTR指向。

LDT每個任務都有各一個獨立的LDT,包含每個任務私有程式碼段資料段堆疊段 以及 該任務所使用的一些門描述符,例如任務門呼叫門描述符等,由LDTR指向。

GDTR 直接指向記憶體地址, LDTRCSDSSSESFS GS 存放索引值,指向區域性描述表中記憶體段對應的描述符全域性描述表中的位置,則只要該表LDTR,系統當前的LDT就會切換,方便了各個任務切換和任務之間資料的隔離,GDT不會隨著任務的切換而切換。

具體的定址過程

16段選擇器(段暫存器)中,13表示索引值01表示程式當前優先順序RPL (Requirement Privilege['privilid3]Level)2TI表示在DT中的位置,TI=0在 GDTTI=1在 LDT

虛擬地址為:SA(16bit):EA(32bit) 的計算

(段暫存器內容-段地址)SA(16bit)*16+EA(32bit)(偏移地址)注意偏移為32bit

分兩種情況:

一、TI = 0

① 從GDTR暫存器中獲取GDT的基址

② 在GDT中應用SA的索引值(13),找到SD(段描述符)

③ SD 中包含了段的基址、限制長、優先順序等各種屬性,得到段的起始地址

④ 在③中得到的起始地址加上偏移,得到實體地址

二、TI = 1

① 從GDTR暫存器中獲取GDT的基址

 從LDTR暫存器中獲取LDT描述符 在 GDT中的索引

 根據②中得到的索引,找到 LDT的描述符

 通過LDT的段描述符,得到LDT段的起始地址

⑤ 在LDT中應用 SA 的索引值(13),找到SD(段描述符)

⑥ SD 中包含了段的基址、限制長、優先順序等各種屬性,得到段的起始地址

⑦ 在⑥中得到的起始地址加上偏移,得到實體地址

補充知識:

控制暫存器是一些特殊的暫存器,它們可以控制CPU的一些重要特性。

CR0

0是保護允許位PE(Protedted Enable),用於啟動保護模式,如果PE位置1,則保護模式啟動,如果PE=0,則在真實模式下執行。

31是分頁允許位(Paging Enable),它表示晶片上的分頁部件是否允許工作。

16是防寫未即WP(486系列之後),只要將這一位置0就可以禁用防寫,置1則可將其恢復。(NT5.x系列,SSDT hook的一種改寫SSDT的方法)