中断:也叫异步中断,是由外设产生的。
异常:也叫同步中断,是由CPU产生的,是指令执行过程中产生的。
中断信号的作用:中断信号提供了一种特殊的方式,使处理器转而去运行正常控制流之外的代码。
1 中断和异常的分类
中断:
- 可屏蔽中断:如果可屏蔽中断masked置位,则cpu忽略它
- 不可屏蔽中断:表示这个中断不可忽略,cpu必须识别并处理它
异常:
- 故障(fault):eip指向发生故障的指令,当异常处理程序终止时,重新执行eip所指向的指令。
- 陷阱(trap):eip指向下一条指令,当异常处理程序终止时,执行eip指向的下一条指令。
- 异常中止(abort):发生一个严重错误,异常处理程序会强制终止当前进程。
- 编程异常:也叫软中断
2 IRQ
外设和PIC(可编程中断控制器)的连线,称为IRQ线。
PIC的I/O端口通过数据总线和CPU的INTR引脚相连
PIC的作用:
- 监视IRQ线
- 如果一个IRQ线上有引发信号,则把这个引发信号转换为对应的向量。
- 把这个向量存放在PIC的I/O端口,从而允许CPU通过数据总线读取此向量
- 引发信号到达CPU的INTR引脚,产生一个中断。
- 等待CPU的中断应答。当CPU处理了中断后,会将确认信号写到PIC的一个I/O端口。PIC读取此确认信号,清INTR线。
- 返回第1步
IRQ线是从0开始编号的,默认的向量号是IRQ+32.
3 IDT(中断描述符表)
中断描述符表存放中断描述符。每一个中断描述符8字节。因为系统中最多256个中断向量,所以,中断描述符表最大为256*8=2048字节。
中断描述符类型:任务门、中断门、陷阱门。linux利用中断门处理中断,利用陷阱门处理异常。其格式如下所示:
4 中断和异常的硬件处理
cs可eip寄存器包含了下一条将要执行的指令的逻辑地址。如果发生一个中断或异常,那么控制单元执行下列操作:
- 确定中断向量i
- 读取由idtr寄存器指向的idt表中的第i项,获取到段选择符和偏移量
- gdtr寄存器获取gdt的基地址。并根据上一步获取的段选择符和偏移量定位到gdt中的某一项。这一步是确定中断或异常处理程序的地址。
- 保存上下文,具体是原进程的eflags、cs、eip入栈,其中eip中的指令是中断处理程序退出时需要执行的原代码中的下一条指令
- 硬件出错码入栈
- 装在中断处理程序的cs和eip寄存器,其值分别是idt表中第i项的段选择符和偏移量。这些值给出了中断或异常处理程序第一条指令的地址。
可参考:https://www.cnblogs.com/zhenjingcool/p/15999402.html,这篇文章介绍了0.11内核中断和异常处理过程。
5 中断和异常处理程序的嵌套执行
我们可以这样理解中断或者异常,每个中断或者异常其实是当前进程的一部分,或者说代表了当前进程在内核态执行的一些指令序列。
每个中断或者异常都会引起一个内核控制路径,内核控制路径可以任意嵌套,一个中断处理程序可以被另一个中断处理程序“中断”。
需要注意的是,中断处理程序必须永不阻塞,换句话说,中断处理程序运行期间不能发生进程切换。也就是说中断处理程序不能做任何耗时操作,必须小巧而精妙,耗时的操作需要放在其他地方执行,发生中断时,必须立即处理,然后立即应答。
事实上,内核控制路径恢复执行时需要的所有数据都存放在当前进程的内核态堆栈中。
待续...
标签:eip,中断,第三版,指令,处理程序,内核,linux,异常 From: https://www.cnblogs.com/zhenjingcool/p/16757043.html