第13章IA32結構微處理器的工作方式_第1頁
第13章IA32結構微處理器的工作方式_第2頁
第13章IA32結構微處理器的工作方式_第3頁
第13章IA32結構微處理器的工作方式_第4頁
第13章IA32結構微處理器的工作方式_第5頁
已閱讀5頁,還剩250頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 13 章 IA-32結構微處理器的結構與工作方式 本章講述:13.1 x86系列微處理器的功能結構13.2 80 x87 FPU的結構13.2 IA-32 結構微處理器的工作方式13.1 x86系列處理器的功能結構系列處理器的功能結構x86系列結構微處理器的增長基本上按摩爾定律發展,如前所述已經經歷許多代。但從使用者(包括程序員)的角度來看,最關心的是處理器的功能結構。13.1.1 8086的功能結構的功能結構8086的功能結構已在第2章中介紹。13.1.2 80386的功能結構的功能結構80386的功能結構如圖13-1所示。80386擁有32位數據線和32位地址線,可以尋址4G(232)

2、的物理地址空間,內部寄存器與數據線都是32位,但段寄存器仍為16位。80386處理器首次將32位的寄存器組引入X86體系的微處理器中,它們都能夠用于計算和尋址操縱。每個32位寄存器的低半部分與80868088、80286處理器的16位寄存器具有相同的特性,完全向上兼容。80386的功能結構如圖13-1所示,由6個能并行操作的功能部件組成,即總線接口部件、代碼預取部件、指令譯碼部件、存儲器管理部件、指令執行與控制部件。這些部件按流水線結構設計,指令的預取、譯碼、執行等步驟由各自的處理部件并行處理。這樣,可同時處理多條指令,提高微處理器的處理速度。總線接口部件提供微處理器與外部環境的接口,在操作時

3、對相應信號進行驅動,包括32位地址總線和32位數據總線。由于地址總線和數據總線是分開的,所以,最快能在2個時鐘周期內從存儲器存取32位數據。顯然,具有32位操作數和尋址形式的指令在執行性能上得到增強,提供了一些用于位處理的新指令。80386總線結構具有動態改變數據和地址寬度的能力,既支持16位也支持32位操作。指令部件預取指令,對指令操作碼進行譯碼,并把它們存放在譯碼指令隊列中,以供執行部件調用。執行部件包括8個既可用于數據操作,也可用于地址計算的32位通用寄存器,還包括一個64位的桶形移位器(BaxelShiaer),用于加速移位、循環移位以及乘除法操作,這使典型的32位乘法可在1微秒內執行

4、。存儲器管理部件MMU由分段部件和分頁機構組成。分段部件通過提供一個額外的尋址機構對邏輯地址空間進行管理,可以實現任務之間的隔離,也可以實現指令和數據區的再定位。80386微處理器也首次將分頁機制引入到X86結構中,尺寸固定為4kB的頁面為虛擬存儲管理提供了基礎,它比80868088地址空間的分段管理更加有效,并且,對應用程序來說是完全透明的,也不會減低應用程序的執行速度。顯然,虛擬存儲管理中的分段與80868088微處理器中64k字節在尋找段基地址方面有很大的區別。80386中的每個段都可以多至4GB,并可以形成一種受保護的“平面”尋址模式。這廣泛應用于如UNIX這樣的主流操作系統中。為保證

5、80386在目標碼級能向后兼容,保證過去用戶開發的軟件能夠被繼續使用。同時,能充分利用新一代微處理器的特性,在80386中除了有實地址方式外,還在保護虛地址方式下提出了一種稱為虛擬8086的新工作模式,該模式是在保護模式下劃分出一部分資源仿真80868088微處理器。當然,這樣的環境可以開辟多個,按多任務方式運行。從8086到80386,處理器的功能有了質的飛躍。體現在以下幾個方面:(1)16位寄存器發展為32位寄存器。(2)地址寄存器也發展為32位。可尋址的地址范圍達到4G字節,有了巨大的擴展。(3)增加了保護方式。使處理器有了兩種工作方式:實地址方式和保護虛地址方式。實地址方式與8086兼

6、容;保護方式才是32位處理器能真正發揮其完整功能的工作方式。(4)引入了多任務、任務切換的概念。(5)引入了四級特權機制,引入了調用門、陷阱門、中斷門,使程序能在不同特權之間切換。(6)引入了存儲管理單元(MMU),使采用80386的操作系統能方便地實現請頁機制(每頁為4kB),從而實現了虛擬存儲器管理。(7)增加了新指令(主要是保護方式的指令)。13.1.3 80486的功能結構的功能結構80486是功能上的另一次飛躍,它把386微處理器、x87FPU和片上的Cache集成在一起,從功能上形成了x86系列微處理器結構,如圖13-2所示。80486基礎結構等同于 80386,它們在寄存器組、尋

7、址方式、存儲器管理特征、數據類型方面都完全相同。為了進一步提高微處理器的執行性能,在內部結構上,對80486微處理器進行了一些改進,這些改進主要包括:(1) 將80386處理器的指令譯碼和執行部件擴展成五級流水線,進一步增強了其并行處理能力,在五級流水線中最多可有五條指令被同時執行,每級都能在一個時鐘周期內執行一條指令,80486微處理器最快能夠在每個CPU時鐘周期內執行一條指令。(2) 同時還增加一個8KB高速緩存Cache,該高速緩存極大地提高了微處理器處理時的取指性能,如果對存儲器進行訪問的指令或操作數位于該高速緩存中,每個時鐘周期內執行指令的數量將多于5個。(3) 另外,在80486中

