890 likes | 1.06k Views
第 7 章 中断与异常. 7.1 概述. 7.1.1 中断、异常、中断向量. 1. 中断与异常概念. 中断 是在程序执行过程中,为了响应从硬件发来的信号而随机产生的事件。系统硬件使用中断来处理外部事物,比如外设的请求。软件也能够通过执行 INT n 指令来产生中断。. 当处理器检测到执行一条指令时的错误,比如除 0 错、保护侵犯、缺页故障、内部机器故障等,就会产生 异常 。当内部硬件错误和总线错误被检测到时,有机器检查功能的处理器( Pentium , P6 , Pentium 4 , Core 及以后)也会产生机器检查异常。. 中断结束. 中断请求. 中断响应.
E N D
7.1 概述 7.1.1 中断、异常、中断向量 1.中断与异常概念 中断是在程序执行过程中,为了响应从硬件发来的信号而随机产生的事件。系统硬件使用中断来处理外部事物,比如外设的请求。软件也能够通过执行INT n指令来产生中断。 当处理器检测到执行一条指令时的错误,比如除0错、保护侵犯、缺页故障、内部机器故障等,就会产生异常。当内部硬件错误和总线错误被检测到时,有机器检查功能的处理器(Pentium,P6,Pentium 4,Core及以后)也会产生机器检查异常。
中断结束 中断请求 中断响应 中断服务 中断处理 2.中断大致过程: 中断到来的时候,CPU暂停现行程序,转而处理随机到来的事件,待处理完后再回到被暂停的程序继续执行。 中断处理的隐操作:程序状态及程序断点地址的进栈及出栈。
3.中断系统其他功能: 支持多中断源和多种中断源。 支持中断屏蔽处理。 支持中断嵌套处理。 支持中断优先级修改。 支持中断结束方式选择。
4.中断向量号、中断向量 为了处理异常和中断,每一个IA-32/Intel 64体系定义的异常和每一个需要特殊处理的中断类型都被分配了唯一的识别号,该识别号称之为中断向量号。 对每个异常或中断而言,处理器都有相应的中断处理程序,而中断向量就是中断处理程序的入口地址。 • 中断向量号允许的范围是0~255 • 0~31号向量被Intel 64和IA-32用作体系结构内部定义的异常和中断。 • 32~255号向量作为用户定义的中断,这些中断通常安排给外部I/O设备,使这些设备能够利用外部的某一种硬件中断机制(比如8259A中断控制器)向处理器发出中断请求。 • 作为INT n指令引发的软件中断,其向量号可以在0~255的范围。
7.1.2 中断源及中断类型 1.外部中断 • Pentium及以上的处理器外部中断通过处理器外部引脚或者本地APIC获得 • Pentium之前的处理器,中断信号直接从INTR和NMI引脚引入 • Pentium之后的处理器,主要的中断引脚是LINT[1:0],它们连接到本地APIC • 如果处理器内本地APIC被禁止时,LINT[1:0]引脚分别被配置为INTR和NMI引脚 • 如果本地APIC被使能时,LINT[1:0]引脚能够通过APIC的本地向量表编程去关联任一个处理器的异常和中断向量 • 外部中断又可分为可屏蔽中断和不可屏蔽中断。 APIC是高级可编程中断控制器,是从Pentium处理器开始被引入的面向多处理器及多核系统的中断控制器,由处理器中的本地APIC,PCH中的I/O APIC以及两者之间的连线构成。
SIO LPC47B27X SERIRQ 中断向量号 IRQx … PCH 北桥 PIRQx INTR CPU 1.外部中断 1)可屏蔽中断(如键盘 、鼠标,串口,并口打印机等) 属性:硬件、可屏 蔽、向量。 中断请求:多个中断请求的排队和判优由中断控制器完成,产生的中断请求信号送到CPU的INTR引脚或本地APIC 。 中断向量号:通过数据总线送到CPU中。 EFLAGS寄存器的IF位影响CPU对中断请求的响应。 处理器在当前指令执行结束的时候启动中断识别INTA总线周期。
1.外部中断 2)不可屏蔽中断 属性:硬件、不可屏蔽、向量。 中断请求:中断请求的信号送到CPU的NMI引脚或本地APIC 。 中断向量号:固定为2。 CPU不需要进行中断识别,直接处理中断。 NMI由0跳变到1以后要维持至少4个连续的处理器时钟周期的高电平才被识别。 NMI由1跳变到0以后要维持至少4个连续的处理器时钟周期的低电平,新的NMI中断才能被识别。
2.软件中断 属性:软件、不可屏蔽、向量。 中断请求: INT n是使用非常广泛的软件中断指令。 中断向量号: INT n的第二字节n给出指令指定的中断向量号 BIOS中断:I/O设备控制、实用服务、特殊中断、专用参数中断。 DOS中断:公开/未公开、可调用、系统功能。 自由中断:未定义(20H~3FH中未使用的中断)。 CPU不需要进行中断识别,直接处理中断。
7.1.3 异常源及异常类型 1.异常源 • 处理器检测到的程序错误产生的异常 • 处理器在执行应用程序或操作系统期间检测到程序错误,会产生一个或多个异常 • IA-32/Intel 64结构为每一个“处理器可检测”的异常指定了一个向量号 • 机器检测异常 • P6家族和Pentium处理器提供了内部和外部机器检测机制用于检查内部芯片硬件和总线事务的操作 • 当发现机器检测错误,处理器发出一个机器检测异常并返回一个错误号
1.异常源 • 软件产生的异常 • INTO是溢出异常指令,如果EFLAGS.OF=1,同时又执行INTO指令,则将产生向量号为4的异常中断 • INT 3是断点异常指令,它是一条单字节指令,常被放在需要放置断点的指令前面。实际上,很多调试程序都是利用INT 3指令来完成断点跟踪功能的 • BOUND指令是边界检查指令,它具有两个操作数:第一个操作数用来指定存放数组索引的寄存器;第二个操作数必须是存储器操作数,其第一个字是数组下标的下限,第二个字是数组下标的上限。BOUND指令执行时将检查数组的索引值,若小于下限或大于上限,则将发生向量号为5的异常中断
2. 异常的属性与种类 属性:软件、不可屏蔽、向量。 中断请求:指令执行中产生。 中断向量号:CPU规定。 故障(失效):错误在指令完成前,错误指令的CS:EIP压栈。该指令会重做。 陷阱:错误在指令完成后,错误指令下一指令的CS:EIP压栈。 中止:不保存,重启机器。 CPU不需要进行中断识别,直接处理中断。
7.2 Intel 8259A 7.2.1 8259A主要任务 • 接受外部的中断请求; • 管理所有外部的中断请求(排队、判优、屏蔽、嵌套); • 向CPU产生中断请求INTR信号及中断向量号; • 进行中断结束处理; • 接受CPU命令及返回状态。
7.2.2 8259A引脚及内部结构 1.8259A引脚 CPU侧: CS#; DB0~DB7; RD#、WR#、A0; INT、INTA#; 外设侧: IR0~IR7; 级联: SP#/EN#、 CAS0~CAS2。
… D0 D7 ISR编码 ≥1 中断屏蔽寄存器IMR 中断请求寄存器IRR IR0 比 较 器 B0 B1 B2 A>B A0 A1 A2 中断请求优先级编码器 & INT … … & & & & & & & & IR7 接口电路:CPU接口、I/O接口。 内部逻辑:IRR、IMR、PR、ISR及控制电路。 中断请求过程:IR->INT。
CPU响应可屏蔽中断条件: 当前指令执行完毕; EFLAGS中IF=1; INTR信号有效。 中断响应过程:8259向CPU送中断向量号。 第一个INTA#,CPU封锁总线(LOCK#有效),8259A最高优先级请求对应ISR位置位,对应IRR复位。 第二个INTA#,总线解锁,ALE无效,8259A将当前中断服务程序对应中断向量号送到数据总线上。 ISR的复位在自动结束/非自动结束时不一致。 回ICW3
级联方式结构: 级联2 级联1 级联3
3.8259A工作方式 中断请求方式: 边沿触发方式:正跳变向8259A请求中断。 电平触发方式:高电平向8259A请求中断,响应中断后要及时清除高电平。 查询中断方式: 外设向8259A请求中断,并将请求状态保存在状态寄存器中等待CPU来查询。 PC机初始化为边沿触发,非查询中断方式
连接总线与级联方式: 非缓冲方式:小系统中,8259A数据线直接连系统数据总线,不需要总线缓冲器,此时SP#/EN#表示级联时主/从关系。 主片:SP#/EN#接高电平; 从片:SP#/EN#接低电平。 缓冲方式:大系统中,数据总线都具有总线缓冲器,此时SP#/EN#表示数据传送方向,级联时主/从关系通过软件设定ICW4来决定。 PC机初始化为非缓冲方式
屏蔽方式: 缺省特性:自动屏蔽低于自己优先级的IR。 正常屏蔽:IMR中相应位置位; 特定屏蔽:开放比自己优先级低的IR。 优先级管理方式: 缺省特性:IR0~IR7的优先级为一循环队列。 固定优先权:从IR0~IR7降序; 轮转优先权: 自动轮转:刚被服务的IR的优先级降至最低; 指定轮转:指定的IR的优先级降至最低。 PC机初始化为缺省屏蔽特性,固定优先权
嵌套方式: 全嵌套:禁止同优先级和低优先级请求发生; 特殊全嵌套:禁止低优先级请求发生。 应用:级联时主片特殊全嵌套,从片全嵌套。 结束方式(ISR复位方式): 自动:中断响应后ISR中最高优先级位自动复位; 非自动:中断服务程序返回前,需要处理程序发出对ISR中相应位复位的中断结束命令; 不指定方式:ISR中最高优先级位复位; 指定方式:命令中指定的ISR中相应位复位。 级联结构 PC机初始化为全嵌套,非自动结束方式
4.8259A的操作功能及命令 I/O端口地址:只提供二个端口(使用A0区别); 命令:初始化--ICW1~ICW4, 操 作--OCW1~OCW3。 状态:IRR、ISR、IMR、查询字。 I/O端口操作冲突时解决方法: 信息字节中有空闲位时:特征位方法; 信息字节中无空闲位时:时序方法、读/写区分法。
8259A命令关系表(地址以PC机中为例): 注:ICWx只有在初始化过程中才会出现。
(1)初始化命令ICW1 特征位:D4=1; 初始化命令ICW4主要设定嵌套、缓冲、结束方式,缺省值为全嵌套、非缓冲、非自动结束方式。 当SNGL=0,需要初始化命令ICW3来设置级联项。 PCH芯片将内嵌的8259 ICW1的D3位作废
(2)初始化命令ICW2 时序: ICW1→ICW2→[ICW3]→[ICW4]。 IRi的中断向量号 = ICW2+i 例:如果ICW2为08H,则 IR3的中断向量号(中断向量)为08H+03H=0BH。 思考题:如果一个中断的类型号是16H,请问该中断接在IR几?该8259初始化的ICW2是多少?
(3)初始化命令ICW3 级联结构 级联方式结构设置: 需要分别对主片和从片进行设置。 主片:S7~S0分别对应相应的IR号的引脚,为1的位对应的引脚接有从片; 从片:ID2~ID1的编号是该从片接到主片的IR引脚的IR号。
主 片:MOV AL, 14H OUT 21H,AL 从片1:MOV AL, 04H OUT 0A1H,AL 级联结构 从片2:MOV AL, 02H OUT 0C1H,AL 级联方式中断请求及响应过程: 非级联响应 主片请求:与非级联一致。 主片响应:收到第一个INTA#后,对从片的IR请求,在第一个INTA#下降沿从CAS线送出该IR编码;否则,在第二个INTA#返回中断向量号。 从片请求:与非级联一致,但其INT送到主片,服从主片的请求规则。 从片响应:通过CAS线译码,选中时在收到第二个INTA#后,返回中断向量号。
(4)初始化命令ICW4 D0:用于8位(0)/16位(1)微机;PCH中该位始终为1 D1:非中断自动结束(0)/自动结束(1)方式; 从片非自动结束时,主、从片均需发EOI命令。 D2:缓冲方式(D3=1)时的主从片级联位置设置, 从片(0)/主片(1) ; D3:非缓冲(0)/缓冲(1)方式; D4:全嵌套(0)/特殊全嵌套(1)方式。
(5)操作命令OCW1 特征位:无,时序:无。 功能:写中断屏蔽寄存器IMR 实际上改变了中断优先级(屏蔽掉高优先级的中断请求)。 对IMR的读取在21H(主)、0A1H(从)端口做读操作。
(6)操作命令OCW2 特征位:D4D3=00; 功能:结束方式和优先权轮转管理; 结束方式管理: D6D5=×0,自动结束,硬件自动清除ISR的相应位; D6D5=01,非自动结束[命令不指定清ISR的哪一位]; D6D5=11,非自动结束[命令指定清ISR的哪一位]。 优先权管理: D7=0,优先权固定;D7=1,优先权轮转。 D6的含义仍然有效
例:MOV AL, 20H OUT 20H,AL的含义?
(7)操作命令OCW3 特征位:D4D3=01;
查询字格式: I=0,无中断请求; I=1,有中断请求。 W2~W0,正在申请中断的若干中断源中优先级最高的中断源的编码。
特定屏蔽管理: 设置方法: 用OCW1屏蔽部分IR[含自己], 用OCW3置SMM即可。 取消方法: 用OCW3取消特定屏蔽, 用OCW1取消被屏蔽的IR。
7.2.3 8259A初始化编程 out 20h(a0h), al 1.初始化编程步骤 out 21h(a1h), al out 21h(a1h), al out 21h(a1h), al
2.初始化编程 注意点: • 不同8259A的I/O端口地址不同; • 8259A级联时,每个8259A均必须有完整的初始化过程[端口地址和部分参数不同而已]; • 全嵌套方式时,初始IR优先级IR0最高。
例: INTM00 EQU 020H ;8259A端口0 INTM01 EQU 021H ;8259A端口1 …… MOV AL, 00010011B ;ICW1:边沿触发,要ICW4; ;单片方式,不要ICW3。 OUT INTM00, AL JMP SHORT $+2 ;I/O端口延时 MOV AL, 00001000B ;ICW2:设置中断向量,起始的 ;中断向量为08H。 OUT INTM01, AL JMP SHORT $+2 MOV AL, 00000001B ;ICW4:非缓冲,全嵌套,非自 ;动中断结束(EOI)。 OUT INTM01, AL JMP SHORT $+2 ……
思考题: MOV AL, 13H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 02H OUT 21H, AL MOV AL, 12H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 02H OUT 21H, AL 问:以上左右两段对8259的访问程序中,最后一句分别是发的什么命令?
5.2.4 微机中8259A应用 G2B G2A 1.PC机系统板上8259A的连接 IOW# RD# 15 1 Y0# A5 A IOR# WR# 接8288 14 2 A6 B CS# INTA# 3 13 INTA# A7 C INTR 12 INT 74LS138 接CPU 5 11 IR[7..0] A8 8259A 4 10 A9 接中断源 9 6 DB[7..0] G1 AEN# 7 Y7# 接数据线 A0 A0 接地址线 中断控制器8259A的端口地址为20H、21H
2.现代微机中PCH中8259A级联 注意: 主、从区分; IRQ优先级; 请求与响应。
3. PCH中的中断请求触发方式设置 在PCH中,ICW1的D3位LTIM位无效,中断请求的触发方式由下面两个寄存器决定。 ELCR1——主控制器边沿/电平触发寄存器(地址4D0H) 7 6 5 4 3 2 1 0 IRQ7 IRQ6 IRQ5 IRQ4 IRQ3 0 0 0 ELCR2——从控制器边沿/电平触发寄存器(地址4D1H) 7 6 5 4 3 2 1 0 IRQ15 IRQ14 0 IRQ12 IRQ11 IRQ10 IRQ9 0 IRQx=0 :IRQx为边沿触发 IRQx=1 :IRQx为电平触发
;对主片8259A的初始化 INTM00 EQU 020H ;主8259A端口0 INTM01 EQU 021H ;主8259A端口1 …… MOV AL, 00010001B ;ICW1:边沿触发,要ICW4;级联方式,要ICW3。 OUT INTM00, AL JMP SHORT $+2 ;I/O端口延时 MOV AL, 00001000B ;ICW2:设置主片的中断向量,起始的中断向量为08H OUT INTM01, AL JMP SHORT $+2 MOV AL, 00000100B ;ICW3:表示从8259A的INT输出是连接到主片的IR2。 OUT INTM01, AL JMP SHORT $+2 MOV AL, 00010001B ;ICW4:非总线缓冲,特殊全嵌套,非自动EOI OUT INTM01, AL JMP SHORT $+2 MOV AL,00000000B ;ELCR1:全部边沿触发 MOV DX,4D0H OUT DX,AL ……
;对从片8259A的初始化 INTS00 EQU 0A0H ;从8259A端口0 INTS01 EQU 0A1H ;从8259A端口1 …… MOV AL, 00010001B ;ICW1边沿触发,要ICW4;级联方式,要ICW3。 OUT INTS00, AL JMP SHORT $+2 MOV AL, 01110000B ;ICW2:设置从片的中断向量,起始的中断向量为70H OUT INTS01, AL JMP SHORT $+2 MOV AL, 00000010B ;ICW3:设置从片的识别标志,指定对应主片的IR2。 OUT INTS01, AL JMP SHORT $+2 MOV AL, 00000001B ;ICW4:非总线缓冲,全嵌套,非自动中断结束。 OUT INTS01, AL JMP SHORT $+2 MOV AL,00000000B ;ELCR2:全部边沿触发 MOV DX,4D1H OUT DX,AL ……
4.现代微机中断请求线连接 返回下页
INTR SERIRQ SIO LPC47B27X IRQx … PCH CPU IRQ14,15 转上页 返回第65页
7.3 现代微机中的中断处理 7.3.1 中断响应过程 在当前指令结束后,可屏蔽中断根据EFLAGS寄存器IF位决定是否响应;其他中断给予响应。 中断响应的步骤如下: 1.保护断点 通过堆栈及相关硬件实现EFLAGS、CS、EIP的保护。并清除IF和TF。 压栈的顺序是EFLAGS、CS、EIP 2.取得中断向量号 对可屏蔽中断通过中断响应周期取得中断向量号。 其他中断直接取得入口地址,无须第2步
3.取得中断服务程序入口地址 对向量中断,通过中断向量号查中断向量表或中断描述符表取得。 4.转入中断处理程序 从中断处理程序入口地址转到中断处理程序。执行对中断的处理。 5.返回断点 恢复断点(EIP、CS、EFLAG顺序出栈)继续执行主程序。
7.3.2 现代微机中断控制 PCI INTA 两个 INTA# INTA 中断向量号 主8259A 从8259A INTR IRQ PCH 内部逻辑 北桥 CPU总线 CPU
在上面的过程中有几点注意: • 一个或多个IRQ到来的时候,置中断请求寄存器IRR的相应位 。如果中断没有被屏蔽,才可以发INTR。 • PCH内部产生两个周期INTA#后,第一个INTA#脉冲,有最高优先级的ISR的相应位被置上,而IRR的相应位被复位。第一个脉冲的下降沿,主中断控制器利用内部3根专用线CAS向从中断控制器发送从识别码。第二个INTA#脉冲后,主或从识别码选中的从可编程中断控制器返回中断向量。 • 结束中断响应周期时,如果在自动中断结束(AEOI)模式下,则中断服务寄存器(ISR)的相应位在第二个INTA#脉冲的末尾被复位,否则ISR相应位保持置位直到中断处理程序末尾发出EOI命令。