深入理解Linux内核之中断和异常

中断通常定义为一个事件,该事件改变处理器执行的指令顺序,这样的事件与CPU芯片内外部硬件电路产生的电信号相对应.

中断通常分为同步中断和异步中断:

  • 同步指一条指令终止执行之后CPU才会发出中断
  • 其他硬件设备依照CPU时钟信号随机产生的

同步和异步中断分别称为异常和中断

中断和异常的区别

中断--外中断,由于外部设备事件引起的中断,异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常.

异常--内中断,CPU内部事件所引起的中断,如程序出错(非法指令,地址越界)中断则是由于系统中某事件引起的,该事件与现行指令无关

总结而言,中断由外因引起,而异常由CPU本身原因引起

中断的引入:为了支持cpu和设备之间的并行操作,设备完成输入/输出后,让cpu决定如何去处理之后的事情

异常的引入:cpu执行指令本身出现的问题

中断信号的作用

当一个中断信号达到的时候,CPU必须停止它当前正在做的事情.并且切换到一个新的活动.要在内核态堆栈保存程序计数器的当前值(eip和cs寄存器内容),并且把中断类型相关的一个地址放进程序计数器.

中断处理与进程切换的差异:

中断或者异常处理的代码不是一个进程,而是一个内核控制路径.

内核控制路径比一个进程要轻,上下文更少,切换上下文花费比切换进程要少

中断和异常

中断
  • 可屏蔽中断

IO设备发出的所有中断请求都可以产生可屏蔽中断.可屏蔽中断可以处于两种状态:屏蔽的或者非屏蔽的

可屏蔽中断可以处于两种状态:屏蔽的或者非屏蔽的

只要中断还是屏蔽的,控制单元就会忽略他

  • 非屏蔽中断

由cpu辨认,只有硬件故障才会引起非屏蔽中断

异常

(EIP寄存器,用来存储CPU要读取指令的地址)

处理器探测异常

  • 故障
    保存在eip中的值是引起故障的指令地址,因此当异常处理程序终止的时候,那条指令就会被重新执行.

  • 陷阱
    保存在eip中的值是一个随后要执行的指令地址
    陷阱的主要用途是为了调试程序,只有当没有必要重新执行已经终止的指令的时候才会触发陷阱

  • 异常中止
    控制单元出了问题,不能在eip寄存器中保存引起异常的指令所在的确切位置

编程异常

也叫做软中断,用途是执行系统调用以及给调试程序通报一个特定的事件.
每个中断和异常都是由0-255的一个数来进行标识的,这8bit无符号证书就叫做向量.非屏蔽中断向量和异常的向量是固定的,而可屏蔽中断的向量可以通过中断控制器的编程来改变.

异常:
内核必须为每种异常提供一个专门的异常处理程序.
对于某些异常,cpu控制单元会在开始执行异常处理程序之前产生一个硬件出错码,然后压入内核态堆栈.

中断描述符表

中断描述符表(Interrupt Descriptor Table IDT)

每一个中断或者异常向量都在中断描述符表中由相应的处理程序的入口地址.

表中每一项对应一个中断或者异常向量,每个向量由8个字节组成.

  • 任务门
    中断信号发生的时候,必须取代当前进程的那个进程的TSS选择符放在任务门中.

  • 中断门

  • 陷阱门

Linux利用中断门处理中断,利用陷阱门处理异常

ref

https://blog.csdn.net/qq_29996285/article/details/88078939

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值