## 6.3 段級保護(Segment-Level Protection)
段保機護機制有以下五個方面:
1、 類型檢查(Type Checking)
2、 界限檢查(Limit Checking)
3、 尋址范圍約束(Restriction of addressable domain)
4、 子程序入口點約束(Restriction of procedure entry points)
5、 指令集約束(Restriction of instruction set)
段是保護的單元,段描述符用來存儲保護機制參數。當把一個選擇子加載進段描述符時和每次段訪問時CPU自動執行保護檢查。段選擇寄存器保存著當前可尋址段的保護機制參數。
6.3.1s 描述符存儲保護機制參數(Descriptors Store Protection Parameters)
圖6-1高亮顯示了段描述符中與保護相關的字段。
在描述符創造時,系統軟件同時把保護參數入在描述符中。一般來說,應用程序員不用管保護參數的。
當程序把一個選擇子裝入段寄存器時,處理器不僅加載段的基址部分,而且也把保護參數裝入段寄存器。每個段寄存器有一個不可見的部分用來存放基址、界限、類型、和特權級。所以對于以后的保護檢查,處理器不必浪費多于的時鐘周期去從內存中加載這些信息。

6.3.1.1 類型檢查(Type Checking)
描述符的類型字段有2個作用:
1、 它用來區分不同格式的描述符。
2、 它暗示了描述符的用處。
除了被應用程序廣范使用的數據段和可執行段描述符外,80386還有特殊的描述符,用來描述和操作系統相關的段(Segment)和門(Gate)。圖6-1列出了所有類型的系統段和門。注意,不是所有的描述符都定義了一個段。門描述符有不同的用法,下一章將講述。
數據段和可執行段的類型字段包括了以下這些位,用來定義一個段的用途(參看圖6-1):
+ 在一個數據段描述符中,可寫位指出了指令是否有權向這個段寫入數據。
+ 在一個可執行段描述符中,可讀位指出了指令是否有權從這個段中讀出數據(例如,用來訪問與指令一起儲存的常量數據)。可讀的可執行段可以在以下兩種方式下讀取:
1、 通過使用CS前綴,來訪問CS 寄存器指定的段。
2、 把描述符加載到數據段寄存器(DS,ES, FS, GS)。
類型檢查可以檢測出某些程序錯誤,比如,當程序員訪問一個不是為某種目的設定的段時。處理器在以下兩種情況下檢查類型:
1、? 當把一個描述符加載到一個段寄存器時。有些段寄存器只能加載某些類型的描述符,比如:
+ CS 寄存器只能加載一個可執行段的描述符。
+ 只有可執行的數據段描述符才能加載入SS段寄存器。
2、? 當一條指令訪問一個段時(顯式的或者隱式的)。一些段只能通過一些特定的方式才能使用,例如:
+ 可執行段不允許任何指令寫入數據。
+ 如果一個數據段的可寫位沒有置位,任何指令不可向其寫入數據。
+ 如果一個可執行段的可讀位沒有置位,任何指令不可從該段讀取數據。
表6-1,系統段描述符和門描述符

6.3.1.2 界限檢查(Limit Checking)
一個描述符的界限字段是用來防止程序在訪問一個段時超出段的范圍的。處理器根據描述符的G位(granularity bit)來解析界限字段的。對于數據段,處理器在解析界限字段時還要根據E位(expansion-direction bit)和 B位(big bit)(參看表6-2)。
當G=0 時,界限字段的值即是描述符中20位的 limit-field。這時,界限可能從0~0FFFFF (2^20 – 1 或者說 1 M)。當G=1時,處理器將會自動的在描述符的 limit-field 低位加12位0。這樣,實際的界限值可以從0FFFH(2^12 – 1 或者說4K)到0FFFFFFFFH(2 ^ 32 – 1 或者說4G)。
除了向下延伸的段外,界限值總比段的大小少1(字節表示)。當以下任一情況發生時,處理器引發異常:
+ 試圖訪問一個 地址 > 界限 的字節。
+ 試圖訪問一個 地址 >= 界限 的字。
+ 試圖訪問一個 地址 >= (界限 – 2 ) 的字雙字。
對于向下延伸的數據段,界限做用相同,但是被處理器以不同的方式來解析。這個時候,有效地址則從 limit + 1 到 64K 或者 2^32 – 1(4G)(由B位決定)。向下延伸的段當界限設為0時,有最大的段長。
向下延伸的特性允許把堆棧拷貝到一個更大的段,而不改變內部段指針,來增大一個堆棧的大小。
描述符表的界限字段用來防止程序尋址超出一個描述符表。界限用來確定描述符表的最后一個描述符的最后一個字節。因為一個描述符是8字節長,界限字段的值為
N * 8 – 1 ,對于一個包含N個描述符的描述符表。
界限字段可以查測到類似下標出界和非法指針運算等程序錯誤。這些錯誤一當發生時就可以被發現,所以確定這種錯誤是很簡單的。如果沒有界限檢查,這些的錯誤會使一個模塊受到破壞,這種錯誤只有當下一次受損的模塊不正常工作時才會被發現,而且發現也是比效困難的。

