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 ...
随机推荐
- Linux 命令行:cURL 的十种常见用法
Linux 命令行:cURL 的十种常见用法 文章目录 1. 获取页面内容 2. 显示 HTTP 头 3. 将链接保存到文件 4. 同时下载多个文件 5. 使用 -L 跟随链接重定向 6. 使用 -A ...
- stm32 待机模式
低功耗模式 降低系统时钟速度 不使用APBx和AHB外设时,将对应的外设时钟关闭 睡眠模式(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC.系统时钟(SysTick ...
- 1.volatile关键字 内存可见性
Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括 ...
- 《构建之法》——Alpha2项目的测试
这个作业属于哪个课程 课程的链接 这个作业要求在哪里 作业要求的链接 团队名称 Runningman 这个作业的目标 测试其他组的项目,互相借鉴 作业正文 作业正文 测试人姓名 陈嘉莹 测试人学号 2 ...
- Windows 下 mysql 安装
mysql官网下载地址:https://downloads.mysql.com/archives/community/ 以5.7.20版本为例 首先安装包解压后,没有网上教程里面提到的data文件夹和 ...
- python3 pyinstaller
一.安装python.pywin32.pyinstaller库 二.官网:https://pyinstaller.readthedocs.io/en/v3.3.1/usage.html#general ...
- java中的io流总结(一)
知识点:基于抽象基类字节流(InputStream和OutputStream).字符流(Reader和Writer)的特性,处理纯文本文件,优先考虑使用字符流BufferedReader/Buffer ...
- MySQL进阶 9: 联合查询 - 查询语句1 union 查询语句2 union ...
#进阶 : 联合查询 /* union 联合 合并: 将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union ... 应用语境: 要查询的结果来自多个表,但查询的列 ...
- thinkphp session跨域
1 .在config.PHP中添加 'SESSION_OPTIONS'=>array('domain'=>'.caizhimofang.con'),//session配置 'COOK ...
- elasticsearch查询:启动项目报错No property ... found for...Did you mean '...'?
网上找的案例是: 实体类字段定义:private String sku_no;dao中接口名定义:Goods findBySkuNo(String skuNo);spring-data按照接口方法定义 ...