首页
社区
课程
招聘
[旧帖] 中断和异常 0.00雪花
发表于: 2012-3-18 01:56 1098

[旧帖] 中断和异常 0.00雪花

2012-3-18 01:56
1098
求邀请。。。

一、基本概念
中断和异常的基本概念见 intel document。概念中最重要的是异常是同步产生,中断是异步产生的。
二、中断
中断的来源(2个来源):外部硬件产生的中断;软件产生的中断(int n,但排除int 3,into,bound)。对于外部硬件产生的中断,按其是否可以被标志位IF屏蔽又分为可屏蔽中断和不可屏蔽中断。
三、外部硬件中断的硬件支持
首先,是下面的图:

一般来说,外部硬件连接在IO APIC的IRQ引脚上,当硬件给其连接的IRQ引脚信号的时候,IO APIC会做下面的事情:
1.        检查irq线对应的Redirection Table Register(RTR),若其Interrupt Mask为1(表示mask了),忽略该中断,没有什么副作用(比如电平触发的,电平不变,边缘触发的,来了就没有了)。若为0,则往下。
2.        根据RTR中的内容决定将中断发给哪个cpu处理,同时递送给cpu的还有vector number。
3.        进入local apic,其中有3组寄存器:IRR(Interrupt Request Register)、ISR(In-Service Register)、TMR(Trigger Mode Register),每个寄存器都是256位,对应于一个vector number,根据ioapic发过来的vector number,设置IRR寄存器中的相应位。
4.        local apic根据TPR(Task Priority Register)中的值决定是否立即将当前中断发给cpu。(微软的irql就是和TPR进行对应来屏蔽低优先级中断的)。
5.        cpu响应中断后,将IRR中的对应位清0,设置ISR对应位,表示该vector number对应的中断正在被cpu处理,cpu处理完后会将该位清0。
local apic的寄存器TPR(Task Priority Register)用于屏蔽vector number小于一定值的中断,该优先级的计算公式为:priority=vector number/16,由于vector number最大为255,所以priority的范围为0-15,15为最大优先级。
例如,当vector number为0x40的中断来到local apic了,这时local apic会计算出该vector number对应的优先级,这里为4,如果此时TPR<=4,则该中断继续留在IRR中,不会发给cpu,若>4就立即中断cpu,响应更高优先级的中断。TPR为可编程的。
很重要的一点,这里讲得优先级屏蔽全都是针对硬件产生的可屏蔽中断,这种类型的中断可以全部被EFLAGS中的IF标志位屏蔽,也可以因为TPR中的值被pending。
四、异常
异常的来源(3个来源):cpu监测到的指令错误,如缺页;如软件异常(int 3,into,bound);机器检查异常。
cpu监测到的异常按后续处理方式可以分为faults、traps和aborts。其中faults异常在中断程序执行完成后返回的是产生异常的那条指令,意图是该异常可以被恢复,从而使执行错误的指令从新执行。traps异常会跳过产生异常的指令,从下一条指令开始执行。aborts异常标明没有办法恢复执行了,被打断的任务无法恢复执行。
五、中断和异常的处理
在intel系列的cpu中, 中断和异常的处理方式是相同的,步骤为:发生异常—cpu保存当前任务的信息(返回指令等,)---通过idtr寄存器和vector number找到中断处理程序---iretd返回---被打断的任务恢复执行。
六、指令边界处的优先级
大家知道cpu仅在一条指令执行完之后才会查看是否有中断或异常(这个执行时就知道了吧),那么如果在执行一条指令期间,来了多个异常或中断,那么如何选择一个进行相应了?intel按如下的优先级类进行响应,并保证在架构中这个优先级是一样的,不同cpu每个优先级类中的异常优先级可能不一样。下面截个小图:

七、IRQL、IRQ、TPR
微软的IRQL其实是和TPR对应的,网上说和IRQ对应估计是因为之前的平台不支持Redirection Table Register的功能的原因,IRQL和TPR的映射关系是由下面的两个数组进行维护的:
0: kd> db hal!HalpVectorToIRQL
8070d298  00 ff ff 01 02 ff 05 06-07 08 09 0a 1b 1c 1d 1e
该数组其实叫HalpTPToIRQL更为合适,因为它是将vector number对应的优先级作为索引来查找优先级对应的IRQL。从上表中,可以发现优先级13对应的irql为1c(28),这个irql是时钟中断所在的irql,根据优先级可以判断时钟中断的vector number必定在208-223(D0-DF)之间。键盘的vector number为0x93,其优先级为9,对应的irql为8。表项为值为ff的项应该是没有用到的。
0: kd> db hal!HalpIRQLtoTPR
80702398  00 3d 41 41 51 61 71 81-91 a1 b1 b1 b1 b1 b1 b1
807023a8  b1 b1 b1 b1 b1 b1 b1 b1-b1 b1 b1 c1 d1 e1 ef ff
这个表将IRQL转成TPR值,先讲一下TPR的格式:

