linux内核对中断的处理方式
中断取代了轮询的通知方式,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
linux内核对中断的处理方式的更多相关文章
- Linux内核实现中断和中断处理(二)
第一部分移步传送门召唤!!:http://www.cnblogs.com/lenomirei/p/5562086.html 上回说了Linux内核实现中断会把中断分为两部分进行处理,上回讲了上部分,这 ...
- 再思linux内核在中断路径内不能睡眠/调度的原因(2010)【转】
转自:http://blog.csdn.net/maray/article/details/5770889 Linux内核中断路径中不能睡眠,为什么? 这里就行了很深入的讨论,值得一看:http:// ...
- 深入理解Linux内核-中断和异常
Linux内核代码查看 http://androidxref.com/ 中断:被定义位一个事件,它能改变处理器执行指令的顺序.它对应硬件(CPU.其他硬件设备)电路产生的电信号. 同步中断:指令执行时 ...
- 理解Linux内核之中断控制
乍一看下边的Linux内核代码,貌似L3389有bug,于是我就绕有兴趣地阅读了一下local_irq_save/local_irq_restore的源代码. /* linux-4.14.12/mm/ ...
- Linux 内核PCI 中断
对于中断, PCI 是容易处理的. 在 Linux 启动时, 计算机的固件已经分配一个唯一的中 断号给设备, 并且驱动只需要使用它. 中断号被存储于配置寄存器 60 (PCI_INTERRUPT_LI ...
- Linux内核实现中断和中断处理(一)
Linux实现中断处理 内核是怎么知道应用程序要调用系统调用的呢?或者说应用程序怎么通知系统内核自己需要执行一个系统调用,这是通过软中断实现的,通过引发一个异常来促使系统切换到内核态去执行异常处理程序 ...
- Linux 内核睡眠的几种方式
译至:http://geeki.wordpress.com/2010/10/30/ways-of-sleeping-in-linux-kernel/ 在Linux中睡眠有2-3种不同的方法. 睡眠的第 ...
- linux内核debug的一种方式:procfs
#include <linux/module.h> #include <linux/compat.h> #include <linux/types.h> #incl ...
- Linux 内核中断内幕
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...
随机推荐
- 解决Oracle监听错误的一种办法
1:事出有因 安装oracle数据库,默认安装的是orcl数据库,安装完成后查看了一下字符集是gbk的,由于业务需要al32utf8的字符集,所以需要修改字符集,但是修改却无效.于是就删除了默认的or ...
- MongoDB 基础命令 (MongoDB Shell)
1.我们 mongodb 安装成功后,用上一篇的方法启动 mongodb服务 然后使用 mongodb shell 来做数据库的增删改查 2.创建数据库 语法: use 数据库名称 案例: > ...
- GO!自制一款【不丑】的名片
大概每一个人都有自己的名片.也见过不少名片. 我敢打赌,你常常认为很多名片"不咋地".尽管不是全部人都具备一定的审美眼光,但实际上每一个人都具备较高的"审丑"眼 ...
- ubuntu——Kconfig、.config、Makefile的关系
原文地址:http://blog.csdn.net/estate66/article/details/5886816 ,本人对此文有改进. 当我们编写完一个驱动后,我们要把它以模块形式编译或者直接编译 ...
- 【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- js特效,轻松实现内容的无缝平滑滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...
- HTTP管线化技术--ajax请求
1.管线化技术——客户端可以发送多次请求到服务端,而不需要等待上一次请求得到响应的时候才能进行下一次请求.实现并行发送请求 2.ajax——实现网页异步刷新 问题:当用户进行多次ajax请求的时候,并 ...
- 【iOS开发-25】UIDevice查看系统信息,从一个问题開始怎样高速找到自己想要的属性和方法并看懂它
如果须要解决的问题:写代码时遇到一种情况,就是须要推断iOS版本号,可能低版本号和高版本号须要增减一些代码,此时.怎样推断iOS版本号? (1)第一步.当然度娘.输入"iOS 推断系统版本号 ...
- SeeSharpTools.JXI.DSP.Spectrum 使用
_spectrumTask.Average.Mode = SeeSharpTools.JXI.DSP.Spectrum.SpectrumAverageMode.PeakHold; // NoAvera ...
- 硬盘Raid
一.raid什么意思? RAID是“Redundant Array of Independent Disk”的缩写,raid什么意思了?说白了,中文翻译过来通俗的讲就是磁盘阵列的意思,也就是说RAID ...