8、,首次將浮點處理部件X87 FPU集成到微處理器內。(4) 當然,總線接口部件也更加復雜,也增加了一些新的引腳、新的位和指令以支持更加復雜、功能強大的系統(支持外部的第二級高速緩存L2和多處理器系統)。在過去,浮點部件一直作為一個單獨的數字協處理芯片配合微處理器進行浮點數字處理。如8087、80287、80387、80487SX分別與80868088、80286、80386、80486SX配合使用,以提高微型計算機對浮點運算的處理能力,如果沒有這些浮點處理器,進行浮點運算時只能通過微處理器劃分出一部分資源運行仿真軟件來實現,這樣,對浮點問題的處理是很慢的。在80486DX中已經將浮點處理部件F

9、PU集成到了微處理器內部,還增加了一些新的指令以適應結構上的擴展。80486從功能結構來說,已經形成了x86系列結構微處理器的基礎。后續的處理器往往是在指令的流水線結構上、在Cache上以及在指令擴展上有了新的發展。較新的x86系列微處理器的功能結構如圖13-3所示。13.2 80 x87 FPU的結構13.2.1 概述 16位微處理器之前的CPU是不適合于數值計算的。因為它們的字長太短,能表達的數值范圍太小;若用多字節表示,則計算的速度太慢;而且沒有乘除法指令,使用很不方便。16位甚至32位微處理器雖然有了較強的功能和較大的數值表示范圍,但是做數值運算仍然十分困難。為此,在16位微處理器的基

10、礎上設計了與之相配合的專門用于數值計算的協處理器。自80486開始,在芯片內集成了協處理器(相當于80387),這些協處理器統稱為80 x87 FPU。 數值計算主要有兩個要求:(1) 計算精度高;(2) 計算速度快。為了滿足這樣的要求,80 x87 FPU中設置了8個80位的寄存器。這樣的80位的寄存器可以用于以下7種數據類型:(1) 整數字(16位);(2) 短整數(32位);(3) 長整數(64位);(4) 短實數(32位: 1個符號位,8位階,23位尾數),相當于單精度數;(5) 長實數(64位: 1個符號位,11位階,52位尾數),相當于雙精度數;(6) 組合的十進制數(80位: 1

11、個符號位,18位BCD數);(7) 臨時實數(80位: 1個符號位,15位階,64位尾數)。也稱為擴展的雙精度數。在80 x87 FPU的內部是用80位的臨時實數表示的,比一般高級語言中用的雙精度數還長得多。其可表達的數值范圍達到: 3.19*10-4932X1.2*104932,是一個相當大的數值范圍,可以達到很高的精度。在80 x87 FPU中設計了具有很強數值計算能力的指令系統,其主要的指令種類如表13-1所示。 80 x87 FPU的指令是與IA-32結構微處理器的指令混合編制在一個完整的程序中的,即程序中有一些指令由80 x87 FPU執行,而另一些指令由IA-32結構微處理器執行。

12、指令這樣分配是自動實現的。而且在80 x87 FPU執行數值運算指令時,IA-32結構微處理器可以繼續執行自己的指令,做到兩個處理器的并發執行,從而大大提高了系統的能力。IA-32結構微處理器的所有尋址方式都可以用于尋址80 x87 FPU所需的存儲器操作數,因而80 x87 FPU可以方便地處理數值數組、結構、各種變量。 80 x87 FPU與IA-32結構微處理器的密切配合可以使數值運算(特別是浮點運算)的速度提高約100倍。8086與8087結合的一些典型運算指令的執行時間如表13-2所示。特別要指出的是,80 x87 FPU的浮點運算符合IEEE的浮點標準。由于80 x87 FPU能不

13、帶舍入地處理18位十進制數,所處理的整數長度可達64位(1018),因而廣泛地應用于在事務處理、商業部門和計算機輔助設計(CAD)等領域。 13.1.2 80 x87 FPU的數字系統當人們用紙進行數值計算時,從理論上講可以是完全精確而不帶任何誤差的。也即人們所使用的實數系統是連續的,任意大小與精度的數值都可以表示。對任何一個實數值來說,總存在著無窮多個更大的數值和無窮多個更小的數值;同時,在任何兩個實數之間,也存在著無窮多個實數。例如在1.5與1.6之間,就存在著1.51、1.52、1.555、1.599999、1.59999999等無窮多個實數。 顯然,計算機是不可能工作在整個實數軸上的。

14、無論計算機的規模有多大,它的寄存器和存儲器的長度總是有限的,這就使得計算機所能表示的數值大小(范圍)及數值精度受到限制。所以,實際上計算機所能表示的實數系統是一組離散的、有限的數值,它僅僅是實數集的一個子集,是實數系統的一種近似。計算機的位數越多,可表達的數值范圍越大,能表示的數值的精確度也越高。 80 x87 FPU中的實數是一種雙精度的長實數,它的表示范圍大約為4.1910-3071.6710306。這是一個相當大的數值范圍,在實際應用中,需處理的數據和最終結果超出這一范圍的情況是相當罕見的。可見,雖然80 x87 FPU是微型計算機中的協處理器,但已為實際應用提供了一個“足夠大”的取值范

15、圍。而80 x87 FPU中的臨時實數的取值范圍更大,如表13-3所示。 把80 x87 FPU的基本實數系統投影到實數軸上,其中的實點()表示80 x87 FPU所能精確表示的實數,如圖13-1所示。80 x87 FPU所能精確表示的兩個相鄰的實數之間總有一個間隔。如果某次運算的結果正好是80 x87 FPU所能表示的某個實數值,那么80 x87 FPU就精確地表示它;但是經常出現結果值落在兩個相鄰的實數之間,此時,就要根據舍入規則,將該結果舍入成為它所能表示的值。這就有一個精度問題。但是在80 x87 FPU中,大部分應用場合精確度是足夠的。 從圖13-1可以看到,80 x87 FPU所能