还是看时钟中断,其irql为28,查询该表得TPR为d1,从上图的定义知,其优先级为d。
函数KfRaiseIrql和KfLowerIrql通过查询这两个表项来进行中断屏蔽的设置,在看着两个函数之前,先介绍一些IO APIC的内存布局和Local APIC的内存布局。
首先,这两块内存是属于IO地址空间的,同时hal也将其映射到了内存空间,具体的地址为:
类型        IO空间        内存空间        是否共享
lcoal APIC        0xfee00000        0xfffe0000        否(每个cpu看到的内容是不一样的)
IO APIC        0xfec00000        0xffd06000        是(有多个io apic时,下一个地址增加0x1000)
好了,现在来看KfRaiseIrql这个函数:
0: kd> uf hal!KfRaiseIrql
hal!KfRaiseIrql:
807023b8 0fb6d1          movzx   edx,cl
807023bb 0fb68a98237080  movzx   ecx,byte ptr hal!HalpIRQLtoTPR (80702398)[edx]
807023c2 a18000feff      mov     eax,dword ptr ds:[FFFE0080h]
807023c7 890d8000feff    mov     dword ptr ds:[0FFFE0080h],ecx
807023cd c1e804          shr     eax,4
807023d0 0fb68098d27080  movzx   eax,byte ptr hal!HalpVectorToIRQL (8070d298)[eax]
807023d7 c3              ret
逻辑很简单,该函数通过edx将新的irql传进来,然后查询表HalpIRQLtoTPR,得到TPR值,写入地址0xfffe0080,该地址是TPR寄存器在内存空间的地址,写入前会将原来的TPR值读出并查询HalpVectorToIRQL得到原来的irql值,然后返回该irql,函数完成。从这里我们可以进一步看到,高的irql只会屏蔽到更多的可屏蔽硬件中断,对于缺页等异常、不可屏蔽中断等是没有任何影响的。KfLowerIrql和KfRaiseIrql功能差不多,这里不再赘述。
八、Q&A
内核态passive级别时,关闭中断后可以访问分页内存吗?
答案是不可以。其实原则上关闭中断后同样可以触发缺页异常,缺页处理完后一样可以正常执行,但是通过查看微软提供的缺页中断代码,发现在代码中会显式的判断当发生缺页时的IF标志是否为0,如果为0,则调用蓝屏的那个代码。这样做的原因我猜是为了保留关中断的语义,即不能被打断。
系统每隔一个时间段收到一个时钟中断(15ms左右,根据系统版本该值不一样),该中断函数会做一些定时器处理、计时等操作,那这个中断对一个的vector number是多少了?
在xp sp3中,该vector number为d1,中断源是连接在IO apic的引脚IRQ8上的RTC定时器。在硬件管理器中显示的system timer对应的irq为0,这个中断貌似没什么用,但是在南桥芯片ICH的的手册里面有讲到,有兴趣的可以看一下。顺便说一下,时钟中断中irql提升使用的是函数hal!HalBeginSystemInterrupt进行的,该函数具有三个参数,第一个是需要提升的irql=1ch。
各个处理器对时钟中断的处理是不一样的,其中BSP使用的中断例程为hal!HalpClockInterrupt,而普通的AP使用的是hal!HalpClockInterruptPn,这两个函数分别跳转到nt模块里面的KeUpdateSystemTime和KeUpdateRunTime。
九、参考资料
http://msdn.microsoft.com/en-us/windows/hardware/gg487516
触发方式及处理方法
http://msdn.microsoft.com/en-us/windows/hardware/gg462964
APIC-Based Interrupt Subsystems on Uniprocessor PCs
http://en.wikipedia.org/wiki/Intel_APIC_Architecture
Intel APIC Architecture
MultiProcessor Specification
里面说到io地址空间的范围,有疑问
http://baike.baidu.com/view/832814.htm
ICH,io控制中心,熟称南桥芯片,主要负责Io总线之间的通信,如pci、usb、lan、sata、音频控制器、键盘控制器、实时时钟控制器等。
http://baike.baidu.com/view/15282.htm
芯片组的概念
http://baike.baidu.com/view/303587.htm
RTC芯片
Intel® I/O Controller Hub 9 (ICH9) Family
http://blog.csdn.net/x313695373/article/details/7009817
从IRQ到IRQL(APIC版)

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

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//