天天看点

Linux 中断1. 中断 定义2. 中断类型(分类)3 中断请求实现:上下半部机制4 断请求线/中断号5 中断上下文

Linux 中断

  • 1. 中断 定义
    • 1.1 背景(为什么需要中断)
    • 1.2 中断和信号
    • 1.3 中断本质及处理机制/流程
  • 2. 中断类型(分类)
    • 2.1 同步中断(异常/内部中断)
      • 2.1.1 同步中断举例:缺页中断
    • 2.2 异步中断(中断/外部中断)
      • 2.2.1 异步中断举例:网卡的工作原理
    • 2.3 中断与异常的区别
  • 3 中断请求实现:上下半部机制
    • 3.1 背景
    • 3.2 上半部:
    • 3.3 下半部:
    • 3.4 上下半部划分原则
    • 3.5 举例子: 用网卡来解释一下这两半。
  • 4 断请求线/中断号
  • 5 中断上下文

1. 中断 定义

中断是硬件在需要的时候向CPU发出信号,CPU暂时停止正在进行的工作,来处理硬件请求的一种机制。

具体说;

中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。

1.1 背景(为什么需要中断)

1.没有中断的话,CPU和外围设备之间协同工作/通信可能只有轮询这个方法:CPU定期检查硬件状态,需要处理时就处理,否则就跳过。

2.处理器的速度跟外围的硬件设备不在一个数量级上,因此提供一种机制让硬件在需要的时候向内核发出信号。

轮询的缺点/引入中断机制:

当硬件忙碌的时候,CPU很可能会做许多无用功(每次轮询都是跳过不处理)。

所以,为了提高CPU和外围硬件(硬盘,键盘,鼠标等等)之间协同工作的性能,引入了中断的机制。

1.2 中断和信号

中断: 硬件/进程发,内核收
信号:内核发,进程收
           

1.3 中断本质及处理机制/流程

中断本质是一种特殊的电信号

Linux 中断1. 中断 定义2. 中断类型(分类)3 中断请求实现:上下半部机制4 断请求线/中断号5 中断上下文

处理过程:

中断由硬件设备生成,并直接送入中断控制器(简单的电子芯片)的输入引脚中,中断控制器采用复用技术将多路中断管线只通过一个和处理器相连接的管线与处理器通信。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。硬件设备生成中断的时候并不考虑与处理器的时钟同步,即中断随时可以产生,因此内核随时可能因为新到来的中断而被打断。

2. 中断类型(分类)

Linux中通常分为外部中断(又叫硬件中断)和内部中断(又叫异常)。

2.1 同步中断(异常/内部中断)

同步中断(异常/内部中断):同步中断由CPU本身产生,又称为内部中断或异常

2.1.1 同步中断举例:缺页中断

CPU在执行一条指令时,如果发现他要访问的页(虚拟地址的页)没有在物理内存中,那么停止该指令的执行,并产生一个页不存在的异常

一个可执行文件可能很大,放在磁盘上,一次只将其中一部分读进内存(cpu局部性原理),

当他要访问剩余内容时,会产生缺页中断,这时候再去从磁盘上换进来

2.2 异步中断(中断/外部中断)

异步中断(中断/外部中断):异步中断是由外部硬件设备产生,又称为外部中断或中断

2.2.1 异步中断举例:网卡的工作原理

当网卡接受到数据包时,通知内核,触发中断,所谓的上半部就是,及时读取数据包到内存,防止因为延迟导致丢失,这是很急迫的工作。

读到内存后,对这些数据的处理不再紧迫,此时内核可以去执行中断前运行的程序,而对网络数据包的处理则交给下半部处理。

2.3 中断与异常的区别

异常与中断不同,中断是由硬件引起的;

异常则发生在编程失误而导致错误指令,或者在执行期间出现特殊情况必须要靠内核来处理的时候(比如缺页)。它在产生时必须考虑与处理器时钟同步,因此异常也称同步中断。

3 中断请求实现:上下半部机制

3.1 背景

中断处理程序运行需要快速执行(因为不可阻塞),同时要能完成尽可能多的工作,这里存在矛盾。

因此把中断处理切分为两个部分,上半部分(top half)接收到一个中断后立即执行,但是只做有严格时限的工作,例如对接收到的中断进行应答或复位硬件。能够被允许稍后完成的工作会推迟到下半部分(bottom half)去,此后在合适的时机下半部分会被中断执行,Linux提供了实现下半部分的各种机制。

优点:这种设计可以使系统处于中断屏蔽状态的时间尽可能的短,以此来提高系统的响应能力。

3.2 上半部:

中断处理程序是上半部——接受中断,他就立即开始执行,但只有做严格时限的工作。

上半部简单快速,执行时禁止一些或者全部中断。

工作内容:处理紧急功能,取寄存器状态。

3.3 下半部:

能够被允许稍后完成的工作会推迟到下半部去,此后,在合适的时机,下半部执行

工作内容:完成中断事件绝大多数任务。

下半部稍后执行,而且执行期间可以响应所有的中断。

下半部的实现有软中断实现, tasklet 实现和工作队列实现。

3.4 上下半部划分原则

1) 如果一个任务对时间非常敏感,将其放在中断处理程序中执行;
2) 如果一个任务和硬件有关,将其放在中断处理程序中执行;
3) 如果一个任务要保证不被其他中断打断,将其放在中断处理程序中执行;
4) 其他所有任务,考虑放置在下半部执行		
           

3.5 举例子: 用网卡来解释一下这两半。

当网卡接受到数据包时,通知内核,触发中断,所谓的上半部就是,及时读取数据包到内存,防止因为延迟导致丢失,这是很急迫的工作。

读到内存后,对这些数据的处理不再紧迫,此时内核可以去执行中断前运行的程序,而对网络数据包的处理则交给下半部处理。

4 断请求线/中断号

中断对应着一个中断号,内核通过这个中断号查找相应的中断服务程序。

每个中断都通过一个唯一的数字标志,这样操作系统才能够给不同的中断提供对应的中断处理程序。

这些中断值即中断请求线,例如IRQ 0是时钟中断、IRQ 1是键盘中断。对于连接在PCI总线上的设备而言,中断请求线是动态分配的。

5 中断上下文

中断服务程序不在进程上下文中执行,而是在一个与所有进程都无关的、专门的中断上下文中运行,以此保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出。

处理器在任何指定时间点上的活动必然属于以下三种情况之一:

运行于用户空间,执行用户进程;
运行于内核空间,处于进程上下文,代表某个特定的进程执行;
			 (CPU空闲时,内核执行空进程)
运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断;
           

详细请参考:

Linux:上下文,进程上下文和中断上下文概念

https://blog.csdn.net/lqy971966/article/details/119103989

参考:

https://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html

https://blog.csdn.net/windeal3203/article/details/44588205

https://blog.csdn.net/zhoutaopower/article/details/86506725

继续阅读