Linux内核设计笔记7——中断
中断与中断处理
何为中断?
- 一种由设备发向处理器的电信号
- 中断不与处理器时钟同步,随时可以发生,内核随时可能因为中断到来而被打断。
- 每一个中断都有唯一一个数字标志,称之为中断线(IRQ)
- 异常是由软件产生,与处理器时钟同步。
中断处理程序
- 由内核调用来响应中断
- 运行于中断上下文
- 中断的执行不可阻塞
- 中断处理分为两个部分,中断处理程序是上半部(top half),还有下半部(bottom halves)
中断处理程序注册
- 中断处理程序是管理硬件驱动程序的组成部分,如果设备使用中断,其相应的驱动程序就会注册一个中断处理程序。
- 通过request_irq()函数来注册中断处理程序
int request_irq( unsigned irq,
irq_handler_t handler,
unsigned long flags,
count char* name,
void *dev)
第一个参数irq表示要分配的中断号
第二个参数handler表示中断处理程序指针
第三个表示标志,可以为0、IRQF_DISABLE、IRQF_SAMPLE_RANDOM、IRQF_TIMER、IRQF_SHARED
- IRQF_DISABLE 表示该中断处理期间,禁用所有其他中断
- IRQF_SAMPLE_RANDOM 这个设备产生的中断对内核熵池有贡献
- IRQF_TIMER 为系统定时器中断而准备的
- IRQF_SHARED 表示多个中断处理程序共享中断线。
第四个参数name表示设备的文本表示
第五个参数dev用于共享中断线,dev提供唯一的标志信息。
需要注意的是,request_irq( )可能睡眠,因此不能再中断上下文或者其他不允许阻塞的代码中调用该函数。
中断处理程序释放
卸载驱动程序时,需要用free_irq()注销相应的中断处理程序,并释放中断线。
void free_irq(unsigned int irq, void *dev);
如果指定的中断线不是共享的,那么该函数删除处理程序的同时将禁用这条中断线。如果是共享的,只删除dev对应的中断处理程序。
编写中断处理程序
static irqreturn_t intr_handler(int irq, void * dev);
当一个给定的中断处理程序正在执行时,相应的中断线在所有的处理器上都会被屏蔽掉,以防止在同一条中断线上接受另一个新的中断。
中断上下文
- 当执行一个中断时,内核处于中断上下文。
- 中断上下文没有后备进程,不可以睡眠。
- 中断上下文有着严格的时间限制,因为其打断了其他代码(有可能打断了其他中断处理程序)。中断上下文中的 代码应该迅速简洁,尽量不要使用循环去处理繁重的工作。
中断控制
Linux内核提供了一组接口用于控制机器上的中断状态
- 禁止和激活中断
用于禁止、激活当前处理器的本地中断,
local_irq_disable();
local_irqenable();
- 禁止指定中断线
void disable_irq(unsigned int irq); //禁止控制器上某一条中断线,函数只有在当前执行的所有处理程序完成后,才能返回
void disable_irq_nosync(unsigned int irq); //禁止控制器上某一条中断线,不会等待当前中断处理程序执行完毕。
void enable_irq(unsigned int irq); //激活控制器上某一条中断线,
void synchronize_irq(unsigned int irq); //等待下一个特定的中断处理程序退出
在一条中断线上,每次调用disable_irq_nosync()、disable_irq(),都需要调用一次enable_irq(),只有在enable_irq()完成了最后一次调用后,才完成了中断线的激活。
- 这三个函数可以从中断或进程上下文中调用,而且不会睡眠。
Linux内核设计笔记7——中断的更多相关文章
- Linux内核设计笔记10——内核同步
Linux内核同步笔记 几个基本概念 - 临界区(critical region):访问和操作共享数据的代码段: - 原子操作:操作在执行中不被打断,要么不执行,要么执行完: - 竞争条件: 两个线程 ...
- Linux内核设计笔记12——内存管理
内存管理学习笔记 页 页是内核管理内存的基本单位,内存管理单元(MMU,管理内存并把虚拟地址转化为物理地址的硬件)通常以页为单位进行处理,从虚拟内存的角度看,页就是最小单位. struct page{ ...
- Linux内核设计笔记8——下半部
# 下半部笔记 1. 软中断 软中断实现 软中断是在编译期间静态分配,其结构如下所示,结构中包含一个接受该结构体指针作为参数的action函数. struct softirq_action{ void ...
- Linux内核设计笔记14——块I/O层
块I/O层 基本概念 系统中可以随机访问固定大小数据片的硬件设备称做块设备,这些固定大小的数据片称之为块.还有一种基本的设备称之为字符设备,其需要按照顺序访问,比如键盘. 扇区:块设备中最小的寻址单元 ...
- Linux内核设计笔记13——虚拟文件系统
虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...
- Linux内核设计笔记11——定时器
定时器与时间管理笔记 内核中的时间 时钟中断:内核中的系统定时器以某种频率触发中断,该频率可以通过编程预定. 节拍率HZ:时钟中断的频率称为节拍率. 节拍:相邻两次中断的时间间隔称为节拍,1/节拍率. ...
- 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理
在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部 ...
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...
- 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...
随机推荐
- asp.net mvc5 step by step(一)——CURD增删查改Demo
1. 新建一个项目:
- OC中自定义init方法
---恢复内容开始--- 我们知道,在函数中实例化一个对象,大多数会同时进行初始化,如 Person *p =[ [Person alloc]init]; 此时已经进行了初始化,使用init方法,那么 ...
- Vue中把从后端取出的时间进行截取
未截取前 截取后 方法: </div>{{times}}</div> export default{ data() { return { // getTime储存从服务器请求回 ...
- mac appstore应用下载失败,不能更新等等问题,都可以解决
打开终端,输入以下命令 open `getconf DARWIN_USER_CACHE_DIR`/com.apple.appstore 进入目录,删除 com.apple.appstore  重启系 ...
- git 的一些基本命令小结
Git是目前世界上最先进的分布式版本控制系统 对于git 的用法,本文并不属于教程,只是总结记录一些平时用的简单命令 git的下载地址:https://git-scm.com/downloads 主要 ...
- PHP实现长网址与短网址
原文地址:http://www.qqdeveloper.com/detail/29/1.html 什么是长链接.短链接 顾名思义,长链接就是一个很长的链接:短链接就是一个很短的链接.长链接可以生成短链 ...
- Java开发小技巧(六):使用Apache POI读取Excel
前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...
- Anaconda下的python如何写入环境变量中
Anaconda是一个非常好的python管理软件,实际使用起来要比直接用python自带的管理工具更好. 若需要将Anaconda下的python.exe添入环境变量中,需要如下设置 如上图所示,需 ...
- 批量改变图片的尺寸大小 python opencv
我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的. 以上为原图片. import cv2 import os # 按指定图像大小调整尺寸 def resi ...
- python2.7入门---CGI编程&文件上传&文件下载
这次我们来看下文件下载和上传的操作.首先是上传,HTML设置上传文件的表单需要设置 enctype 属性为 multipart/form-data,代码如下所示: <!DOCTYPE h ...