中断与中断处理程序(一)

疑问:

1.设备,中断线,中断处理程序联系,异常与中断的区别
2.中断上下文与进程上下文
3.嵌套中断
4.共享中断处理程序的编写
5.基于内核2.6.3分析中断处理机制的实现概述
6.中断子系统框架概述 (待续)
7.中断控制(内核版本2.6)(待续)

结语:

异常:处理器产生的同步中断(在处理器处理失误代码造成执行错误指令的时候(分母为0),或者在执行期间出现特殊情况(缺页),必须由内核处理,处理器产生一个异常)
中断:由硬件产生的异步中断

中断线 对应同一个中断处理程序或多个(中断线共享),并非与设备一一对应,一个设备可以产生多个中断,又想中断处理程序运行快,工作量又大,这个矛盾体得去权衡,基于此提出了上部分(TH)和下部分(BH)中断处理程序属于上部分,中断产生立即执行,它一般负责对接收的中断进行应答和复位硬件。能够被允许稍后完成的工作会推迟到下部分去执行,linux提供针对下部分的各种机制(下回分解)

注意
进程上下文均可睡眠,中断不可以睡眠;
原因:进程存在current宏与其关联(current宏,是一个全局指针,指向当前进程的struct task_struct结构体,即表示当前进程),此外因为进程是以进程上下文的连接进内核中的,因此进程上下文可以睡眠的,也可以调用调度程序。而中断无后备进程,也就无法对其重新调度,自然也就不可以睡眠,详细理解参考中断上下文与进程上下文

注意
针对request_irq 可能睡眠,因此不可以在中断上下文或者不允许阻塞的进程对其进行调用,常见错误:在睡眠不安全的的上下文中调用request_irq 函数
解析源码原因如下:
request_irq 在注册的过程会在/proc/irq 创建一个与中断对应的项,函数proc_create 就是用来创建这个procfs项的,而proc_create对新的procfs项进行配置,proc_create 会调用 kmalloc 来请求分配内存,而kmalloc是可以睡眠的。

分支之中断子系统概述

HW层面逻辑架构
中断子系统SW软件逻辑架构
内核中断子系统大致可以分为四层,深入了解请参考中断子系统
1.硬件无关的代码,我们称之Linux kernel通用中断处理模块。无论是哪种CPU,哪种controller,其中断处理的过程都有一些相同的内容,这些相同的内容被抽象出来,和HW无关。此外,各个外设的驱动代码中,也希望能用一个统一的接口实现irq相关的管理(不和具体的中断硬件系统以及CPU体系结构相关)这些“通用”的代码组成了linux kernel interrupt subsystem的核心部分,对应目录/kernel/kernel/irq。
2.CPU architecture相关的中断处理。 和系统使用的具体的CPU architecture相关,对应目录下的kernel/arch/arm/kernel。
3.Interrupt controller驱动代码 。和系统使用的Interrupt controller相关,对应目录kernel/drivers/irqchip/。
4.普通外设的驱动。这些驱动将使用Linux kernel通用中断处理模块的API来实现自己的驱动逻辑。

分析之中断处理机制的实现概述

基于上文中硬件层面的逻辑图,想必大家也是知道中断子系统依赖于cpu架构,所使用中断控制器requestline在激动的情况下,中断控制器就会把找中断电信号发往处理器,处理接收,停止正在做的事,然后跳转到内存预定义的位子上去执行,这个预定义的位置由内核设置,是中断处理程序的入口,这类似于系统调用通过预定义的异常句柄进入内核,每一条request line处理器会调到指定的位置,这样内核就知道接收的irq号了。

嵌套中断

针对中断嵌套:
当一个中断处理程序执行时,相应的中断线在所有的处理器上都会被屏蔽,为防止系统在同一处理上接收一个新的中断,通常其它的中断线是打开的,所有不同中断线上的中断可以被处理,但当前中断线是被禁止的,由上可得,同一中断处理程序绝对不会被同时调用以处理嵌套的中断

共享中断处理程序的编写

按照如下三点要求编写

1.request_irq 的参数flags必须设置为IRQF_SHARED
2.每个注册的中断处理程序中的dev参数必须唯一,常用唯一的设备指针,不可给共享的中断处理程序传NULL,不同于非共享中断的处理程序的编写
3.中断处理程序能够区分确实是它对应的设备产生了中断,即需要硬件支持也需要,也要中断处理程序有相关的处理逻辑。
指定IRQF_SHARED标志以调用request_irq 时 只有在以下两种情况下可以成功
(1)当前中断线未注册
(2)中断线已注册中断程序都指定了IRQF_SHARED

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值