中断

中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据;硬件设备生成中断并不考虑与处理器的始终同步,中断可能随时产生,内核随时都有可能被中断打断;

不同设备的中断不同,而每个中断都对应一个唯一的中断值,这些中断值通常称为中断请求IRQ线;中断号并不一定是严格定义的,也可能是动态分配的,如PCI设备;

异常

异常与中断不同,它的产生必须考虑与处理器时钟同步;实际上,异常也常常被称为同步中断;在处理器执行到又编程失误而导致的错误指令的时候,就会产生一个异常;许多处理器体系结构处理异常与中断的方式类型;因此,内核对它们的处理也很类似;

中断处理程序

在响应一个特定中断的时候,内核会执行一个函数,这个函数叫中断处理程序或者中断服务例程;产生中断的每个设备都有一个相应的中断处理程序;中断处理器程序与其他内核函数的区别在于,中断处理程序是被内核调用来响应中断的,它们要运行于中断上下文中,通常,中断上下文也成为原子上下文,该上下文执行的代码不可阻塞;

中断可能随时发生,因此中断处理程序也就随时可能执行;所以必须保证中断处理程序能够快速执行,这样才能保证尽可能快的恢复中断代码执行,对于硬件和操作系统来讲,缩短响应和处理时间都极为重要;

上半部和下半部

中断处理被分为两个部分,中断处理程序是上半部–接收到一个中断,就立即开始执行,但只做严格时限的工作,例如对接收的中断进行应答或者复位硬件,这些工作都是所有中断被禁止的情况下完成的;能够允许被稍后完成的工作会退出到下半部;此后合适的时机,下半部会被开中断执行;

以网卡为例,当网卡接收来自网络的数据包时,需要通知内核数据包到了;因此,网卡立即发出中断,内核通过执行我那个口已注册的中断处理程序来做出应答;中断开始执行,通知硬件,拷贝最新的网络数据包到内存,然后读取网卡更多的数据包,这些都是重要,紧迫而又与硬件相关的工作,如果这些工作执行时间过长,就会导致网卡缓存溢出,从而产生丢包;当网络数据包被拷贝到系统内存后,中断任务执行完成,这时将控制权交给原本运行的程序;处理数据包的其他工作在随后的下半部中进行;

中断上下文

当执行一个中断处理程序时,内核处于中断上下文;

在进程上下文中,可以通过current宏关联当前进程;此外,因为进程是以进程上下文的形式连接到内核的,因此,进程上下文中可以睡眠,也可以调度程序;

中断上下文与进程并没有什么关系,与current宏也是不相干的;因为没有后备进程,所以中断上下文不可以睡眠,一些睡眠函数都不能在中断上下文中使用;

中断上下文具有严格的时间显示,因为它打断了代码;正因为这种异步的恩正,所以所有的中断处理程序必须尽可能快速、简洁;尽量把工作从中断处理程序中分离出来,放在下半部执行,因为下半部可以再更合适的时间运行;

Linux设备驱动程序 之 中断的更多相关文章

  1. Linux设备驱动程序 之 中断下半部

    中断处理程序的局限 1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好: 2. 如果当前有一个中断处理程序 ...

  2. Linux设备驱动程序 之 中断和锁

    中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq ...

  3. linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)

    原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...

  4. 【转】linux设备驱动程序中的阻塞机制

    原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...

  5. Linux设备驱动程序学习----2.内核模块与应用程序的对比

    内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...

  6. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  7. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  8. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

  9. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

随机推荐

  1. VBA连接操作符

    VBA支持以下连接运算符. 假设变量A=5,变量B=10,则 - 运算符 描述 示例 + 将两个值添加为变量,其值是数字 A + B = 15 & 连接两个值 A & B = 510 ...

  2. Twitter Bootstrap:前端框架利器

    Bootstrap 的文件结构 读者可以直接从 GitHub 下载到 Bootstrap 源码,本地解压后可以看到这样的目录结构:docs.img.jquery-ui- bootstrap.js 和 ...

  3. S2-052

    前言 S2-052的RCE漏洞和以前的有些不同,不再是ognl表达式注入了,而是xml反序列化漏洞导致的RCE(另外还有S2-055漏洞是fastjson的反序列化漏洞).我复现的时候遇到一个坑,导致 ...

  4. leetcode-62. Unique Paths · DP + vector

    题面 A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  5. ifeq ifneq ifdef ifndef

    条件语句中使用到了三个关键字:“ifeq”.“else”和“endif”.其中: 1.        “ifeq”表示条件语句的开始,并指定了一个比较条件(相等).之后是用圆括号括包围的.使用逗号“, ...

  6. 【Hibernate】一级缓存

    一.概述 二.证明Hibernate的一级缓存的存在 三.一级缓存中快照区 四.管理一级缓存 五.Hibernate一级缓存的刷出时机 六.操作持久化对象的方法 一.概述 什么是缓存: 缓存将数据库/ ...

  7. Codeforces 853B Jury Meeting

    题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求 ...

  8. 什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

    什么是 java 序列化?(未完成)什么情况下需要序列化?(未完成)

  9. 如何实现数组和 List 之间的转换?(未完成)

    如何实现数组和 List 之间的转换?(未完成)

  10. HDU 6568 Math

    Math \(f_i\)为从\(i\)到\(i+1\)的期望步数. \(f_i = 1-p + p(f_i + 2((1-q)^{n-i}(n-i) + q\sum_{j=0}^{n-i-1}(1-q ...