16、表示的實數不是均勻地分布在實數軸上,在任意的2的連續的冪次方之間,80 x87 FPU所能表示的實數個數是相等的(因為它的位數是固定的),即在216(65536)和217(131072)之間存在著的可以表示的實數個數與21(2)和22(4)之間是相同的。因此,可以表示的兩個相鄰實數之間的間隔是隨著數值的增大而增大的。 一般來說,雙精度數的實數集已經足夠大(表達范圍)、足夠密(精確度)了。在80 x87 FPU中所以還要有80位的臨時實數是想給常數和中間結果以更大的范圍和更高的精度,以保證最后結果的精確度。所以,在運算過程中,應盡可能把中間結果保存在80 x87 FPU的寄存器堆棧中,而不要以結

17、果的形式存放在存儲器中。80 x87 FPU的7種數據類型的格式,如圖13-2所示。80 x87 FPU各種數據類型所能表達的數值范圍如表13-4所示。 1. 二進制整數80 x87 FPU中有三種二進制整數類型,但它們的格式實際上是相同的,只是位數不同。最高位(最左面的位)是符號位,“0”表示正,“1”表示負。負數用補碼表示。值得注意的是,在80 x87 FPU中只有二進制整數是用補碼表示的,其他數據類型均采用原碼表示正負數只是符號不同,數值位是相同的。2. 十進制整數在80 x87 FPU中的十進制整數是用組合的BCD碼表示,共用10個字節即80位。最高字節的最高位為符號位,其余位無用,后

18、面9個字節,每個字節為兩位BCD數(故稱為是組合的),因此總共是18位十進制數。3. 二進制實數80 x87 FPU的二進制實數都采用科學記數法表示,分為階和尾數,在計算機中則用浮點數表示,符合IEEE標準。每個數由三部分組成: 符號字段、階碼字段和有效數字段。符號字段規定數的正負;有效數字段用于存放數值的有效數字(尾數);階碼字段用于調整二進制小數點的位置,它也決定了數值的大小。 80 x87 FPU中通常是以規格化的格式來表示其有效數字的,即以1fffff的格式表示有效數字的。其中“”表示一個假設的小數點,故有效數字由一位整數及一個由多位數字組成的小數部分組成。其中小數部分的位數取決于實數

19、的類型,短實數為23位,長實數為52位,而臨時實數為63位。在實數的這種規格化表示中,整數位取值總是“1”,這樣就消除了“小”的數值的前面的那些“0”,從而使得有效位字段中所表示的有效數位的數目達到最大值。 但是80 x87 FPU的短實數和長實數中的整數位是一個隱含位,即它實際上并沒有真正出現在實數格式當中,而只有在臨時實數格式當中,才真正有這個整數位。為了確定數值大小,還必須考慮指數部分(階碼)。尾數的規格化處理提高了數值的精度,而引入階碼就擴大了數值的表達范圍。階碼是為了把二進制小數點定位到有效數字中,它與科學計算中所采用的十進制指數類似。指數(階碼)為正,表示小數點應向右移;指數為負,

20、小數點應向左移。 為了省去指數中的符號和便于實現實數之間的比較,80 x87 FPU中以偏移的形式來存放指數,即在原指數上加上了一個常數偏移基數。這個偏移值對于不同的數據類型是不相同的。對于短實數,偏移值為127=7FH;對于長實數偏移值為1023=3FFH;對于臨時實數,偏移值則為16383=3FFFH。選擇這樣的偏移值是為了使階碼總是為正。這樣做的好處是,兩個實數可以像兩個不帶符號的二進制整數一樣進行比較,一旦發現某個對應位不同時,就可以確定數的大小,對后面的各位就沒有必要再進行比較了。采用了偏移指數以后,實現的真實指數可以由階碼段的值減去相應的偏移基數來求得。 若有一個用十六進制數表示的

21、短實數為:BE580000展開成二進制為:1011 1110 0101 1000 0000 0000 0000 0000把它的符號位、階碼字段和有效位字段分開為:1 011 1110 0101 1000 0000 0000 0000 0000符號位為1,則此數為負數。階碼部分轉換的十進制值124,減去偏移基數127,則實際的指數為:124-127=-3有效數為:1.1011 000 0000 0000 0000 0000把這個二進制數字轉換為十進制格式得到:1.0 + .5 + .125 + .0625= 1.6875把這三部分綜合起來,可得短實數為:x=-1.68752-3=-1.6875(

22、0.125)=-0.210937513.1.3 80 x87 FPU的結構 8087、80287、80387的結構分別如圖13-3、圖13-4、圖13-5所示。它們的主體部分是一樣的。8087的結構分成兩大部分: 控制單元(CU)和數值處理單元(NEU)。數值處理單元負責執行所有的數值運算處理指令;而控制單元則負責取指令、對指令譯碼、讀寫操作數、執行8087的非數值運算指令等。這兩個單元能彼此相對獨立地進行操作,可以使有些操作并發進行,并使NEU在進行數值運算處理時,由CU保持與主CPU(8086)同步。 1. 控制單元控制單元CU的重要功能之一是保持8087與CPU(8086/8088)同步

23、。8087的設計,可以把8087看成是8086/8088在結構上、功能上的擴充,8087的指令與CPU的指令是處在同一指令流中的。之所以能實現這一點,是由于在CPU的指令系統中安排了一條換碼(交權)指令ESC。這是一條16位的指令,但只要它的前五位為11011,則CPU就把它看為一條ESC指令。所有的8087指令,對于CPU來說就是一條ESC類的指令;當主CPU取出這樣一條指令時,就按ESC指令處理。 此時,CPU內部不進行任何操作相當于一條NOP指令;但ESC指令可以尋址存儲器操作數,主CPU對這個操作數進行一次“假讀”,即執行一次存儲器讀周期,按規定的尋址方式,把地址送至地址總線上,發出讀

