生活随笔
收集整理的這篇文章主要介紹了
7.中断门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows沒有使用調用門,但是使用了中斷門:
<1>系統調用
老的CPU調用一些api從r3進入r0,就是通過中斷門,新的都是快速調用了
<2>調試
用od等一些調試器下斷點,就是將他的下斷位置的某一個字節改成0xCC (int 3)
IDT即中斷描述符表,同GDT一樣, IDT也是由一系列描述符組成的,每個.描述符占8個字節。但要注意的是, IDT表中的第一個元素不是NULL
IDT表的構成:
IDT表可以包含3種門描述符:
任務門描述符
中斷門描述符
陷阱門描述符
typedef struct _IDTENTRY
{unsigned short LowOffset
;unsigned short selector
;unsigned char retention
: 5;unsigned char zero1
: 3;unsigned char gate_type
: 1;unsigned char zero2
: 1;unsigned char interrupt_gate_size
: 1;unsigned char zero3
: 1;unsigned char zero4
: 1;unsigned char DPL
: 2;unsigned char P
: 1;unsigned short HiOffset
;
} IDTENTRY
, *PIDTENTRY
;#pragma pack(2)
typedef struct _IDTR
{USHORT limit
;ULONG Base
;
}IDTR
,*PIDTR
;
#pragma pack()
VOID
enumidt()
{IDTR idtr
;PIDTENTRY pIdtEntry
;_asm sidt idtr
;KdPrint(("%x %x"), idtr
.Base
, idtr
.limit
);pIdtEntry
= (PIDTENTRY
)idtr
.Base
;for (ULONG i
= 0; i
< (idtr
.limit
+ 1) / sizeof(IDTENTRY
); i
++){KdPrint(("%d %x\n", i
, MAKELONG(pIdtEntry
[i
].LowOffset
, pIdtEntry
[i
].HiOffset
)));}
}
兩段offset拼成一個地址,segment selector為段選擇子。
中斷門不允許傳參數了,高0~7必須為0。
P為1
DPL為11
8~11位為1110
????ee00`
0008????
用int 0x20進入中斷門
測試代碼
#include<windows.h>
#include<stdio.h>
DWORD val
;
void _declspec(naked
)func()
{_asm
{pushadpushfdmov eax
,[0x80b95400]mov ebx
,[eax
]mov val
,ebxpopfdpopadiretd
}}int main()
{_asm
{int 0x20}printf("%x", val
);getchar();
}
修改idt表 要找好空白位置再改
執行結果
進入中斷門,CPU會把EFLAGS中的IF位置清0
if位一旦為0,將不再接收可屏蔽中斷
比如說我門的程序在跑,我們突然按了一下鍵盤快捷鍵讓屏幕鎖住,雖然程序在跑但是我們按了鍵盤,它會通過硬件發送一個中斷請求讓cpu知道,這種就是可屏蔽中斷
不可屏蔽中斷
電腦真正執行突然停電了,電源會通過電源管理器向當前的cpu發送一個請求,這個請求是不受if位影響的,cpu一旦就是到它必須馬上處理
就算斷電了電源上的電容會支持一會讓CPU處理完這個請求
總結
以上是生活随笔為你收集整理的7.中断门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。