内核中断处理

中断取代了轮询的通知方式,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编号

时间: 2024-10-12 15:38:55

内核中断处理的相关文章

Linux内核中断处理体系分析

前一篇博文中:linux内核初始化阶段通过early_trap_init()函数完成了把异常向量拷贝到0xFFFF0000开始的地方,这些异常向量大部分指向通过vector_stub宏定义的那段代码,这段代码完成的主要工作是计算异常返回地址.保存现场.切换到svc模式.跳转执行汇编异常处理函数,汇编异常处理函数工作在svc模式,先接管上一异常模式保存的现场,然后调用C处理函数,C函数返回后执行一段汇编代码完成异常返回工作.这一系列的工作就是基于arm9处理器的内核异常处理的体系架构. linux

内核中断及按键驱动程序

寒假Linux学习笔记 2015年1月25日 晚 20:00 一.内核中断处理 进程上下文:应用程序主动调用内核驱动的程序的跳转 中断上下文:中断由硬件产生的,与应用程序无关 ? ? 1.注册中断 Int request_irq(unsigned int irq, ????????????//中断号 void (*handler)(int ,void *, struct pt_regs*),????//中断处理函数 unsigned long flags,????????????//与中断处理管

一种Linux下共享中断的处理方法

前段时间调试一款芯片的时候,碰到一个奇怪的问题:只要在板卡上插入一个PS2键盘,启动内核时系统就可能会进入串口中断函数去执行,过一会系统就panic不往下继续执行.后来经过分析出现问题时的panic的堆栈,借助EJTAG工具,读到这个时候的串口的中断状态位,竟然发现串口并没有真正产生中断.那么,串口本身没有中断,内核怎么又会跑到串口的中断服务函数去执行呢? 我们知道Linux的中断可以分为I/O 中断 .时钟中断和处理器核间中断.其中I/O中断是Linux 系统响应外部IO事件的重要方式.尽管不

高性能服务端漫谈

一.背景 进入多核时代已经很久了,大数据概念也吵得沸沸扬扬,不管你喜欢不喜欢,不管你遇到没遇到,big-data或bigger-data都必须正视. 处理大数据,基本都离不开分布式计算和分布式存储,这其中以hadoop最为使用广泛和经典. 分布式系统,就离不开计算系统.网络系统.文件系统和数据库系统. 这么多系统,之间又是如何协作的呢? 通讯过程又是如何保障高性能的呢? 1.单处理器 在以前的单核心cpu下,我们要实现文件I/O.网络I/O,可以妥妥的使用单线程循环处理任务. 但是如果想"同时&

字符设备之中断按键

从题目就可以意会到这一节还是关于字符设备的驱动,不过是另一种技巧:中断.这个词一点都不陌生. 一.先来分析今天的重量级函数request_irq(),看看他的函数原型就行了,先不进行深入分析. int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev_id); 关键是参数的意义: ①irq:中断号,在irqs.h中定义,每一条中断线上面对应一个中

记一次php高负载问题排查经历

在最近一次项目中,后台跑了deamon来处理任务.之前一直没什么问题,在一次增加任务处理时间等监控上报后,deamon的机器出现高负载,平均在20以上,任务出现积压. 第一步先使用strace查看系统调用情况: strace -tt -T -c -p 31420 strace -c发现,系统时间主要耗费在rt_sigprocmask上,该函数是系统的信号屏蔽函数,一般使用在信号处理程序中,对信号进行屏蔽,保证信号处理程序不被打断.rt_sigprocmask为linux的系统调用函数,不对外直接

非常好!!!Linux源代码阅读——中断【转】

Linux源代码阅读——中断 转自:http://home.ustc.edu.cn/~boj/courses/linux_kernel/2_int.html 目录 为什么要有中断 中断的作用 中断的处理原则 Linux 中断机制 中断控制器 中断描述符 中断数据结构 中断的初始化 内核接口 中断处理过程 CPU 的中断处理流程 保存中断信息 处理中断 从中断中返回 编写中断处理程序 软中断.tasklet与工作队列 上半部与下半部 软中断 tasklet 工作队列 1 为什么要有中断 1.1 中

高性能大并发server的基础

一.背景 进入多核时代已经很久了,大数据概念也吵得沸沸扬扬,不管你喜欢不喜欢,不管你遇到没遇到,big-data或bigger-data都必须正视. 处理大数据,基本都离不开分布式计算和分布式存储,这其中以hadoop最为使用广泛和经典. 分布式系统,就离不开计算系统.网络系统.文件系统和数据库系统. 这么多系统,之间又是如何协作的呢? 通讯过程又是如何保障高性能的呢? 1.单处理器 在以前的单核心cpu下,我们要实现文件I/O.网络I/O,可以妥妥的使用单线程循环处理任务. 但是如果想"同时&

《Linux内核设计与实现》读书笔记(七)- 中断处理【转】

转自:http://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html 中断处理一般不是纯软件来实现的,需要硬件的支持.通过对中断的学习有助于更深入的了解系统的一些底层原理,特别是驱动程序的开发. 主要内容: 什么是中断 中断类型 中断相关函数 中断处理机制 中断控制方法 总结 1. 什么是中断 为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制. 没有中断的话,CPU和外围设备之间协同工作可能只有轮询