24、存儲器的有關控制信號,把存儲器中指定單元的信息讀出至數據總線上,但封鎖了CPU的數據總線(即CPU不讀取這個數據),然后CPU執行下一條指令。對于8087來說就要執行指定的指令。所以,8087就要和CPU一樣取指令及對指令譯碼。當譯碼為CPU指令時(非ESC指令),8087不做任何操作;只有當譯碼到ESC類指令時,8087才進行指定的操作。 8087的CU監視CPU發出的狀態信息(S0#、S1#、 S2#與S6),當它們為(1、0、1、0)時,就是CPU的取指周期,則CU同樣從數據總線上讀取指令, 以使8087與主CPU同步地獲取指令。8086為了做到取指令與執行指令并發進行(流水線結構),在

25、CPU內部有一個預取指令隊列。所以,8087中也要有一個預取指令隊列。CU又可以通過監視CPU的隊列狀態線(QS0、QS1)做到與CPU同步地從指令隊列中取得指令,并及時對其進行譯碼。 8087的指令,有的沒有存儲器操作數,這時主CPU執行的ESC指令與執行NOP類似;有的需要存儲器操作數,則主CPU執行一個上述的“假讀”周期,最多可讀取一個字(主CU不獲取這個字),用于執行ESC指令。對于8087來說,讀出的存儲器操作數可能用于加載指令(讀),也可能用于存儲指令(寫),而且操作數往往不只是一個字,這就可能出現以下情況:(1) 8087只讀取一個“字存儲器操作數”,則在上述的主CPU的“假讀”

26、周期中,8087把從存儲器中讀出的一個字,從數據總線上加載至8087中。 (2) 8087要讀取多個“字存儲器操作數”。則在主CPU執行這條ESC指令時,執行一次“假讀”周期。8087一方面在上述的“假讀”周期中從數據總線上獲取一個字操作數;另一方面把出現在地址總線上的地址鎖存下來。接著8087向主CPU發出DMA請求,接管總線,以鎖存的地址為基準,從存儲器中讀取余下所需的字操作數。然后,把總線釋放給CPU。 (3) 若8087要用存儲器保存數據,也就是要寫存儲器,則在主CPU執行這條ESC指令時,進入“假讀”周期;但8087并不獲取“假讀”的操作數,而只是獲取鎖存在地址總線上的地址。當808

27、7完成了內部操作,真正要執行寫存儲器操作時,它向CPU發出DMA請求,接管總線。以鎖存的地址為基準,寫入指定數量的操作數。然后,把總線釋放給主CPU。 2. 數值處理單元凡是涉及8087寄存器堆棧的所有指令都是由數值處理單元NEU執行的。這些指令包括算術運算、邏輯比較、超越函數的計算、數據傳送以及常數指令。在NEU中,主要部分是8個80位的寄存器棧。為了適應各種數據類型的需要,為了保證運算的精確度,也為了使數的傳送和處理更為方便,NEU中的數據通路的寬度是80位的,其中小數部分64位,指數部分15位,另加一個符號位。NEU中的80位數據是放在寄存器棧中的,并通過棧來進行處理。 8個80位的寄存

28、器構成了一個先進后出的棧,由狀態寄存器中的三位形成棧指針(ST),規定了當前的棧頂。棧的操作是以棧頂為基準的。壓入(PUSH)操作把ST減1,再將某個數值裝入新的棧頂寄存器;彈出(POP)操作把當前棧頂寄存器的數值輸出,然后將ST加1。所以,8087中的堆棧與8086/8088中的堆棧相似,是下推式的堆棧。堆棧操作和棧中的數值及堆棧指針的變化情況,如圖13-6所示。 在8087初始化時,ST=0,則在入堆操作時ST-1=000-001=111=7,這在工作時是要注意的。8087對寄存器棧操作時,可以明顯規定某個寄存器ST(i),這稱為顯式尋址;也可以不明顯規定是哪個寄存器,則隱含著對當前的棧頂

29、(即狀態寄存器中的ST所指向的某個寄存器)進行操作。例如,求平方根指令通常為:FSQRT即對棧頂寄存器中的操作數求平方根,這種尋址稱為隱式尋址。 要注意的是,隱式尋址是指出當前棧頂寄存器,也即是由狀態寄存器中的堆棧指針所指定的寄存器,而不一定是寄存器0(R0)。若狀態寄存器中的堆棧指針為000,則當前棧頂即為R0;若堆棧指針是010,則當前棧頂是R2。另外,顯式指定的ST(i),其中0i7,也是相對于當前棧頂的,ST(i)是從當前棧頂計算起的第i個寄存器。例如有指令:FADD ST,ST(2)若狀態寄存器中的ST=001,則是指R1與R3(001+2=3)的內容相加。 為了優化數值協處理器的功

30、能,每一個寄存器都有一個標志位(每寄存器兩位)與之相對應,用以反映寄存器的情況,如圖13-7所示。這個標志字,對于程序員來說是無用的。80287的功能結構幾乎與8087完全一樣,只是把8087的控制單元CU改稱為總線接口單元BIU,兩者在功能上是完全一樣的,特別是數值處理單元部分都是以8個80位的堆棧作為核心,支持多種數據格式。 80387的結構更為復雜一些。從大的方面來說,有總線控制邏輯、數據接口和控制單元及浮點單元三個部分。但從本質上來說,仍可分為80387內部的浮點運算部分以及與80386和存儲器連接的接口和控制部分。后一部分負責監視80386的指令流,當譯碼分析到數值運算指令時,由80

31、387執行。執行所需的數據以及計算結果的存儲也是由這部分負責,其工作過程與8087部分介紹的一致。 只是80387與80386相應的有關寄存器和指針是32位的,而且有可能與工作在保護虛地址方式的80386協同工作,主要反映在事故指針上。但80387的主體部分仍是以 8個80位的堆棧為核心,配合必要的運算邏輯的浮點運算部分。這部分除了在運算邏輯部分作了較大的改進外,其他部分與8087是一致的,特別是堆棧格式和操作方法是完全一樣的。8087、80287和80387的狀態字分別如圖13-8、圖13-9、圖13-10所示。這三者的狀態字基本上是一樣的。 最高位都是B(BUSY)位,反映80 x87 F

32、PU是否忙的狀態位。80 x87 FPU都有一條BUSY引線,一旦它們的數值運算部分開始執行指令,則狀態寄存器中的B位就置1,輸出引線BUSY就變為高電平。在IA-32結構微處理器中,設置了引線TEST(TEST與80 x87 FPU的BUSY線相連)和指令WAIT,就可以做到IA-32結構微處理器與80 x87協處理器同步。第1311位ST即為堆棧指針,它的值規定了哪一個寄存器是當前的棧頂。ST=000表示棧頂是第0號寄存器R0,ST=001表示棧頂是R1,S=111表示棧頂是R7。 4個條件位C3、C2、C1、C0,用于80 x87 FPU的比較指令后,反映比較的結果,是一些轉移指令的依據

33、。當執行了比較指令(棧頂的內容與指定的操作數相比較)之后,狀態位C3、C2、C0反映了比較以后的結果,如表13-5所示。若操作數為0,則上述條件碼也可以用來反映棧頂(TOP)的內容是否等于0或大于0、小于0。當執行了檢驗指令FXAM后,條件碼反映出棧頂內容的一些特殊情況。8087的條件碼和數據檢驗情況如表13-6所示。 狀態字的第7位在8087中為IR位即中斷請求標志位,在80287和80387中都稱為ES位即總的出錯狀態位。即在80 x87 FPU中,有任一種未屏蔽的異常發生,則IR位或ES位置1,用來表示8087向主CPU發出了一個待處理的中斷請求;在80287和80387中相應的ERRO

34、R#引腳就發出有效信息。 在80387中還利用了狀態字的第6位(在8087和80287中此位未用,為0)作為堆棧標志SF,這一位用于區分無效操作是由于堆棧的上溢或下溢造成的,還是由于別的類型的無效操作造成的。SF=1,表示是堆棧操作造成的,此時,條件碼的C1=1表示是堆棧上溢;C1=0表示是堆棧下溢。 狀態字的第05位用來反映發生了某種異常事件。當80 x87 FPU在執行某條指令時,有可能發生下列的6種異常情況,當某種異常情況發生時,狀態字中的相應位置位若未予屏蔽的話,就可以發出中斷(或異常請求)。80 x87 FPU中可能出現的6種異常情況為:(1) 無效操作(Invalid Operat

35、ion): 在出現下面某種情況時,80 x87 FPU就認為是一種無效操作:堆棧溢出(80 x87 FPU中的堆棧是由8個寄存器組成,在做連續9個以上的壓棧或退棧操作時,將發生堆棧溢出);將某個非有效數(NAN)(例如字符)作為操作數;操作結果是不定的(例如、-、求負數的平方根)。這些無效操作,一般說明發生了程序錯誤。(2) 上溢(Overflow): 當運算的結果太大,超過了目標操作數所能表達的范圍,就發生上溢錯誤。(3) 下溢(Underflow): 運算的結果雖然不是0,但其數據太小,超出了目標操作數能表達的最小值的范圍,就發生下溢錯誤。(4) 被零除(Zero divisor): 當用

