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