如果你以前没接触过中断,也许你会认为中断是一件特容易的事。但一旦你接触中断,并且想弄明白前因后果时,你就会改变观点,并且大发感慨:这是什么鬼东西?
是的,X86的中断就是这么麻烦。在操作系统下,一个中断从产生到中断服务程序的确定要经历N个步骤。首先,你要知道中断源。有了中断源,就要确定中断号。有了中断号,还要对应一个中断向量。有了中断向量,还需要注册中断服务程序和设定这个中断的优先等级。现在的架构都是支持中断共享的,所以如果牵涉到中断共享,还会有几个中断服务程序对应一个中断向量的事情。
1. 中断源触发类型
对于外部设备触发的中断,可以通过中断控制器设为电平触发模式或者边沿触发模式。
2. 中断号
对于BIOS工程师来讲,做中断这一块的重点在于中断号的确定。在这一点,ISA中断和PCI中断的确定是不同的。
ISA中断:ISA时代已经成为历史,但现在的计算机平台还保留着对ISA设备的兼容,LPC总线就是干这种事的。要想使能ISA的某个中断,要完成两个事情。首先,要在逻辑设备的SIO配置空间中填写中断号。然后还要在ASL中设置好_CRS,将其中断号宣告出来和设置MP表的IO Interrupt Entry供操作系统使用。要想修改ISA中断,我们不仅要修改SIO配置空间的中断号,还要修改_CRS里宣告的中断号。
PCI中断:设置PCI内部Device的中断时,我们要完成成三部分的事情。首先要设置DXXIP和DXXIR寄存器,即选择IRQ Routing中的一条路径作为中断连线。其次,我们要在LPC配置空间的PIRQ[A..H]_ROUT寄存器中设置IRQEN为1,代表使用APIC作为中断控制器。并且据此设