36、0去除一個非0操作數,就發生此類錯誤。(5) 不可規格化操作數(Denormalized Operand): 當操作結果中至少有一個為不可規格化的操作數時,就發生此類錯誤。不可規格化的操作數是指操作數太小,若要規格化就會產生下溢。(6) 結果不精確(Inexact Result): 如果操作結果的真值,不能用規定格式的目標操作數精確表示,也就是要按80 x87 FPU中規定的舍入方法進行舍入處理時,就設置精度事故標志。在實際應用中,這種事件是經常發生的,它表示在運行過程中犧牲了一些精度,這通常是可以接受的。對以上6種異常事件,在狀態寄存器中設置了相應的出錯標志位(IE、OE、UE、ZE、DE、

37、PE)。在這6種異常中,無效操作、被0除、不可規格化操作數等是故障類異常,是在執行實際操作之前產生異常;而上溢/下溢及精度事故等,則要在指令執行后,在結果計算出來后才能檢測,因此是陷阱類異常。 在發現前一類事故時,寄存器堆棧和存儲器中的操作數的內容不會改變,它們與引起錯誤的指令未被執行時的狀態一樣;而后一類事故,當發現錯誤時,指令已經執行,寄存器堆棧和存儲器中的內容可能已經更新。因此,這兩類事故所需的恢復和處理過程也有所不同。這6種異常事件有可能多個同時發生,此時對異常事件的處理就要按照事件的優先權次序順序進行。80 x87 FPU中規定的優先權次序為: 不可規格化操作數(未屏蔽)無效操作被零

38、除不可規格化操作數(被屏蔽)上溢/下溢結果不精確排在前面的優先權高。在一般情況下,當這些異常事件發生時,就要求程序員用軟件進行處理。故當發生這些異常事件時,80 x87 FPU除了在狀態寄存器中設置相應的標志外,還要向主CPU發出中斷請求,用程序員編制的中斷服務程序進行處理。 但是,事故處理程序往往是難于編寫的,好的事故處理程序就更難于編寫。Intel公司的設計者綜合了各方面的情況,針對各種異常條件,編寫了較合理的事故處理程序,放在80 x87 FPU中作為隱含的異常處理程序。只要用戶對某種異常事故設置屏蔽,則當此類異常發生時,80 x87 FPU一方面設置相應的異常標志,另一方面不發出中斷請

