CPU三種工作模式總結(jié)

 

CPU三種模式

處理器有3種工作模式:實模式、保護(hù)模式和虛擬86模式。實模式和虛擬86模式是為了和8086處理器兼容而設(shè)置的。在實模式下,80386處理器就相當(dāng)于一個快速的8086處理器。保護(hù)模式是80386處理器的主要工作模式。在此方式下,80386可以尋址4GB的地址空間,同時,保護(hù)模式提供了80386先進(jìn)的多任務(wù)、內(nèi)存分頁管理和優(yōu)先級保護(hù)等機(jī)制。為了在保護(hù)模式下繼續(xù)提供和8086處理器的兼容,80386又設(shè)計了一種虛擬86模式,以便可以在保護(hù)模式的多任務(wù)條件下,有的任務(wù)運行32位程序,有的任務(wù)運行MS-DOS程序。在虛擬86模式下,同樣支持任務(wù)切換、內(nèi)存分頁管理和優(yōu)先級,但內(nèi)存的尋址方式和8086相同,也是可以尋址1 MB的空間。

【批注:處理器從8086升級到80386,工作模式也從實模式升級到保護(hù)模式,為了兼容8086產(chǎn)生虛擬86模式】

  

由此可見,80386處理器的3種工作模式各有特點且相互聯(lián)系。實模式是80386處理器工作的基礎(chǔ),這時80386當(dāng)做一個快速的8086處理器工作。在實模式下可以通過指令切換到保護(hù)模式,也可以從保護(hù)模式退回到實模式。虛擬86模式則以保護(hù)模式為基礎(chǔ),在保護(hù)模式和虛擬86模式之間可以互相切換,但不能從實模式直接進(jìn)入虛擬86模式或從虛擬86模式直接退到實模式。

【批注:實模式→保護(hù)模式→虛擬86模式】

  

1.   實模式

  

80386處理器被復(fù)位或加電的時候以實模式啟動。這時候處理器中的各寄存器以實模式的初始化值工作。80386處理器在實模式下的存儲器尋址方式和8086是一樣的,由段寄存器的內(nèi)容乘以16當(dāng)做基地址,加上段內(nèi)的偏移地址形成最終的物理地址,這時候它的32位地址線只使用了低20。在實模式下,80386處理器不能對內(nèi)存進(jìn)行分頁管理,所以指令尋址的地址就是內(nèi)存中實際的物理地址。在實模式下,所有的段都是可以讀、寫和執(zhí)行的。

【批注:物理地址】  

 

實模式下80386不支持優(yōu)先級,所有的指令相當(dāng)于工作在特權(quán)級(優(yōu)先級0),所以它可以執(zhí)行所有特權(quán)指令,包括讀寫控制寄存器CR0等。實際上,80386就是通過在實模式下初始化控制寄存器,GDTRLDTRIDTRTR等管理寄存器以及頁表,然后再通過加載CR0使其中的保護(hù)模式使能位置位而進(jìn)入保護(hù)模式的。實模式下不支持硬件上的多任務(wù)切換。

【批注:多任務(wù)】

  

實模式下的中斷處理方式和8086處理器相同,也用中斷向量表來定位中斷服務(wù)程序地址。中斷向量表的結(jié)構(gòu)也和8086處理器一樣,每4個字節(jié)組成一個中斷向量,其中包括兩個字節(jié)的段地址和兩個字節(jié)的偏移地址。

【批注:中斷向量】

  

從編程的角度看,除了可以訪問80386新增的一些寄存器外,實模式的80386處理器和8086有什么進(jìn)步呢?其實最大的好處是可以使用8038632位寄存器,用32位的寄存器進(jìn)行編程可以使計算程序更加簡捷,加快了執(zhí)行速度。比如在8086時代用16位寄存器來完成32位的乘法和除法時,要進(jìn)行的步驟實在是太多了,于是考試時出這一類的題目就成了老師們的最愛,所以那時候當(dāng)學(xué)生做夢都想著讓寄存器的位數(shù)快快長,現(xiàn)在夢想終于成真了,用32位寄存器一條指令就可以完成(問題是老師們也發(fā)現(xiàn)了這個投機(jī)取巧的辦法,為了達(dá)到讓學(xué)生們基礎(chǔ)扎實的目的,也把題目換成了64位的乘法和除法,所以現(xiàn)在晚上做的夢換成了寄存器忽然長到了64位);其次,80386增加的兩個輔助段寄存器FSGS在實模式下也可以使用,這樣,同時可以訪問的段達(dá)到了6個而不必考慮重新裝入的問題;最后,很多80386新增指令也使一些原來不很方便的操作得以簡化,如80386中可以使用下述指令進(jìn)行數(shù)組訪問:

  

          mov   cx, [eax + ebx*2 + 數(shù)組基地址]

  

這相當(dāng)于把數(shù)組中下標(biāo)為eaxebx的項目放入cx中;ebx * 2中的2可以是1248,這樣就可以支持8位到64位的數(shù)組。而在8086處理器中,實現(xiàn)相同的功能要進(jìn)行一次乘法和兩次加法。另外,pushadpopad指令可以一次把所有8個通用寄存器的值壓入或從堆棧中彈出,比起用下面的指令分別將8個寄存器入棧要快了很多:

  

          push  eax   

          push  ebx   

          ...   

          pop   ebx   

          pop   eax

  

