九.輸入/輸出保護
為了支持多任務,80386不僅要有效地實現任務隔離,而且還要有效地控制各任務的輸入/輸出,避免輸入/輸出沖突。本文將介紹輸入輸出保護。 這里下載本文源代碼。
<一>輸入/輸出保護
80386采用I/O特權級IPOL和I/O許可位圖的方法來控制輸入/輸出,實現輸入/輸出保護。
1.I/O敏感指令
輸入輸出特權級(I/O Privilege Level)規定了可以執行所有與I/O相關的指令和訪問I/O空間中所有地址的最外層特權級。IOPL的值在如下圖所示的標志寄存器中。
標 志
寄存器 BIT31—BIT18 BIT17 BIT16 BIT15 BIT14 BIT13—BIT12 BIT11 BIT10 BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
00000000000000 V
M R
F 0 N
T IOPL OF D
F I
F T
F S
F Z
F 0 A
F 0 P
F 1 C
F
I/O許可位圖規定了I/O空間中的哪些地址可以由在任何特權級執行的程序所訪問。I/O許可位圖在任務狀態段TSS中。
I/O敏感指令 指令 功能 保護方式下的執行條件
CLI 清除EFLAGS中的IF位 CPL<=IOPL
STI 設置EFLAGS中的IF位 CPL<=IOPL
IN 從I/O地址讀出數據 CPL<=IOPL或I/O位圖許可
INS 從I/O地址讀出字符串 CPL<=IOPL或I/O位圖許可
OUT 向I/O地址寫數據 CPL<=IOPL或I/O位圖許可
OUTS 向I/O地址寫字符串 CPL<=IOPL或I/O位圖許可
上表所列指令稱為I/O敏感指令,由于這些指令與I/O有關,并且只有在滿足所列條件時才可以執行,所以把它們稱為I/O敏感指令。從表中可見,當前特權級不在I/O特權級外層時,可以正常執行所列的全部I/O敏感指令;當特權級在I/O特權級外層時,執行CLI和STI指令將引起通用保護異常,而其它四條指令是否能夠被執行要根據訪問的I/O地址及I/O許可位圖情況而定(在下面論述),如果條件不滿足而執行,那么將引起出錯碼為0的通用保護異常。
由于每個任務使用各自的EFLAGS值和擁有自己的TSS,所以每個任務可以有不同的IOPL,并且可以定義不同的I/O許可位圖。注意,這些I/O敏感指令在實模式下總是可執行的。
2.I/O許可位圖
如果只用IOPL限制I/O指令的執行是很不方便的,不能滿足實際要求需要。因為這樣做會使得在特權級3執行的應用程序要么可訪問所有I/O地址,要么不可訪問所有I/O地址。實際需要與此剛好相反,只允許任務甲的應用程序訪問部分I/O地址,只允許任務乙的應用程序訪問另一部分I/O地址,以避免任務甲和任務乙在訪問I/O地址時發生沖突,從而避免任務甲和任務乙使用使用獨享設備時發生沖突。
因此,在IOPL的基礎上又采用了I/O許可位圖。I/O許可位圖由二進制位串組成。位串中的每一位依次對應一個I/O地址,位串的第0位對應I/O地址0,位串的第n位對應I/O地址n。如果位串中的第位為0,那么對應的I/O地址m可以由在任何特權級執行的程序訪問;否則對應的I/O地址m只能由在IOPL特權級或更內層特權級執行的程序訪問。如果在I/O外層特權級執行的程序訪問位串中位值為1的位所對應的I/O地址,那么將引起通用保護異常。
I/O地址空間按字節進行編址。一條I/O指令最多可涉及四個I/O地址。在需要根據I/O位圖決定是否可訪問I/O地址的情況下,當一條I/O指令涉及多個I/O地址時,只有這多個I/O地址所對應的I/O許可位圖中的位都為0時,該I/O指令才能被正常執行,如果對應位中任一位為1,就會引起通用保護異常。
80386支持的I/O地址空間大小是64K,所以構成I/O許可位圖的二進制位串最大長度是64K個位,即位圖的有效部分最大為8K字節。一個任務實際需要使用的I/O許可位圖大小通常要遠小于這個數目。
當前任務使用的I/O許可位圖存儲在當前任務TSS中低端的64K字節內。I/O許可位圖總以字節為單位存儲,所以位串所含的位數總被認為是8的倍數。從前文中所述的TSS格式可見,TSS內偏移66H的字確定I/O許可位圖的開始偏移。由于I/O許可位圖最長可達8K字節,所以開始偏移應小于56K,但必須大于等于104,因為TSS中前104字節為TSS的固定格式,用于保存任務的狀態。
1.I/O訪問許可檢查細節
保護模式下處理器在執行I/O指令時進行許可檢查的細節如下所示。
(1)若CPL<=IOPL,則直接轉步驟(8);
(2)取得I/O位圖開始偏移;
(3)計算I/O地址對應位所在字節在I/O許可位圖內的偏移;
(4)計算位偏移以形成屏蔽碼值,即計算I/O地址對應位在字節中的第幾位;
(5)把字節偏移加上位圖開始偏移,再加1,所得值與TSS界限比較,若越界,則產生出錯碼為0的通用保護故障;
(6)若不越界,則從位圖中讀對應字節及下一個字節;
(7)把讀出的兩個字節與屏蔽碼進行與運算,若結果不為0表示檢查未通過,則產生出錯碼為0的通用保護故障;
(8)進行I/O訪問。
設某一任務的TSS段如下:
TSSSEG SEGMENT PARA USE16
TSS <> ;TSS低端固定格式部分
DB 8 DUP(0) ;對應I/O端口00H—3FH
DB 10000000B ;對應I/O端口40H—47H
DB 01100000B ;對用I/O端口48H—4FH
DB 8182 DUP(0ffH) ;對應I/O端口50H—0FFFFH
DB 0FFH ;位圖結束字節
TSSLen = $
TSSSEG ENDS
再假設IOPL=1,CPL=3。那么如下I/O指令有些能正常執行,有些會引起通用保護異常:
in al,21h ;(1)正常執行
in al,47h ;(2)引起異常
out 20h,al ;(3)正常實行
out 4eh,al ;(4)引起異常
in al,20h ;(5)正常執行
out 20h,eax ;(6)正常執行
out 4ch,ax ;(7)引起異常
in ax,46h ;(8)引起異常
in eax,42h ;(9)正常執行
由上述I/O許可檢查的細節可見,不論是否必要,當進行許可位檢查時,80386總是從I/O許可位圖中讀取兩個字節。目的是為了盡快地執行I/O許可檢查。一方面,常常要讀取I/O許可位圖的兩個字節。例如,上面的第(8)條指令要對I/O位圖中的兩個位進行檢查,其低位是某個字節的最高位,高位是下一個字節的最低位。可見即使只要檢查兩個位,也可能需要讀取兩個字節。另一方面,最多檢查四個連續的位,即最多也只需讀取兩個字節。所以每次要讀取兩個字節。這也是在判別是否越界時再加1的原因。為此,為了避免在讀取I/O許可位圖的最高字節時產生越界,必須在I/O許可位圖的最后填加一個全1的字節,即0FFH。此全1的字節應填加在最后一個位圖字節之后,TSS界限范圍之前,即讓填加的全1字節在TSS界限之內。
I/O許可位圖開始偏移加8K所得的值與TSS界限值二者中較小的值決定I/O許可位圖的末端。當TSS的界限大于I/O許可位圖開始偏移加8K時,I/O許可位圖的有效部分就有8K字節,I/O許可檢查全部根據全部根據該位圖進行。當TSS的界限不大于I/O許可位圖開始偏移加8K時,I/O許可位圖有效部分就不到8K字節,于是對較小I/O地址訪問的許可檢查根據位圖進行,而對較大I/O地址訪問的許可檢查總被認為不可訪問而引起通用保護故障。因為這時會發生字節越界而引起通用保護異常,所以在這種情況下,可認為不足的I/O許可位圖的高端部分全為1。利用這個特點,可大大節約TSS中I/O許可位圖占用的存儲單元,也就大大減小了TSS段的長度。
<二>重要標志保護
輸入輸出的保護與存儲在標志寄存器EFLAGS中的IOPL密切相關,顯然不能允許隨便地改變IOPL,否則就不能有效地實現輸入輸出保護。類似地,對EFLAGS中的IF位也必須加以保護,否則CLI和STI作為敏感指令對待是無意義的。此外,EFLAGS中的VM位決定著處理器是否按虛擬8086方式工作。
80386對EFLAGS中的這三個字段的處理比較特殊,只有在較高特權級執行的程序才能執行IRET、POPF、CLI和STI等指令改變它們。下表列出了不同特權級下對這三個字段的處理情況。
不同特權級對
標志寄存器特
殊字段的處理 特權級 VM標志字段 IOPL標志字段 IF標志字段
CPL=0 可變(初POPF指令外) 可變 可變
0 不變 不變 可變
CPL>IOPL 不變 不變 不變
從表中可見,只有在特權級0執行的程序才可以修改IOPL位及VM位;只能由相對于IOPL同級或更內層特權級執行的程序才可以修改IF位。與CLI和STI指令不同,在特權級不滿足上述條件的情況下,當執行POPF指令和IRET指令時,如果試圖修改這些字段中的任何一個字段,并不引起異常,但試圖要修改的字段也未被修改,也不給出任何特別的信息。此外,指令POPF總不能改變VM位,而PUSHF指令所壓入的標志中的VM位總為0。
<三>演示輸入輸出保護的實例(實例九)
下面給出一個用于演示輸入輸出保護的實例。演示內容包括:I/O許可位圖的作用、I/O敏感指令引起的異常和特權指令引起的異常;使用段間調用指令CALL通過任務門調用任務,實現任務嵌套。
1.演示步驟
實例演示的內容比較豐富,具體演示步驟如下:
(1)在實模式下做必要準備后,切換到保護模式;
(2)進入保護模式的臨時代碼段后,把演示任務的TSS段描述符裝入TR,并設置演示任務的堆棧;
(3)進入演示代碼段,演示代碼段的特權級是0;
(4)通過任務門調用測試任務1。測試任務1能夠順利進行;
(5)通過任務門調用測試任務2。測試任務2演示由于違反I/O許可位圖規定而導致通用保護異常;
(6)通過任務門調用測試任務3。測試任務3演示I/O敏感指令如何引起通用保護異常;
(7)通過任務門調用測試任務4。測試任務4演示特權指令如何引起通用保護異常;
(8)從演示代碼轉臨時代碼,準備返回實模式;
(9)返回實模式,并作結束處理。
資源簡介:九.輸入/輸出保護為了支持多任務,80386不僅要有效地實現任務隔離,而且還要有效地控制各任務的輸入/輸出,避免輸入/輸出沖突。本文將介紹輸入輸出保護。 這里下載本文源代碼。 <一>輸入/輸出保護80386采用I/O特權級IPOL和I/O許可位圖的方法來控制輸入/輸出,...
上傳時間: 2013-12-11
上傳用戶:nunnzhy
資源簡介:保護模式教程,經典!!!!學習系統編程必看
上傳時間: 2015-01-09
上傳用戶:lanwei
資源簡介:80x86保護模式教程
上傳時間: 2015-03-06
上傳用戶:拔絲土豆
資源簡介:要深入理解32位編程的奧秘,必須理解保護模式.這是李彥昌的保護模式教程,基本是清華出版社80X86匯編語言程序設計的保護模式部分的電子版,但修改了原書的一些錯誤,也加入了李先生自己的一些體會.很好的資料,保護模式的資料本來就少,中文的的資料更少,謹以此與As...
上傳時間: 2015-12-31
上傳用戶:cjf0304
資源簡介:保護模式教程源碼 The source code of protection mode in dos
上傳時間: 2013-12-24
上傳用戶:siguazgb
資源簡介:微波技術基礎,實驗(省優課件) PDF版
上傳時間: 2013-04-15
上傳用戶:eeworm
資源簡介:80x86保護模式編程教程,幫助文檔(匯編)
上傳時間: 2015-01-12
上傳用戶:exxxds
資源簡介:80x86保護模式系列教程 作者:李彥昌
上傳時間: 2015-03-10
上傳用戶:縹緲
資源簡介:x86保護模式編程教程,簡明易懂,進入低層編程的門檻,很不錯的資料哦
上傳時間: 2014-12-22
上傳用戶:lanwei
資源簡介:匯編語言的小教程,針對80386 即包括保護模式和實模式 作者 kingcaiya
上傳時間: 2013-11-27
上傳用戶:ynsnjs
資源簡介:dos下保護模式的匯編示范源程序 。
上傳時間: 2013-12-13
上傳用戶:LouieWu
資源簡介:chm資料,講保護模式,對學匯編有一定的幫助,
上傳時間: 2014-01-02
上傳用戶:李夢晗
資源簡介:利用386保護模式將DOS實模式下的PC總線I/O操作(in/out)實時捕捉到內存并可以顯示在屏幕上。可用于ISA/VESA/PCI插卡及相關軟件的輸入/輸出調試、I/O性能/行為分析和反匯編。Version 3增加了連續相同I/O操作的壓縮記錄功能,大大提高了內存利用率。同時提供了...
上傳時間: 2014-07-27
上傳用戶:一諾88
資源簡介:學習x86保護模式開發的源代碼,對開發操作系統很有幫助,全部為匯編代碼
上傳時間: 2014-01-20
上傳用戶:851197153
資源簡介:本書向讀者展示了如何自己動手編寫一個簡化的32位保護模式操作系統,涉及了現代操作系統的主要技術。本書以編寫操作系統為主線索,討論了存儲管理、基本I/O操作與圖形界面、中斷與系統調用、進程管理、設備管理(以IDE磁盤為例)、文件系統(FAT16為例)、系統引...
上傳時間: 2014-08-06
上傳用戶:小眼睛LSL
資源簡介:保護模式詳解,要想深入學習匯編的必由之路。 例子和理論并舉,很清晰明了,是一本好書。 奉獻給大家了
上傳時間: 2016-07-29
上傳用戶:sxdtlqqjl
資源簡介:保護模式下的8259A芯片編程及中斷處理探究_上.pdf
上傳時間: 2014-06-07
上傳用戶:a6697238
資源簡介:保護模式下的8259A芯片編程及中斷處理探究_下.rar
上傳時間: 2015-01-18
上傳用戶:mhp0114
資源簡介:保護模式下的80386及編程
上傳時間: 2015-02-22
上傳用戶:13188549192
資源簡介:DOS保護模式下匯編程序設計.zip
上傳時間: 2014-01-19
上傳用戶:nairui21
資源簡介:intel匯編的程序教程
上傳時間: 2015-03-09
上傳用戶:ljt101007
資源簡介:是關于保護模式與實模式之間的相互切換,是用匯編寫的源程序
上傳時間: 2013-12-21
上傳用戶:cx111111
資源簡介:java編成模式教程,介紹大量常用的java模式適用技巧。
上傳時間: 2013-12-22
上傳用戶:zsjinju
資源簡介:關于x86保護模式的畢業論文,講的非常詳細,有很多圖,對學習x86保護模式編程是非常好的文檔
上傳時間: 2013-12-24
上傳用戶:黑漆漆
資源簡介:了解80x86的保護模式,對操作系統了解就看吧。
上傳時間: 2013-12-20
上傳用戶:Thuan
資源簡介:一個很簡單的操作系統(版本二),是保護模式的編寫,讓你了解保護模式
上傳時間: 2014-11-09
上傳用戶:蠢蠢66
資源簡介:繼第二版本,教你怎么讓自己的操作系統進入保護模式,很精彩哦
上傳時間: 2013-12-26
上傳用戶:bibirnovis
資源簡介:保護模式下8259A芯片編程及中斷處理探究,代碼演示,請高手多多指教~
上傳時間: 2014-01-23
上傳用戶:離殤
資源簡介:水晶報表push模式教程,生動詳細的講解了水晶報表的使用方法。
上傳時間: 2014-01-06
上傳用戶:15736969615
資源簡介:SEAL是DOS 下的32位保護模式的GUI程序,它只能在DOS下才能運行。
上傳時間: 2015-07-04
上傳用戶:plsee