中断处理过程:
reg value–>irq(int) —> struct irq_desc
1 | ==> 中断时的有一个寄存器会保存中断源的vector值. |
注:这里的handle_irq不是真正的中断处理函数,而是几大类中断控制器处理函数.
如82599, msi等.
`do_IRQ(struct pt_regs *regs)
File: arch/x86/kernel/irq.c
arch/x86/kernel/entry_64.S
will call do_IRQ
1 | 187 __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) |
bool handle_irq(unsigned irq, struct pt_regs *regs)
arch/x86/kernel/irq_64.c
1 | 77 bool handle_irq(unsigned irq, struct pt_regs *regs) |
generic_handle_irq_desc
include/linux/irqdesc.h
1 | 114 static inline void generic_handle_irq_desc(unsigned int irq, struct irq_desc *desc) |
desc里的handle_irq
对应哪些函数?
handle_level_irq
和handle_edge_irq
等
1 | arch/x86/kernel/i8259.c: irq_set_chip_and_handler_name(irq, &i8259A_chip, handle_level_irq, |
for example: 8259A
1 | ==> make_8259A_irq |
make_8259A_irq
arch/x86/kernel/i8259.c
1 | 107 void make_8259A_irq(unsigned int irq) |
irq_set_chip_and_handler
include/linux/irq.h
1 | 452 static inline void irq_set_chip_and_handler(unsigned int irq, struct irq_chip *chip, |
irq_set_chip_and_handler_name
kernel/irq/chip.c
1 | 726 void |
1 | 23 /** |
1 | 688 void |