win32 005 實模式

Win32基礎知識2

 

讓編程改變世界

Change the world by program


 

實模式

 

處理器被複位或者加電的時候以實模式啓動。

這時候處理器中各寄存器以實模式的初始化值工作。

80386處理器在實模式下的存儲器尋址方式和8086是一樣的,由段寄存器的內容乘以 16當做基地址,加上段內的偏移地址形成最終的物理地址,這時候它的32位地址線只使用了低20位。

 

在實模式下,80386處理器不能對內存進行分頁管理,所以指令尋址的地址就是內存中實際的物理地址。在實模式下,所有的段都是可以讀、寫和執行的。

實模式下80386不支持優先級,所有的指令相當於工作在特權級(優先級0),所以它可以執行所有特權指令,包括讀寫控制寄存器CR0等。

實際上,80386就是通過在實模式下初始化控制寄存器,GDTR,LDTR,IDTR與TR等管理寄存器以及頁表,然後再通過加載CR0使其中的保護模式使能位置位而進入保護模式的。

 

當然,實模式下不支持硬件上的多任務切換。

實模式下的中斷處理方式和8086處理器相同,也用中斷向量表來定位中斷服務程序地址。

中斷向量表的結構也和8086處理器一樣:每4個字節組成一箇中斷向量,其中包括兩個字節的段地址和兩個字節的偏移地址。

 

從編程的角度看,除了可以訪問80386新增的一些寄存器外,實模式的80386處理器和8086有什麼進步呢?

其實最大的好處是可以使用80386的32 位寄存器,用32位的寄存器進行編程可以使計算程序更加簡捷,加快了執行速度。

 

比如在8086時代用16位寄存器來完成32位的乘法和除法時,要進行的步驟實在是太多了,現在用32位寄存器一條指令就可以完成。

80386中增加的兩個輔助段寄存器FS和GS在實模式下也可以使用,這樣,同時可以訪問的段達到了6個而不必考慮重新裝入的問題。

最後,很多80386的新增指令也使一些原來不很方便的操作得以簡化。

 

保護模式

 

當 80386工作在保護模式下的時候,它的所有功能都是可用的。這時80386所有的32根地址線都可供尋址,物理尋址空間高達4GB。

在保護模式下,支持內存分頁機制,提供了對虛擬內存的良好支持。

 

雖然與8086可尋址的1 MB物理地址空間相比,80386可尋址的物理地址空間可謂很大,但實際的微機系統不可能安裝如此大的物理內存。

所以,爲了運行大型程序和真正實現多任務,虛擬內存是一種必需的技術。

 

保護模式下80386支持多任務,可以依靠硬件僅在一條指令中實現任務切換。任務環境的保護工作是由處理器自動完成的。

在保護模式下,80386處理器還支持優先級機制,不同的程序可以運行在不同的優先級上。

優先級一共分0~3 共 4個級別,操作系統運行在最高的優先級0上,應用程序則運行在比較低的級別上。

 

配合良好的檢查機制後,既可以在任務間實現數據的安全共享也可以很好地隔離各個任務。

從實模式切換到保護模式是通過修改控制寄存器CR0的控制位PE(位0)來實現的。

 

在這之前還需要建立保護模式必需的一些數據表,如全局描述符表GDT和中斷描述符表IDT等。

DOS操作系統運行於實模式下,而Windows操作系統運行於保護模式下。

 

虛擬8086模式

 

雖說實模式兼容以前的系統,但是設想一下,如果Windows或80386處理器推出的時候宣佈不能運行以前的MS-DOS程序,那麼就等於放棄了一個巨大的軟件庫,Windows以及80386處理器可能就會落得和蘋果機一樣的下場,這是Microsoft 和Intel都不願看到的。

舉個簡單的例子,當你正興高采烈地計劃利用80386多任務並行的特性,邊欣賞《小甲魚大戰倉小姐》的大片邊完成小甲魚的編程作業時,發覺原來的文檔要用到原來的系統才能打開……

 

由於這種特殊需求的普遍性,虛擬8086應運而生!

虛擬86模式是以任務形式在保護模式上執行的,在 80386上可以同時支持由多個真正的80386任務和虛擬86模式構成的任務。

在虛擬86模式下,80386支持任務切換和內存分頁。在Windows 操作系統中,有一部分程序專門用來管理虛擬86模式的任務,稱爲虛擬86管理程序。

 

既然虛擬86模式以保護模式爲基礎,它的工作方式實際上是實模式和保護模式的混合。

爲了和8086程序的尋址方式兼容,虛擬86模式採用和8086一樣的尋址方式,即用段寄存器乘以16當做基址再配合偏移地址形成線性地址,尋址空間爲1 MB。

 

但顯然多個虛擬86任務不能同時使用同一位置的1 MB地址空間,否則會引起衝突。

操作系統利用分頁機制將不同虛擬86任務的地址空間映射到不同的物理地址上去,這樣每個虛擬86任務看起來都認爲自己在使用0~1 MB的地址空間。

 

8086代碼中有相當一部分指令在保護模式下屬於特權指令,如屏蔽中斷的cli和中斷返回指令iret 等。

這些指令在8086程序中是合法的。如果不讓這些指令執行,8086代碼就無法工作。爲了解決這個問題,虛擬86管理程序採用模擬的方法來完成這些指令。

虛擬86管理程序在異常處理程序中檢查產生異常的指令,如果是中斷指令,則從虛擬86任務的中斷向量表中取出中斷處理程序的入口地址,並將控制轉移過去。

 

如果是危及操作系統的指令,如cli等,則簡單地忽略這些指令,在異常處理程序返回的時候直接返回到下一條指令。

通過這些措施,8086程序既可以正常地運行下去,在執行這些指令的時候又覺察不到已經被虛擬86管理程序做了手腳。MS-DOS應用程序在Windows 操作系統中就是這樣工作的

 

發佈了49 篇原創文章 · 獲贊 18 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章