首页
社区
课程
招聘
[旧帖] [脚印]我的学习的脚印 2011.6.11日--中断 IDT 0.00雪花
发表于: 2011-6-11 11:31 3101

[旧帖] [脚印]我的学习的脚印 2011.6.11日--中断 IDT 0.00雪花

2011-6-11 11:31
3101

声明:
     内容都是书中或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直播授课

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 191
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
占地,若干时间后自省
2011-6-11 11:32
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
3
同上.......
2011-6-11 14:07
0
游客
登录 | 注册 方可回帖
返回
//