Linux 中断学习笔记(三)
时间:2009-04-21 来源:chenjifeng
要使用中断肯定得初始化,这些初始化在系统启动时已经为你做好了,但是我们还是来看看怎样初始化的,这样就能更好的理解中断机制了。
先看下面函数:
355 void __init init_ISA_irqs (void) |
88 struct irq_chip no_irq_chip = { |
然后再来看函数set_irq_chip_and_handler_name(),设置irq_desc[]数组中的chip和handle_irq字段,其函数定义如下:
594 set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip, |
int set_irq_chip(unsigned int irq, struct irq_chip *chip) |
void |
也就是说执行set_irq_chip_and_handler_name(i, &i8259A_chip,handle_level_irq, "XT")后给数组irq_desc[]的第i个字段chip,handle_irq,name分别赋值i8259A_chip,handle_level_irq,XT。而其中handle_level_irq是一个函数指针,定义在kernel/irq/chip.c重要代码如下:
void fastcall |
387 void __init native_init_IRQ(void) |
30 void __init pre_intr_init_hook(void) |
69 #define IRQ(x,y) \ |
接着再看宏#define IRQ(x,y) IRQ##x##y##_interrupt
##表示将字符串连接起来,比如IRQ(0x2,0)就是IRQ0x20_interrupt,这样以来就会生成224个这样的函数,从IRQ0x20_interrupt一直到IRQ0xff_interupt。那么这些函数是如何定义的了?往下看include/asm-x86_64/hw_irq.h:
156 #define IRQ_NAME2(nr) nr##_interrupt(void) |
这样我们就定义了一个interrupt[]数组中的一个函数,这只是一个函数,通过以下的宏就可以定义224个了arch/x86_64/kernel/i8259.c:
60 BUILD_16_IRQS(0x2) BUILD_16_IRQS(0x3) |
至此set_intr_gate(vector, interrupt[i]);执行结束。这样我们就对IDT初始化成功。