6.3.1.3 特權級
處理器通過賦給一個重要的對象以一個 0 ~ 3 的數字來實現特權級。這個數字被稱為特權級。0代表最高特權級,3代表最低特權級。以下的對象包含了特權級:
+ 描述符包含了一個叫做描述符特權級(DPL)的字段。
+ 選擇子包含了一個叫做請求特權級(RPL)的字段。RPL 代表著指向子程序的選擇子。
+ 處理器的一個內部寄存器記錄了一個叫做當前特權級(CPL)的字段。一般來說,CPL 和當前正在執行的代碼段的DPL是相同的。當控制在不同特權級的段間轉移時,CPL發生變化。
當某個段的一個子程序要訪問一個段時,處理器會自動的把一個要訪問某個段的子程序的特權級和CPL或者更多的特權級相比。這種比較是在當一個描述符被加載到一個段寄存器時執行的。比較的標準在訪問數據時和控制轉移時是分別不同的。所以,就有了以下兩種不同的查測:
圖6-2顯示了不同特權級環的解析方式。中心是用來放最關鍵的軟件的,一般來說是操作系統內核。外面是用來放次關鍵的應用軟件段的。
4個特權級全用并不是必要的。已存在的軟件如果是主兩級特權級設計的,也可以很好的被80386支持的。一個只用一級特權級的系統應該使用特權級0;一個使用兩級特權級的系統應該使用特權級0和特權級3。

### 6.3.2 訪問數據約束(Restricting Access to Data)
為了尋址一個操作數,80386必須把一個選擇子加載到一個段寄存器(DS, ES, FS, GS, SS)里。處理器自動執行訪問特權級的檢查。檢查是在當選擇子被加載入段寄存器時執行的。圖6-3顯示了,在這種檢測下的3種不同的特權級。
1、? CPL(當前特權級(current privilege level))
2、? 用來指定目標段的選擇子的RPL(請求特權級(requestor’s privilege level))。
3、? 目標段的DPL(描述符特權級)
一條指令只有當一個目標段的DPL在數值上大于或等于CPL和選擇子的RPL中的最大值時,才可以加載目標段的選擇子到一個段寄存器里。也就是說,一個子程只能訪問它同級的或比它特權級低的數據。
當一個任務的CPL改變時,它的可尋址范圍也會改變。當CPL是0時,任何特權級的數據段都是可尋址的。當CPL是1時,只有特權級從1 ~ 3 的數據段才是可尋址的,當CPL是3時,只有特權級是3 的數據段才是可尋址的。80386的這個性質可以保護操作系的內部表不被應用程序所讀取或更改。

