本文共 2307 字,大约阅读时间需要 7 分钟。
schedule_work schedule_delayed_work 将工作队列任务放到标准工作队列events handle_edge_irq 调用 action_ret = handle_IRQ_event(irq, action); handle_IRQ_event 调用action 执行相关中断处理函数。
汇编调用do_IRQ->
__do_IRQ -> handle_irq -》 handle_edge_irq (handle_level_irq)->handle_IRQ_event ->驱动或内核注册 acition
* @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] 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
desc->chip->ack(irq); mask_and_ack_8259A
if (!(action->flags & IRQF_DISABLED))
local_irq_enable_in_hardirq();
现在多处理器(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有本质的区别。 irq_exit -》invoke_softirq -》__do_softirq __do_softirq 中pending >>= 1; 操作,经过MAX_SOFTIRQ_RESTART 10次循环,wakeup_softirqd **************tasklet 使用*************** tasklet_enable tasklet_disable ************工作队列使用****************** 将中断上半部(可以执行可以睡眠的函数)放到进程中进行执行。 keventd_wq = create_workqueue("events"); /kevents 线程 queue_delayed_work (在任何cpu 上面) *******************************网卡软中断调用流程*********************** net_dev_init 会调用 open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); __napi_schedule -》__raise_softirq_irqoff(NET_RX_SOFTIRQ); 2. handle_IRQ_EVENT 最后local_irq_disable , 什么时候打开本地中断?