文章目录
一、系统中断概念
早期计算机各个程序只能串行执行、系统资源利用低。为了解决上述问题,人们就发明了操作系统,引入了中断机制,实现了多道程序的并发执行,提高了系统资源的利用率。中断是多程序并发执行的前提条件。
举个例子:
你在家打了一天的游戏或者看了一天的电影,突然你饿了,你就点了个外卖,然后接着打游戏,等着外卖。外卖小哥突然敲门,这时候你第一步要执行的动作肯定是暂停游戏,而外卖小哥敲门的行为其实就是申请中断请求。此时中断处理程序就会来处理两件事,一件事就是执行挂起游戏这个进程,接着将吃东西这个进程唤醒。当中断处理程序执行结束,就会将执行挂起的打游戏进程恢复。
二、硬中断和软中断
操作系统的中断存在硬中断和软中断
-
硬中断
由与系统相连的外设(例如网卡、硬盘)自动产生的。主要是用来通知操作系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。 -
软中断
为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间
就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。 -
硬中断和软中断的区别
-
软中断是执行中断指令产生的,而硬中断是由外设引发的。
-
硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
-
硬中断是可屏蔽的,软中断不可屏蔽。
-
硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
-
软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
三、用户态和内核态
当一个进程执行系统调用而需要内核代码去执行,就称为内核态。此时处理器就处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核态。当进程执行用户自己的代码时,则称其处于用户态。
内核态和用户态是操作系统的两种运行级别,这个和CPU没有必然的联系。CPU提供了Ring0-Ring3四种级别的运行模式,Ring0级别最高,Ring3级别最低。Linux将Ring3级别作为用户态,Ring0级别作为内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间。Linux进程的4GB地址空间,3G-4G部分大家时共享的,是内核态的地址空间,这里存放的是内核的代码、数据和所有内核模块。
用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件读写,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作;这时,就会切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。
用户态切换到内核态的3种切换方式
- 系统调用:当用户进程通过系统调用申请使用操作系统提供的服务来完成工作时,就要切换到内核态来处理。
- 异常:当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序,也就转到了内核态。
- 外围设备的中断:当外围设备完成用户请求操作,会向CPU发起相应中断信号,这时CPU会暂停当前执行的指令,转而执行该中断信号对应的处理程序,如果先前执行的指令是用户态的程序,那么这个转换的过程自然也就发生了由用户态到内核态的转换。
四、系统中断,内核做了哪些事?
每个硬件都对应一个中断处理程序。向CPU发送中断请求,cpu中有一个进程c在运行,进程c会将当前的瞬时数据保存到进程描述符。进程c就会从用户态切换到内核态。此时 cpu就可以执行硬件的处理程序,当处理完成,进程c就可以根据当前在进程描述符记录的位置继续恢复执行。
五、硬件中断触发的过程(8259A芯片中断控制器的工作流程)
图中cpu的INTR就代表是一个中断引脚,用于接收中断信号,但每个引脚不可能对应一个硬件,硬件有很多,肯定不够用,因此就会有一个中断控制器去控制。
1.中断控制器
用来连接硬件设备,可以连接多个设备,例如图上所示,中断控制器还可以实现级联,可以再拿一个中断控制器连接到另一个中断控制器上面。
2. 中断控制器工作流程
当硬件发起中断请求,首先中断请求寄存器就会保存中断请求信号,这个中断请求寄存器可能同时会保存好几个硬件设备的中断请求信号,假设我们这个cpu只有一颗,那只能处理一个中断请求,所以就会通过优先级解析器对要处理的中断请求排个优先级, 然后正在服务寄存器保存的就是正在处理的中断请求,当cpu处理完成当前的这个中断请求,正在服务寄存器的值就会清空,然后处理下一个优先级最高的中断请求。