6.3.2.1 在代碼段中訪問數據(Accessing Data in Code Segments)
更少見點的情況可能是在一個代碼段內存儲數據。代碼段可以存儲常量。任何指令不能向一個代碼段寫入數據。以下是可以在代碼段內訪問數據的方法:
1、? 用一個非一致性的、可讀的、可執行的選擇子加載一個數據段寄存器。
2、? 用一個一致性的、可讀的、可執行的選擇子加載一個數據段寄存器。
3、? 用CS前綴來讀取一個可讀的,可執行的代碼段(該段當前已被CS寄存器所指向)。
在訪問數據時,和正常的數據訪問規則適用于第1種情況。情況2總是合法的,一致性段的特權級總是和當前特權級(CPL)相同,無論該段的DPL是多少。第三種情況也是合法的,因為目標段的DPL就是代碼段的DPL,根據定義,也就是CPL。
### 6.3.3 控制轉移約束(Restricting Control Transfers)
在80386中,控制轉移是通過指令 JMP, CALL, RET, INT, 和 IRET 當然還有異常和中斷機制。異常和中斷是特殊的情況,在第9章中講述。這一章講述JMP,CALL,和RET 指令。
JMP, CALL, RET 指令的“NEAR”(近)形式,只在當前的代碼段內發生轉移,所以安全檢查只涉及到界限檢查。處理器保證JMP, CALL, RET 指令不會超出當前執行的代碼段的限長。這個限長被存儲在CS段寄存器的不可見部分。所以這種檢查不會帶來額外的時鐘周期。
而JMP, CALL, RET 的“FAR”(遠)形式則會轉移到不同的段內,所以,處理器將執行特權級檢查。JMP和CALL有兩種方法轉移到另一個段:
1、? 操作數選擇一個另一個可執行段的描述符。
2、操作數選擇了一個調用門描述符。這種門形式的轉移將在下一節介紹調用門時講述。
圖6-4顯示了,兩種不同特權級之間的控制轉移(沒有使用調用門時):
1、? CPL(當前特權級(Current privilege level))。
2、? 目標段的描述符的DPL。
一般來說,CPL和處理器正在執行的段的DPL是相同的。但是,當正在執行的段的一致性位(conforming bit)置位時,CPL也可能比DPL要大。處理器把當前特權級(CPL)緩存在CS段寄存器里,這個值也可能和當前代碼段的描述符特權級不同的。
只有當以下條件致少滿足一個時,處理器才允許JMP或CALL直接轉移到另一個段:
+ 目標段的DPL和CPL相同時。
+ 目標代碼段的一致性位(conforming bit)設置時,而且目標代碼段的DPL與CPL相等或者目標代碼段的DPL比CPL小。
一致性位設置的段被稱為一致性段。一致性段的機制允許不同特權級共享子程序,而且在執行其中的子程序時使用自已的特權級,而不是使用一致性段的段描述符特權級。一個例子就是數學庫子程序和一些異常處理子程序。當控制轉稱到一致性段時,CPL不會改變。這就是唯一的CPL不等于當前可執行代碼段的情況。
許多代碼都是非一致性的(non-conforming)。上述的基本特權級檢查意思是,對于非一致性段,不通過門描述符可以轉移到一個相同特權級的可執行段。但是,有時我們也需要從低特權級向高特權級(數值上比較小的)轉移。這種需要就可以能過調用門(call-gate)來實現。調用門在下一節中介紹。JMP 指令不可能通過任何方法轉移到DPL與CPL不同的非一致性段中去。

### 6.3.4 門描述符保證子程序入口點(Gate Descriptors Guard Procedure Entry Points)
為了提供轉移到不同特權級段中的機制,80386使用了門描述符。有4種門描述符:
+ 調用門(Call Gates)
+ 陷阱門(Trap Gates)
+ 中斷門(Interrupt Gates)
+ 任務門(Task Gates)
這一章只講述調用門。任務門是用來任務切換的,所以在第7章中介紹。第9章說明了陷阱門和中斷門,用來處理異常和中斷。圖6-5顯示了調用門的格式。一個調用門可以在GDT中,也可以在LDT中,但不能在IDT中。
一個調用門主要有2個作用:
1、? 定義一個子程序的入口。
2、? 定交了入口的特權級。
調用門描述符被CALL和JMP指令使用,方法和普通的代碼段描述符相同。當硬件識別了目標選擇子是指向一個調用門時,操作過程將由這個調用門來決定。
門中的選擇子和偏移量將用來形成一個子程序入口點的指針。調用門保證了控制轉移到一個段內的合法入口點,而不是轉移到一個子程序的中間,或者更糟糕的是轉移到一條指令的中間。作為操作數的遠指針不再象平常那樣指向一個段中的某個偏移了,而是選擇子部分指向了一個門,偏移部分沒有使用。圖6-6顯示了這種尋址方式。
如圖6-7所示,4種不同的特權級將用來做安全檢測:
1、 CPL
2、 用來指向調用門的選擇子的RPL
3、 門描述符的DPL
4、 可執行目標段的DPL
調用門描述符的DPL決定了什么樣的特權級可以使用這個門。一個段可能有多個子程序,這些子程序被設計給不同特權級程序來使用。例如,操作系統可能有幾個子程序,這些服務被設計來給應用程序使用,但其它的子程序可能只被設計成給系統軟件使用。
門描述符可以用來向高特權級(數值上更小的)或同特權級控制轉移(這樣實際上沒有必要)。只有CALL指令才能用門描述符向高特權級轉移。JMP只能使用門描述符向同級特權級轉移或向一個一致性段轉移。
對于JMP 指令,向一個非一致性代碼段轉移時,以下兩點必須要同時滿足,否則處理器引發異常:
MAX(CPL,RPL) <= Gate DPL
Target Segment DPL = CPL
對于CALL指令(或者對于向一致性代碼段轉移的JMP)以下兩點必須要同時滿足,否則處理器引發異常:
```
MAX(CPL, RPL) <= Gate DPL
Target Segment DPL <= CPL
```


