《Linux Kernel 2.6.14 内核源代码剖析》


------------------------------------------------------- 
Linux中的中断向量号的分配: 
-------------------------------------------------------- 
(1)0-31(0x0-0x1f)计32个,Intel保留,不分配IRQ,为异常,OS不能使用,由控制单元产生,在初始化中由函数将一些处理异常的函数插入到IDT非屏蔽中断及异常表项中,下面分成1),2)两块进行说明讲解: 

1)0-19(0x0-0x13)非屏蔽中断和异常,计:20个,Intel保留,不分配IRQ 
具体如下: 
0 Divide error(故障) 
1 Debug (故障或陷阱) 
2 保留未用(为非屏蔽中断保留的,NMI) 
3 breakpoint(陷阱) 
4 Overflow(陷阱) 
5 Bounds check(故障) 
6 Invalid Opcode(故障) 
7 Device not available(故障) 
8 Double fault(异常中止) 
9 Coprocessor segment overrun(异常中止) 
10 Invalid TSS(故障) 
11 Segment not present(故障) 
12 Stack segment(故障) 
13 General protection(故障) 
14 Page fault(故障) 
15 Intel保留 
16 Floating point error(故障) 
17 Alignment check(故障) 
18 Machine check(异常中止) 
19 SIMD floating point(故障) 
更多的信息可在Intel的技术文档中找到。 

2)20-31(0x14-0x1f)Intel保留将来使用,计12个,不分配IRQ,OS不能使用 
-------------------------------------------------------- 
OS可用的中断向量号只有0x20--->0xff,计剩224个 

(2)32-127(0x20-0x7f)外部中断,可分配IRQ,OS能使用,下面进一步分开为: 
1)0x20-0x2f: ISA中断,计16个,可分配IRQ,OS能使用,由可编程中断控制器产生,这16个向量对应的IRQ的门设置为其最终值。 
2)0x30-0x7f: 其他外部中断,可分配IRQ,OS能使用,由可编程中断控制器产生。 
-------------------------------------------------------- 

(3)128(0x80): 为系统调用,编程异常,1个,不分配IRQ,OS能使用,由控制单元产生 
-------------------------------------------------------- 

(4)129-238(0x81-0xee):外部中断(IRQ),可分配IRQ,OS能使用,由可编程中断控制器产生 
-------------------------------------------------------- 
(5)239(0xef): 本地APIC时钟中断,1个,不用分配IRQ,OS能使用,由可编程中断控制器产生 
-------------------------------------------------------- 
(6)240-250(0xf0-0xfa):Linux 保留作将来使用(注意是Linux内核保留,而非Intel保留)。11个,不用分配IRQ,OS能使用,由可编程中断控制器产生 
-------------------------------------------------------- 
(7)251-255(0xfb-0xff): 处理器间中断,5个,不用分配IRQ,OS能使用,由可编程中断控制器产生,具体如下: 
(1)0xfb: CALL_FUNCTION_VECTOR :发往所有的CPU(不包括发送者),强制这些CPU运行发送者传递过来的函数。 

(2)0xfc: RESCHEDULE_VECTOR :当一个CPU接收这种类型的中断时,限定自己来应答中断。当从中断返回时,所有的重新调度都自动进行。 

(3)0xfd: INVALIDATE_TLB_VECTOR :发往所有CPU(不包括发送者),强制他们的转换后援缓冲器(TLB)变为无效, 

(4)0xfe: ERROR_APIC_VECTOR :错误的APIC向量,应该从不发生。 

(5)0xff: SPURIOUS_APIC_VECTOR:假的APIC向量,应该从不发生。 

-------------------------------------------------------- 
IRQ分配到中断向量号 
-------------------------------------------------------- 
1.IRQ和中断向量的不同: 
那个能发出请求的中断控制器的输入线叫IRQ线,外部设备的中断请求从这个PIC的输入线输入 

