1.中断概念

  中断时一种电信号,由硬件设备产生,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知操作系统已经产生中断。不同的设备,对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。

2.Linux2.6中断处理原理

  - 获取中断号:中断处理程序的第一步要做两件事:

    * 将中断号压栈

    * 将当前寄存器信息压栈

  - 中断串行化:将多个cpu同时产生的某一中断进行串行化

  - 关中断条件下的中断处理:中断处理函数总是在关中断的情况下进行

  - 开中断条件下的软中断

  - 开中断下的tasklet:软中断很少直接被使用,开中断情况下进行的处理过程一般是由tasklet机制完成

3.Linux中断处理程序架构

  - Linux系统将中断程序分成上半部和下半部:

    * 顶半部:完成尽可能少,比较紧急的功能。往往只是简单读取寄存器中的中断状态并清除中断标志后就进行登记中断工作

    * 底半部:中断处理大部分工作都在底半部完成。主要机制有:tasklet, 工作队列, 软中断

  - tasklet

    * 定义tasklet机器处理器,并将两者关联

void my_tasklet_func(unsigned long)
DECLARE_TASKLET(my_tasklet, my_tasklet_func, data)

    * 调度

      tasklet_schedule(&my_tasklet)

  - 工作队列

    * 定义一个工作队列

      struct work_struct my_work;

      void my_wq_functon(struct work_struct *work);

    * 在初始化函数中通过INIT_WORK()初始化工作队列并将工作队列与处理函数绑定

      INIT_WORK(&my_work, (void *)my_wq_func);

    * 在适当的地方调度工作队列,一般在中断的上半部调度

      schedule_work(&my_work);

  - Linux 2.6中断API

    * request_irq:向内核注册一个中断服务函数

    * free_irq:从内核注销一个中断服务函数

    * disable_irq:关闭指定中断,并等待中断服务函数运行结束才会返回

    * disable_irq_nosync:关闭指定中断,不等待中断服务函数结束,调用完该函数立即返回

    * enable_irq:打开指定中断

  - 中断共享:指多个设备共享一根中断线的情况,中断共享使用方法如下:

    * 在申请中断时,使用IRQF_SHARED标志

    * 在中断到来时,会遍历共享此中断的所有中断处理程序

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

  1. Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层【转】

    转自:http://blog.csdn.net/droidphone/article/details/7497787 在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本 ...

  2. linux网络设备驱动程序

    4.linux网络设备驱动程序体系结构 -------------------------------------- | 数据包发送 | 数据包接收 | ----->网络协议接口层 | dev_ ...

  3. 15.linux按键驱动程序(二)

    linux按键驱动程序 包含内容定时器延时去抖动,阻塞型设备驱动设计 一.定时器延时去抖 按键所用开关为机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,开关不会马上稳定地接通或断开.因而 ...

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

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

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

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

  6. Linux中断(interrupt)子系统

    Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理 ...

  7. Linux中断分层技术

    一.中断嵌套  当系统正在执行某中断处理函数时,又产生了一个新的中断,这就叫做中断嵌套.当中断为慢速中断时,新的中断会取代当前中断,即当前中断没有执行完就结束 了:当中断为快速中断时,新的终端就不会产 ...

  8. Linux中断管理 (2)软中断和tasklet

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  9. Linux中断管理 (3)workqueue工作队列

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

随机推荐

  1. Oracle中真正稳妥的求三甲的方法

    坐地铁回家路上忽然想起,三甲排名可能为多个,只取三名岂不荒谬.不信请看下面数据: create table tb_score( id number(4,0) primary key, name nva ...

  2. [oracle/Sql]怎样比较两表的差异?

    比如有这么一个表: create table test02( id number(8,0) primary key, name nvarchar2(20), sal number(5,0) ) 可以这 ...

  3. 操作DOM对象

    操作DOM对象 目录 操作DOM对象 1. 核心 2. 获得Dom节点 3. 更新节点 1. 操作文本 2. 操作CSS 4. 删除节点 5. 插入节点 1. 追加(将已存在的节点移到后面) 2. 创 ...

  4. 鼠标移到图片上图片放大【css3实例】

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. ansible使用,常用模块

    使用ansible管理其他主机有两种方式: 1.命令行执行ansible ad-hoc命令 2.把要做的动作行为写入一个文件[playbook脚本],ansible读取脚本自动完成相应的任务. Ans ...

  6. 突然虚拟机无法联网解决办法,且报错Failed to start LSB: Bring up/down

    使用sudo service network restart去启动网络时起不来 使用systemctl status network.service查看网络状态也是failed,且报错Failed t ...

  7. python中反射 getattr(对象,'方法')()和hasattr(对象,'方法')

    getattr(对象,'方法')():从一个对象里面找到里面的方法,,, 传了一个对象,再传一个字符串,就能找到这个字符串的方法 hasattr(对象,'方法') 判断这个对象里面有没有这个方法,返回 ...

  8. Linux下用户的创建与删除

    我们在Linux下创建用户主要有两种方式:adduser和useradd,它们的区别以及主要用法如下: adduser adduser的用法很简单,只需adduser+username即可,如下: s ...

  9. 科普-- 白话HTTPS

    HTTPS是传输协议吗? HTTPS与HTTP有什么关系? HTTPS为什么会安全? 闲扯一下 Mac笔记本.Windows台式机.Linux主机.像这三种类型,它们硬件不同,系统不同,服务端处理的编 ...

  10. Oracle学习(二)SQL高级--表数据相关

    SQL高级语句 top / limit / rownum / percent (前XXX条数据) --top(SQL Server / MS Access) select top 条数 from 表; ...