7.2 下半部和推后执行的工作_软中断

来源:互联网 发布:自由禁区捏脸数据 编辑:程序博客网 时间:2024/05/16 06:11

7.2.1 软中断的实现

    软中断是在编译期间静态分配的。它不像tasklet那样能被动态地注册或去除。软中断由softirq_action结构表示,它定义在<linux/interrupt.h>:

  • struct softirq_action
  • {
  •     void (*action) (struct softirq_action *);
  •     void *data;
  • }

 

1. 软中断处理程序

    一个软中断不会抢占另外一个软中断。实际上,唯一可以抢占软中断的是中断处理程序。不过,其他的软中断--甚至是相同类型的软中断--可以在其他处理器上同时执行。

 

2. 执行软中断

    一个注册的软中断必须在被标记后才会执行。这被称作触发软中断。在下列地方,待处理的软中断会被检查和执行:

  • 从一个硬件中断代码处返回时。
  • 在ksoftirqd内核线程中。
  • 在那些显式检查和执行待处理的软中断的代码中,如网络子系统。

    不管是用什么办法唤起,软中断都要在do_softirq()中执行。

 

7.2.2 使用软中断

1. 分配索引

    目前,只有两个子系统--网络和SCSI--直接使用软中断。此外,内核定时器和tasklet都是建立在软中断上。

 

2. 注册你的处理程序

    在一个处理程序运行的时候,当前处理器上的软中断被禁止。实际上,如果同一个软中断在它执行的同时再次被触发了,那么另一个处理器可以同时运行其处理程序。这意味着任何共享数据--甚至是仅在软中断处理程序内部使用的全局变量--都需要严格的锁保护。大部分软中断处理程序都通过采取单处理器数据(仅属于某一个处理器的数据,因此根本不需要加锁)或其他一些技巧来避免显式地加锁,从而提供更出色的性能。

 

3. 触发你的软中断

原创粉丝点击