7.中断门
Windows沒有使用調(diào)用門,但是使用了中斷門:
<1>系統(tǒng)調(diào)用
老的CPU調(diào)用一些api從r3進(jìn)入r0,就是通過中斷門,新的都是快速調(diào)用了
<2>調(diào)試
用od等一些調(diào)試器下斷點(diǎn),就是將他的下斷位置的某一個字節(jié)改成0xCC (int 3)
IDT即中斷描述符表,同GDT一樣, IDT也是由一系列描述符組成的,每個.描述符占8個字節(jié)。但要注意的是, IDT表中的第一個元素不是NULL
IDT表的構(gòu)成:
IDT表可以包含3種門描述符:
任務(wù)門描述符
中斷門描述符
陷阱門描述符
兩段offset拼成一個地址,segment selector為段選擇子。
中斷門不允許傳參數(shù)了,高0~7必須為0。
P為1
DPL為11
8~11位為1110
用int 0x20進(jìn)入中斷門
測試代碼
#include<windows.h> #include<stdio.h> DWORD val; void _declspec(naked)func() {_asm{//int 3pushadpushfdmov eax,[0x80b95400]mov ebx,[eax]mov val,ebxpopfdpopadiretd //返回}}int main() {_asm{int 0x20}printf("%x", val);getchar(); }修改idt表 要找好空白位置再改
執(zhí)行結(jié)果
進(jìn)入中斷門,CPU會把EFLAGS中的IF位置清0
if位一旦為0,將不再接收可屏蔽中斷
比如說我門的程序在跑,我們突然按了一下鍵盤快捷鍵讓屏幕鎖住,雖然程序在跑但是我們按了鍵盤,它會通過硬件發(fā)送一個中斷請求讓cpu知道,這種就是可屏蔽中斷
不可屏蔽中斷
電腦真正執(zhí)行突然停電了,電源會通過電源管理器向當(dāng)前的cpu發(fā)送一個請求,這個請求是不受if位影響的,cpu一旦就是到它必須馬上處理
就算斷電了電源上的電容會支持一會讓CPU處理完這個請求
總結(jié)