首页
社区
课程
招聘
[推荐]调试笔记之观察中断
发表于: 2008-10-14 16:03 6036

[推荐]调试笔记之观察中断

2008-10-14 16:03
6036
调试笔记之观察中断
中断好比计算机系统的脉搏,是系统生命力的源泉。在WinDBG做内核调试时该如何观察系统的中断分配和响应情况呢?WinDBG的帮助文件对此描述甚少,已经有的几个重要扩展命令居然也没有出现在帮助文件中。下面就以调试一个双核的G33系统为例简介绍一下常用的几个命令。

!pic

显示传统ISA中断(8259)的当前状态,例如:

1: kd> !pic
----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Physically in service:  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Physically masked:      Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y
Physically requested:   .  .  .  .  .  .  .  .  Y  Y  Y  Y  .  .  .  .

第一行是中断号,传统的ISA中断只有16个,其实是两个8259控制器级联在一起。第二行是CPU是否正在服务于对应的中断,.代表CPU没有在服务这个中断。第三行是中断屏蔽情况,因为观察时内核调试引擎将系统中断,屏蔽了大多数中断。第四行显示的是设备请求中断的情况。

如果多次执行这个命令,那么可能看到第四行内容有所变化:

0: kd> !pic
----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Physically in service:  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Physically masked:      Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y  Y
Physically requested:   Y  .  .  .  .  .  .  .  Y  Y  Y  Y  .  .  .  .

!ioapic

显示位于芯片组中的IO APIC的状态

0: kd> !ioapic
IoApic @ FEC00000  ID:2 (20)  Arb:170020
Inti00.: 000100ff  Vec:FF  FixedDel  PhysDest:00      edg  high       masked
Inti01.: 00000951  Vec:51  LowestDl  Lg:03000000      edg  high            
Inti02.: 000109ff  Vec:FF  LowestDl  Lg:03000000      edg  high       masked
Inti03.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti04.: 000109ff  Vec:FF  LowestDl  Lg:03000000      edg  high       masked
Inti05.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti06.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti07.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti08.: 000008d1  Vec:D1  FixedDel  Lg:01000000      edg  high            
Inti09.: 0000d9b1  Vec:B1  LowestDl  Lg:03000000-Pend lvl  high  rirr      
Inti0A.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti0B.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti0C.: 00000961  Vec:61  LowestDl  Lg:03000000      edg  high            
Inti0D.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti0E.: 00000952  Vec:52  LowestDl  Lg:03000000      edg  high            
Inti0F.: 000009b3  Vec:B3  LowestDl  Lg:03000000      edg  high            
Inti10.: 0000a9b2  Vec:B2  LowestDl  Lg:03000000      lvl  low              
Inti11.: 0000f992  Vec:92  LowestDl  Lg:03000000-Pend lvl  low   rirr      
Inti12.: 0000f982  Vec:82  LowestDl  Lg:03000000-Pend lvl  low   rirr      
Inti13.: 0000f972  Vec:72  LowestDl  Lg:03000000-Pend lvl  low   rirr      
Inti14.: 000109ff  Vec:FF  LowestDl  Lg:01000000      edg  high       masked
Inti15.: 0000f962  Vec:62  LowestDl  Lg:03000000-Pend lvl  low   rirr      
Inti16.: 0000a993  Vec:93  LowestDl  Lg:03000000      lvl  low              
Inti17.: 0000f9a3  Vec:A3  LowestDl  Lg:03000000-Pend lvl  low   rirr      
这个表格中很有用的信息是显示出了中断号和IDT表中向量号的对应关系。比如IRQ8对应的向量号是0xD1。

执行!idt d1便可以看到这个中断/向量所对应的处理例程:

0: kd> !idt d1

Dumping IDT:

d1: 82ba4614 hal!HalpRtcClockInterrupt

在设备管理器中可以看到IRQ8分配给了RTC(Real time clock)设备,因此上面的显示是吻合的。

!apic

显示当前CPU内部的局部APIC状态。

0: kd> !apic
Apic @ fffe0000  ID:0 (50014)  LogDesc:01000000  DestFmt:ffffffff  TPR 00
TimeCnt: 0fe536c0clk  SpurVec:1f  FaultVec:e3  error:0
Ipi Cmd: 000c00e1  Vec:E1  FixedDel   Dest=Othrs      edg  high            
Timer..: 000300fd  Vec:FD  FixedDel    Dest=Self      edg  high       masked
Linti0.: 0001001f  Vec:1F  FixedDel    Dest=Self      edg  high       masked
Linti1.: 000004ff  Vec:FF  NMI         Dest=Self      edg  high            
TMR: 62, 72, 82, 92-93, A3, B1-b2
IRR: 62, 82, B1, D1
ISR: E1
每个CPU有一个局部的APIC,因此要观察另一个CPU的,应该先切换到另一个CPU:

0: kd> ~1s

1: kd> !apic
Apic @ fffe0000  ID:1 (50014)  LogDesc:02000000  DestFmt:ffffffff  TPR 00
TimeCnt: 0fe536c0clk  SpurVec:1f  FaultVec:e3  error:80
Ipi Cmd: 000c00e1  Vec:E1  FixedDel   Dest=Othrs      edg  high            
Timer..: 000300fd  Vec:FD  FixedDel    Dest=Self      edg  high       masked
Linti0.: 0001001f  Vec:1F  FixedDel    Dest=Self      edg  high       masked
Linti1.: 000004ff  Vec:FF  NMI         Dest=Self      edg  high            
TMR: 62, 72, 82, 92-93, A3, B1-b2
IRR: 61, 72, 92, A3
ISR: D1
其中的IRR代表Interrupt Request Register,ISR代表Interrupt Service Register,前者后面列出的是在请求队列中的中断向量号,ISR后面列出的是已经处理完的中断(在处理好队列中的)。

《软件调试》下载

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
2
hoho
最近在做bios,这些名词看起来格外眼熟
2008-10-14 18:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
向楼主学习了
2008-12-4 20:50
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看不懂
顶一下
2008-12-5 14:35
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主又来推销他的书了,哈哈,我花了100多大洋,看了几个月了还没有看完。
对于新手来说,太难了,看不懂,只能跳着看。
2008-12-7 22:38
0
雪    币: 242
活跃值: (463)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
6
好书!
仅仅因为是中文的资料也特意顶了
2008-12-8 02:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我想知道怎么访问IOAPIC内的寄存器!
2009-5-16 19:46
0
游客
登录 | 注册 方可回帖
返回
//