一步步编写操作系统 61 任务状态段 TSS
I/O位圖是位于TSS中的,它可以存在也可以不存在,它只是用來設置對某些特定端口的訪問,沒有它的話便默認為禁止訪問所有端口。正是由于它可有可用,所以TSS的段界限TSS limit(即實際大小-1)并不固定。當TSS中不包括I/O位圖時,TSS只有104字節大小。話說回來了,當處理器執行某些IO指令時,若當前特權級比IOPL低,處理器就會認為也許只是給當前任務單獨放行了某些端口,于是它就到TSS中找I/O位圖,如果I/O位圖不存在,即所有端口都禁止訪問,于是處理器就會拋異常。
讀到這里,有兩個問題要解決:
在TSS結構中,有一項是“I/O位圖在TSS中的偏移地址”, 它在TSS中偏移102字節的地方,占2個字節空間,就是圖5-47的左上角,此處用來存儲I/O位圖的偏移地址,即此地址是I/O位圖在TSS中以0為起始的偏移量。如果某個TSS存在I/O位圖的話,此處用來保存它的偏移地址,示意如圖
如圖所示,TSS中如果有I/O位圖的話,它將位于TSS的頂端,這就是TSS的實際尺寸并不固定的原因,當包括I/O位圖時,其大小是“I/O位圖偏移地址”+8192+1字節,結尾這個1字節是I/O位圖中最后的0xff,說來話長,一會再解釋。若不包括I/O位圖,其大小則為最小尺寸104字節。由于I/O位圖偏移地址并不固定,可以大于等于104,所以在TSS中偏移102字節和I/O位圖之間可能會有空閑區域。
您看,既然I/O位圖位于TSS內,那它的地址必須是在TSS的尺寸范圍之內,即地址的范圍是在TSS偏移(104 ~ TSS 段界限limit)之間,如果偏移地址不在此范圍,即大于等于TSS 段界限limit(TSS尺寸大小-1),則表明沒有I/O位圖。
現在來說下為什么在IO位圖的結尾有個0xff。
在計算機系統硬件中,IO端口是按字節來編址的,意思是說一個端口只能讀寫1個字節的數據。如果對一個端口連續讀寫多個字節,實際上是從以該端口號為起始的多個端口一并讀進來的。舉個例子,比如in指令可以讀取16位端口數據,即一次讀取2字節,假設端口0x234是16位端口:
in ax,0x234這相當于
in al,0x234 in ah,0x235處理器在進行端口讀寫時,若當前特權級CPL低于IO特權級IOPL時,如果有I/O位圖的話,處理器會在I/O位圖中檢查端口相應的bit是否為0。若在某個端口中讀取多個字節,處理器必然會檢查連續的多個端口在I/O位圖中對應的多個bit,這些bit必須都得為0 才允許訪問它們。
連續的多個bit也許會跨字節,比如端口0x234對應的bit在前一個字節的最后一位,0x235對應的bit在后一個字節的第0位,這樣處理器必須將這兩個字節都讀進來處理。
大多數情況下跨字節都沒問題,但當第1個bit在位圖的最后一個字節時就會出問題,處理器要讀進多個字節,所以,第2個bit所在的字節就越界了,該字節已經不屬于位圖范圍。
為解決這個問題,處理器要求位圖的最后一字節必須是0xFF,此字節有兩個作用:
第一,處理器允許I/O位圖中不映射所有的端口, 即I/O位圖長度可以不足8KB,但位圖的最后一字節必須為0xFF。如果在位圖范圍外的端口,處理器一律默認禁止訪問。這樣一來,如果位圖最后一字節的0xFF屬于全部65536個端口范圍之內,字節各位全為1表示禁止訪問此字節代表的全部端口,這并沒什么過錯。
第二,如果該字節已經超過了全部端口的范圍,它并不用來映射端口,只是用來做為位圖的邊界標記,用于跨位圖最后一個字節時的“余量字節”。避免越界訪問TSS外的內存。
這就是位圖中最后一字節必須為0xFF的原因。
您看I/O位圖我說的這么熱鬧,其實咱們不用它,這里的介紹完全是為了讓大伙了解IO訪問的工作原理,只會有益無害。
到了這里,特權級就講完了,本章也結束了,友情提示,我知道本章內容有點多,您已經很累了,現在所說的是結束語,所以可以略過這里不看啦。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 61 任务状态段 TSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比x86性能强90% 苹果M2版MacB
- 下一篇: 纯白机身YYDS!Redmi K50晴雪