硬中断和软中断的区别.docx
《硬中断和软中断的区别.docx》由会员分享,可在线阅读,更多相关《硬中断和软中断的区别.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、硬中断和软中断的区别概述从本质上来讲,中断是一种电信号,当设备有其中一种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的一些特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。(1)硬中断由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。(2)软中断为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时
2、间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。(3)中断嵌套Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。(4)软中断指令int是软中断指令。中断向量表是中断号和中断处理函数地址的对应表。int n - 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 n。软中断是执行中断指令产生的,而硬中断是由外设引发的。硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中
3、断控制器。硬中断是可屏蔽的,软中断不可屏蔽。硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。开关(1)硬中断的开关简单禁止和激活当前处理器上的本地中断:local_irq_disable(;local_irq_enable(;保存本地中断系统状态下的禁止和激活:unsigned long flags;local_irq_save(flags);local_irq_restore(flags);(2)软中断的开关禁止下半部,如softirq、tasklet和workqueue等:local_bh
4、_disable(;local_bh_enable(;需要注意的是,禁止下半部时仍然可以被硬中断抢占。(3)判断中断状态#define in_interrupt( (irq_count() / 是否处于中断状态(硬中断或软中断)#define in_irq( (hardirq_count() / 是否处于硬中断#define in_softirq( (softirq_count() / 是否处于软中断硬中断(1)注册中断处理函数注册中断处理函数:/irq: 要分配的中断号handler: 要注册的中断处理函数flags: 标志(一般为0)name: 设备名(dev-name)dev: 设备(s
5、truct net_device dev),作为中断处理函数的参数成功返回0/int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char name, void dev);中断处理函数本身:typedef irqreturn_t (irq_handler_t) (int, void );/enum irqreturn/enum irqreturn IRQ_NONE,IRQ_HANDLED,IRQ_WAKE_THREAD,;typedef enum irqreturn irqretu
6、rn_t;#define IRQ_RETVAL(x) (x) != IRQ_NONE)(2)注销中断处理函数/free_irq - free an interrupt allocated with request_irqRemove an interrupt handler. The handler is removed and if theinterrupt line is no longer in use by any driver it is disabled.On a shared IRQ the caller must ensure the interrupt is disabled
7、on the card it drives before calling this function. The function doesThis function must not be called from interrupt context./void free_irq(unsigned int irq, void dev_id);软中断(1)定义软中断是一组静态定义的下半部接口,可以在所有处理器上同时执行,即使两个类型相同也可以。但一个软中断不会抢占另一个软中断,唯一可以抢占软中断的是硬中断。软中断由softirq_action结构体表示:struct softirq_action
8、void (action) (struct softirq_action ); / 软中断的处理函数 /;目前已注册的软中断有10种,定义为一个全局数组:static struct softirq_action softirq_vecNR_SOFTIRQS;enum HI_SOFTIRQ = 0, / 优先级高的tasklets /TIMER_SOFTIRQ,/定时器的下半部/NET_T_SOFTIRQ,/发送网络数据包/NET_R_SOFTIRQ,/接收网络数据包/BLOCK_SOFTIRQ,/BLOCK装置/BLOCK_IOPOLL_SOFTIRQ,TASKLET_SOFTIRQ, / 正
9、常优先级的tasklets /SCHED_SOFTIRQ,/调度程序/HRTIMER_SOFTIRQ,/高分辨率定时器/RCU_SOFTIRQ,/RCU锁定/NR_SOFTIRQS/10/;(2)注册软中断处理函数/void open_softirq(int nr, void (action) (struct softirq_action )softirq_vecnr.action = action;例如:open_softirq(NET_T_SOFTIRQ, net_tx_action);open_softirq(NET_R_SOFTIRQ, net_rx_action);(3)触发软中断调
10、用raise_softirq(来触发软中断。void raise_softirq(unsigned int nr)unsigned long flags;local_irq_save(flags);raise_softirq_irqoff(nr);local_irq_restore(flags);/ This function must run with irqs disabled /inline void rasie_softirq_irqsoff(unsigned int nr)_raise_softirq_irqoff(nr);/ If were in an interrupt or s
11、oftirq, were done(this also catches softirq-disabled code). We willactually run the softirq once we return from the irqor softirq.Otherwise we wake up ksoftirqd to make sure weschedule the softirq soon./if (! in_interrupt() / 如果不处于硬中断或软中断 /wakeup_softirqd(void); / 唤醒ksoftirqd/n进程 /Percpu变量irq_cpusta
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 区别
限制150内