一、80386 概述
80386處理器被廣泛應用在1980年代中期到1990年代中期的IBM PC相容機中。這些PC機稱為「80386電腦」或「386電腦」,有時也簡稱「80386」或「386」。80386的廣泛應用,將PC機從16位時代帶入了32位時代。80386的強大運算能力也使PC機的應用領域得到巨大擴展,商業辦公、科學計算、工程設計、多媒體處理等應用得到迅速發展。它的數據總線和地址總線都是32位,直接尋址的內存空間4GB,虛擬地址空間為64TB。芯片上集成了27.5萬個晶體管,主頻16-33MHz。它是X86第一個真正的32位CPU,它能提供真正的多任務處理和建立虛擬系統的能力。
二、80386的引腳及功能
80386 DX有132根引腳,采用PGA(Pin Grid Array,引腳網格陣列)封裝,采用這種封裝工藝單根引腳所占用的面積較雙列直插時小,因此引腳數目可以多一些,不必再采用引腳復用技術。因此,在80386中數據線和地址線是分開設置的,控制信號和狀態信號也不再復用引腳。其中34 條地址線(A31~A2、BE3~BE0),32 條數據線(D31~D0),3 條中斷線,1條時鍾線,13 條控制線,20 條電源線VCC,21條地線VSS,還有8 條為空。
與8086/8088 相比,需要說明以下幾點:
1)時鍾( CLK2): 80386 的基本定時信號由CLK2 提供。CLK2 的頻率是80386 內部時鍾信號頻率的兩倍,輸入該信號與82384 時鍾信號同步,經80386 內部2 分頻之后得到80386 的工作基准頻率信號。
2)數據總線(D31~D0):為80386 和其他設備之間提供數據通路,32 位數據總線,雙向三態,一次可傳送8 位、16 位或32 位數據,由輸入信號(BE3~BE0)和BE16確定。在任何寫操作周期(包括暫停周期和停機周期),80386 總是驅動數據總線的所有32 位信號,而不管當前總線的實際寬度。
3)地址總線(A31~A2,BE3~BE0) 。
- A31~A2:地址總線,輸出三態,和BE3~BE0相結合起到32位地址的作用。80386地址總線包含A2~A31地址線和字節選通線BE3~BE0。BE3~BE0線的功能與8086和80286系統的A0和BHE非常相似,它們是內部地址信號A0和A1的譯碼。由於80386有一個32位數據總線,所以內存可以建立4B寬的存儲體。BE3~BE0信號是用來選通這4B個存儲體。這些單獨選通可以使80386 的內存傳送或者接收字節、字或者雙字。
- BE3~BE0:字節選通信號。用於選通在當前的傳送操作要涉及4B數據中的哪幾個字節。BE0對應於D0~D7,BE1對應於D8~D15,BE2對應於D16~D23,BE3對應於D24~D31。
4)總線周期定義信號(M/IO,W/R,D/C,LOCK,三態,輸出,用來定義正在進行的總線周期類型)。
- M/IO:存儲器/輸入輸出選擇信號,輸出信號。高電平時訪問存儲器,低電平時訪問I/O 端口。80386 直接I/O 端口簡單地把8086 和80286 端口結構擴充成32 位端口。32 位I/O 端口可以通過並聯8 位I/O 端口設備(如8255A)來構成。80386 可以使用所有8 位端口地址的IN 或OUT 指令來編址256 個8 位端口、128 個16 位端口、64 個32 位端口。使用DX 寄存器存放16 位端口地址,80386 可以編址64K 個8 位端口、32K 個16 位端口或8K 個32 位端口。
- W/R:讀/寫控制輸出信號,高電平時寫入,低電平時讀出。
- D/C:數據/指令控制信號,輸出。高電平時傳送數據,低電平時傳送指令代碼,D/C指示總線操作是一個數據讀/寫還是控制字傳輸(如取一個操作碼)。
- W/R、D/C、M/IO是總線周期定義信號。當80386 驅動ADS(地址狀態)輸出信號有效時,這3個信號被驅動為有效,根據3 個信號的功能可得到總線周期定義,見表3-8。
- LOCK:總線周期封鎖信號,低電平有效。
5)總線控制信號(ADS,READY,NA,BE16)。
這組信號用來表示總線周期何時開始,以及數據總線的寬度和總線周期的終結。
- ADS:地址選通信號,三態輸出,低電平有效。當有效時,表示總線周期中地址信號有效。當有效地址、BE信號和總線周期定義信號均在總線上時,ADS信號將被設置。因為80386 地址總線是不可復用的,所以8086 類型的ALE 信號是不需要的。但是,在某些80386 系統中,ADS信號用於一種稱為地址流水線的模式,將地址傳送到外部鎖存器。地址流水線的原理:如果一個地址保持在外部鎖存器的輸出端,80386 就可以把地址引腳上的“老”地址清除,並在總線周期的前期輸出下一個操作的地址。外部控制芯片通過設置下一個地址信號來通知80386 何時為下一個操作輸出地址。對一個有SRAM 高速緩沖的系統,流水線地址模式通常不是必需的,因為SRAM 高速緩沖已足夠快了,不需要等待狀態。
- READY:准備就緒,輸入信號,低電平有效。READY有效時表示當前總線周期已完成。信號用來在總線周期中根據低速的內存或I/O 設備接口的需要插入等待狀態。
- NA:下一個地址請求信號,輸入信號,低電平有效。允許地址流水線操作,當其有效時,表示當前執行中的周期結束之后,下一個總線周期的地址和狀態信號可變為有效。
- BE16:輸入信號,低電平有效,指定16 位數據總線。BE16輸入端允許80386以16位和/或32位數據總線工作。如果設置了BE16,那么80386只將數據傳送到32位數據總線的低16位上。如果設置了BE16並且要從16位寬內存中讀一個32位的操作數,那么80386將自動產生一個第二總線周期來讀第二個字。對於未調整的傳輸,如果設置了BE16,那么80386 也產生所需數目的總線周期。
6)總線仲裁信號(HOLD,HLDA) :由總線請求主設備來控制該組信號。
- HOLD:總線請求信號,輸入信號,高電平有效。
- HLDA:總線保持響應信號,輸出信號,有效時,CPU 讓出總線。
7)協處理器接口信號(PEREQ,BUSY,ERROR) :控制80386 同80287 或80387 之間的通信。
- PEREQ:來自協處理器的請求信號,輸入信號,表示80387 要求80386 控制它們與存儲器之間的信息傳送。PEREQ 信號是由一個像80387 浮點處理器這樣的協處理器輸出的,它通知80386 為協處理器取數據字的第一部分,然后協處理器將接管總線並讀數據字的其余部分。
- BUSY:協處理器忙,輸入信號,低電平有效。BUSY信號由協處理器使用。以避免80386 在協處理器結束當前指令之前又繼續下一條指令。
- ERROR:協處理器錯誤信號,輸入信號,低電平有效。如果協處理器設置了ERROR 信號,80386 將執行類型為16 的異常中斷。
8)中斷信號( INTR,NMI,RESET) :用來引起中斷或中止80386 正在執行的指令流。
- INTR:可屏蔽中斷請求,輸入信號。80386 響應INTR 請求時,完成兩個連續的中斷響應周期,在整個響應周期,LOCK信號有效。在第二個周期末,D0~D7數據線上送出8位中斷類型碼,以識別中斷源。INTR信號可以由80386的標志寄存器中的IF位屏蔽。
- NMI:非屏蔽中斷請求,輸入信號。80386對NMI的處理不運行中斷響應周期,而是自動產生一個中斷類型2。
- RESET:復位信號,輸入信號,當RESET 有效時,將中止80386 正在執行的一切操作,並置於一個已知的復位狀態。復位期間的80386 的有關引腳的狀態見表3-9。
80386有許多VCC 腳,也有許多標為VSS 的地線,這些引腳均被接到PC板合適的電平上。
三、80386內部結構
上圖可簡化為如下圖:
- 總線接口部件 它通過數據總線、地址總線、控制總線來與外部環境聯系,包括從存儲器中預取指令、讀寫數據,從I/O端口讀寫數據,以及其他的控制功能。數據總線和地址總線都是32位的,由於它們是分開的,所以從存儲器中存儲數據最快也需要兩個時鍾周期內完成。
- 指令預取部件 IPU:它將存放在存儲器中的指令經BIU取到16字節長的預取指令隊列中,並向指令譯碼部件輸送指令。
- 指令譯碼部件 IDU :從IPU中取出指令進行譯碼分析,然后將其放入IDU中的譯碼指令隊列中,供執行部件使用。(容納3條以譯碼的指令)
- 執行部件 EU: 執行部件EU包含算數邏輯單元ALU,8個32位的通用寄存器,一個64位的多位移位加法器,執行數據處理和運算操作
- 存儲管理部件(MMU)由分段部件和分頁機構組成,實現了從邏輯地址到物理地址的轉換,既支持段式存儲管理、頁式存儲管理,也支持段頁存儲管理。它存儲器采用段、頁式結構,80386首次將分頁機制引入到80X86結構,每頁大小為4KB。
- 分段部件 SU: 按指令要求,分段部件SU將指令中的邏輯地址轉換成線性地址。
- 分頁部件 PU:分頁部件PU將分段部件SU產生的線性地址轉換成物理地址,每頁容量4KB.當系統不使用分頁功能時,線性地址就是物理地址。
四、80386的寄存器
80386的寄存器結構 80386微處理器共有7類34個寄存器,通用寄存器組、段寄存器、指令指針和標志寄存器、系統地址寄存器、控制寄存器、調試寄存器、測試寄存器。
(1)通用寄存器組:共有8個32位寄存器,EAX, EBX,ECX,EDX,ESP,EBP,ESI,EDI。它們由8086的16位寄存器擴展而來,它們的低16位與8086使用方法相同。
(2)段寄存器:共有6個16位的段寄存器CS、DS、SS、ES、FS、GS。與這6個段寄存器對應的有6個64位描述符寄存器,它是80X86處理器提供的一種附加的非編程的寄存器,用來裝64的段描述符,每當一個段選擇符被裝入段寄存器是,相應的段描述符就由內存裝入到對應的非編程的CPU寄存器。其中CS、DS、SS、ES與8086的段寄存器完全相同,在實地址方式下,使用方法也與8086相同;在虛地址保護方式下,這些寄存器中的值是“段選擇符”,需要查全局描述符表(GDT)或者局部描述符表(LDT)來獲得段的基地址,再加上偏移地址才能得到線性地址。 FS和GS是新加的附加數據段寄存器,可以由用戶將FS、GS定義為其他數據段。
(3)指令指針和標志寄存器:指令指針寄存器EIP,由8086的IP寄存器擴展而來。標志寄存器EFLAGS包含一組狀態標志、一個控制標志、一組系統標志,圖四定義該寄存器中的標志位。
標志寄存器EFLAGS的低12位與8086的標志寄存器FLAGS一樣。IOPL位表示特權標志位,定義當前任務的特權層。NT位表示任務嵌套標志位,當NT位為1時表明當前執行的任務嵌套在另外一個任務中,否則NT位為0。RF位表示重新啟動標志位,與調試寄存器一起用於斷點和單步操作,RF位為1時表明下一條指令的調試故障將被忽略,不產生中斷異常;RF位位0時表示調試故障被接受並產生中斷異常。由於調測失敗后強迫程序恢復執行;在每條指令成功執行后,RF自動復位。VM位表示虛擬模式標志位,VM位為1時表明80386工作在保護虛擬地址方式。前4個定義從80286開始,后面的2個定義從80386開始存在。另外的三個標志是Pentium以后的CPU才有的。VIF(Virtual interrupt flag)表示虛擬中斷標志。當VIF=1時,可以使用虛擬中斷,當VIF=0時不能使用虛擬中斷。該標志要和下面的VIP和CR4中的VME配合使用。VIP(Virtual interrupt pending flag)表示虛擬中斷掛起標志。當VIP=1時,VIF有效,VIP=0時VIF無效。ID(Identification flag)表示鑒別標志。該標志用來只是Pentium CPU是否支持CPUID的指令。
(4) 系統地址寄存器和系統段寄存器:系統地址寄存器有全局描述符表寄存器GDTR、中斷描述符表寄存器IDTR。系統段寄存器有局部描述符表寄存器LDTR和任務寄存器TR。這些寄存器保存相應的描述符表的地址。
(5) 控制寄存器:4個32位的控制寄存器CR0,CR1,CR2,CR3,它們保存全局性的機器狀態,其基本定義如圖五。從Pentium開始,又增加了一個CR4。下面來簡單介紹控制寄存器中的位。
1)CR0的低16位包含了與80286的MSW一致的位定義,保持了和80286的兼容,同時也兼容了從80286開始的兩條指令LMSW/SMSW。指令LMSW和SMSW分別用於裝入和保存機器狀態字信息,可以通過MOV指令對CR0進行讀寫操作。CR0中各位含義如下:
PE(Protection Enable)保護模式允許位,用來啟動CPU進入虛地址保護方式。PE=0表示CPU工作在實地址方式;PE=1表示CPU工作在虛地址保護方式。
MP(Monitor Coprocessor)監控協處理器,MP=1表示協處理器在工作;MP=0表示協處理器未工作。
EM(Emulation)協處理器仿真,當MP=0,EM=1時,表示正在使用軟件仿真協處理器工作。
TS(Task Switched)任務轉換,每當進行任務轉換時,TS=1;任務轉換完畢,TS=0。TS=1時不允許協處理器工作。
ET(Extension Type)處理器擴展類型,反映了所擴展的協處理器的類型,ET=0為80287,ET=1為80387。
PG(Paging)頁式管理機制使能,PG=1時頁式管理機制工作,否則不工作。
NE(Numeric Error)數值異常中斷控制,NE=1時,如果運行協處理器指令發生故障,則用異常中斷處理,NE=0時,則用外部中斷處理。
WP(Write Protect)寫保護,當WP=1時,對只讀頁面進行寫操作會產生頁故障。
AM(Alignment Mask)對齊標志,AM=1時,允許對齊檢查,AM=0時不允許,關於對齊,在EFLAGS的AC標志時介紹過,在80486以后的CPU中,CPU進行對齊檢查需要滿足三個條件,AC=1、AM=1並且當前特權級為3。
NW(Not Write-through)和CD(Cache Disable),這兩個標志都是用來控制CPU內部的CACHE的,當NW=0且CD=0時,CACHE使能,其它的組合比較復雜。
前4個定義從80286開始,接着的2個定義從80386開始存在, 后面4個是從80486開始定義的。
2)CR1寄存器用來保留給Intel微處理器將來開發使用;CR2寄存器包含一個32位的線性地址,指向發生最后一次也故障的地址,只有在PG=1時,CR2才有效,當頁故障處理程序被激活時,壓入頁故障處理程序堆棧中的錯誤碼提供頁故障的狀態信息;CR3寄存器中包含頁物理目錄表的物理基地址,由於每4KB為一頁,80386中的頁目錄表總在頁的整數邊界上,CR3的低13位總是為0,只有當CR0中的PG=1時,CR3的頁目錄基地址才有效。
(6) 調試寄存器:共8個排錯寄存器DR0~DR7。DR0~DR3可以分別設置4個斷點的線性地址,DR4~DR5保留未用,DR6是斷點狀態寄存器,DR7是斷點控制寄存器(包括斷點類型、斷點長度,斷點開放/禁止)。
(7) 測試寄存器:2個32位的測試寄存器TR6和TR7,用於控制轉換后援緩沖器中的RAM測試,其中TR6為命令測試寄存器,TR7為測試數據寄存器。
五、80386工作模式
有三種工作模式:實地址模式、保護虛擬地址模式和虛擬8086模式。
常用的WINDOWS,LINUX 就是工作在處理器的保護模式底下.
為了兼容以前在實模式底下工作的軟件,80386支持實模式,但是在實模式底下不能支持多任務處理,所以V86模式應運而生.
下面分別介紹幾種模式:
1. 實模式
80386工作在時模式底下是 A0--------A19的20根地址線是可用的,尋址空間為1MB,這個時候80386和8086,8088的尋址方式是一樣的,即段寄存器內容左移4位作為段地址,在加上段內偏移地址就構成了20位的物理地址,每個段的最大長度是64K,所以實模式底下物理地址的最高為是0XFFFFFH,若超除了就會被丟棄.在這種模式底下,80386不支持優先級,所以程序都可執行特權指令,不支持硬件上多任務的切換,是單操作系統,DOS既運行在實模式底下.定位中斷服務子程序,需要中斷向量表,中斷向量號乘以4得到中斷向量號,再在表中查找中斷向量,中斷向量有4個字節組成,分別是兩個字節的段地址和兩個字節的偏移地址,就可得到中斷服務程序的入口地址. 這種模式底下可以直接對I/O地址空間,數據段,代碼段進行讀寫.這時的80386和8086非常相似,80386就象是一個快速的8086,只不過80386有32位的數據線和32位的通用寄存器而8086是16位的.准確的說是准16位的系統
2 保護模式
在保護模式底下,邏輯地址由段寄存器和偏移地址組成,不過要得到物理地址可不是實模式底下的方法,首先,段寄存器中存放的不是段基址,而是選擇子,系統通過選擇子來得到真正的段基地址,然后段基地址和偏移地址相加后得到線性地址,這是通過分段機制實現的,然后再通過分頁機制把線性地址轉化成物理地址.但是分頁機制是可選的.在保護模式底下,32條地址線全部有效,最大尋址空間可達4GB.支持多任務處理,使用一條指令或者一個中斷就可以在任務內或任務間切換.提供了0---3共4個特權級,操作系統運行在最高級上即0級,應用程序運行低級上,不但實現資源共享,而且實現數據和代碼的安全.不再使用中斷向量表來實現中斷功能,而是通過各種控制描述符來和特權級檢查來完成多任務的實現即中斷功能.以前那些I/O操作的指令不能對I/O端口進行讀寫,通過特權級和I/O許可位來進行安全檢查.
3 V86模式
估計大家已經猜出來了(其實你在前面也講了!),不管是實模式還是保護模式都有弊端,V86就充當了這兩者之間的橋梁.說白了V86模式就是想利用保護模式的優點來運行8086下的程序.它是在保護模式底下工作的,也稱虛擬8086模式.v86模式底下尋址和實模式相同,但20位地址不是真實的物理地址,而是線性地址,尋址空間為1MB,為了使多個虛8086任務不使用同一個位置的1MB地址空間,系統使用了分頁機制將不同的V8086任務映射到不同的物理空間上去.每個V86任務認為自己在0-1MB的空間上運行.這樣8086下的程序可以在80386的V86模式底下運行,但是它的一部分指令是是受到保護的,如果執行將發生異常,V86模式受到了V86監控程序的控制,v86監控程序和硬件組成了"8086虛擬機"。V86監控程序控制外部界面,中斷,I/O,硬件提供最底端的1MB虛擬存儲.,在80386中每個V86模式是相對的,這樣就充分發揮了處理器的能力