转自:http://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html

中断处理一般不是纯软件来实现的,需要硬件的支持。通过对中断的学习有助于更深入的了解系统的一些底层原理,特别是驱动程序的开发。

主要内容:

  • 什么是中断
  • 中断类型
  • 中断相关函数
  • 中断处理机制
  • 中断控制方法
  • 总结

1. 什么是中断

为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。

没有中断的话,CPU和外围设备之间协同工作可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。

当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理)。

中断机制是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。

2. 中断类型

中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。

异步中断:CPU处理中断的时间过长,所以先将硬件复位,使硬件可以继续自己的工作,然后在适当时候处理中断请求中耗时的部分。

举个例子:网卡的工作原理

  1. 网卡收到数据包后,向CPU发出中断信号,请求处理接收到的数据包
  2. CPU将收到的数据包拷贝到内存后,即通知网卡继续工作
  3. 至于数据包拷贝至内存后的处理会在适当的时候进行

这样做避免了处理数据包时间过长导致网卡接收数据包速度变慢。

同步中断:CPU处理完中断请求的所有工作后才反馈硬件

举个例子:系统异常处理(比如运算中的除0操作)

  1. 应用程序出现异常后,需要内核来处理
  2. 内核调用相应的异常处理函数来处理异常
  3. 处理完后终了应用程序或者给出message

同步中断应该处理能很快完成的一种中断。

3. 中断相关函数

实现一个中断,主要需要知道3个函数:

  • 注册中断的函数
  • 释放中断的函数
  • 中断处理程序的声明

3.1 注册中断的函数

位置:<linux/interrupt.h>  include/linux/interrupt.h

定义如下:

/*
* irg - 表示要分配的中断号
* handler - 实际的中断处理程序
* flags - 标志位,表示此中断的具有特性
* name - 中断设备名称的ASCII 表示,这些会被/proc/irq和/proc/interrupts文件使用
* dev - 用于共享中断线,多个中断程序共享一个中断线时(共用一个中断号),依靠dev来区别各个中断程序
* 返回值:
* 执行成功:0
* 执行失败:非0
*/
int request_irq(unsigned int irq,
irq_handler_t handler,
unsigned long flags,
const char* name,
void *dev)

3.2 释放中断的函数

定义比较简单:

void free_irq(unsigned int irq, void *dev)

如果不是共享中断线,则直接删除irq对应的中断线。

如果是共享中断线,则判断此中断处理程序是否中断线上的最后一个中断处理程序,

是最后一个中断处理程序 -> 删除中断线和中断处理程序

不是最后一个中断处理程序 -> 删除中断处理程序

3.3 中断处理程序的声明

声明格式如下:

/*
* 中断处理程序的声明
* @irp - 中断处理程序(即request_irq()中handler)关联的中断号
* @dev - 与 request_irq()中的dev一样,表示一个设备的结构体
* 返回值:
* irqreturn_t - 执行成功:IRQ_HANDLED 执行失败:IRQ_NONE
*/
static irqreturn_t intr_handler(int, irq, void *dev)

4. 中断处理机制

中断处理的过程主要涉及3函数:

  • do_IRQ 与体系结构有关,对所接收的中断进行应答
  • handle_IRQ_event 调用中断线上所有中断处理
  • ret_from_intr 恢复寄存器,将内核恢复到中断前的状态

处理流程可以参见书中的图,如下:

5. 中断控制方法

常用的中断控制方法见下表:

函数

说明

local_irq_disable() 禁止本地中断传递
local_irq_enable() 激活本地中断传递
local_irq_save() 保存本地中断传递的当前状态,然后禁止本地中断传递
local_irq_restore() 恢复本地中断传递到给定的状态
disable_irq() 禁止给定中断线,并确保该函数返回之前在该中断线上没有处理程序在运行
disable_irq_nosync() 禁止给定中断线
enable_irq() 激活给定中断线
irqs_disabled() 如果本地中断传递被禁止,则返回非0;否则返回0
in_interrupt() 如果在中断上下文中,则返回非0;如果在进程上下文中,则返回0
in_irq() 如果当前正在执行中断处理程序,则返回非0;否则返回0

