第一、二期衔接——4.3 字符驱动设备—简述Linux中断处理体系结构

简述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中断处理体系框架

在这里插入图片描述

  1. 发生中断时,CPU进入异常,执行异常向量vertor_irq的代码。
  2. vertor_irq中,最终会调用中断处理的总入口函数asm_do_IRQ
  3. asm do IRQ根据中断号调用 irq_desc数组项中的 handle_ irq
  4. handle irq会使用chip成员中的函数来设置硬件,比如清除中断、禁止中断、重新使能中断等。
  5. handle irq逐个调用用户在 action链表中注册的处理函数。

所以,在实际编程中,需要初始化构造这些数据结构,

  • 比如 irq_desc数组项中的handle_ irq、chip等成员;
  • 用户注册中断时就是构造 action链表;
  • 用户卸载中断时就是从 action链表中去除不需要的项。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章