中断与异常原理总结

核心态:在处理器的存储保护中,核心态,或者特权态(与之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问

用户态:用户态(user mode)在计算机结构指两项类似的概念。在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患

简单来说就是核心态是操作系统内部的程序(管理程序。即管程),它能执行所有的特权指令 和用户态指令。用户态就是用户程序执行的环境(用户态不能执行特权指令),用户程序想要对外设,存储器等进行管理(即企图执行相应的特权指令进行外设,存储器的管理) 必须使用操作系统提供的接口。即调用系统调用,这个时候发生中断,执行陷入指令(访管指令)陷入内核态,然后使用管程提供的服务(由操作系统执行特权指令)之后再从系统调用返回到用户态。

例如,用户点击启动一个程序,QQ什么 游戏之类的,这个时候就会执行创建一个进程的指令,创建进程必须由操作系统完成创建相应PCB等操作, 即这个时候用户企图去执行创建进程的特权指令。用户程序就会调用系统调用(即操作系统提供给用户程序的接口)产生中断,进入内核态创建进程,完成内存的 分配等等工作再返回到应用程序。

再例如,一个 C语言程序中使用了printf()输出语句,这个函数里就会执行系统调用,产生中断,进入内核态将数据打印到显示屏上,相当于应用程序调用了操作系统已经封装好了的函数,可见封装在计算机中是无处不在,就和我们调用C语言已经封装好了的print()一样不需要考虑其内部是怎么样实现,系统调用也一样,如何将数据打印到显示屏上不需要用户关心,操作系统已经写好了这样的程序(这是特权指令) 你所要做的只是调用这个函数。

总之,在 用户程序中,凡是与资源有关的操作如存储分配,进行IO传输以及文件管理,进程管理以及进程之间的通信,都必须通过系统调用的方式向操作系统提出请求进入内核态,让操作系统完成。

操作系统由用户态进入到核心态的途径非常多,分为中断和异常,中断也称外中断,异常也称内中断。

外中断主要是指与当前执行的指令无关的事件,比如外部设备发出的IO结束中断,表示外部的输出输入已经完成 ,请求下一步指示,比如键盘输入一个字母 也会引起外部中断,CPU得切换到内核态执行中断服务程序 来接收键盘输入的数据。时钟中断等等都是外部中断。

异常也称内中断,陷入,就是指和当前指令有关的事件,比如除法零操作数,算数溢出,java中的系统异常类(自定义的不算),基本都是内中断,还有缺页中断也是内中断。因为他是执行到那一条指令,可能操作数所在的逻辑地址所在的页还未调入内存当中,会产生内中断并将该页调入内存,这些属于强迫内中断,并不是用户主动想进入内核态的,而是发生了意外才中断。还有专门的陷入指令,比如文件的read(),C中的printf()以及系统需要创建一个进程等等,这些都是属于用户企图去执行一条特权指令,首先会执行陷入指令,陷入内核态,这些都是属于自愿中断。

在用户态能使用的指令不可能是特权指令。

中断的具体细节:

第一步:用户企图执行一条特权指令,中断,CPU响应中断后,通过硬件中断机制进入中断服务程序(这里便是内核态程序了)

硬件中断机制为中断隐指令,完全由硬件完成。它完成的操作是:

1.关中断,为了保存现场CPU内部寄存器的值的过程中不被其他中断打断,(被打断则中断处理完成后无法中断返回到原来正在执行的程序)必须关中断。

2.保存断点:为了能使中断服务程序完成之后能够返回到原来正在执行的程序的正在执行的指令,要将程序计数器(PC)的值压入栈中。

3.取出中断服务程序的入口地址(中断向量)传到PC中。硬件会自动将中断向量地址传到CPU,由CPU实现进程的切换。

第二步:执行完第一步中断隐指令后,进入中断服务程序。

中断服务程序完成的操作如下:

1.保存现场:将CPU中重要寄存器的信息(因为里面存放着当前进程局部变量等等重要信息的值),如程序状态字寄存器中的值保存

2.开中断,若是支持多重中断(中断嵌套)才执行此步,即允许在进行设备服务(见第3点)的时候被其他优先级更高的中断打断,转去处理优先级更高的中断。处理完之后再回来执行被打断的进程的设备服务。

3.执行中断服务(设备服务),这里是具体的设备服务内容,例如printf 在这里是将数据打印到屏幕上,或者是接收键盘输入的数据传送到CPU,等等设备服务。

4.关中断,若是支持多重中断(中断嵌套)在第2步开了中断才执行此步,因为第5步要恢复现场,不能被打断,否则原来被打断的程序的现场丢失(例如局部变量的值丢失)。

5.恢复现场:将原来第1步保存的寄存器的值恢复。

第三步:中断返回,在第一步中断隐指令的第2步中保存在栈中的PC寄存器的值弹出到PC中,使其返回原来程序的断点位置,继续执行。

 

 

 

你可能感兴趣的:(中断与异常原理总结)