中断和异常

1.中断定义:

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

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

同步中断:当指令执行时由CPU的控制单元产生。同步是指只有在一条指令终止执行后CPU才会发出中断。同步中断又称异常。

异步中断:其他硬件设备依照CPU时钟信号随机产生。

2.中断信号的作用

中断信号使得处理器转而去运行正常控制流之外的代码。当中断信号到达时,CPU必须停止当前正在做的事,并且切换到一个新的活动。为了做到这一点,就要在内核态堆栈保存程序计数器的当前值(eip 和 cs 寄存器),并把与中断相关的一个地址放进程序计数器。

中断切换和上下文切换(进程切换)的异同:

上下文切换是发送在内核用一个进程替代另一个进程。而中断处理是切换内核的控制路径。

 

中断处理是内核执行的任务之一,需要有如下约束:

  • 内核的目标就是让中断尽可能快的处理完,尽其所能把更多的额处理向后推迟。内核相应中断后需要进行的操作分为两部分:关键紧急的部分立即执行,其余推迟部分内核随后执行。
  • 中断处理程序必须编写成使相应内核控制路径能以嵌套的方式执行,当最后一个内核控制路径终止时,内核必须能恢复被中断进程的执行。
  • 中断虽然可以嵌套,但是在临界区中中断必须禁止。

 

3.中断和异常的分类:

中断:

  • 可屏蔽中断:处于屏蔽状态的中断控制单元可以忽略它。
  • 非屏蔽中断:非屏蔽中断总是由CPU辨认,只有危急时间比如硬件故障才会引起屏蔽中断。

 

异常:

异常又分为处理器探测异常 和 编程异常。

处理器探测异常:当CPU执行指令探测到一个反常条件所引起的异常。可进一步分为三组,由CPU控制单元产生异常时保存在内核态堆栈eip寄存器中的值决定。

  • 故障fault:通常可以纠正,一旦纠正,程序可以不失连贯性的情况下重新开始,eip中的值时引起故障的指令地址,当异常处理程序终止时,那指令会被重新执行。
  • 陷阱trap:在陷阱指令执行后立即报告,内核把控制权返回给程序后就可以继续它的执行而不失连贯性。保存在eip中的值是一个随后要执行的指令地址,只有当没有必要重新执行已终止的指令时,才触发陷阱。陷阱的主要用途是为了调试程序。
  • 异常终止abort:发生了严重错误,控制单元出现问题,从而不能在eip寄存器中保存引起异常指令所在的确切位置。常用于报告严重的错误,比如硬件故障或系统表中的无效值或不一致的值。

编程异常:

在编程者发出请求时发生,由int 或者 int3指令触发。编程异常又称为软中断,常用于执行系统调用以及给调试程序通报一个特定的事件。

 

3.1 IRQ和中断

IRQ:每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。现在所有的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连。

可编程中断控制器执行下列动作:
1.监视IRQ线,检查产生的信号。

2.若有一个引发信号出现在IRQ线上:

  • 把接收到的引发信号转换成对应的向量。
  • 把这个向量存放在中断控制器的一个I/O端口,从而运行CPU通过数据总线读取此向量。
  • 把引发信号发送到处理器的INTR引脚,即产生一个中断。
  • 等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它,当这种情况发生时,清除INTR线。

3.返回第一步

 

3.2中断请求在CPU之间并发方式

静态并发:IRQ信号传递给重定向表相应项中所列出的本地APIC,中断立即传递给一个特定的CPU,或一组CPU,或所有CPU。

动态并发:如果处理器正在执行最低优先级的进程,IRQ信号就传递给这种处理器的本地APIC。

 

4.中断描述符表

中断描述符表IDT是一个系统表,与每一个中断或异常向量相联系,每一个向量在表中有相应的中断或异常处理程序的入口地址。

IDT包含三种类型的描述符:

任务门 task gate:当中断信号发生时,必须取代当前进程的TSS选择符存放在任务门中。

中断门 interrupt gate:包含段选择符和中断或异常处理程序的段内偏移量。当控制权转移到一个适当的段时,处理器清除IF标志,从而关闭将来会发生的可屏蔽中断。

