中断与中断处理

何为中断?

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

    我用的UE版本是4.14.1   系统:win10 64 前不久给样板房里面做了一个扫地机器人,导航设置让我头大了很久,度娘也没有用,最后在谷哥上有所感悟,现在给出本人的设置过程和解决方案. 一开始拖 ...

  2. Objective-C 中的 assign, copy,retain,strong,weak 详解

    在IOS开发中,经常会使用   @property(nonatomic,copy)NSString * name;   语句来快速设置set get 方法,在此依次说明atomic .nonatomi ...

  3. AtomicStampedReference解决ABA问题

      在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值 ...

  4. ABAP术语-Transaction

    Transaction 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/19/1112804.html Logical process in ...

  5. MySQL必知必会 读书笔记二:MySQL使用

    使用MySQL 选择数据库 使用USE关键字 USE database; 了解数据库和表 如果不知道可以使用的数据库名时,可用MySQL的SHOW命令来显示这些信息. SHOW DATABASES; ...

  6. jsp页面通过EL表达式获取list大小兼容性处理

    1.jsp页面通过EL表达式获取list大小,中间件用tomcat7时,下面这个写法是可以的 <input id="test" type="hidden" ...

  7. 4 二维数组中的查找 JavaScript

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  8. php bug 调试助手 debug_print_backtrace()

    debug_print_backtrace() 是一个很低调的函数,很少有人注意过它. 不过当我对着一个对象调用另一个对象再调用其它的对象和文件中的一个函数出错时,它也许正在一边笑呢 如果我们想知道某 ...

  9. CI框架视图继承

    CI(CodeIgniter)框架 视图继承 这个代码不是我撸的 ... 当时在哪儿找的忘了 ... 如果有侵权什么的 ... 联系我删了 ... 需要去core里面创建一个MY_loader.php ...

  10. C语言之一般树

    1.一般树 将这种一般的树转化成我们熟悉的单链表形式,这有三层,每一层都可以看成单链表或者多个分散的单链表 数据节点如下: struct tree {        int elem;        ...