总结

中断处理对处理时间的要求很高,如果一个中断要花费较长时间,那么中断处理一般分为2部分。

上半部只做一些必要的工作后,立即通知硬件继续自己的工作。

中断处理中耗时的部分,也就是下半部的工作,CPU会在适当的时候去完成。

《Linux内核设计与实现》读书笔记(七)- 中断处理【转】的更多相关文章

  1. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

  2. Linux内核设计与实现 读书笔记

    第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...

  3. Linux内核设计与实现读书笔记(8)-内核同步方法【转】

    转自:http://blog.chinaunix.net/uid-10469829-id-2953001.html 1.原子操作可以保证指令以原子的方式执行——执行过程不被打断.内核提供了两组原子操作 ...

  4. Linux内核设计与实现——读书笔记2:进程管理

    1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3 ...

  5. Linux内核设计与实现——读书笔记1:内核简介

    内核:有的时候被称管理者或者操作系统核心,通常内核负责响应中断的中断服务程序, 负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间德内存管理程序 和网络,进程间通信等系统服务程序共同组 ...

  6. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  7. Linux内核架构与底层--读书笔记

    linux中管道符"|"的作用 命令格式:命令A|命令B,即命令1的正确输出作为命令B的操作对象(下图应用别人的图片) 1. 例如: ps aux | grep "tes ...

  8. Linux内核设计与实现 总结笔记(第十章)内核同步方法

    一.原子操作 原子操作可以保证指令以原子的方式执行----执行过程不被打断. 1.1 原子整数操作 针对整数的原子操作只能对atomic_t类型的数据进行处理. 首先,让原子函数只接收atomic_t ...

  9. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  10. Linux内核分析 一二章读书笔记

    第一章 Linux内核简介 1.Unix (1)Unix系统很简洁 (2)在Unix中,所以东西都被当作文件对待,通过一套相同的系统调用接口来进行:open(),read(),write(),lsee ...

随机推荐

  1. 【Valid Number】cpp

    题目: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " = ...

  2. 搬瓦工VPS搭建PPTP VPN

    之前一直在用神器Lantern和Nydus(20元一个月),感觉还不错,但是各有各的不足! 于是开始自己动手折腾用VPS搭建VPN... 上网逛了一圈,最后选择了搬瓦工的VPS:512RAM,10G ...

  3. 推荐系统之LFM(二)

    对于一个用户来说,他们可能有不同的兴趣.就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawe ...

  4. 双栈排序 noip2008

    首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里, 当存在k使i<j<k,a[k]<a[i]<a[j]时,i,j是不能放在一个栈里的,需要一 ...

  5. JS语句循环(100以备奇偶数、100以内与7先关的数、100以内整数的和、10以内阶乘、乘法口诀、篮球弹起高度、64格子放东西)

    3.循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都 ...

  6. asp.net 分布式缓存

    之前Velocity已被 集成到App Fabric(包含有WCF监控==)中.   网络Velocity使用大多是针对老版本:  老版本的下载地址:  http://www.microsoft.co ...

  7. C/C++中内存区域划分大总结

    C++作为一款C语言的升级版本,具有非常强大的功能.它不但能够支持各种程序设计风格,而且还具有C语言的所有功能.我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分. 一. 在c中 ...

  8. ASP.NET MVC 应用提速的十种方法

    [编者按]本文作者为 DZone 社区的最具价值博主(MVB) Jonathan Danylko,主要介绍为 ASP.NET MVC 应用提速的十种方法.由国内 ITOM 管理平台 OneAPM 编译 ...

  9. 【☆】javascript数据类型拾遗

    一.Array对象 1.两个数组能用< > == ===做比较吗? 答:数组可以用> <进行矩阵比较,比如a=[1,2,3] b=[1,2,4],那么a<b,如果a的数值 ...

  10. Linux的别名使用

    直接定义别名 编辑当前用户下的.bashrc 文件: vim  ~/.bashrc 添加别名为 lmysql 的命令语句 : alias lmysql='mysql -uroot -p -Dtest ...