首页
社区
课程
招聘
[求助]再问一个关于IDT的问题
发表于: 2009-4-27 21:42 5734

[求助]再问一个关于IDT的问题

2009-4-27 21:42
5734
IDT中的中断例程地址是就是定义的中断服务例程的地址吗?好像不是啊?

根据“从IRQ到IRQL(APIC版)”这篇文章,导出的IDT的内容中:
83: 817d2d44
(Vector:83,Irql:7,SyncIrql:7,Connected:TRUE,No:0,ShareVector:TRUE,Mode:LevelSensitive,ISR:NDIS!ndisMIsr(bff1b794))

从IDT中得到中断服务例程地址是817d2d44 ,但是ISR:NDIS!ndisMIsr(bff1b794)) ,从817d2d44怎么到达ISR:NDIS!ndisMIsr(bff1b794)) 的呢?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
根据我导出的idt为:
Dumping IDT:

37: 806d0728 hal!PicSpuriousService37
3d: 806d1b70 hal!HalpApcInterrupt
41: 806d19cc hal!HalpDispatchInterrupt
50: 806d0800 hal!HalpApicRebootService
62: 83f91ce4 atapi!IdePortInterrupt (KINTERRUPT 83f91ca8)
63: 83d6c044 NDIS!ndisMIsr (KINTERRUPT 83d6c008)
73: 83f88dd4 portcls!CKsShellRequestor::`vector deleting destructor'+0x26 (KINTERRUPT 83f88d98)
USBPORT!USBPORT_InterruptService (KINTERRUPT 83cf7120)
82: 83f9148c atapi!IdePortInterrupt (KINTERRUPT 83f91450)
83: 83f94044 SCSIPORT!ScsiPortInterrupt (KINTERRUPT 83f94008)
93: 83d9f4bc i8042prt!I8042KeyboardInterruptService (KINTERRUPT 83d9f480)
a3: 83d1f15c i8042prt!I8042MouseInterruptService (KINTERRUPT 83d1f120)
b1: 83f9c894 ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 83f9c858)
b2: 83d1e044 serial!SerialCIsrSw (KINTERRUPT 83d1e008)
c1: 806d0984 hal!HalpBroadcastCallService
d1: 806cfd34 hal!HalpClockInterrupt
e1: 806d0f0c hal!HalpIpiHandler
e3: 806d0c70 hal!HalpLocalApicErrorService
fd: 806d1464 hal!HalpProfileInterrupt
fe: 806d1604 hal!HalpPerfInterrupt


93:        83d9f4bc i8042prt!I8042KeyboardInterruptService (KINTERRUPT 83d9f480)
以键盘的中断为例,可以看到93号中断向量从idt中得到的地址是83d9f4bc

kd> dt_kinterrupt 83d9f480
nt!_KINTERRUPT
+0x000 Type : 22
+0x002 Size : 484
+0x004 InterruptListEntry : _LIST_ENTRY [ 0x83d9f484 - 0x83d9f484 ]
+0x00c ServiceRoutine : 0xf7614495 unsigned char i8042prt!I8042KeyboardInterruptService+0
+0x010 ServiceContext : 0x83e37620
+0x014 SpinLock : 0
+0x018 TickCount : 0xffffffff
+0x01c ActualLock : 0x83e376e0 -> 0
+0x020 DispatchAddress : 0x80541920 void nt!KiInterruptDispatch+0
+0x024 Vector : 0x193
+0x028 Irql : 0x8 ''
+0x029 SynchronizeIrql : 0x9 ''
+0x02a FloatingSave : 0 ''
+0x02b Connected : 0x1 ''
+0x02c Number : 0 ''
+0x02d ShareVector : 0 ''
+0x030 Mode : 1 ( Latched )
+0x034 ServiceCount : 0
+0x038 DispatchCount : 0xffffffff
+0x03c DispatchCode : [106] 0x56535554


可以看到实际定义的中断服务例程的地址是:ServiceRoutine   : 0xf7614495     unsigned char  i8042prt!I8042KeyboardInterruptService+0

但是83d9f4bc这个地址代表的是什么呢?和_kinterrupt 这个结构的关系是什么呢?和0xf7614495  这个实际地址的关系呢?哪位帮忙解释一下,多谢了
2009-4-28 00:14
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
这个问题看看驱动的书……
2009-4-28 12:51
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
83d9f4bc这个地址貌似是DispatchCode成员的地址。
具体原因不是很清楚......
2009-11-28 22:25
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
5
好像是这样的:
IDT 地址是一个IDT表的起始地址,从这个地址指向的地址(表)的每4个字节指向一个胚体的服务地址。
类似二级指针。
2009-11-28 22:57
0
游客
登录 | 注册 方可回帖
返回
//