文章中图片来源于网络,侵权告删。
源头:
1.中断:来源于外设(键盘、鼠标、网卡、声卡、显卡等),外部事件
(异步:应用程序不知道什么时候产生)
(持续,但是对用户程序是透明的)
如时钟中断控制CPU上进程的切换,键盘中断、磁盘中断等。
2.异常:应用程序意想不到的行为,不是应用程序主动想产生的(除0操作、访问越界等),内部事件
(同步:执行到特定的指令一定会产生,如除0指令)
(将异常的程序杀死、或者重新执行异常程序,说不定下一次就不会触发异常)
3.系统调用:应用程序请求操作提高服务,应用程序主动要求产生的(对硬件资源的访问)
(同步或者异步:执行到特定的指令一定会产生,如Int 0x80指令)
(发出系统调用请求是同步的,返回时可能是异步,正常情况是同步的)
(用户等待服务完成,继续向下执行)
返回同步的情况:用户申请读内存,内核去读,然后将数据返回给客户,这个过程中用户一直阻塞等待
返回异步的情况:用户申请读内存,内核去读,然后将数据返回给客户,不同的是客户在这个过程中
去做其他事情了,内核完成操作后,会给用户发送异步的消息,告诉用户数据读取完毕
一、处理器的状态基础(也叫模式)
1.CPU = 控制器 + 运算器 + 寄存器 + 高速cache+MMU(存储管理单元)
2.寄存器的分类:
用户可见寄存器:由高级语言编译器优化算法分配使用,为减少访问内存的次数
控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用
(这是我们关注的重点)
二、控制和状态寄存器:
作用:
用于控制处理器的操作,如PC控制CPU执行哪条指令;
在某个特权级别下可以访问、修改
常见的控制和状态寄存器:
程序计数器:PC 记录将要执行的指令的地址
指令寄存器:IR 记录最近取除的指令
程序状态字:PSW 记录处理器的运行状态如条件码、模式、控制位等信息
三、操作系统需要的CPU状态(MODE)
1.内核态:运行内核代码
2.用户态:运行用户代码
在X86系统中,分为实模式和保护模式
其中实模式的中断处理和普通的过程调用没什么区别
指令系统划分:
特权指令:只能由操作系统使用
非特权指令:操作系统和用户都可以使用
特权指令:启动IO、内存清零、修改程序状态字、设置时钟、允许/禁止中断、停机等
非特权指令:控制转移、算术运算等
X86系统支持4个处理器特权级别:
R0:特权最高,可以直接访问所有资源;
R3:特权最低,必须通过系统调用陷入内核,才能访问资源,也就是通过操作系统访问。
linux实际上只选择了0和3两个特权级别。
用户态->内核态途径:唯一的途径是中断/异常/陷入机制
内核态->用户态途径:修改设置程序的状态字PSW即可
四、特殊的指令—访管指令(陷入指令):
内核态有时也被称为管理态,所以访问或者陷入内核 又被称为访管。
用户态->内核态途径:唯一的途径是中断/异常/陷入机制
陷入指令 == 访管指令
提供给用户程序的接口,用于切换到内核态,用于调用操作系统的功能
常见的有:int trap syscall sysenter/sysexit
五、中断和异常机制概念:
有句话这样说: ”操作系统是由中断驱动的,事件驱动的“
主要作用:
1.及时处理设备发来的请求
2.捕获用户程序提出的请求
3.防止用户程序有意或者无意的破坏活动
…
中断/异常的概念:
1.定义:CPU对系统发生的某个事件做出的一种反应。
2.发生中断/异常CPU做什么反应:
1.暂停正在执行的程序
2.保留现场后自动转去执行相应事件的处理程序
(这里”自动“指的是 硬件去处理该异常或者中断)
3.处理完成后返回断点,继续执行被打断的程序
3.中断和异常的引入:
中断的引入:为了支持CPU和设备之间的并行操作
设备通过中断 的 方式 向CPU”报告“自己的事情做完了,让CPU决定处理之后的事情
异常的引入:表示CPU执行指令时本身出现的问题
如算术溢出、除零、地址越界、执行了陷入指令,此时CPU暂停当前工作,
转到错误处理程序或者执行系统调用
早期,中断和异常不作区分,也就是说,大概上可以混为一谈。
4.事件分类(中断+异常):
中断:也叫外中断
一般有I/O中断、时钟中断(定时器、时间片)、硬件故障(笔记本没电)
异常:也叫内中断
常见的有系统调用、页故障(如缺页异常)、保护性异常(越界访问)、断点指令(单步调试)
程序性异常(算术除零、算术溢出等等)
5.总结中断和事件的区别:
中断:都是一些CPU外部的事件引起的,是程序所不期望发生的
异常:由CPU正在执行的指令引发
异常包括:陷入+ 故障 + 中止
六、中断和异常机制原理:硬件与软件相互配合
1.硬件做什么:捕获中断源发出的中断/异常请求,然后将控制权交给处理器去执行特定的处理程序;(捕获响应)
2.软件做什么:执行处理程序。(处理)
3.中断寄存器:
4.中断向量表:
是一个内存单元,存放中断处理程序的入口地址和程序运行时所需处理机的状态字。
事先编写好这些中断处理程序,然后将入口地址存放在中断向量表中,并进行编号。
Linux的中断向量表:
前面提到了,X86系统的分为实模式和保护模式:
其中 实模式 使用的表就叫中断向量表
保护模式 使用的向量表 换了个名字 叫中断描述符表
采用门描述符数据结构表示中断向量,本质上没什么太大差别
5.中断处理程序:
设计操作系统时,为每一类的中断/异常事件提前编号相应的处理程序,并设置好中断向量表。
基本流程:
系统运行被打断,去响应中断,中断硬件部件 将CPU控制权交给中断处理程序
(软件提前设置好,硬件机制来执行)
在中断处理程序中:
1.保存相关寄存器信息
2.分析中断/异常的具体原因
3.执行对应的处理功能
4.恢复现场,返回被事件打断的程序
六、实例