软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错;当然,对于时间要求严格并能自己高效完成加锁的工作,软中断是正确的选择;

分配索引

在编译期间,通过在<linux/interrupt.h>中定义一个枚举类型来静态的声明软中断,内核用这些索引来表示优先级,索引号小的软中断在索引号大的软中断之前执行;

建立新的软中断必须在此枚举的类型中加入新的项;加入时,不能像其他地方一样,简单的把项增加到列表的末尾;相反,必须根据希望赋予她的优先级来决定加入的位置;习惯上,HI_SOFTIRQ通常作为第一项,而RCU_SOFTIRQ作为最后一项;新项可能插在BLOCK_SOFTIRQ和TASKLET_IRQ之间;

 enum
{
HI_SOFTIRQ=,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
IRQ_POLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the
numbering. Sigh! */
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ NR_SOFTIRQS
};
注册处理程序

在运行时,通过调用open_softirq()注册软中断处理程序,该函数有两个参数:软中断的索引号和处理函数;

 void open_softirq(int nr, void (*action)(struct softirq_action *));

如网络子系统注册中断的方式如下:

 open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
 open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);

软中断处理程序执行的时候,允许响应中断,但是它自己不能休眠;在一个处理程序运行的时候,当前处理上的软中断被禁止;但其他处理器上仍可以执行别的软中断;如果同一个软中断在它被执行的同时再次触发了,那么另外一个处理器可以同时运行其处理程序;这意味着任何共享数据都需要严格的锁保护;这也是tasklet更受青睐的原因;大部分软中断处理程序,都通过使用单处理器数据或者其他一些技巧来避免显式的加锁,从而获得更出色的性能;

引入软中断的主要原因是其可扩展性;如果不需要扩展到多个处理器,那么,使用tasklet是好的选择;tasklet本质上也是软中断,只不过同一个处理程序的多个实例不能再多个处理器上同时运行;

软中断的触发

通过在枚举类型的列表中添加了新项之后,并调用open_softirq()进行了注册,新的软中断处理程序就能够运行了;raise_softirq()函数可以将一个软中断设置为挂起状态,让它在下次调用do_softirq()函数时投入运行;

raise_softirq()函数再触发一个软中断之前要先禁止中断,触发之后再恢复原来的状态;如果中断本来就已经被禁止了,那么可以调用raise_softirq_irqoff()函数,将会带来一些优化效果;

 void raise_softirq_irqoff(unsigned int nr);
void raise_softirq(unsigned int nr);

在中断处理程序中触发软中断是最常见的形式,在这种情况下,中断处理程序执行硬件设备的相关操作,然后触发相应的软中断,最后退出;内核在执行完中断处理程序以后,马上就会调用do_softirq()函数;于是软中断开始执行中断处理程序留给它去完成的剩余任务;

Linux设备驱动程序 之 软中断的更多相关文章

  1. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  2. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  3. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  4. Linux设备驱动程序学习之分配内存

    内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...

  5. 教你写Linux设备驱动程序:一个简短的教程

    教你写Linux设备驱动程序:一个简短的教程 http://blog.chinaunix.net/uid-20799298-id-99675.html

  6. linux设备驱动程序_hello word 模块编译各种问题集锦

    在看楼经典书籍<linux设备驱动程序>后,第一个程序就是编写一个hello word 模块. 原以为非常easy,真正弄起来,发现问题不少啊.前两天编过一次,因为没有记录,今天看的时候又 ...

  7. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  8. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  9. Linux设备驱动程序学习----3.模块的编译和装载

    模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...

随机推荐

  1. ThinkPHP5.0.*远程代码执行漏洞预警

    安全公告 Thinkphp5.0.*存在远程代码执行漏洞. 漏洞描述 Thinkphp5.0.*存在远程代码执行漏洞.攻击者可以利用漏洞实现任意代码执行等高危操作. 目前官方已经出了补丁: https ...

  2. ajax对数据删除、查看详情功能

    运用bootstrap,jquery和ajax显示一些数据,附加删除功能并且点击能弹出模态框详情功能 主页面main.php <!DOCTYPE html PUBLIC "-//W3C ...

  3. vue嵌套数据多层级里面的数据不自动更新渲染dom

    可以尝试手动调用更新 主要代码: vm.$forceUpdate() 官网

  4. Nginx中location模块的详细配置(含示例)

    题记 此前在配置Nginx location模块的时候玩出了一些bug,折腾了一段时间.后来网上也查阅了相关的资料,看着也比较混乱.周末有空想着好好整理一下location模块的配置,结合自己的亲手实 ...

  5. JS Array.reverse 将数组元素颠倒顺序

    <pre><script type="text/javascript"> //JS Array.reverse 将数组元素颠倒顺序//在JavaScript ...

  6. Insufficient space for shared memory file 解决办法

    Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file:   /tmp/hsperfd ...

  7. How to resolve the 403 error when send POST request from Postman

    Root cause: the site refused the connection from the http request origin, by default it is setted as ...

  8. We're sorry but mobile doesn't work properly without JavaScript enabled. Please enable it to continue.

    vue过程中遇见这个问题:We're sorry but mobile doesn't work properly without JavaScript enabled. Please enable ...

  9. alibaba 用360的evpp -》个别项目

  10. 大数据之路week05--day02(Maven安装,环境变量的配置及基本使用)

    今天我们就来学习一下maven,怎么说呢,maven更像是一种管理的工具,实现的原理是使用插件. 举个例子,比如说,一个公司需要做一个项目,这个项目又分成了很多的模块,每个模块又分成了许多的业务等等, ...