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
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();
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);
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
- Linux内核中断学习
- linux中断学习
- Linux的中断学习
- Linux 中断学习之一
- Linux学习:中断下半部
- Linux 中断学习及中断内核编程
- 中断 Linux 中断学习之前言篇
- Linux 中断学习之小试牛刀篇
- Linux 中断学习之小试牛刀篇
- Linux kernel 学习之中断
- Linux 中断学习之小试牛刀篇
- linux 中断学习之小试牛刀篇
- Linux中断处理学习笔记
- linux中断机制学习整理
- Linux 中断学习之小试牛刀篇
- linux kernel学习(2) - 中断
- Linux 中断学习之小试牛刀篇
- Linux 中断学习之小试牛刀篇
- Delphi操作Word,Excel替换
- My First Blog
- [GEiv]JavaSE 游戏引擎Geiv开发背景介绍
- IOS WEB APP学习
- c++接口定义及实现举例
- linux中断学习
- 深入 Cloud Foundry(上)
- [LeetCode] Word Ladder
- xml语法
- 将apk文件中的classes.dex反编译成java源码
- java字符串相关api及简单实现3
- Servlet 线程安全
- [GEiv]JavaSE 游戏引擎Geiv简介
- vs2010 编写C++ 应用程序