6.3.4.1 堆棧切換(Stack Switching)
如果調用門中指示的目標代碼段和當前特權級(CPL)不同,段間跳轉發生了。
為了保證系統的完整性,每一個特權級使用了一個相互獨立的堆棧。這樣,可以保證高特權級有足夠的堆棧空間使用。沒有它們時,如果調用者不提供足夠的堆棧空間,那么一個受信任的子程序就無法正常工作。處理器通過任務狀態段(task state segment)(請看圖6-8)來尋址這些堆棧。每一個任務有一個單獨的TSS, 所以允許任務擁有自已的堆棧。系統軟件的責任是創建TSS還要把它們的堆棧指針設置好。TSS最初的堆棧指針是只讀的。處理器絕對不會在執行程序時更改它們。
當一個調用門用來改變特權級時,處理器使用TSS中的堆棧指針來建立一個新的堆棧。處理器用目標代碼段的DPL來索引TSS中的堆棧指針,PL0,PL1 或PL2。
新堆棧的DPL必須和新的CPL相等,如果不是,處理器引發堆棧異常。為每一個特權級創建堆棧和堆棧段描述符是系統軟件的責任。每一個堆棧必須包含必要的空間來容納舊的SS:ESP,返回地址(CS:EIP)和所有的參數,局部變量等。
內部調用時,傳給子過程序參數放在堆棧上。為了使特權轉移相對被調用者來說透明,處理器把參數拷貝到新堆棧上。調用門的 count 字段說明了有多少個雙字參數需要從調用者堆棧上拷貝到新的堆棧上。如果 count 字段為0,則不用拷貝任何參數。
在特權級轉移調用過程中,處理器執行以下堆棧相關的操作:
1、? 處理器檢測新的堆棧是否有足夠的空間容納各參數和返回鏈。如果不能,則引發一個錯誤碼為0 的堆棧錯誤異常。
2、? 舊的堆棧寄存器 SS:ESP 各以雙字的形式壓入新的堆棧中。
3、? 拷貝參數。
4、? 一個在CALL指令后的指令指針(舊的CS:EIP)被壓入新堆棧。最后SS:ESP指針將指向新堆棧中的這個返回值。
圖6-9顯示了在成功調用后的堆棧內容。
TSS 段沒有特權級3的堆棧指針保存區,因為特權級3不能被任何一個別的特權級
調用。
被別的特權級調用的子程序,如果需要比31個雙字還要多的參數的話,就必須使用保存的SS:ESP鏈來訪問第31個以后的參數了。
通過調用門的子程序調用并不檢測拷貝到新棧的參數的值。被調用程序有責任對參數的有效性檢測。后面的小節將討論如何使用 ARPL, VERR, VERW, LSL, 和LAR 指令來檢測指針的有效性。

6.3.4.2 從子過程中返回(Returning from a Procedure)
NEAR 形式的 RET 指令只是在當前段內做控制轉移,所以只做界限檢測。跟在CALL指令后的OFFSET 部分將從堆棧中彈出。處理器保證OFFSET 部分不會超過當前可執行段的界限。
FAR 形式的RET指令把先前通過FAR CALL 指令而壓入棧的返回指針從棧中彈出。一般情況下,該值應該是有效的,因為它和先前的CALL和INT對應。但是,處理器還是會執行特權檢測,以防止當前執行的子程更改這個指針或者子程序沒有對堆棧做正確的維護。 從堆棧中彈出的CS寄存器中的RPL字段指示了調用者的特權級。
段間返回指令可能會改變特權級,但是只能向更低的特權級返回。當一條RET指令遇到一個保存的CS寄存器,而且它的RPL字段比CPL(當前特權級)要數值上更大時,段間返回便發生了。那樣的返回執行以下的步驟:
1、? 圖6-3顯示的檢測被執行,用以前存儲在堆棧中的舊值加載CS:EIP和SS:ESP寄存器。
2、? RET 指令指示要對舊的SS:ESP所做的調整。結果的ESP將不會和堆棧段的界限做檢查。如果ESP超出了界限,直到下一次的堆棧操作才會被識別到。(做返回動作的子過程的SS:ESP部分是不會被保存的,一般說來,這個值和TSS中保存的相同)
3、? ?DS, ES, FS,GS 寄存器的內容將被檢查。如果有任何一個寄存器指向了一個比當前特權級高的段(當然除了一致性段),該寄存器將被加載一個NULL選擇子(INDEX=0,TI=0)。RET指令本身并不會產生任保異常。任何使用空選擇子的以后的內存訪問將引發一個通用保護異常(general protection exception)。這樣可以防止低特權級程序通過使用高特權級留在堆棧里的選擇子來訪問高特權級的段。
### 6.3.5 一些指令是為操作系統保留的(Some Instructions are Reserved for Operationg System)
一些會對保護機制產生影響的指令和會對系統性能產生影響的指令只能由受信任的
代碼執行。80386 有兩種這樣的指令:
1、? 特權指令——這些指令用于系統控制
2、? 敏感指令——這些是用于I/O或和I/O相關的指令。

