15-任务门
1. 任務門
上一節已經基本掌握了使用 call/jmp 去訪問一個任務段,來達到切換一堆寄存器的目的。但是,CPU同時又提供了另一種方法讓我們訪問任務段——任務門。
而任務門是安裝在 IDT 表中的。之前學中斷門的時候,就簡單介紹了IDT表中可以安裝中斷門、陷阱門,還有一個當時只是稍微提了一下,那就是任務門。
說白了就是想表達,IDT 表中只可以安裝 3 種門:中斷門、陷阱門和任務門。
思考一下,既然都可以使用 call/jmp 來訪問任務段了,為什么又弄個任務門來訪問段,何必多此一舉?仔細想想,使用 int 指令加索引號,是不是比call/jmp加選擇子要方便。因為一個 int 0x20 指令(假設我在 IDT[20]處安裝了一個任務門描述符)就可以讓我切換一堆寄存器。
到現在或許你已經明白門的含義了,所有的門描述符的里頭都嵌入著另一個段的選擇子。比如中斷門和陷阱門中嵌入了代碼段的選擇子。任務門也不例外,它里頭嵌入了任務段的選擇子。
2. 任務門描述符
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字節 |76543210|76543210|7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特 |-----------------|1|--|0|0101|--------|--------|--------|--------|--------| 占位 | reserved |P|D |S|TYPE| |segment selector | reserved | 含義 | 31-16 |P | | | 15-0 ||L |任務門的 S=0, TYPE=0101。
在Windows中,典型任務門描述符就是安裝在 IDT[8] 的位置,00008500`00501188.其中有用的就只有標紅的部分。它告訴我們,該任務段的段選擇子是0x0050.
3. 分析 xp 系統的 windows 任務門
- 實驗
上圖可以得出,TSS段的選擇子為 0x0050。現在去查GDT表的0x0050選擇子對應的描述符。
圖2 GDT表中的TSS段描述符通過分析圖2,可以看到該TSS段描述符的段基址是0x8054a100,段界限是104B. 現在去看看0x8054a100處的TSS段長什么樣。
圖3 Windows XP 中的 TSS段- 對齊到TSS段結構體
4. 總結
CPU提供任務門,是為了方便訪問任務段。在CPU發生二重錯誤的時候,會直接跳到 8 號中斷,而 8 號中斷就是任務門(這是Windows xp 系統設計的任務門),這意味著什么?
一旦進入 8 號中斷,CPU 會切換一堆寄存器,這時候無論發生什么錯誤都沒什么關系,通過一堆寄存器的切換,CPU 保證能跳到一個正確的地方去執行(除非那個地方也被破壞了),緊接著做一些后續處理(比如收集錯誤信息),系統藍屏。
總結
- 上一篇: java咖啡是研磨的吗_研磨咖啡,这三个
- 下一篇: AppUpdate