2.第一条IRQ线通常表示为IRQ0,与IRQn关联的Intel的缺省向量是n+32. 
IRQ和中断向量之间有个映射关系,可以修改对应的。 

3.物理IRQ可以分配给32-238(0x20-0xee)之间的任何中断向量,但是要除去128(0x80)这是系统调用。即物理IRQ线可具体分配给如下的中断向量号中的任意一个: 
0x20-0x2f: ISA中断 
0x30-0x7f: 外部中断 
129-238(0x81-0xee):外部中断 

源代码分析: 
#define NR_IRQS 224 
#define NR_IRQ_VECTORS NR_IRQS 
其实在LINUX中物理需要的IRQ为238-32=206 
这个224是OS系统能用到的最大的中断向量个数,除掉了INTEL CPU保留的异常部分。这224个中断向量中有一些是不需要IRQ的,不过用个224就起到了最大值,没漏掉一个中断向量,对于不需要IRQ的,到时候再来另外处理,也难说将来不用。 
NR_IRQ_VECTORS:就是将IRQ分配到中断向量,注意,不用IRQ的到时再作处理,这里取个224最大值,防止了将来的变动,而无须大改。 
-------------------------------------------------------- 
IRQ分配到外部设备 
-------------------------------------------------------- 
但为了兼容IBM PC体系,必须将以下设备静态的连接到指定的IRQ线: 
(1)间隔定时设备必须连接到IRQ0线; 
(2)8259A必须连接到IRQ2线; 
(3)外部数学协处理器必须连接到IRQ13线; 
(4)一个I/O设备可以连接到多个IRQ线; 

-------------------------------------------------------- 
中断向量<---> IRQ<--->外部设备 
-------------------------------------------------------- 
1.中断向量如前所述,已经作好了分配:Intel的异常[0-31(0x0-0x1f)],Intel的保留使用[20-31(0x14-0x1f)], ISA中断[0x20-0x2f],外部中断[0x30-0x7f],系统调用[128(0x80)],外部中断[129-238(0x81-0xee)],本地APIC时钟中断[239(0xef)],处理器间中断[ 251-255(0xfb-0xff)]。 

2.IRQ对外部设备分配,只有IRQ0,IRQ2,IRQ13必须如下分配: 
IRQ0 ---->间隔定时设备 
IRQ2 ---->8259A 
IRQ13 ---->外部数学协处理器 
其余的IRQ可以任意分配给外部设备。 

源代码: 
#define TIMER_IRQ 0 
#define FPU_IRQ 13 

3.IRQ对中断向量的分配: 
1.第一条IRQ线通常表示为IRQ0,与IRQn关联的Intel的缺省向量是n+32. 
IRQ和中断向量之间有个映射关系,可以修改对应的。 

2.物理IRQ可以分配给32-238(0x20-0xee)之间的任何中断向量,但是要除去128(0x80)这是系统调用。即物理IRQ线可具体分配给如下的中断向量号中的任意一个: 
0x20-0x2f: ISA中断 
0x30-0x7f: 外部中断 
129-238(0x81-0xee):外部中断 

4.综合: 
这样以IRQ为中心,就建立了中断向量<---> IRQ<--->外部设备,于是乎,中断向量就和外部设备建立了映射关系。 

5.中断向量与IRQ对应关系是在OS中固定不动的,而IRQ与I/O外设的对应关系会应外设变动而变动。所以外设变动后,需重启系统,重建IRQ与I/O外设的对应关系,进而重建中断向量与外设的映射关系。 
其中有一种方法就是在系统启动时,执行一个硬件协议,外设宣布它们准备使用哪些中断线,然后协商一个最终的值以尽可能的减少冲突。这样一旦外设有了变动后,IRQ线不再对应原来的外设后,这个通过IRQ线建立与外设对应关系的中断向量不再有效。必须重启系统,执行硬件协议,取得新的IRQ与外设的对应关系,从而也就确定新的中断向量与外设的对应关系。 
---------------------------------------------------------------