39、求,而是轉入片內隱含的異常處理程序進行處理。80 x87 FPU對各種異常事件的響應如表13-9所示。 在大量應用中發現: 在把除無效操作之外的所有事故都屏蔽掉之后,就能夠以最少的軟件開銷獲得令人滿意的結果。之所以沒有把無效操作這種異常事件屏蔽掉,是因為它通常代表了程序中的一種必須加以糾正的“致命”的錯誤。要對事故進行屏蔽就要用到控制字。80 x87 FPU的控制字格式分別如圖13-11、圖13-12、圖13-13所示。 三者格式基本上是相同的,只是在80287和80387中沒用中斷允許控制位IEM,在80387中沒用無窮大控制位IC(在80387中的無窮大都是仿射的)。80 x87 FPU為

40、了適應各種數據類型和各種運算處理的需要,設置了三個處理方式控制位。精度控制位PC,是與參與運算的數據類型相一致的,用以決定操作數是短整數、短實數還是長實數等。在算術運算或存取操作中,當目標數據的格式不能完全準確地表示結果時,就會發生舍入問題。例如,在把某個實數類型的數值送到一個短實數或整數時,就有可能需要進行舍入處理。80 x87 FPU中具有四種舍入處理方式,采用何種處理方式,由舍入控制RC決定。若結果X不能用目標數據類型精確地表示,而在給定的數據類型中與它最接近的可表示的數為X1和X2,且X1XX2,那么,在運算得到X之后,就要根據舍入控制方式,把X舍入成X1或X2。四種方式的舍入結果如表

41、13-10所示。 顯然,在實際應用中,應根據需要選擇舍入方式。在大多數應用中,都是采用“最近舍入”方式,這與習慣的“四舍五入”方式十分相似;“截尾”舍入方式往往用于對整數的運算中;“向下舍入”和“向上舍入”一般用于區間運算。8087、80287的控制字中還有一位IC(第12位),專門用于對無窮大進行控制。8087、80287的實數系統有兩種模型,一種是仿射閉包,另一種是投射閉包,如圖13-14所示。控制字中的IC位用來在這兩種模型中選擇一個。當IC位為0時,選擇投射閉包。此時8087、80287的特殊值無窮大沒有正、負之分,即它是不帶符號的,在絕大多數計算機中,使用的都是這種模型。當IC位為1

42、時,選擇仿射閉包。此時無窮大就有+和-之分。80387中使用這種方式。 有些異常事件是在指令執行后檢測到的,當異常發生時,原有的數據已經改變了。為了便于對事故進行分析,在80 x87 FPU中設置了事故指針。8087中的事故指針如圖13-15所示。這是一個4個字(16位)的指示器,用以保存產生異常指令的20位物理地址;保存了此指令操作碼的低11位(高5位為ESC指令標志),以確定是什么指令;若此指令有存儲器操作數,則保存它的20位物理地址,以便查找。每當8087的NEU執行一條指令時,其CU就把上述內容存入事故指示器中。可用8087的FSAVE/FNSAVE或FSTENV/FNSTENV指令,

43、把事故指示器作為環境的一部分放在存儲器中以供查找。 80387是與80386配合工作的。80386是32位的處理器,其內部寄存器是32位,地址偏移量一般也是32位。80386有兩種工作方式: 實地址方式和保護虛地址方式;而且在保護虛地址方式下還有32位方式和16位方式(為了與80286兼容)。在各種方式下的事故指示器分別如圖13-17、圖13-18、圖13-19所示。 13.3 x86系列結構微處理器的工作方式x86結構微處理器有兩種主要的工作方式: 實地址方式和保護虛地址方式。實地址方式是為了與8086兼容而設置的方式。在實地址方式下,具有32條地址線的x86結構微處理器只有低20條地址線起

44、作用,能尋址1MB的物理地址;此時,x86系列結構微處理器相當于一個快速的8086,雖然可以使用32位的數據寄存器,但遠不能充分發揮x86結構微處理器的全部功能。 保護虛地址方式是IA-32結構微處理器的主要工作方式,在此方式下,全部32條地址線都能尋址,故可尋址高達4GB的物理存儲器;在保護方式下,x86結構微處理器支持虛擬存儲器的功能,一個任務可運行多達16K個段,每個段最大可為4GB,故一個任務最大可達64MMB的虛擬地址;在保護方式下運行的程序分為4個特權等級:0、1、2、3,操作系統核心運行在最高特權等級0;用戶程序運行在最低特權等級3。IA-32結構微處理器中有完善的特權檢查機制,

45、既能實現資源共享又能保證程序和數據的安全和保密,任務之間的隔離。 在保護方式下,IA-32結構微處理器支持多用戶多任務操作系統,可以用一條指令實現任務切換,而且任務的環境得到了很好的保護。IA-32結構微處理器的芯片內包含一個存儲管理單元MMU,在保護方式下可以實現分頁,通過二級頁表,可以把物理地址映射到線性地址空間的任何區域。總之,在保護虛地址方式下,IA-32結構微處理器有很強的功能,保護方式是IA-32結構微處理器的主要工作方式。而且,IA-32結構微處理器在保護虛地址方式下,增加了一種虛擬8086方式,可以在多任務的條件下,有的任務運行MS-DOS,這是一種與8086兼容但又不同于實地

