Linux设备驱动程序 之 中断和锁
中断和锁
1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中断可以打断软中断,所以软中断中访问共享数据需要禁止中断;考虑如下情况,当软中断中获取到锁,之后被硬中断打断,硬中断此时尝试获取锁,因为锁已经被软中断持有,硬中断获取不到,产生死锁;
2. 硬中断和进程上下文共享数据,硬中断中使用spin_lock/spin_unlock,进程上下文中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中断可以打断进程上下文,所以进程上下文中访问共享数据需要禁止中断;考虑如下情况,当进程上下文中获取到锁,之后被硬中断打断,硬中断此时尝试获取锁,因为锁已经被进程上下文持有,硬中断获取不到,产生死锁;
3. 多个相同硬中断共享数据,不存在这种情况;
同一个中断处理程序同时只有一个实例,当一个中断处理程序运行时,相应中断线在所有处理器上都会屏蔽掉;
4. 多个不同的硬中断共享数据,需要使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;
硬中断可以被一个比自己优先级高的硬中断打断,考虑如下情况,当优先级低的中断中获取到锁,之后被优先级高的中断打断,高优先级中断此时尝试获取锁,因为锁已经被低优先级中断持有,高优先级中断获取不到,产生死锁;
5. 软中断(包括tasklet和timer)和进程上下文共享数据,软中断中需要使用spin_lock/spin_unlock,进程上下文中需要使用spin_lock_bh/spin_unlock_bh;
软中断可以打断进程上下文,所以进程上下文中访问共享数据需要禁止中断下半部;考虑如下情况,当进程上下文中获取到锁,之后被软中断打断,软中断此时尝试获取锁,因为锁已经被进程上下文持有,软中断获取不到,产生死锁;
6. 多个相同软中断(不包括tasklet和timer)之间共享数据,需要使用spin_lock/spin_unlock;
多个相同的软中断可以在不同CPU上同时运行,他们之间访问共享数据需要加锁;
7. 多个不同软中断(不包括tasklet和timer)之间共享数据,需要使用spin_lock/spin_unlock;
多个不同的软中断可以在不同CPU上同时运行,他们之间访问共享数据需要加锁;
8. 多个相同tasklet(timer)之间共享数据,不存在这种情况;
tasklet(timer)同时只会有一个实例运行,在SMP环境也是如此,只有一个运行中的实例,不需要加锁;
9. 多个不同tasklet(timer)之间共享数据,需要使用spin_lock/spin_unlock;
多个不同的tasklet(timer)是可以在不同CPU上同时运行的,他们之间访问共享数据需要加锁;
中断打断关系
1. 同类型的硬中断同时只会有一个实例执行,SMP环境也是如此,同级中断会被屏蔽掉;
2. 不同类型的硬中断可以同时在不同CPU上同时执行;
3. 同一个CPU上的优先级高的硬中断可以打断优先级低的硬中断;
4. 硬中断可以打断软中断,可以打断进程上下文;
5. 相同软中断(不包括tasklet和timer)可以在不同CPU上同时执行;
6. 同一个CPU上的软中断(不包括tasklet和timer)是串行执行的,他们不会互相抢占;
7. 相同tasklet(timer)同时只会有一个实例执行,SMP环境也是如此;
8. 不同的tasklet(timer)可以同时在不同的CPU上同时执行;
9. 软中断可以打断进程上下文;
Linux设备驱动程序 之 中断和锁的更多相关文章
- Linux设备驱动程序 之 中断下半部
中断处理程序的局限 1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好: 2. 如果当前有一个中断处理程序 ...
- Linux设备驱动程序 之 中断
中断 中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据:硬件设备生成中断并 ...
- 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 ...
随机推荐
- Mysql 更新时间
Mysql时间加减函数为date_add().date_sub() 定义和用法DATE_ADD() 函数向日期添加指定的时间间隔.DATE_SUB() 函数向日期减少指定的时间间隔.语法DATE_AD ...
- Java 之 泛型
一.泛型概述 集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成 Object 类型.当我们取出一个对象,并且进行相应的操作,这时必须采用类型转换. 先观察下面代码: publ ...
- 封装promise
// new 做了什么 //1.创建一个新的空对象 //2.将构造函数中的this指向这个新空对象 //3.执行构造函数中的代码 //4.返回这个对象 //5.这个对象有一个__proto__指向构造 ...
- burpsuite暴力破解dvwa的登录密码
前提准备条件: 1.下载安装dvwa,下载链接地址:http://www.dvwa.co.uk/. 2.安装php+mysql环境,我用的是这个软件(phpStudy)下载地址:https://www ...
- C++自问
1.forwarding reference 2.move 3. map的内部实现 rb tree,但rbtree优点是什么?使用情况?和b+有啥区别? 4.顺序容器和关联容器的区别: 本质区别是顺序 ...
- Oracle创建上下文 SYS_CONTEXT
Oracle创建上下文 SYS_CONTEXT 1. 系统默认的一些参数 set heading offselect SYS_CONTEXT('USERENV', 'TERMINAL') termin ...
- mongodb的基本操作之数据写入和查询
连接到mongodb服务器后,查看当前数据中有多少数据库 show dbs 切换数据库 use conf 删除数据库 db.dropDatabase() 再次使用 use conf 切换数 ...
- CSS3媒体查询实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- IAR添加debug和release选项
在IAR的Workspace窗口顶部的下拉菜单中有两个选项,Debug和Release. 名字和数量可以在菜单栏的Project-->Edit Configuration中增删修改 每个选项都对 ...
- [2019HDU多校第三场][HDU 6603][A. Azshara's deep sea]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6603 题目大意:给出一个凸包,凸包内有若干个圆,要求画尽可能多的对角线使得他们两两不在凸包内相交且不与 ...