80386處理器有3種工作模式:實模式、保護模式和虛擬86模式。實模式和虛擬86模式是為了和8086處理器兼容而設置的。在實模式 下,80386處理器就相當於一個快速的8086處理器。保護模式是80386處理器的主要工作模式。在此方式下,80386可以尋址4GB的地址空間,同時,保護模式提供了80386先進的多任務、內存分頁管理和優先級保護等機制。為了在保護模式下繼續提供和8086處理器的兼 容,80386又設計了一種虛擬86模式,以便可以在保護模式的多任務條件下,有的任務運行32位程序,有的任務運行MS-DOS程序。在虛擬86模式 下,同樣支持任務切換、內存分頁管理和優先級,但內存的尋址方式和8086相同,也是可以尋址1MB的空間。
由此可 見,80386處理器的3種工作模式各有特點且相互聯系。實模式是80386處理器工作的基礎,這時80386當做一個快速的8086處理器工作。在實模 式下可以通過指令切換到保護模式,也可以從保護模式退回到實模式。虛擬86模式則以保護模式為基礎,在保護模式和虛擬86模式之間可以互相切換,但不能從 實模式直接進入虛擬86模式或從虛擬86模式直接退到實模式。
1. 實模式
80386處理器被復位或加電的時候 以實模式啟動。這時候處理器中的各寄存器以實模式的初始化值工作。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位寄存器一 條指令就可以完成(問題是老師們也發現了這個投機取巧的辦法,為了達到讓學生們基礎扎實的目的,也把題目換成了64位的乘法和除法,所以現在晚上做的夢換 成了寄存器忽然長到了64位);其次,80386中增加的兩個輔助段寄存器FS和GS在實模式下也可以使用,這樣,同時可以訪問的段達到了6個而不必考慮 重新裝入的問題;最后,很多80386的新增指令也使一些原來不很方便的操作得以簡化,如80386中可以使用下述指令進行數組訪問:
mov cx,[eax + ebx * 2 + 數組基地址]
這相當於把數組中下標為eax和ebx的項目放入cx中;ebx*2中的2可以是1,2,4或8,這樣就可以支持8位到64位的數組。而在8086處理器中,實現相同的功能要進行一次乘法和兩次加法。另外,pushad 和popad指令可以一次把所有8個通用寄存器的值壓入或從堆棧中彈出,比起用下面的指令分別將8個寄存器入棧要快了很多:
push eax
push ebx
...
pop ebx
pop eax
當然,使用了這些新指令的程序是無法拿回到8086處理器上去執行的,因為這些指令的編碼在8086處理器上是未定義的。
2. 保護模式
當 80386工作在保護模式下的時候,它的所有功能都是可用的。這時80386所有的32根地址線都可供尋址,物理尋址空間高達4GB。在保護模式下,支持內存分頁機制,提供了對虛擬內存的良好支持。雖然與8086可尋址的1MB物理地址空間相比,80386可尋址的物理地址空間可謂很大,但實際的微機系統不可能安裝如此大的物理內存。所以,為了運行大型程序和真正實現多任 務,虛擬內存是一種必需的技術。
保護模式下80386支持多任務,可以依靠硬件僅在一條指令中實現任務切換。任務環境的保護工作是由處 理器自動完成的。在保護模式下,80386處理器還支持優先級機制,不同的程序可以運行在不同的優先級上。優先級一共分0~3個級別,操作系統運行在最高的優先級0上,應用程序則運行在比較低的級別上;配合良好的檢查機制后,既可以在任務間實現數據的安全共享也可以很好地隔離各個任務。從實模式切換到保護模式是通過修改控制寄存器CR0的控制位PE(位0)來實現的。在這之前還需要建立保護模式必需的一些數據表,如全局描述符 表GDT和中斷描述符表IDT等。
DOS操作系統運行於實模式下,而Windows操作系統運行於保護模式下。
3. 虛擬86模式
虛擬86模式是為了在保護模式下執行8086程序而設置的。雖然80386處理器已經提供了實模式來兼容8086程序,但這時8086程序實際上只是運行得 快了一點,對CPU的資源還是獨占的。在保護模式的多任務環境下運行這些程序時,它們中的很多指令和保護模式環境格格不入,如段尋址方式、對中斷的處理和 I/O操作的特權問題等。為了在保護模式下工作而丟棄這些程序的代價是巨大的。設想一下,如果Windows或80386處理器推出的時候宣布不能運行以 前的MS-DOS程序,那么就等於放棄了一個巨大的軟件庫,Windows以及80386處理器可能就會落得和蘋果機一樣的下場,這是Microsoft 和Intel都不願看到的。所以,80386處理器又設計了一個虛擬86模式。
虛擬86模式是以任務形式在保護模式上執行的,在 80386上可以同時支持由多個真正的80386任務和虛擬86模式構成的任務。在虛擬86模式下,80386支持任務切換和內存分頁。在Windows 操作系統中,有一部分程序專門用來管理虛擬86模式的任務,稱為虛擬86管理程序。
既然虛擬86模式以保護模式為基礎,它的工作方式實 際上是實模式和保護模式的混合。為了和8086程序的尋址方式兼容,虛擬86模式采用和8086一樣的尋址方式,即用段寄存器乘以16當做基址再配合偏移 地址形成線性地址,尋址空間為1MB。但顯然多個虛擬86任務不能同時使用同一位置的1MB地址空間,否則會引起沖突。操作系統利用分頁機制將不同虛擬86任務的地址空間映射到不同的物理地址上去,這樣每個虛擬86任務看起來都認為自己在使 用0~1MB的地址空間。
8086代碼中有相當一部分指令在保護模式下屬於特權指令,如屏蔽中斷的cli和中斷返回指令iret 等。這些指令在8086程序中是合法的。如果不讓這些指令執行,8086代碼就無法工作。為了解決這個問題,虛擬86管理程序采用模擬的方法來完成這些指 令。這些特權指令執行的時候引起了保護異常。虛擬86管理程序在異常處理程序中檢查產生異常的指令,如果是中斷指令,則從虛擬86任務的中斷向量表中取出 中斷處理程序的入口地址,並將控制轉移過去;如果是危及操作系統的指令,如cli等,則簡單地忽略這些指令,在異常處理程序返回的時候直接返回到下一條指 令。通過這些措施,8086程序既可以正常地運行下去,在執行這些指令的時候又覺察不到已經被虛擬86管理程序做了手腳。MS-DOS應用程序在Windows操作系統中就是這樣工作的。