6.3.5.1 特權指令(Privileged Instructions)
影響系統數據結構的指令只能在特權級0下執行。如果處理器在當前特權級大于0的情況下遇到這樣的指令,將產生一個通用保護異常。這些指令包括:

6.3.5.2 敏感指令(Sensitive Instructions)
當當前特權級不是0時,和I/O相關的指令需要一定的約束條件才能執行。I/O執行機制將在第8章(輸入、輸出)講述。
### 6.3.6 指針有效性檢測(Instruction for Pointer Validation)
指針有效性檢測是檢測程序錯誤的一個重要手段。指針檢測還是保持不同特權級間的獨立性的必需。指針檢測包括以下幾個步驟:
1、? 檢查指針的提供者有權訪問段。
2、? 檢測段的類型是否可以以指針指示的方式使用。
3、? 檢查指針沒有越界。
雖然80386在指令執行時會自動執行2和3檢測,但軟件必須要協助來做第1類檢測。 非特權指令的作用就是體現在這方面的。軟件也可以自已做2和3類檢測,以避免處理器產生異常。非特權指令 LAR, LSL, VERR, VERW 就是用于執行這樣的操作的。
LAR(Load Access Rights)用來檢測一個特權級的指針針訪問了合適特權級和正確類型的段。LAR 有一個操作數——想檢察屬性的段描述符的選擇子。描述符必須要可被訪問(CPL和選擇子的RPL)。如果描述符可被訪問,LAR將得到描述符的第二個雙字部分,用值0xFxFF00H來掩它,存儲到一個32位的目的地寄存器里,設置ZERO 標志(X指的是存儲的這4位沒有定義)。一旦加載了,便可以對這些訪問特權進行測試。
如果RPL或CPL比DPL要大,或者選擇子超出了描述符表的界限,則沒有訪問權限被返回,ZERO位置0。一致性段可以被任意特權級訪問。
LSL(Load Segment Limit)允許軟件測試一個描述符。如果在當前特權級下可訪問該描述符的話,LSL加載32位的。字節計數的、 從界限片段字段計算出來的沒有整合的界限,G-位到指定的32位寄存器。只有數據段,代碼段,任務狀態段和局部描述符表才可以做這些操作;門描述符是不可訪問的(表6-4詳細列出了哪種類型的可以,哪種類型的不行)。怎么解析界限和段的類型相關,比如,向下增長的數據段對于界限的解析和代碼段對界限的解析是不同的。對于LAR和LSL,如果操作執行了,ZERO位被置位,否則ZF位清除。

