Linux设备驱动程序 之 中断
中断
中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据;硬件设备生成中断并不考虑与处理器的始终同步,中断可能随时产生,内核随时都有可能被中断打断;
不同设备的中断不同,而每个中断都对应一个唯一的中断值,这些中断值通常称为中断请求IRQ线;中断号并不一定是严格定义的,也可能是动态分配的,如PCI设备;
异常
异常与中断不同,它的产生必须考虑与处理器时钟同步;实际上,异常也常常被称为同步中断;在处理器执行到又编程失误而导致的错误指令的时候,就会产生一个异常;许多处理器体系结构处理异常与中断的方式类型;因此,内核对它们的处理也很类似;
中断处理程序
在响应一个特定中断的时候,内核会执行一个函数,这个函数叫中断处理程序或者中断服务例程;产生中断的每个设备都有一个相应的中断处理程序;中断处理器程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,它们要运行于中断上下文中,通常,中断上下文也成为原子上下文,该上下文执行的代码不可阻塞;
中断可能随时发生,因此中断处理程序也就随时可能执行;所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快的恢复中断代码执行,对于硬件和操作系统来讲,缩短响应和处理时间都极为重要;
上半部和下半部
中断处理被分为两个部分,中断处理程序是上半部–接收到一个中断,就立即开始执行,但只做严格时限的工作,例如对接收的中断进行应答或者复位硬件,这些工作都是所有中断被禁止的情况下完成的;能够允许被稍后完成的工作会退出到下半部;此后合适的时机,下半部会被开中断执行;
以网卡为例,当网卡接收来自网络的数据包时,需要通知内核数据包到了;因此,网卡立即发出中断,内核通过执行我那个口已注册的中断处理程序来做出应答;中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包,这些都是重要,紧迫而又与硬件相关的工作,如果这些工作执行时间过长,就会导致网卡缓存溢出,从而产生丢包;当网络数据包被拷贝到系统内存后,中断任务执行完成,这时将控制权交给原本运行的程序;处理数据包的其他工作在随后的下半部中进行;
中断上下文
当执行一个中断处理程序时,内核处于中断上下文;
在进程上下文中,可以通过current宏关联当前进程;此外,因为进程是以进程上下文的形式连接到内核的,因此,进程上下文中可以睡眠,也可以调度程序;
中断上下文与进程并没有什么关系,与current宏也是不相干的;因为没有后备进程,所以中断上下文不可以睡眠,一些睡眠函数都不能在中断上下文中使用;
中断上下文具有严格的时间显示,因为它打断了代码;正因为这种异步的恩正,所以所有的中断处理程序必须尽可能快速、简洁;尽量把工作从中断处理程序中分离出来,放在下半部执行,因为下半部可以再更合适的时间运行;
Linux设备驱动程序 之 中断的更多相关文章
- Linux设备驱动程序 之 中断下半部
中断处理程序的局限 1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好: 2. 如果当前有一个中断处理程序 ...
- Linux设备驱动程序 之 中断和锁
中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- linux设备驱动程序--gpio控制
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 嵌入式Linux设备驱动程序:发现硬件配置
嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...
随机推荐
- Linux报错排解
1.Loaded plugins: product-id, search-disabled-repos, subscription-manager This system is not registe ...
- vue处理换行符
1.处理换行符 <tr class="unread" v-for="(item,index) in DataList" :key="index& ...
- mysql5.6快速安装及参数详解
一.所需软件 软件名称 版本 下载地址 当前环境 管理员账号/密码 mysql 5.6 yum安装 centOS6.7系统 zxfly/zxfly 二.安装说明 数据库所在目录 /database/m ...
- C#的预处理指令
- Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]
题目链接:https://codeforces.com/problemset/problem/567/D 题意: 在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 ...
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
- 2018年5月20日--西安icpc邀请赛打铁总结
2018年5月20日--西安icpc邀请赛打铁总结 事后诸葛亮 大致回顾一下比赛,29号的热身赛和30号的正式赛. 热身赛总共三道题,一个小时,没有AC一道题目. A题是一个几何题目,审题时犯了一个 ...
- 【转】Golang关于channel传递引用引发的坑
原文: https://studygolang.com/articles/12310/comment/17923 ------------------------------------------- ...
- 由浅入深剖析 go channel
原文:https://www.jianshu.com/p/24ede9e90490 ---------------------------------- 由浅入深剖析 go channel chann ...
- django安装好之后,django-admin仍然不能使用的问题
我使用的是python3,python3不能找到django的正确位置.需要下面这样才能正确建立mysite python3 /usr/lib/python2./site-packages/djang ...