中断和异常

名词缩写:

PIC:可编程终端控制器

IRQ  line:中断请求线

I/O APIC:I/O高级可编程控制器

TPR:可编程任务优先级寄存器

IDT:中断描述符表

GDT:全局描述符表

ISR:中断服务例程



中断通常分为同步和异步两种

同步中断是当指令执行时由CPU控制单元产生。之所以成为同步,是因为只有一条指令终止执行后CPU才会发出中断

异步中断是由其他硬件设备依照CPU时钟信号随机产生的、

 

每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。所有现有的IRQ线都与一个名为可编程终端控制器(PIC)的硬件电路输入淫叫相连。PIC的执行下列动作:

1、监视IRQ线,检查产生的信号。如果有两条或以上的IRQ线上产生信号,就选择引脚编号较小的IRQ线。

2、如果一个引发信号出现在IRQ线上:

a、把接收到的引发信号转换成对应的向量

b、把这个向量存放在中断控制器的一个I/O端口,从而允许CPU通过数据总线读此向量

c、把引发信号发送到处理器的INTR引脚,即产生一个中断。

d、等待,直到CPU通过把这个中断信号写进可编程中断控制器的一个I/O端口来确认它,当这种情况发生时,请INTR线。

3、返回到第1步。


可以对PIC编程,从而禁止IRQ,即告诉PIC停止对给定的IRQ线发布中断,或者激活它们。禁止的中断是丢失不了的,一旦重新激活,PIC又把它们发送到CPU。这个特点允许中断处理程序逐次处理同一类型的IRQ。

 

传统PIC由两篇8259A风格的外部芯片以“级联”的方式连接在一起。

从奔腾3开始引入了一种名为I/O高级可编程控制器(I/O APIC)的新组件。

与8259A的IRQ引脚不同,中断优先级并不与引脚号相关联:中断重定向表中的每一项都可以被单独编程以指明中断向量和优先级、目标处理器及选择处理器的方式。重定向表中的信息用于把每个外部IRQ信号转换为一条消息,然后,通过APIC总线把消息发送给一个或多个本地APIC单元。


中断请求以两种方式在可用CPU之间分发:

静态分发:根据重定向表相应项列出的本地APIC,利记传送到指定的CPU中。

动态分发:如果处理器正在执行最低优先级的进程,IRQ信号就传递给这种处理器的本地APIC。每个本地APIC都有一个可编程任务优先级寄存器(TPR),TPR用来计算当前运行进程的优先级。内核通过每次进程切换对这个寄存器进行修改。

 

当执行一条指令后,取下一条指令前,控制单元会检查在运行前一条指令时是否已经发生了一个中断或异常。如果是,则执行下列操作:

1、确定与中断或异常关联的向量i

2、读有idtr寄存器指向的IDT(中断描述符表)中的第i项

3、从gdtr寄存器获得GDT(全局描述符表)的基地址,并在GDT中查找,以读取IDT表项中的选择符所标识的段描述符。这个描述符指定中断或异常处理程序所在段的基地址。

4、确信中断是由授权的(中断)发生源发出的。把当前特权级CPL与段描述符(存放在GDT中)的描述符特权级DPL进行比较

5、检查CPL是否不同于所选择的段描述符的DPL。

6、如果故障已发生,用引起异常的指令地址装载cs和eip寄存器,从而使得这条指令能再次被执行。

7、在栈中保存eflags、cs及eip的内容(用于中断返回)

8、如果异常产生了一个硬件出错码,则将它保存在栈中。

9、装载cs和eip寄存器,其值分别是IDT表中第i项描述符的段选择符和偏移量字段。这些值给出了中断或者异常处理程序的第一条指令的逻辑地址。

 

内核控制路径可以任意嵌套:一个中断处理程序可以被另一个中断处理程序“中断”。中断处理程序必须永不阻塞,即中断处理程序运行期间不能发生进程切换。

 

大多数异常只在CPU处于用户态时发声。然而,缺页中断异常发生在内核态。

 

一个中断处理程序既可以抢占其他的中断处理程序,也可以抢占异常处理程序。相反,异常处理程序从不抢占中断处理程序。在内核态中唯一能触发的异常是缺页中断,但中断处理程序从不执行可以导致缺页中断的操作。

 

内核启动后,把IDT表的初始地址装到idtr寄存器,并初始化表中的每一项。

 

执行异常时,大部分函数把硬件出错码和异常向量保存在当前进程的描述符中,然后向当前进程发送一个适当的信号。

异常处理程序刚一终止,当前进程就关注这个信号。该信号要么在用户态由程序自己的处理程序处理,要么由内核来处理。


在PCI总线的体系结构中,几个设备可以共享一个IRQ线。

中断处理程序以两种不同的方式实现

IRQ共享:中断处理程序执行多个中断服务例程(ISR)。每个ISR是一个与单独设备(共享IRQ线)相关的函数。因为不可能预先知道哪个特定的设备产生IRQ,因此,每个ISR都被执行,以验证它的设备是否需要关注。如果是,当设备产生中断时,就执行需要执行的所有操作。

IRQ动态分配:一条IRQ线在可能的最后时刻才与一个设备驱动程序相关联:这样,即使几个硬件设备并不共享IRQ线,同一个IRQ向量也可以由这几个设备在不同是可使用。

 

中断处理程序正在运行时,相应的IRQ线上发出的信号就被暂时忽略。中断处理程序代表进程正在执行,所以它代表的进程必须总处于TASK_RUNNING状态。因此,中断处理程序不能执行任何阻塞过程。

紧急的操作:如对PIC答应中断,对PIC或设备控制器重编程,或者修改由设备和处理器同时访问的数据结构。需要在中断处理程序中立即执行,而且实在禁止可屏蔽中断的情况下。

非紧急的:修改那些只有处理器才会访问的数据结构(如按下一个键后读扫描码)。需要在中断处理程序中立即执行,但必须在开中断的情况下。

非紧急可延时的:可由独立的函数来完成。

 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值