翻譯自《intel®64和ia-32架構軟體開發者指南》卷一。
當處理器執行在保護模式,以下保護機制控制對i/o埠的訪問:
·通過i/o定址空間訪問i/o埠時,兩種保護設施會控制訪問:
— eflags暫存器中的i/o特權級(iopl)位域
— 任務狀態段(tss)中的i/o允許位圖
·在訪問記憶體對映的i/o埠時,一般的分段和分頁基址還有mtrr(在支援它們的處理器上)會影響對i/o埠的訪問。對記憶體的保護的完整的討論,請見《intel®64和ia-32架構軟體開發者指南》卷3a的第5章《保護》和第11章《記憶體快取控制》。
以下章節描述用i/o指令訪問i/o定址空間中的i/o埠時可用的保護機制。
在使用i/o保護機制的系統中,eflags暫存器中的iopl位域通過限制特定指令的使用來控制對i/o定址空間的訪問。這種保護機制允許作業系統或其他系統軟體來設定執行i/o所需的特權級。在典型的保護環模型中,對i/o定址空間的訪問被限制在特權級0和1。這裡,核心和裝置驅動允許執行i/o,而更次特權級的裝置驅動和應用程式則被拒絕訪問i/o定址空間。應用程式必須用系統呼叫來執行i/o。
以下指令只能在當前執行的程式或任務的當前特權級(cpl)小於等於iopl時執行:in、ins、out、outs、cli(中斷允許標誌清0)和sti(中斷允許標誌設1)。可稱這些指令為i/o敏感的指令,因為它們對iopl敏感。更次特權級的程式或任務的任何使用i/o敏感指令的意圖都將導致一般保護異常(#gp)。因為每個任務都有其自己的eflags的值,每個任務可擁有不同的iopl。
tss中的i/o允許位圖可用來改變iopl對i/o敏感指令的影響,允許更次特權級的程式或任務訪問某些i/o埠(請見章節14.5.2《i/o允許位圖》)。
程式或任務只能通過popf或iret指令來改變其iopl,但這樣的改變是需要特權的。任何不執行在特權級0的程式都不能修改其iopl。更次特權級的程式修改iopl的意圖不會導致異常;只是iopl會保持不變。
除了cli和sti指令,popf指令也可能用來改變if標誌位的狀態;但是這樣的popf指令也是i/o敏感的。只有cpl小於等於當前iopl的程式可以用popf來改變if標誌位。更次特權級的程式修改if標誌位的意圖不會導致異常;只是if標誌位會保持不變。
i/o允許點陣圖是允許更次特權級的程式或任務或者執行在虛擬8086模式中的任務對i/o埠進行有限訪問的設施。i/o允許位圖位於當前程式或任務的tss中(見圖14-2)。i/o允許點陣圖的首位址由tss的i/o允許位圖基礎位址位域給出。tss中i/o允許點陣圖的大小和位置是可變的。
圖14-2、i/o允許位圖
因為每個任務都有其自己的tss,每個任務有其自己的i/o允許位圖。對每個i/o埠的訪問可以根據每個任務單獨考慮。
如果保護模式中cpl小於等於當前iopl,處理器允許所有i/o操作。如果cpl大於iopl或者處理器處於虛擬8086模式,處理器檢查i/o允許點陣圖來檢查對特定i/o埠的訪問是否可被允許。點陣圖中的每一位對應乙個i/o埠位元組位址。例如,i/o定址空間中位址為29h的i/o埠的控制位是i/o允許點陣圖第6位元組的位1。在允許i/o訪問前,處理器會測試所有定址到的i/o埠的控制位。例如對於乙個雙字(doubleword)訪問,處理器會測試對應4個8位埠位址的4個控制位。如果任一被測試的位被設1,會產生一般保護異常(#gp)。如果所有被測試的位都被清0,則允許i/o操作。
因為i/o埠位址不必要對齊到字(word)或雙字(doubleword)邊界,對於每次i/o埠訪問,處理器會從i/o允許位圖讀取兩個位元組。為了防止訪問最高的i/o埠位址時產生異常,乙個額外的位元組必須緊跟在i/o允許位圖之後幷包含在tss中。這個位元組的所有位都必須為1(0ffh),並且必須不超過tss的段界限。
i/o允許點陣圖不需要包含所有i/o位址。i/o允許點陣圖不包含的i/o位址會被視同i/o允許點陣圖中的全設1的位元組而被禁止訪問。例如,如果tss的段界限是點陣圖基礎位址後10位元組,從而i/o允許點陣圖有11位元組且對映前80個i/o埠,訪問i/o定址空間中位址高於80的i/o埠會產生異常。
如果i/o允許點陣圖的基礎位址大於等於tss的段界限,則認為沒有i/o允許位圖,在cpl大於當前iopl時所有i/o指令都會產生異常。
14 5 保護模式I O
當處理器執行在保護模式,以下保護機制控制對i o埠的訪問 通過i o定址空間訪問i o埠時,兩種保護設施會控制訪問 eflags暫存器中的i o特權級 iopl 位域 任務狀態段 tss 中的i o允許位圖 在訪問記憶體對映的i o埠時,一般的分段和分頁基址還有mtrr 在支援它們的處理器上 會影響...
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...