46、址方式的工作方式。 13.2.1 實地址方式實地址方式和保護虛地址方式的區分是由控制寄存器CR0的最低位PE位決定的。若PE位為0,則工作在實地址方式;若PE=1,則工作在保護虛地址方式。IA-32結構微處理器在系統復位后,CR0的PE=0,即工作在實地址方式。在經過了必要的初始化以后(在后面詳細介紹),用MOV指令使CR0加載一個PE位等于1的新的操作數,就使工作方式切換到保護虛地址方式。 在實地址方式下的存儲器尋址與8086是一樣的,32位地址線中的A31A20不起作用。由段寄存器(CS、SS、DS、ES)的內容乘以16作為段基地址,加上16位的段內偏移量形成20位的物理地址。在實地址方式

47、下,每一個段最大可達64KB。所有的段都是可讀、寫和執行的。在實地址方式下的內存是不能分頁的,故線性地址和物理地址是統一的。在實地址方式下運行的程序不分特權等級。實際上,實地址方式下的程序相當于工作在特權級0,它能執行控制寄存器(CR0、CR3)傳送指令,加載GDTR、LDTR、TR等特權指令。除保護虛地址方式下的一些專用指令之外,所有其他指令都能在實地址方式下執行。所以,系統復位以后,要在實地址方式下,初始化GDT、IDT和兩級頁表,加載CR3,然后通過加載CR0使PE=1才能進入保護虛地址方式。實地址方式下不能實現多任務,所以IA-32結構微處理器的實地址方式,是系統復位后向保護虛地址方式

48、過渡的一種方式。一部分IA-32結構微處理器在DOS支持下工作,只工作在實地址方式,主要是為了與8086兼容,能運行DOS支持下的軟件。IA-32結構微處理器在實地址方式下有兩個內存保留區: 系統初始化區和中斷向量表區。IA-32結構微處理器在復位以后,CS寄存器的值為F000H,而IP初始化為FFF0H,而且系統強迫地址總線的高12位為1。所以,初始化后的入口地址為FFFFFFF0H,從FFFFFFF0HFFFFFFFFH為初始化的保留區,通常在FFFFFFF0H處存放一條段間跳轉指令,轉至系統的入口處。實地址方式與8086方式相似,在內存的00000000H000003FFH的1KB區域內

49、,存放一個具有256個向量的中斷向量表,每一向量對應著一個四個字節的中斷服務程序的入口地址(兩個字節的段寄存器值,兩個字節的段內偏移量)。在實地址方式下的中斷與異常與保護虛地址方式下有較大的區別。這主要涉及系統程序員的工作,在本書中不作詳細分析。13.2.2 保護虛地址方式1. 保護方式下的尋址機制在保護方式下,一個存儲單元的地址也是由段基地址和段內偏移量兩部分組成。以段內偏移量來說,除能擴展到全地址(32位)外與實地址方式下區別不大,尋址方式的根本區別在于如何確定段基地址。在實地址方式下,段寄存器的內容16(即左移四位)就形成段基地址,故段基地址是20位的,只能尋址1MB;在保護方式下,段基

50、地址也是32位的,所以就不能由段寄存器的內容直接形成32位的段基地址,而要經過轉換。 于是在內存中就有一個表,每一個內存段對應著表中的一項,此項中包含32位的段基地址。為了適應多用戶、多任務操作系統的需要,一個段還要有一些其他信息,例如,段的大小(界限)和段的一些讀寫權限、段的類型等。在IA-32結構微處理器中,一個段用一個8字節的描述符來描述,這些描述符構成了一個表,稱為描述符表。由描述符中所規定的段基地址再加上32位的段內偏移量就可以尋址一個存儲單元,如圖13-20所示。 由段基地址(32位)和段內偏移量(32位)形成的地址稱為線性地址(32位)。在IA-32結構微處理器片內有分頁的MMU

51、,當啟用分頁機制時(CR0的最高位PG=1),經過分頁機制可以把線性地址轉換為存儲器的物理地址,如圖13-21所示。當不啟用分頁機制時(CR0的PG=0),線性地址即為內存的物理地址。保護方式下的段內偏移量為32位,故一個段最大可達4GB。2. 全局描述符表和局部描述符表在IA-32結構微處理器中,有三種類型描述符表: 全局描述符表(gdt)、局部描述符表(ldt)和中斷描述符表(idt)。在整個系統中,全局描述符表和中斷描述符表都只有一個,局部描述符表可以有若干個,每一個任務一個。每個描述符表本身形成一個段,最多可以有8K(8192)個描述符。但IA-32結構微處理器中,最多只能處理256個

52、中斷向量,故中斷描述符表最多只包含256個中斷描述符。每個描述符表構成一個段,也有段的基地址、段的界限和其他特性,也即有一個相應的描述符來描述。這樣的描述符必須放在全局描述符表中。 (1) 全局描述符表(gdt)全局描述符表中,包含著系統中每一個任務都可能(或可以)訪問的段的描述符,通常包含操作系統使用的碼段、數據段和堆棧段,各種任務狀態段、系統中所有的ldt表的描述符等。(2) 局部描述符表(ldt)通常,操作系統的設計者使每一個任務都有自己的ldt。ldt包含了此任務所使用的碼段、數據段、堆棧段描述符;也可包含此任務所使用的一些控制描述符,如任務門、調用門描述符。使用ldt這樣的數據結構,

53、就可以使指定任務的碼段、數據段等與別的任務相隔離以達到保護。 使用gdt、ldt這兩種數據結構可以達到既保護又可共享全局數據的目的。從系統的虛擬地址空間來看,整個虛擬地址空間可以分成兩半,一半空間的描述符在全局描述符表中,另一半空間的描述符在局部描述符表中。每一個表都可以包含多達8192個描述符(即對應的空間可由8192個段組成),每一個段最大可為4GB。故最大的虛擬地址空間可為:2819244GB=64MMB當任務切換時,ldt就切換為新任務的ldt,而gdt是不變的。因此,由gdt所映像的虛擬地址空間對所有的任務是公共的;而ldt所映像的虛擬地址空間,只局限于任務,隨著任務而改變。對于一個

