首页 > [linux内核][linux中断]——软中断机制

[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在CODE上查看代码片派生到我的代码片
  1. struct softirq_action{  
  2.  void (*action)(struct sotfirq_action*)  
  3. kernel/softirq.c中定义了一个包含有32个该结构体的数组  
  4. static struct softirq_action softirq_vec[NR_SOFTIRQS]  

 

 

 

1,注册软中断函数 open_softirq

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void open_softirq(int nr, void (*action)(struct softirq_action *))  
  2. {  
  3.     /* softirq_vec是个struct softirq_action类型的数组 */  
  4.     softirq_vec[nr].action = action;  
  5. }  



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

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void raise_softirq(unsigned int nr)  
  2. {  
  3.     unsigned long flags;  
  4.   
  5.     local_irq_save(flags);  
  6.     raise_softirq_irqoff(nr);  
  7.     local_irq_restore(flags);  
  8. }  

 

 

 

 



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

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. asmlinkage void do_softirq(void)  
  2. {  
  3.     __u32 pending;  
  4.     unsigned long flags;  
  5.     /* 判断是否在中断处理中,如果正在中断处理,就直接返回 */  
  6.     if (in_interrupt())  
  7.         return;  
  8.     /* 保存当前寄存器的值 */  
  9.     local_irq_save(flags);  
  10.     /* 取得当前已注册软中断的位图 */  
  11.     pending = local_softirq_pending();  
  12.     /* 循环处理所有已注册的软中断 */  
  13.     if (pending)  
  14.         __do_softirq();  
  15.     /* 恢复寄存器的值到中断处理前 */  
  16.     local_irq_restore(flags);  
  17. }  





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

转载于:https://www.cnblogs.com/zhiliao112/p/4232157.html

更多相关:

  • 中断延迟  (Interrupt Latency) 中断延迟 是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。 也就是: 计算机接收到中断信号到操作系统作出响应,并完成换到转入中断服务程序的时间。 不严格地,也可以表述为: (外部)硬件(设备)发生中断,到系统执行中断服务子程序(ISR)的第一条指令的时间。...

  • 系统环境 (一)  硬件环境 CPU:S3C4510B SDRAM:W981216DH 16M FLASH:MX29LV160AB 2M (二)  软件环境 tornado2.01 for arm(AKA的FTP上有tornado2.2需要的可以自己去下载:)) (三)  调试环境...

  • 设置路由的default的Controller和Action可以达到我们预期的效果,代码如下所示: public class RouteConfig {public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.ax...