Windows保护模式学习笔记(四)—— 中断门陷阱门
Windows保護模式學習筆記(四)—— 中斷門&陷阱門
- 要點回顧
- 中斷描述符表(IDT)
- 一、中斷門
- 實驗:構造一個中斷門
- 第一步:初步構造參數(shù)
- 第二步:確定 Offset in Segment
- 第三步:將門描述符寫入IDT表
- 第四步:繼續(xù)執(zhí)行第二步的代碼
- 二、陷阱門
- 實驗:構造一個陷阱門
- 第一步:初步構造參數(shù)
- 第二步~第四步:參考中斷門
- 陷阱門與中斷門的區(qū)別:
要點回顧
Windows實際上并沒有使用調(diào)用門,但是使用了中斷門
學習調(diào)用門是為了更好地理解中斷門
注意:老式CPU會使用中斷門,新式CPU使用的是快速調(diào)用
中斷描述符表(IDT)
描述:
IDT即中斷描述符表,同GDT一樣,IDT也是由一系列描述符組成的,每個描述符占8個字節(jié)
但要注意的是,IDT表中的第一個元素不是NULL
使用WinDbg查看IDT表的基址和大小:
IDT表可以包含三種門描述符:
一、中斷門
結構圖:
中斷門執(zhí)行前后堆棧變化:
實驗:構造一個中斷門
第一步:初步構造參數(shù)
Offset in Segment 31:16 = 0x0000 //暫定P = 1DPL = 二進制:11Segment Selector = 0x0008 Offset in Segment 15:00 = 0x0000 //暫定由上述參數(shù)構造出的門描述符為:0000EE00`00080000
第二步:確定 Offset in Segment
在VC6中執(zhí)行以下代碼并中斷
#include <windows.h>DWORD dwH2GValue;void __declspec(naked) GetH2GValue() {__asm{pushadpushfdmov eax,[0x8003f00c]mov ebx,[eax] // 獲取高2G地址的值mov dwH2GValue,ebxpopfdpopadiretd} }void PrintH2GValue() {printf("%x \n", dwH2GValue); }int main(int argc, char* argv[]) {__asm{int 0x20 // 中斷門位置在IDT[20]}PrintH2GValue();getchar();return 0; }右鍵進入反匯編窗口,查看GetH2GValue函數(shù)起始地址,我這里是00401030
至此,門描述符的最終確定為:0040EE00`00081030
第三步:將門描述符寫入IDT表
查看IDT表
紅框標注處描述符無效,將構造的描述符寫入
第四步:繼續(xù)執(zhí)行第二步的代碼
執(zhí)行結果:
成功讀取了高2G內(nèi)存的值,構造中斷門實驗成功!
二、陷阱門
結構圖:
實驗:構造一個陷阱門
第一步:初步構造參數(shù)
Offset in Segment 31:16 = 0x0000 //暫定P = 1DPL = 二進制:11Segment Selector = 0x0008 Offset in Segment 15:00 = 0x0000 //暫定由上述參數(shù)構造出的門描述符為:0000EF00`00080000
第二步~第四步:參考中斷門
之后的實驗過程不再記錄,可以參考中斷門,基本相同
陷阱門與中斷門的區(qū)別:
中斷門執(zhí)行時,會將IF標志位清零,但陷阱門不會
IF=0 時:程序不再接收可屏蔽中斷
可屏蔽中斷:比如程序正在運行時,我們通過鍵盤敲擊了鎖屏的快捷鍵,若IF位為1,CPU就能夠接收到我們敲擊鍵盤的指令并鎖屏
不可屏蔽中斷:斷電時,電源會向CPU發(fā)出一個請求,這個請求叫作不可屏蔽中斷,此時不管IF位是否為0,CPU都要去處理這個請求
IF位是否會被清零是陷阱門與中斷門唯一的區(qū)別
總結
以上是生活随笔為你收集整理的Windows保护模式学习笔记(四)—— 中断门陷阱门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows保护模式学习笔记(三)——
- 下一篇: Windows保护模式学习笔记(五)——