什么是中断?
在学习操作系统中,经常性的会看到中断这个概念,最典型的就是汇编代码中的int命令。
用一个比较通俗的概念来说,就是计算机会连接许多外接设备,包括磁盘、显示器、键盘鼠标等等,而如何处理这些输入呢?对于一个处理器来讲,程序运行的过程是一个不断取指执行的过程。如何响应设备也就是常说的I/O输入呢?一种简单的办法就是当我们有数据输入时,想处理器提出请求,处理器过来处理我们的输入,在回去执行原来的程序代码,这样的一个过程就叫做中断(Interrupt)。
如果同时有多个设备提出请求,那么CPU应该怎么样去处理呢?我们需要对这些中断有一个优先级的概念。这里就需要提到可编程中断控制器(PIC-Programmable Interrupt Controller),会对所有的中断进行判断并且选出最高优先级进行处理。这里值得注意的是中断不仅仅可以由硬件发出,同样也可以由软件发出,最典型的就是从磁盘中读取数据。对于软件以及硬件中断的不同以及CPU的处理过程如下图:
异常:又称为同步中断,是当指令执行时CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。在不失进程执行连续性的同时,按引起的异常的指令是否能重新执行,且依据它们被报告的方式,异常分为错误,陷阱,和终止三种情况。
错误:错误是一种通常可以能够被修正的异常,一旦修正,程序能够不失去连续性地接着执行。当报告错误发生时,处理器将机器状态恢复到执行错误之前的状态。错误处理例程的返回地址指向产生错误的指令,而不是错误指令之后的的那条指令。如页错误。
陷阱:当引起陷阱的指令发生时,马上产生该异常。陷阱允许程序不失去连续性的继续执行。陷阱处理例程的返回地址指向引起陷阱的指令的下一条指令(与错误本质上的区别)。如溢出。
终止:它并不总是报告产生异常的指令的确定位置,也不允许引起终止的进程或任务重新执行。如总线错误导致异常终止。
典型的非屏蔽中断源的例子是电源掉电,一旦出现,必须立即无条件地响应,否则进行其他任何工作都是没有意义的。
典型的可屏蔽中断源的例子是打印机中断,CPU对打印机中断请求的响应可以快一些,也可以慢一些,因为让打印机等待儿是完全可以的。
用户如果需要操作系统资源,则必须使用中断
用户程序和内核之间的交互主要是通过系统调用实现的,而内核和外部设备之间主要是通过硬中断
用户态、内核态以及其他内容我将会在其他的文章中做记录
什么是IDT(中断向量表)
中断描述符表IDT是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地址。内核在允许中断发生前,必须适当的初始化IDT
(1)16-31共16位是中断处理程序所在的段选择符。
(2)0-15位和48-64位组合起来形成32位偏移量,也就是中断处理程序所在段(由16-31位给出)的段内偏移。
(3)40-43位共4位表示描述符的类型。(0111:中断描述符,1010:任务门描述符,1111:陷阱门描述符)
(4)45-46两位标识描述符的访问特权级(DPL,Descriptor Privilege Level)。
(5)47位标识段是否在内存中。如果为1则表示段当前不再内存中。
中断产生之后发生了什么?(以键盘为例)
- 引起一个中断
- 通过APIC判断中断优先级,同时向CPU发送int信号
- CPU中断后去查中断向量表,找到对应处理中断的程序,程序调用对应的设备驱动与外部设备之间通信
一个设备的中断处理程序是它设备驱动程序的一部分。中断处理程序与其他内核的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。
Linux内核中断系统处理机制-详细分析
Linux中断和系统调用的解析
Linux内核完全注释
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)