中断与中断处理

何为中断?

  • 一种由设备发向处理器的电信号
  • 中断不与处理器时钟同步,随时可以发生,内核随时可能因为中断到来而被打断。
  • 每一个中断都有唯一一个数字标志,称之为中断线(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——中断的更多相关文章

  1. Linux内核设计笔记10——内核同步

    Linux内核同步笔记 几个基本概念 - 临界区(critical region):访问和操作共享数据的代码段: - 原子操作:操作在执行中不被打断,要么不执行,要么执行完: - 竞争条件: 两个线程 ...

  2. Linux内核设计笔记12——内存管理

    内存管理学习笔记 页 页是内核管理内存的基本单位,内存管理单元(MMU,管理内存并把虚拟地址转化为物理地址的硬件)通常以页为单位进行处理,从虚拟内存的角度看,页就是最小单位. struct page{ ...

  3. Linux内核设计笔记8——下半部

    # 下半部笔记 1. 软中断 软中断实现 软中断是在编译期间静态分配,其结构如下所示,结构中包含一个接受该结构体指针作为参数的action函数. struct softirq_action{ void ...

  4. Linux内核设计笔记14——块I/O层

    块I/O层 基本概念 系统中可以随机访问固定大小数据片的硬件设备称做块设备,这些固定大小的数据片称之为块.还有一种基本的设备称之为字符设备,其需要按照顺序访问,比如键盘. 扇区:块设备中最小的寻址单元 ...

  5. Linux内核设计笔记13——虚拟文件系统

    虚拟文件系统 内核在它的底层文件系统系统接口上建立一个抽象层,该抽象层使Linux可以支持各种文件系统,即便他们在功能和行为上存在很大差异. VFS抽象层定义了各个文件系统都支持的基本的.概念上的接口 ...

  6. Linux内核设计笔记11——定时器

    定时器与时间管理笔记 内核中的时间 时钟中断:内核中的系统定时器以某种频率触发中断,该频率可以通过编程预定. 节拍率HZ:时钟中断的频率称为节拍率. 节拍:相邻两次中断的时间间隔称为节拍,1/节拍率. ...

  7. 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理

    在前一章也提到过,之所以中断会分成上下两部分,是由于中断对时限的要求非常高,需要尽快的响应硬件. 主要内容: 中断下半部处理 实现中断下半部的机制 总结中断下半部的实现 中断实现示例 1. 中断下半部 ...

  8. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  9. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

随机推荐

  1. python基础 列表和字符串

    1.列表和字符串最大区别就是 列表可以改变,字符串不可以改变 列表: welldone = [ "hutu","python","java" ...

  2. angularjs ng-app="angular_app" ng-controller="angular_controller" ng-init="findAll()"

    ng-app="angular_app" 范围 ng-controller="angular_controller" 控制器 ng-init="fin ...

  3. Java分布式锁之数据库方式实现

    之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...

  4. ACM 2000~2002

    ACM  2000  输入三个字符后,按各个字符的ASCⅡ码从小打到的顺序输出这三个字符. import java.util.Scanner; public class Lengxc {public ...

  5. jquery仿移动端支付宝键盘

    最近做项目时碰到一个需求,就是在移动端支付页面点击支付按钮弹出一个支付键盘,类似于支付宝的那种.由于项目只是单纯的手机网站,而并非app,所以这个功能得由前端来实现.话不多说,先上图看看效果. 尼玛, ...

  6. Python文本和字符串常用操作

    ## 字符串分割 line = "This is my love!" fields = line.split(' ') print(fields) # ['This', 'is', ...

  7. php_Trait

    * Trait Answer* Trait : 关键字 Trait* 使用 use* 我的理解 是为了解决php不能多继承的一个处理方式* 在使用的时候 可以让两个不相关的类 产生联系* Trait ...

  8. Spark运行模式_spark自带cluster manager的standalone cluster模式(集群)

    这种运行模式和"Spark自带Cluster Manager的Standalone Client模式(集群)"还是有很大的区别的.使用如下命令执行应用程序(前提是已经启动了spar ...

  9. Arduino UNO仿真开发环境设置和仿真运行

    一. Proteus仿真平台简介 Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司).它不仅具有其它EDA工具软件 ...

  10. BZOJ1432_Function_KEY

    题目传送门 找规律. 画一个像这样的图: 不同颜色为不同层,因为函数图像可对称,所以只考虑K<=N/2的情况. 最小为min(K,N-K+1)*2. N=1时特殊考虑,答案为1. code: # ...