1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > [linux内核][linux中断]——软中断机制

[linux内核][linux中断]——软中断机制

时间:2023-07-24 08:32:47

相关推荐

[linux内核][linux中断]——软中断机制

点击打开链接

一,linux软中断的概念

软中断(softirq)常常表示可延迟函数的所有种类,目前linux上使用的软中断个数是有限的,linux最多注册32个,目前使用了10个,在interrupt.h中定义,中断上下文:表示内核当前正在执行一个中断处理程序或者一个可延迟函数。软中断(即使同一类型的软中断)可以并发运行在多个CPU上,因此软中断是可重入函数必须使用自旋锁保护其数据结构。一个软中断不会去抢占另外一个软中断。

软中断和tasklet的区别

由于软中断必须使用可重入函数,这就导致设计上的复杂度变高,作为设备驱动程序的开发者来说,增加了负担。而如果某种应用并不需要在多个CPU上并行执行,那么软中断其实是没有必要的。因此诞生了弥补以上两个要求的tasklet。它具有以下特性:

a)一种特定类型的tasklet只能运行在一个CPU上,不能并行,只能串行执行。

b)多个不同类型的tasklet可以并行在多个CPU上。

c)软中断是静态分配的,在内核编译好之后,就不能改变。但tasklet就灵活许多,可以在运行时改变(比如添加模块时)。

软中断的实现:

软中断由softirq_action结构体表示

[cpp]view plaincopy structsoftirq_action{void(*action)(structsotfirq_action*)kernel/softirq.c中定义了一个包含有32个该结构体的数组staticstructsoftirq_actionsoftirq_vec[NR_SOFTIRQS]

1,注册软中断函数 open_softirq

[cpp]view plaincopy voidopen_softirq(intnr,void(*action)(structsoftirq_action*)){/*softirq_vec是个structsoftirq_action类型的数组*/softirq_vec[nr].action=action;}

2,触发软中断的函数 raise_softirq 参见 kernel/softirq.c文件

[cpp]view plaincopy voidraise_softirq(unsignedintnr){unsignedlongflags;local_irq_save(flags);raise_softirq_irqoff(nr);local_irq_restore(flags);}

3,执行软中断 do_softirq 参见 kernel/softirq.c文件,如果有待处理的软中断,do_softirq()会循环遍历每一个,调用它们的处理程序。

[cpp]view plaincopy asmlinkagevoiddo_softirq(void){__u32pending;unsignedlongflags;/*判断是否在中断处理中,如果正在中断处理,就直接返回*/if(in_interrupt())return;/*保存当前寄存器的值*/local_irq_save(flags);/*取得当前已注册软中断的位图*/pending=local_softirq_pending();/*循环处理所有已注册的软中断*/if(pending)__do_softirq();/*恢复寄存器的值到中断处理前*/local_irq_restore(flags);}

4,执行相应的软中断 - 执行自己写的中断处理linux中,执行软中断有专门的内核线程,每个处理器对应一个线程,名称ksoftirqd/n

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。