當(dāng)然,使用了這些新指令的程序是無法拿回到8086處理器上去執(zhí)行的,因為這些指令的編碼在8086處理器上是未定義的。

   【批注:新增針對32位寄存器的指令,簡化操作】

 

2.   保護(hù)模式

  

當(dāng)80386工作在保護(hù)模式下的時候,它的所有功能都是可用的。這時80386所有的32根地址線都可供尋址,物理尋址空間高達(dá)4 GB。在保護(hù)模式下,支持內(nèi)存分頁機(jī)制,提供了對虛擬內(nèi)存的良好支持。雖然與8086可尋址的1 MB物理地址空間相比,80386可尋址的物理地址空間可謂很大,但實際的微機(jī)系統(tǒng)不可能安裝如此大的物理內(nèi)存。所以,為了運行大型程序和真正實現(xiàn)多任務(wù),虛擬內(nèi)存是一種必需的技術(shù)。

【批注:虛擬內(nèi)存】

  

保護(hù)模式下80386支持多任務(wù),可以依靠硬件僅在一條指令中實現(xiàn)任務(wù)切換。任務(wù)環(huán)境的保護(hù)工作是由處理器自動完成的。在保護(hù)模式下,80386處理器還支持優(yōu)先級機(jī)制,不同的程序可以運行在不同的優(yōu)先級上。優(yōu)先級一共分03   4個級別,操作系統(tǒng)運行在最高的優(yōu)先級0上,應(yīng)用程序則運行在比較低的級別上;配合良好的檢查機(jī)制后,既可以在任務(wù)間實現(xiàn)數(shù)據(jù)的安全共享也可以很好地隔離各個任務(wù)。從實模式切換到保護(hù)模式是通過修改控制寄存器CR0的控制位PE(位0)來實現(xiàn)的。在這之前還需要建立保護(hù)模式必需的一些數(shù)據(jù)表,如全局描述符表GDT和中斷描述符表IDT等。

  

DOS操作系統(tǒng)運行于實模式下,而Windows操作系統(tǒng)運行于保護(hù)模式下。

   【批注:多任務(wù),優(yōu)先級】

 

3.   虛擬86模式

  

虛擬86模式是為了在保護(hù)模式下執(zhí)行8086程序而設(shè)置的。雖然80386處理器已經(jīng)提供了實模式來兼容8086程序,但這時8086程序?qū)嶋H上只是運行得快了一點,對CPU的資源還是獨占的。在保護(hù)模式的多任務(wù)環(huán)境下運行這些程序時,它們中的很多指令和保護(hù)模式環(huán)境格格不入,如段尋址方式、對中斷的處理和I/O操作的特權(quán)問題等。為了在保護(hù)模式下工作而丟棄這些程序的代價是巨大的。設(shè)想一下,如果Windows80386處理器推出的時候宣布不能運行以前的MS-DOS程序,那么就等于放棄了一個巨大的軟件庫,Windows以及80386處理器可能就會落得和蘋果機(jī)一樣的下場,這是MicrosoftIntel都不愿看到的。所以,80386處理器又設(shè)計了一個虛擬86模式。

   【批注:在保護(hù)模式下,兼容8086

 

虛擬86模式是以任務(wù)形式在保護(hù)模式上執(zhí)行的,在80386上可以同時支持由多個真正的80386任務(wù)和虛擬86模式構(gòu)成的任務(wù)。在虛擬86模式下,80386支持任務(wù)切換和內(nèi)存分頁。在Windows操作系統(tǒng)中,有一部分程序?qū)iT用來管理虛擬86模式的任務(wù),稱為虛擬86管理程序

  

既然虛擬86模式以保護(hù)模式為基礎(chǔ),它的工作方式實際上是實模式和保護(hù)模式的混合。為了和8086程序的尋址方式兼容,虛擬86模式采用和8086一樣的尋址方式,即用段寄存器乘以16當(dāng)做基址再配合偏移地址形成線性地址,尋址空間為1  MB。但顯然多個虛擬86任務(wù)不能同時使用同一位置的1 MB地址空間,否則會引起沖突。操作系統(tǒng)利用分頁機(jī)制將不同虛擬86任務(wù)的地址空間映射到不同的物理地址上去,這樣每個虛擬86任務(wù)看起來都認(rèn)為自己在使用01MB的地址空間。

【批注:虛擬86模式 = 實模式 + 保護(hù)模式】

  

8086代碼中有相當(dāng)一部分指令在保護(hù)模式下屬于特權(quán)指令,如屏蔽中斷的cli和中斷返回指令iret等。這些指令在8086程序中是合法的。如果不讓這些指令執(zhí)行,8086代碼就無法工作。為了解決這個問題,虛擬86管理程序采用模擬的方法來完成這些指令。這些特權(quán)指令執(zhí)行的時候引起了保護(hù)異常。虛擬86管理程序在異常處理程序中檢查產(chǎn)生異常的指令,如果是中斷指令,則從虛擬86任務(wù)的中斷向量表中取出中斷處理程序的入口地址,并將控制轉(zhuǎn)移過去;如果是危及操作系統(tǒng)的指令,如cli等,則簡單地忽略這些指令,在異常處理程序返回的時候直接返回到下一條指令。通過這些措施,8086程序既可以正常地運行下去,在執(zhí)行這些指令的時候又覺察不到已經(jīng)被虛擬86管理程序做了手腳。MS-DOS應(yīng)用程序在Windows操作系統(tǒng)中就是這樣工作的。