-
-
[旧帖]
[脚印]我的学习的脚印 2011.6.11日--中断 IDT
0.00雪花
-
发表于:
2011-6-11 11:31
3101
-
[旧帖] [脚印]我的学习的脚印 2011.6.11日--中断 IDT
0.00雪花
声明:
内容都是书中或baidu的,很多在论坛都有出现,只是觉得有阅读和收藏整理以方便自己使用的必要。另外就是方便自己以后回头看看自己曾经走过的坎坷之路,仅此而已。
实模式
IVT: 中断向量表
从0地址开始,共256个,结构就是个地址表,每个占4字节,保存的是中断向量处理函数,存储方式仍为高高低低
2-3 Seg
0-1 offset jmp Seg:offset
Seg:offset 中断处理函数
处理步骤:
1) 把EFLAGES压栈
2) CS栈
3) IP压栈(指向中断处理结束后要执行的下一条OpCode)
4) 清楚IF和TF标志位.
5) 根据中断向量(索引)找到对应的IVT数据项
6) 报IVT中的段地址和偏移地址分别加载到CS和IP寄存器
IRET返回过程
1) 栈顶16位数值pop到IP 前面压栈对应的弹出
2) 栈顶16位数值pop到CS
3) 栈顶16位数值pop到EFLAGS
读中断信息
Int 21
AH = Dos中断功能号 0x35
AL = 中断向量
返回值放在ES:段,BX:偏移
写中断向量表
Int 21
AH = Dos中断功能号 0x25
Al = 中断向量
Push DS
DS = 要改写的段地址
DX = 要改写的Offset
Pop DS
保护模式
Idtr 中断描述表基值为的基地址
Idtrl 界限(长度)
kd> r idtr
idtr=8003f400
中断描述符表,每个表大小是8byte,因为兼容的关系处理函数地址被分割在低2byte和高2byte,共32位,16位应该就是用低16位就好了吧,哈哈。
kd> dw 8003f400
8003f400 e36c 0008 8e00 8053 e4e4 0008 8e00 8053
8003f410 112e 0058 8500 0000 e8b4 0008 ee00 8053
kd> u 8053e8b4
nt!KiTrap03:
8053e8b4 6a00 push 0
8053e8b6 66c74424020000 mov word ptr [esp+2],0
8053e8bd 55 push ebp
typedef struct
{
unsigned short LowOffset;
unsigned short selector;
unsigned char unused_lo;
unsigned char segment_type:4; //0x0E is an interrupt gate
unsigned char system_segment_flag:1;
unsigned char DPL:2; // descriptor privilege level
unsigned char P:1; /* present */
unsigned short HiOffset;
} IDTENTRY;
// load idt_info
__asm [B][COLOR="Red"]sidt [/COLOR][/B]idt_info //不知道s是那个单词缩写,set还是... 而r-read 如:rdmsr
idt_entries = (IDTENTRY*) MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase); //取高2和低2byte
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课