linux中断学习

来源:互联网 发布:北京java培训费用 编辑:程序博客网 时间:2024/05/24 07:43
schedule_work  schedule_delayed_work   将工作队列任务放到标准工作队列events





中断数据结构:
irq_desc  全局数据,每个中断占有一项 
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

tasklet 只在同一个cpu上执行 



desc->chip->ack(irq);  mask_and_ack_8259A 
end end_8259A_irq 


中断里面开全局中断那地方:

handle_IRQ_event: 
if (!(action->flags & IRQF_DISABLED))
local_irq_enable_in_hardirq();


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有本质的区别。


软中断调用时机:
irq_exit -》invoke_softirq -》__do_softirq  
__do_softirq 中pending >>= 1; 操作,经过MAX_SOFTIRQ_RESTART 10次循环,wakeup_softirqd 

ksoftirqd 函数,进程处理

open_softirq   软中断初始化
raise_softirq  激活软中断

**************tasklet 使用***************
tasklet_init 
调度: tasklet_schedule
tasklet_enable tasklet_disable  



************工作队列使用******************
将中断上半部(可以执行可以睡眠的函数)放到进程中进行执行。 

keventd_wq = create_workqueue("events");  /kevents 线程
标准工作队列函数:
queue_work
queue_delayed_work (在任何cpu 上面)
queue_delayed_work ()
flush_workqueue 

预定义工作队列函数:
相关api: schedule_work 
schedule_delayed_work 
flush_scheduled_work 

worker_thread  工作队列线程




*******************************网卡软中断调用流程***********************
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); 




待总结:
1. 关中断前又来一个中断怎样处理?
2. handle_IRQ_EVENT  最后local_irq_disable , 什么时候打开本地中断?   











0 0