54、系統來說,操作系統是面向所有任務的,它應該在gdt的映像中。一些全局性的數據、表格,公用的實用程序等也應在gdt的映像中。上述的全局和局部地址空間的情況如圖13-22所示。它既可以做到互相隔離、保護,也可以做到全局數據的共享。3. 描述符在保護虛地址方式下的每一個段,都有一個相應的描述符。描述符由8個字節組成,包含了此段的基地址(32位)、段的大小(20位)、段的類型等一些主要特性。在IA-32結構微處理器中,主要有兩種類型描述符: 段碼和數據段描述符; 特種數據段和控制描述符。在后一種里又分為特種數據段描述符和控制(門)描述符兩大類。 (1) 碼段和數據段描述符碼段和數據段描述符一般格式如圖

55、13-23所示。圖13-23中規定了32位的段基址(由基址3124、基址2316和基址150三部分構成)、20位段界限(由界限1916和界限150兩部分構成)。另有一個粒度位G。G=0,段長度以字節為粒度,20位段界限可定義段的大小為1兆字節(1MB);G=1,段長度以頁為粒度,每頁為4KB,段的界限為1M頁,可定義段的大小:1M4KB=4GB描述符中有一個字節,稱為段的訪問權字節,它描述了段的一些重要特性: 段的訪問權字節的高4位在所有的段描述符中都是相同的:最高位P(Present)為存在位,P=1,此段被映像到物理存儲器;P=0,無物理存儲器映像存在。第6、5位DPL(Descripto

56、r Privilege Level)為描述符特權級,規定了此段的特權級,用于特權檢查,以決定對此段能否進行訪問。第4位S(Segment)區分上述的兩大類描述符。S=0,為特殊數據段或控制描述符;S=1,為碼段或數據段描述符。 訪問權字節的低4位,在S=0或S=1時是不同的。在S=1即為碼段或數據段描述符時,其作用如表13-11所示。它反映了碼段或數據段,以及段能否被讀寫訪問。段的訪問權字節是段的極其重要的屬性。描述符的各個字段,可以由相應的指令來讀取和設置。在描述符中,比訪問權字節地址高的一個字節的有些位也是很重要的,其中的G位是界限的粒度位。 D位也很重要,其作用如下: 碼段描述符的D位用

57、于設置由指令所引用的地址和操作數據的默認值。D=1,指示默認值是32位地址、32位或8位操作數,這是IA-32結構微處理器在保護方式下的正常設置;D=0,指示默認值是16位地址、16位或8位操作數,這是在IA-32結構微處理器中為了執行80286的程序而設置的。由D位所設置的默認值,可以由前面章節中提到的地址前綴和操作數前綴加以改變。 對于設置為向下擴展的段,D位決定段的上邊界。D=1,指示段的上邊界邊4G;D=0,指示段的上邊界為64K。 由SS尋址的段,若D位=1,規定用ESP作為指針,堆棧操作是32位的;若D=0,則用SP作為指針,堆棧操作是16位的。 (2) 特種數據段和控制描述符此類

58、描述符的一般格式如圖13-24所示。其中,TYPE字段共4位,用此4位二進制的值區分描述符的具體類型。 (3) 特種數據段描述符80 x86系統中有兩種特種數據段描述符,即局部描述符表(ldt)的描述符和任務狀態段TSS(Task Status Segment)的描述符。ldt中包含了一個任務所要訪問的段的所有描述符,但此表本身構成一個存儲器數據段,它也有段基地址、段的界限、段的屬性,需要一個描述符與之相對應,這樣的描述符當然要放在gdt中。當任務切換時,一個任務的環境(狀態)需要保存(離去的任務)或需要恢復(進入的任務)。這些環境是保存在內存的某個段內的,如圖13-25所示,稱為任務狀態段T

59、SS。TSS是一個段,它具有一般段同樣的特性,需要有一個描述符與之對應。當然,這樣的描述符也存放在gdt中。此類描述符分為80286、80386兩種,每種都還有可用或忙兩種情況,故共有四種。ldt描述符和四種TSS描述符的格式只是TYPE字段的值不同。 (4) 控制(門)描述符程序在運行中會發生轉移,系統會進行任務切換,外部事件會引起中斷,指令的執行會引起異常,總之,會發生控制轉移。轉移至何處?轉移可能在同一段內進行,但更一般的是段間轉移(任務切換、中斷、異常,一定都是段間轉移;程序的跳轉與調用也可能是段間的)。如何確定目標段和相應的入口呢?控制轉移通常會涉及特權級的變換,所以80 x86中設

60、置了調用門、任務門、中斷門和陷阱門。調用門用于在程序中調用子程序、過程、函數;任務門用于任務切換;中斷門用于外部事件引起的中斷;陷阱門用于異常處理。 每一種門都要涉及轉移的目標段及在段內的入口,所以門描述符與段描述符非常相似。其一般格式如圖13-26所示。其中,包括了目標段的選擇子(通過選擇子來確定相應的段),入口點的偏移量(32位)以及有關的特性。TYPE字段的值區分了幾種不同的門描述符。只有在調用門中才有DC字段(在其他類型的門中,此字段為0),它規定了從調用者的堆棧中拷貝多少個雙字到被調用者的堆棧中,用于傳遞參數。在任務門中,入口點的偏移量是不用的。 4. 選擇子每一個段相應的描述符在g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論