首页
社区
课程
招聘
[原创]科普一下APIC的IPI机制
发表于: 2010-6-19 22:42 17695

[原创]科普一下APIC的IPI机制

2010-6-19 22:42
17695

write by hi.baidu.com/weolar/
最近写了一个DirectUI,如果运气不好没人要就开源给大家。
繁忙之余复习了一下APIC的IPI机制:
大家知道,在做内核调试器的时候,为了不影响当前环境,当中断产生的时候必须将非当前cpu外的其他cpu
的运行中断下来。那么内核调试器是怎么做到的呢?实际上这是APIC的ipi(处理器间中断)。下面我根据Linux和Windows的相应源码进行讲解。
当进入内核调试模式时,内核由KdEnterDebugger进入KeFreezeExcution。在KeFreezeExcution中首先检测是否KiFreezeExecutionLock
这个锁是busy状态,如果是则表示其他的处理器试图投
递IPI给当前处理器,于是调用KiIpiServiceRoutine,这便是处理器间中断的
服务例程。那么什么是处理器间中断(IPI)呢?这要从8259A讲起。
传统的i386采用的8259A中断控制器有个缺点,如果在smp中采用这样的设计,那就只能静态的把所有外部中断源划分成若干组,
分别把每组都链接到8259A,使其与CPU有一对一的连接,然而这样就达不到动态分配中断请求的目的,也使得硬件设计变的很不简洁。
因此intel设计了更为通用的中断控制器--APIC,高级可编程中断控制器。另一方面,koala到处理器间中断请求的需要,每个cpu都
需要有个本地APIC,因为一个cpu常常要有目标的向系统中的其他CPU发出中断请求,所以从pentium开始intel就在cpu芯片
内部集成了一个本地APIC。但是SMP结构中还需要一个外部的、全局的APIC。
不管是外部还是内部,APIC都支持从0x20-0xff共240个不同的中断向量,其中0-0x1f用于cpu本身的异常。这些中断分为15个
优先级,可以按中断向量号处于16算得。除了外部APIC可以把来自外部设备的中断请求提交给系统的各个cpu外,每个cpu也可以通过其内部的apic
向其他cpu发出中断请求,这便是处理器间中断。当一个cpu向其他cpu发送中断信号时,就在自己的本地ICR寄存器(
interrupt command ragister)中存放其中断向量,和目标cpu拥有的本地apic标识出发中断。IPI信号由apic总线传递再到目标APIC。
例如,下面是我的某个cpu的idt表:

lkd> !idt

Dumping IDT:

37: 806e4864 hal!PicSpuriousService37
3d: 806e5e2c hal!HalpApcInterrupt
41: 806e5c88 hal!HalpDispatchInterrupt
50: 806e493c hal!HalpApicRebootService
63: 89b3948c serial!SerialCIsrSw (KINTERRUPT 89b39450)
          USBPORT!USBPORT_InterruptService (KINTERRUPT 898d3308)
          USBPORT!USBPORT_InterruptService (KINTERRUPT 89c50360)
73: 89d6f7e4 atapi!IdePortInterrupt (KINTERRUPT 89d6f7a8)
          atapi!IdePortInterrupt (KINTERRUPT 89daf008)
          atapi!IdePortInterrupt (KINTERRUPT 89e20bb0)
          atapi!IdePortInterrupt (KINTERRUPT 89e01bb0)
          atapi!IdePortInterrupt (KINTERRUPT 89da0bb0)
          USBPORT!USBPORT_InterruptService (KINTERRUPT 89c4f208)
83: 89c03bec VIDEOPRT!pVideoPortInterrupt (KINTERRUPT 89c03bb0)
          *** ERROR: Module load completed but symbols could not be loaded for \SystemRoot\system32\DRIVERS\HECI.sys
HECI+0x486 (KINTERRUPT 89b39bb0)
          USBPORT!USBPORT_InterruptService (KINTERRUPT 898cebb0)
          *** ERROR: Module load completed but symbols could not be loaded for \SystemRoot\system32\DRIVERS\HDAudBus.sys
HDAudBus+0x2C12 (KINTERRUPT 898c1bb0)
92: 89c445b4 serial!SerialCIsrSw (KINTERRUPT 89c44578)
94: 89c57044 USBPORT!USBPORT_InterruptService (KINTERRUPT 89c57008)
          USBPORT!USBPORT_InterruptService (KINTERRUPT 897933b8)
a4: 89bedbec USBPORT!USBPORT_InterruptService (KINTERRUPT 89bedbb0)
b1: 89e2867c ACPI!ACPIInterruptServiceRoutine (KINTERRUPT 89e28640)
b4: 899021c4 NDIS!ndisMIsr (KINTERRUPT 89902188)
c1: 806e4ac0 hal!HalpBroadcastCallService
d1: 806e3e54 hal!HalpClockInterrupt
e1: 806e5048 hal!HalpIpiHandler
e3: 806e4dac hal!HalpLocalApicErrorService
fd: 806e55a8 hal!HalpProfileInterrupt
fe: 806e5748 hal!HalpPerfInterrupt

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 7092
活跃值: (2988)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主 在看雪 和 debugman 同步发布哦
呵呵
2010-6-19 22:50
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
受教了。很详细
2010-6-20 11:05
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
4
嗯,看来这东西没啥技术含量,没人关注。
2010-6-21 19:33
0
雪    币: 75
活跃值: (728)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
严重关注,非常有用00!一般人俺不告诉他
2010-6-21 20:36
0
雪    币: 2318
活跃值: (2210)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
6
菜鸟来学习下
2010-6-22 14:35
0
雪    币: 695
活跃值: (25)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
盟主又来看雪卖油条了啊,看不懂回头问你~~
2010-6-23 09:31
0
雪    币: 246
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
没人顶吗? 星级萌主的东西太高深,不过是大牛就要顶啊!
2010-7-11 20:41
0
雪    币: 11180
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
顶一下,看了半天,跟看英语书一样,头里连一点雾水都没有。
2010-7-12 20:32
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
受教了…………
2010-7-13 08:25
0
雪    币: 563
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
研究下!!!!
2010-7-14 10:47
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
13
最底层拦截键盘时多处理器的环境下要考虑这些,要不然就会漏掉。只是作者没弄个例子罢了!
2010-8-28 22:31
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
+1 非常有用。。。
2011-1-21 21:11
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习了。又长了见识
2011-1-22 07:22
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
顶礼膜拜武林盟主
2011-1-22 08:29
0
雪    币: 154
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
膜拜
2011-1-22 08:57
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
很难懂,不知有什么用
2011-1-22 10:10
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
不错的中断
2018-2-24 22:10
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
20
mark
2018-2-24 22:59
0
雪    币: 3739
活跃值: (3877)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
感谢分享!
2018-8-12 22:14
0
游客
登录 | 注册 方可回帖
返回
//