博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux中断学习
阅读量:4192 次
发布时间:2019-05-26

本文共 2307 字,大约阅读时间需要 7 分钟。

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 , 什么时候打开本地中断?   
你可能感兴趣的文章
项目开发经验谈(二)
查看>>
项目开发经验谈(一)
查看>>
浅谈项目感觉
查看>>
用积木搭出的埃菲尔铁塔
查看>>
IT项目经理是否需要技术能力
查看>>
饮水者才能自知冷暖
查看>>
产品和样品
查看>>
测试Windows Sockets协议
查看>>
浅谈流媒体测试
查看>>
在接口后面能不能使用new操作符
查看>>
Windows API一日一练(37)MoveWindow函数
查看>>
C/C++内存问题检查利器—Purify (三)
查看>>
C/C++内存问题检查利器—Purify (二)
查看>>
让自定义的类型可以和任意的类型之间转换
查看>>
你讨厌 C++中的“
查看>>
STL的L细细品
查看>>
实实在在说多态(相同函数名 依据上下文 实现却不同)
查看>>
仿基因编程原理导论(里面的几个重要的概念正在做修正,所以这只能算是一个原理的初稿。)
查看>>
node的 http-server 启动以后 浏览器访问有问题
查看>>
解决VS+QT无法自动生成moc文件的问题
查看>>