中断取代了轮询的通知方式,DMA取代了轮询的读写数据方式。

分类
软件指令造成的中断(又叫异常,同步中断)。    svc, und, abt
硬件通过中断请求信号造成的中断(异步中断)。  irq,fiq

向量中断和非向量中断
采用向量中断的CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不同中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后再通过软件判断中断标志来识别具体是哪个中断。
向量中断由硬件提供中断服务程序的入口地址,非向量中断由软件提供向量中断服务程序入口地址。

中断的特点
1)中断随机的。
2)中断是可恢复的。
3)中断是自动进行处理的。

linux中断分为顶半部和底半部两部分。
顶半部中断不可嵌套,中断被禁止。代码尽量短,处理重要事情,在中断处理函数asm_do_irq()中完成。
底半部中断处理,可嵌套,有三种处理方式:
1)SOFTIRQ (需重新编译内核,不推荐)。
2)TASKLET小任务(中断上下文),不能睡眠。
3)workqueue工作队列(进程上下文,可休眠)。

中断处理函数以共享方式注册时,要设置设备id,否则设备注册不成功。
独享方式时,设备id为NULL。

共享中断返回IRQ_NONE, IRQ_HANDLED.
do_irq()(x86)  <====> asm_do_irq() (arm)

中断顶半部函数,禁止中断,不可嵌套(通过request_irq()申请)
中断处理函数是被硬件请求执行的内核代码,所以它属于中断上下文。
在中断上下文中绝对不允许出现睡眠或者可能睡眠的代码,否则会死机。
睡眠代码:ssleep(), msleep()。
可能造成睡眠的代码:
kmalloc(2048, GFP_KERNEL);  //内存不足时可能睡眠,不能用于中断中。
kmalloc(2048, GFP_ATOMIC);  //内存不足时不睡眠,直接返回错误码,可以用在中断中。
copy_to_user(),copy_from_user(); //可能睡眠,不允许用在中断中。

使能中断只能enable_irq().
禁止中断disable_irq(), 中断内调用disbale_irq_nosync()。

tasklet在linux/interrupt.h中定义,属中断上下文,不能访问0-3G空间,不能用copy_to_user()函数。

工作队列属进程上下文,其执行晚于中断处理函数和tasklet,可休眠。
工作队列workqueue被进程[events/0] PID=5调用。  0为CPU编号

参考:

http://webjs.blog.sohu.com/300913581.html

tasklet_workqueue

linux内核对中断的处理方式的更多相关文章

  1. Linux内核实现中断和中断处理(二)

    第一部分移步传送门召唤!!:http://www.cnblogs.com/lenomirei/p/5562086.html 上回说了Linux内核实现中断会把中断分为两部分进行处理,上回讲了上部分,这 ...

  2. 再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】

    转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http:// ...

  3. 深入理解Linux内核-中断和异常

    Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时 ...

  4. 理解Linux内核之中断控制

    乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...

  5. Linux 内核PCI 中断

    对于中断, PCI 是容易处理的. 在 Linux 启动时, 计算机的固件已经分配一个唯一的中 断号给设备, 并且驱动只需要使用它. 中断号被存储于配置寄存器 60 (PCI_INTERRUPT_LI ...

  6. Linux内核实现中断和中断处理(一)

    Linux实现中断处理 内核是怎么知道应用程序要调用系统调用的呢?或者说应用程序怎么通知系统内核自己需要执行一个系统调用,这是通过软中断实现的,通过引发一个异常来促使系统切换到内核态去执行异常处理程序 ...

  7. Linux 内核睡眠的几种方式

    译至:http://geeki.wordpress.com/2010/10/30/ways-of-sleeping-in-linux-kernel/ 在Linux中睡眠有2-3种不同的方法. 睡眠的第 ...

  8. linux内核debug的一种方式:procfs

    #include <linux/module.h> #include <linux/compat.h> #include <linux/types.h> #incl ...

  9. Linux 内核中断内幕

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...

随机推荐

  1. 初始小R-安装启动与测试

    非常感谢<深入浅出数据分析>这本书让我有幸认识了R,多多少少的弥补了我心里对R语言.R分析.R工具的模糊认知,下面我们就来体验一下R语言的魅力吧!GO! 一:下载R R官方地址:http: ...

  2. Visual Studio 2015年预览设置: 辅助安装程序说明

    本文介绍了第三方应用程序安装辅助安装的 Visual Studio 2015年预览时安装的说明.如果您安装了多设备开发功能,您需要使用其他第三方软件来处理这些项目.辅助安装程序允许您将部署到您的计算机 ...

  3. C经典之9-system,if,do,while---ShinePans

    #include <stdio.h> #include <conio.h> #include <stdlib.h> //system(); 这个指令须要用到此头文件 ...

  4. 软件调试工具——GDB

    1.GDB调试器概述 GDB是GNU开源组织发布的一个强大的程序调试工具,具有查看程序运行状态.设置断点.查看表达式.显示变量等众多功能,是程序员进行Linux编程必须要掌握的一种调试技术. GDB调 ...

  5. Vagrant up Warning: Authentication failure. Retrying...

    Vagrant up Warning: Authentication failure. Retrying... Vagrant up Warning: Authentication failure. ...

  6. getAttribure()和getParameter()的区别

    1.getAttribute是取得jsp中 用setAttribute设定的attribute 2.parameter得到的是string:attribute得到的是object 3.request. ...

  7. IOS+openCV在Xcode的入门开发(转)

    看这篇文章之前先看看这个地址:OpenCV iOS开发(一)——安装 昨天折腾了一天,终于搞定了openCV+IOS在Xcode下的环境并且实现一个基于霍夫算法的圆形识别程序.废话不多说,下面就是具体 ...

  8. 【LeetCode】111. Minimum Depth of Binary Tree (2 solutions)

    Minimum Depth of Binary Tree Given a binary tree, find its minimum depth. The minimum depth is the n ...

  9. 【转载】IIS6、IIS7、IIS7.5设置拒绝一组计算机(IP段)访问网站的方法

    IIS6设置方法: 1.打开IIS管理器,右键点击网站,选择“属性” 2.把标签切换到“目录安全性”,点击“IP地址和域名限制”的编辑按钮,如下图: IP地址和域名限制 3.选择“授权访问”,然后点击 ...

  10. C#指南,重温基础,展望远方!(13)C#泛型

    一.什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能. 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样.但我们没有办法,只能 ...