您的位置:首页 > 其它

Microsoft windows internals 学习笔记(1)

2008-04-09 21:48 387 查看
陷阱分发:

陷阱(trap)指的是异常或中断发生时处理器扑捉到一个执行线程,并将控制权转移到操作系统某一固定地址处。windows中控制权转移给一个

陷阱处理器(trap handler),与某个异常或中断相关联的函数。

中断:是一个异步事件,可以在任何时候发生,与处理器当前执行的任务无关,
异常:同步条件,一个特殊指令执行结过。

如果中断的线程是在用户模式下运行,windows就切换该线程到内核模式栈,wondows在被中断的线程的内核栈上创建一个陷阱帧(trap frame

),并把线程的执行状态保存到陷阱帧里。
陷阱帧是一个线程完整指行环境的一个子集,调试中输入
dt nt!_ktrap_frame
可以看出结构定义:
如下:
nt!_KTRAP_FRAME
+0x000 DbgEbp : Uint4B
+0x004 DbgEip : Uint4B
+0x008 DbgArgMark : Uint4B
+0x00c DbgArgPointer : Uint4B
+0x010 TempSegCs : Uint4B
+0x014 TempEsp : Uint4B
+0x018 Dr0 : Uint4B ;几个调试寄存器
+0x01c Dr1 : Uint4B
+0x020 Dr2 : Uint4B
+0x024 Dr3 : Uint4B
+0x028 Dr6 : Uint4B
+0x02c Dr7 : Uint4B
+0x030 SegGs : Uint4B
+0x034 SegEs : Uint4B
+0x038 SegDs : Uint4B
+0x03c Edx : Uint4B
+0x040 Ecx : Uint4B
+0x044 Eax : Uint4B
+0x048 PreviousPreviousMode : Uint4B
+0x04c ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD ;指向异常链表
+0x050 SegFs : Uint4B
+0x054 Edi : Uint4B
+0x058 Esi : Uint4B
+0x05c Ebx : Uint4B
+0x060 Ebp : Uint4B
+0x064 ErrCode : Uint4B
+0x068 Eip : Uint4B
+0x06c SegCs : Uint4B
+0x070 EFlags : Uint4B
+0x074 HardwareEsp : Uint4B
+0x078 HardwareSegSs : Uint4B
+0x07c V86Es : Uint4B
+0x080 V86Ds : Uint4B
+0x084 V86Fs : Uint4B
+0x088 V86Gs : Uint4B

保存各寄存器状态。

在系统引导的时候,windows会填充IDT(interrupt descript table),其中包含了指向内核中负责处理每个中断和异常的例程指针。

利用!idt可以看到IDT的内容。

lkd> !idt

Dumping IDT:

37: 806e4864
3d: 806e5e2c
41: 806e5c88
50: 806e493c
62: 89c97954 ba6105e0 (KINTERRUPT 89c97918)
63: 8970b044 ba59ce80 (KINTERRUPT 8970b008)
b82bfbca (KINTERRUPT 896f6bb0)
73: 89a7cbec b82deb78 (KINTERRUPT 89a7cbb0)
b82bfbca (KINTERRUPT 896febb0)
b82bfbca (KINTERRUPT 896f7bb0)
82: 89cba954 ba6105e0 (KINTERRUPT 89cba918)
83: 89c86afc ba6105e0 (KINTERRUPT 89c86ac0)
ba6105e0 (KINTERRUPT 89cb2bb0)
92: 896f8634 ba958a30 (KINTERRUPT 896f85f8)
93: 89c3176c ba968495 (KINTERRUPT 89c31730)
a3: 89c95bec ba96fd80 (KINTERRUPT 89c95bb0)
a4: 89702044 b82bfbca (KINTERRUPT 89702008)
b82bfbca (KINTERRUPT 896f8bb0)
b1: 89ce32cc ba68431e (KINTERRUPT 89ce3290)
ba6a9da8 (KINTERRUPT 896f8008)
b4: 89709bec b82bfbca (KINTERRUPT 89709bb0)
b825fbd8 (KINTERRUPT 896f0bb0)
c1: 806e4ac0
d1: 806e3e54
e1: 806e5048
e3: 806e4dac
fd: 806e55a8

显示中断号,及中断ISR(interrupt server routine)地址。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: