多工處理

I/O 對映表


I/O 處理

在保護模式中,所有的 I/O 相關指令(包括 IN、OUT、INS、OUTS、CLI、和 STI),都必須在 CPL 小於或等於 EFLAGS 中的 IOPL 時,才能使用。不過,有時候,系統可能會有某些 I/O 位址是可以自由讓應用程式使用的。這時,就可以利用 I/O 對映表來指定。
I/O 對映表是存放在 TSS 裡面,其基底位址也是存放在 TSS 中。如果 I/O 對映表的基底位址比 TSS 的邊界值還大,則表示這個 TSS 中沒有 I/O 對映表。
在 I/O 對映表中,每個 bit 分別代表一個 I/O 位址的存取權。例如,第 40 個 bit 若是 0,則表示 I/O 位址 40 可以使用。若一次使用很多個 I/O 位址,則必須在所有的位址都可以使用的情形下,才能使用。例如,一個 32bit 的 I/O 動作,需要使用 4 個相鄰的 I/O 位址。因此,在進行 32 bit 的 I/O 動作時,必須這 4 個位址的對映位元都是 0,才能進行這個 I/O 動作。
I/O 對映表並不需要包含整個 I/O 位址空間,而且 I/O 位址並不一定要對齊在 2 或 4 的倍數上。因此,處理器在進行 I/O 動作時,是一次讀取對映表中的兩個 byte,再進行檢查。如果在 I/O 對映表的頂端的話,就可能會超出 I/O 對映表的範圍。所以,在 I/O 對映表的後面,還必須加上一個 byte,並將該 byte 的內容全部填入 1。這樣處理器在讀取時,才不會超出 I/O 對映表的範圍。