简述Linux中断处理体系结构
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:《嵌入式Linux应用开发手册》、《嵌入式Linux应用开发手册第2版》、https://blog.csdn.net/juS3Ve/article/details/81437432
- 开发环境:Linux 2.6.22.6 内核、arm-linux-gcc-3.4.5-glibc-2.3.6工具链
目录
一、栈
在介绍Linux中断处理体系结构之前,先来介绍一下栈。
1、概念
"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
栈,是一个线性表(数据结构),具有先进后出的特点。
2、场景举例
在中断的时候,我们通常需要到栈来进行保存现场的工作,下面通过一个场景来具体感受下栈的作用。
场景:在函数A中调用函数B
funA()
{
//funB()之前的其他操作
funB();
//funB()之后的其他操作
}
执行过程:
图画描述:
图片来自:《嵌入式Linux应用开发手册第2版》
文字解释:
①、在执行funA()
中的funB()之前的其他操作
的指令时,根据翻译的汇编码正常执行。
②、当funB()之前的其他操作
的指令执行完毕后,进入到funB()
函数中,此时
{
首先:把funB()之前的其他操作
的指令的结果、数据、寄存器入栈,保存在程序A的栈中(瞬间完成);
之后:执行funB()
函数,把结果、数据、寄存器入栈,保存在程序B的栈中;;
最后:funB()
函数执行完毕后(是否释放B栈资源看具体程序),把栈A中保存的结果、数据、寄存器重新拿出来;
}
③、执行funB()之后的其他操作
的指令。
二、Linux对中断处理的演进
1、中断分类
在Linux系统中,对中断进行了拓展了,分为你了硬件中断和软件中断。
1.1 硬件中断
硬件中断是一个异步信号,表明需要注意,,或需要改变在执行一个同步事件。硬件中断是由与系统相连的外设(比如网卡 硬盘 键盘等)产生的.。
1.2 软件中断
软中断的处理类似于硬中断,但是软中断仅仅由当前运行的进程产生。
2、中断处理原则
2.1 不能嵌套
中断处理函数需要调用 C 函数,这就需要用到栈。
场景:假设中断 A 正在处理的过程中,假设又发生了中断 B,那么在栈里要保存 A 的现场,然后处理 B。在处理 B 的过程中又发生了中断 C,那么在栈里要保存 B 的现场,然后处理 C。如果中断嵌套突然暴发,那么栈将越来越大,栈终将耗尽,系统会崩溃。
所以,为了防止这种情况发生,也是为了简单化中断的处理,在 Linux 系统上中断无法嵌套:即当前中断 A 没处理完之前,不会响应另一个中断 B(即使它的优先级更高)。
抛转:在中断的下半部分可以相应其他中断。
(参考资料:《嵌入式Linux应用开发手册第2版》、https://blog.csdn.net/juS3Ve/article/details/81437432)
2.2 越快越好
在单芯片系统中,假设中断处理很慢,那应用程序在这段时间内就无法执行:系统显得很迟顿。
在中断的处理过程中,该 CPU 是不能进行进程调度的,所以中断的处理要越快越好,尽早让其他中断能
3、中断的上半部与下半部
假如处理一个中断所消耗的时间过长,那么对于整个系统来说,给人的感觉就是很卡顿的(特别是对于可视化应用),所以Linux就引出了中断的上半部与下半部这个概念。
3.1 中断的上半部
在关中断(无法处理其他中断)的状态下,在关中断下处理紧急的事情。
3.2 中断的下半部
在开中断(中断允许打断)的状态下,处理非紧急的事情。
整个流程如下:假如在A中断的下半部发生了B中断,则B中断结束后,回到A中断下半部,此时A、B中断的下半部,是汇集在一起处理的。
三、Linux中断处理体系框架
- 发生中断时,CPU进入异常,执行异常向量
vertor_irq
的代码。 - 在
vertor_irq
中,最终会调用中断处理的总入口函数asm_do_IRQ
。 asm do IRQ
根据中断号调用irq_desc
数组项中的handle_ irq
。handle irq
会使用chip
成员中的函数来设置硬件,比如清除中断、禁止中断、重新使能中断等。handle irq
逐个调用用户在action链表
中注册的处理函数。
所以,在实际编程中,需要初始化构造这些数据结构,
- 比如
irq_desc
数组项中的handle_ irq、chip
等成员; - 用户注册中断时就是构造 action链表;
- 用户卸载中断时就是从 action链表中去除不需要的项。