陷阱门 trap gate:与中断门相似,只是控制权传递到一个适当的段时处理器不修改IF标志。

 

当执行了一条指令时,cs和eip这对寄存器包含下一条将要执行的指令的逻辑地址。

 

5  中断和异常处理程序的嵌套执行

每个中断或异常都会引起一个内核控制路径,当I/O设备发出一个中断时,相应的内核控制路径的第一部分指令就是把那些寄存器的内容保存在内核堆栈的指令,而最后一部分指令就是恢复寄存器内容并让CPU返回到用户态的那些指令。

内核控制路径可以任意嵌套,一个中断处理程序可以被另一个中断处理程序中断,因此引起内核控制路径的嵌套执行。

允许内核控制路径的嵌套执行必须付出代价:中断处理程序必须永不阻塞,即中断处理程序运行期间不能发生进程切换。

  • 中断处理程序可以抢占其他的中断处理程序,也可以抢占异常处理程序。
  • 异常处理程序从不抢占中断处理程序。

 

linux交错执行内核控制路径的原因:(在多处理器上,多个内核控制路径可以实现真正并发)

  • 提高可编程中断控制器和设备控制器的吞吐量。
  • 实现一种没有优先级的中断模型,因为每个中断处理程序都可以被另一个中断处理程序延缓。

 

6.异常处理

CPU产生的大部分异常都由Linux解释为出错条件。当其中一个异常发生时,内核就像引起异常的进程发送一个信号向它通知一个反常条件。

异常处理程序由以下三部分组成:

在内核堆栈中保存大多数寄存器的内容。

用高级C函数处理异常。(执行异常处理程序的C函数总是由 do_前缀和处理程序名组成)

使用ret_from_exception函数从异常处理程序退出。

7.中断处理

三种主要的中断类型:I/O中断,时钟中断,处理器间中断。

7.1 I/O中断

I/O 中断处理程序必须足够灵活以给多个设备同时提供服务。

所有I/O中断处理程序都能执行四个相同的基本操作:

  1. 在内核态堆栈中保存IRQ的值和寄存器的内容。
  2. 为正在给IRQ线服务的PIC发送一个应答,这将运行PIC进一步发出中断。
  3. 执行共享这个IRQ的所有设备的中断服务列程(ISR)。
  4. 跳到ret_from_intr()的地址后终止。

7.1.1 IRQ在多处理器系统上的并发

Linux遵循对称多处理模型SMP,即内核本质上对任何一个CPU都不该偏爱,因而内核试图以轮转的方式把来自硬件设备的IRQ信号所在的所有CPU之间分发。因此,所有CPU服务于I/O中断的执行时间片几乎相同。

7.1.2 多种类型内核栈

内核使用三种类型内核栈:

异常栈:用于处理异常。

硬中断请求栈:用于处理中断。

软中断请求栈:用于处理可延迟函数。

7.2处理器间中断处理

处理器间中断允许一个CPU向系统中的其他CPU发送中断信号。处理器间中断IPI不是通过IRQ线传输的,而是作为信号直接放在链接所有CPU本地APIC的总线上。

 

8 软中断及tasklet

软中断:表示可延迟函数的所有种类。

软中断的分配时静态的,在编译时定义,而tasklet的分配和初始化可以在运行时进行。

软中断可以并发的运行在多个CPU上,因此软中断时可重入函数并且必须明确的使用自旋锁保护其数据。

而tasklet总是被串行的执行。

 

可延迟函数可以执行4中操作:

初始化:定义一个新的可延迟函数。

激活:标记一个可延迟函数为挂起(在可延迟函数的下一轮调度中执行)

屏蔽:由选择的屏蔽一个可延迟函数,这样即使被激活内核也不执行它。

执行:执行一个挂起的可延迟函数和同类型的其他所有挂起的可延迟函数。

 

9. 工作队列

可延迟函数和工作队列非常相似,但是还有区别。

可延迟函数运行在中断上下文中,而工作队列中的函数运行在进程上下文中。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值