linux中断学习

schedule_work  schedule_delayed_work   将工作队列任务放到标准工作队列events





中断数据结构:
irq_desc  全局数据,每个中断占有一项 
handle_edge_irq 调用 action_ret = handle_IRQ_event(irq, action);    handle_IRQ_event 调用action 执行相关中断处理函数。 

汇编调用do_IRQ-> handle_edge_irq ->handle_IRQ_event ->驱动或内核注册 acition 

do_IRQ 调用流程: entry_32.S   ENTRY(interrupt)    jmp common_interrupt 

common_interrupt:
     addl $-0x80,(%esp)     /* Adjust vector into the [-256,-1] range */
     SAVE_ALL
     TRACE_IRQS_OFF
     movl %esp,%eax
     call do_IRQ
     jmp ret_from_intr
ENDPROC(common_interrupt)
     CFI_ENDPROC

tasklet 只在同一个cpu上执行 

Intel SMP 处理
现在多处理器(SMP)系统已经非常普遍,因为8259采用pin脚直连的方式,所以在SMP系统中8259已经被APIC(Advanced Programmable Interrupt Controller)所取代。SMP系统中APIC一般分成两个组成部分:LAPIC和IOAPIC。LAPIC即Local APIC,一个集成在处理器内部的芯片,它即可产生中断也能接收来自IOAPIC的中断,同时它还有一个Timer功能,可以为所属的处理器提供本地时钟功能,此外它还可以给发送中断消息给其他处理器IPI(Inter Processor Interrupt)。IOAPIC一般位于南桥芯片上,与8259功能类似,主要作external device interrupts hub,它通过system bus以interrupt message的形式与各处理器中的LAPIC进行互动,IOAPIC即可用于UP系统,也可用于SMP系统。在集成了LAPIC的处理器中,处理器与中断相关的外部引脚为LINT0和LINT1(参考intel开发者手册V3A Figure 8.4. Local APIC Structure)。相对于8259,IOAPIC可以处理更多的外设中断,比如ICH9中单个IOAPIC总共可以支持24个中断,而且可以将接收到的中断分发到不同的处理器中,这与8259有本质的区别。









你可能感兴趣的:(linux中断学习)