6.3.6.1 描述符的有效性(Descriptor Validation)
80386 有兩條指令,VERR 和VERW, 用來測試當前特權級是否有權對一個段的讀寫。當不可訪問時,兩條指令都不會產生異常。
VERR(Verify for Reading)檢查一個段的可讀性,當在當前特權級可讀時把ZF置1。VERR做以下檢測:
1、? 指向描述符的選擇子在LDT或GDT的界限之內。
2、? 它指向一個代碼或數據段描述符。
3、? 在一合適的特權級下段可讀
對于數據段和非一致性代碼段的檢查是,DPL必須要同時在數值上大于或等于CPL
選擇子RPL。一致性段不做特權檢查。
VERW(Verify for Writing)和VERR一樣做相似的檢測,不過是對于寫。和VERR指令一樣,當在當前特權級下可寫時,VERW置ZF位為1。指令還會檢查描述符在描述符表界限內,是一個段描述符,可寫,DPL在數值上同時比CPL和選擇子的RPL大或相等。代碼段永遠不可寫,不管是一致性還是非一致性的。
6.3.6.2 指針完不整性和RPL
請求特權級(RPL)特性可以防止一個低特權級的不正確的使用指針而破壞高特權級的數據或代碼一個很常見的例子是,文件系統子程序,FREAD(file_id, n_bytes, buffer_ptr)。這個假設的子程序從一個文件讀取數據,然后把數據放入緩沖區,不管緩沖區內是任何數據,都將被覆蓋。一般情況下,FREAD對于用戶程序是可見的。在沒有指針檢測的標準下,一個用戶程序可能提供一個文件表的指針而非一個緩沖區的指針,以至使FREAD子程序使文件表受到損壞。
使用RPL可以避免這種問題。RPL字段允許賦一個特權級給選擇子。這個特權級屬性一般指出了產生選擇子的代碼的特權級。當選擇子被加載時,80386會自動檢查RPL是否允許訪問。
為了更好地利用好處理器對RPL的檢測,被調用的子過程只用確保傳給它的選擇子至少在數值上比CPL大就行了。這樣就可以使選擇子被賦予比它們的提供者更低的特權級。如果一個選擇子用來訪問一個調用者都不能訪問的段時,也就是說RPL在數值上比DPL更大,當加載該選擇子時便會產生保護異常。
ARPL(Adjust Requestor’s Privilege Level)調整一個選擇子的RPL字段或一個寄存器的RPL字段,使RPL變大。后者一般都是從一個保存在堆棧上的CS寄存器的映象加載的。如果請求特權級被調整,ZF位置1,否則置0。
- 第一章 80386介紹
- 1.1 該手冊的組織結構
- 1.2 其他文獻
- 第二章 編程基本模型
- 2.1 存儲器組織和段
- 2.2 數據類型
- 2.3 寄存器
- 2.4 指令格式
- 2.5 操作數選擇
- 2.6 中斷和異常
- 第4章 系統寄存器
- 4.1 系統寄存器 (System Registers)
- 4.2 系統指令 (System Instructions)
- 第五章 內存管理
- 5.1 分段地址轉換(Segment Translation)
- 5.2 分頁地址轉換(Page Translation)
- 5.3 混合分段和分頁地址轉換(Combining Segment and Page Translation)
- 第六章 內存管理
- 6.1 為什么要保護(Why Protection?)
- 6.2 80386保護機制概述(Overview of 80386 Protection Mechnaisms)
- 6.3 段級保護(Segment-Level Protection)
- 6.4 頁級保護(Page-Level Protection)
- 6.5 混合分頁和分段保護(Combining Page and Segment Protection)
- 第7章 多任務(Multitasking)
- 8.1 I/O 尋址(I/O Addressing)
- 7.1 任務狀態段(Task State Segment)
- 7.3 任務寄存器(Task Register)
- 7.4 任務門描述符(Task Gate Descriptor)
- 7.5 任務切換(Task Switching)
- 7.6 任務鏈(Task Linking)
- 7.7 任務尋址空間(Task Address Space)
- 第8章 輸入 輸出
- 8.2 I/O 指令(I/O Instructions)
- 8.3 保護和I/O(Protection and I/O)
- 第9章 異常和中斷(Exceptions and Interrupts)
- 9.1 識別中斷(Identifying Interrupts)
- 9.2 允許和禁止中斷(Enabling and Disabling Interrupts)
- 9.3 同時發生的中斷和異常的優先級(Priority Among Simultaneous Interrupts and Exceptions)
- 9.4 中斷描述符表(Interrupt Descriptor Table)
- 9.5 IDT 描述符(IDT Descriptors)
- 9.6 中斷任務和中斷子程序(Interrupt Tasks and Interrupt Procedures)
- 9.7 出錯碼(Error Code)
- 9.8 異常條件(Exception Conditions)
- 9.9 異常總結(Exception Summary)
- 9.10 出錯碼總結(Error Code Summary)
- 第10章 初始化(Initialization)
- 10.1 復位后處理器狀態(Processor State After Reset)
- 10.2 實模式初始化(Software Initialization for Real-Address Mode)
- 10.3 切換到保護模式(Switching to Protected Mode)
- 10.4 保護模式初始化(Software Initialization for Protected Mode)
- 10.5 初始化示例
- 10.6 TLB測試
- 第十四章 80386實地址模式
- 14.1 物理地址構成
- 14.2 寄存器和指令
- 14.3 中斷和異常處理
- 14.4 進入和離開實地址模式
- 14.6 實地址模式異常
- 14.7 與8086的不同
- 14.8 與80286實地址模式的不同