Download presentation
Presentation is loading. Please wait.
1
第7章 中断与异常
2
7.1 概述 7.1.1 中断、异常、中断向量 1.中断与异常概念 中断是在程序执行过程中,为了响应从硬件发来的信号而随机产生的事件。系统硬件使用中断来处理外部事物,比如外设的请求。软件也能够通过执行INT n指令来产生中断。 当处理器检测到执行一条指令时的错误,比如除0错、保护侵犯、缺页故障、内部机器故障等,就会产生异常。当内部硬件错误和总线错误被检测到时,有机器检查功能的处理器(Pentium,P6,Pentium 4,Core及以后)也会产生机器检查异常。
3
中断处理的隐操作:程序状态及程序断点地址的进栈及出栈。
2.中断大致过程: 中断到来的时候,CPU暂停现行程序,转而处理随机到来的事件,待处理完后再回到被暂停的程序继续执行。 中断服务 中断响应 中断结束 中断请求 中断处理 中断处理的隐操作:程序状态及程序断点地址的进栈及出栈。
4
3.中断系统其他功能: 支持多中断源和多种中断源。 支持中断屏蔽处理。 支持中断嵌套处理。 支持中断优先级修改。 支持中断结束方式选择。
屏蔽中断请求
5
4.中断向量号、中断向量 为了处理异常和中断,每一个IA-32/Intel 64体系定义的异常和每一个需要特殊处理的中断类型都被分配了唯一的识别号,该识别号称之为中断向量号。 对每个异常或中断而言,处理器都有相应的中断处理程序,而中断向量就是中断处理程序的入口地址。 中断向量号允许的范围是0~255 0~31号向量被Intel 64和IA-32用作体系结构内部定义的异常和中断。 32~255号向量作为用户定义的中断,这些中断通常安排给外部I/O设备,使这些设备能够利用外部的某一种硬件中断机制(比如8259A中断控制器)向处理器发出中断请求。 作为INT n指令引发的软件中断,其向量号可以在0~255的范围。
6
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的本地向量表编程去关联任一个处理器的异常和中断向量 外部中断又可分为可屏蔽中断和不可屏蔽中断。 高级可编程中断控制器(Advanced Programmable Interrupt Control,APIC)是从Pentium处理器开始被引入的面向多处理器及多核系统的中断控制器,它不仅扩展了以前处理器中断处理的功能,还增加了多处理器之间相互传递处理器间中断消息的功能, APIC系统由集成在处理器中的本地APIC,集成在系统芯片组(如PCH)中的I/O APIC以及本地APIC和I/O APIC之间的连线构成。 APIC是高级可编程中断控制器,是从Pentium处理器开始被引入的面向多处理器及多核系统的中断控制器,由处理器中的本地APIC,PCH中的I/O APIC以及两者之间的连线构成。
7
1)可屏蔽中断(如键盘 、鼠标,串口,并口打印机等)
1.外部中断 1)可屏蔽中断(如键盘 、鼠标,串口,并口打印机等) 属性:硬件、可屏 蔽、向量。 中断请求:多个中断请求的排队和判优由中断控制器完成,产生的中断请求信号送到CPU的INTR引脚或本地APIC 。 中断向量号:通过数据总线送到CPU中。 SIO LPC47B27X … IRQx PCH SERIRQ 北桥 CPU INTR 中断向量号 PIRQx 屏蔽中断请求响应,IF通过CLI/STI清零/置位 EFLAGS寄存器的IF位影响CPU对中断请求的响应。 处理器在当前指令执行结束的时候启动中断识别INTA总线周期。
8
中断请求:中断请求的信号送到CPU的NMI引脚或本地APIC 。
1.外部中断 2)不可屏蔽中断 属性:硬件、不可屏蔽、向量。 中断请求:中断请求的信号送到CPU的NMI引脚或本地APIC 。 中断向量号:固定为2。 CPU不需要进行中断识别,直接处理中断。 NMI由0跳变到1以后要维持至少4个连续的处理器时钟周期的高电平才被识别。 NMI由1跳变到0以后要维持至少4个连续的处理器时钟周期的低电平,新的NMI中断才能被识别。 不可屏蔽中断不通过中断控制器 软件中断不通过中断控制器
9
2.软件中断 属性:软件、不可屏蔽、向量。 中断请求: INT n是使用非常广泛的软件中断指令。 中断向量号: INT n的第二字节n给出指令指定的中断向量号 BIOS中断:I/O设备控制、实用服务、特殊中断、专用参数中断。 DOS中断:公开/未公开、可调用、系统功能。 自由中断:未定义(20H~3FH中未使用的中断)。 CPU不需要进行中断识别,直接处理中断。
10
7.1.3 异常源及异常类型 1.异常源 处理器检测到的程序错误产生的异常 机器检测异常
处理器在执行应用程序或操作系统期间检测到程序错误,会产生一个或多个异常 IA-32/Intel 64结构为每一个“处理器可检测”的异常指定了一个向量号 机器检测异常 P6家族和Pentium处理器提供了内部和外部机器检测机制用于检查内部芯片硬件和总线事务的操作 当发现机器检测错误,处理器发出一个机器检测异常并返回一个错误号 高级可编程中断控制器(Advanced Programmable Interrupt Control,APIC)是从Pentium处理器开始被引入的面向多处理器及多核系统的中断控制器,它不仅扩展了以前处理器中断处理的功能,还增加了多处理器之间相互传递处理器间中断消息的功能, APIC系统由集成在处理器中的本地APIC,集成在系统芯片组(如PCH)中的I/O APIC以及本地APIC和I/O APIC之间的连线构成。
11
1.异常源 软件产生的异常 INTO是溢出异常指令,如果EFLAGS.OF=1,同时又执行INTO指令,则将产生向量号为4的异常中断
INT 3是断点异常指令,它是一条单字节指令,常被放在需要放置断点的指令前面。实际上,很多调试程序都是利用INT 3指令来完成断点跟踪功能的 BOUND指令是边界检查指令,它具有两个操作数:第一个操作数用来指定存放数组索引的寄存器;第二个操作数必须是存储器操作数,其第一个字是数组下标的下限,第二个字是数组下标的上限。BOUND指令执行时将检查数组的索引值,若小于下限或大于上限,则将发生向量号为5的异常中断
12
2. 异常的属性与种类 属性:软件、不可屏蔽、向量。 中断请求:指令执行中产生。 中断向量号:CPU规定。 故障(失效):错误在指令完成前,错误指令的CS:EIP压栈。该指令会重做。 陷阱:错误在指令完成后,错误指令下一指令的CS:EIP压栈。 中止:不保存,重启机器。 CPU不需要进行中断识别,直接处理中断。
13
7.2 Intel 8259A 7.2.1 8259A主要任务 接受外部的中断请求; 管理所有外部的中断请求(排队、判优、屏蔽、嵌套);
向CPU产生中断请求INTR信号及中断向量号; 进行中断结束处理; 接受CPU命令及返回状态。
14
7.2.2 8259A引脚及内部结构 1.8259A引脚 CPU侧: CS#; DB0~DB7; RD#、WR#、A0;
INT、INTA#; 外设侧: IR0~IR7; 级联: SP#/EN#、 CAS0~CAS2。
15
2.8259A内部结构 在 I/O接口包含级联/缓冲比较器
16
内部逻辑:IRR、IMR、PR、ISR及控制电路。 中断请求过程:IR->INT。
接口电路:CPU接口、I/O接口。 内部逻辑:IRR、IMR、PR、ISR及控制电路。 中断请求过程:IR->INT。 & INT ISR编码 中断请求优先级编码器 中断请求寄存器IRR IR0 IR7 … 中断屏蔽寄存器IMR D0 D7 ≥1 比 较 器 B0 B1 B2 A>B A0 A1 A2 有一个电路存放当前最高优先级对应IR,下一个IR优先级次之,为循环链。 优先级编码器选择从最高优先级IR到最低IR的最近一个有请求的IR编码(非IR号)。 ISR中正在和被打断服务的中断均置位 ISR编码为正在服务的优先权编码,非IR号
17
第一个INTA#,CPU封锁总线(LOCK#有效),8259A最高优先级请求对应ISR位置位,对应IRR复位。
当前指令执行完毕; EFLAGS中IF=1; INTR信号有效。 中断响应过程:8259向CPU送中断向量号。 第一个INTA#,CPU封锁总线(LOCK#有效),8259A最高优先级请求对应ISR位置位,对应IRR复位。 第二个INTA#,总线解锁,ALE无效,8259A将当前中断服务程序对应中断向量号送到数据总线上。 ISR的复位在自动结束/非自动结束时不一致。 回ICW3
18
级联方式结构: 级联1 级联2 级联3
19
3.8259A工作方式 中断请求方式: 边沿触发方式:正跳变向8259A请求中断。 电平触发方式:高电平向8259A请求中断,响应中断后要及时清除高电平。 查询中断方式: 外设向8259A请求中断,并将请求状态保存在状态寄存器中等待CPU来查询。 PC机初始化为边沿触发,非查询中断方式
20
连接总线与级联方式: 非缓冲方式:小系统中,8259A数据线直接连系统数据总线,不需要总线缓冲器,此时SP#/EN#表示级联时主/从关系。 主片:SP#/EN#接高电平; 从片:SP#/EN#接低电平。 缓冲方式:大系统中,数据总线都具有总线缓冲器,此时SP#/EN#表示数据传送方向,级联时主/从关系通过软件设定ICW4来决定。 PC机初始化为非缓冲方式
21
屏蔽方式: 缺省特性:自动屏蔽低于自己优先级的IR。 正常屏蔽:IMR中相应位置位; 特定屏蔽:开放比自己优先级低的IR。 优先级管理方式: 缺省特性:IR0~IR7的优先级为一循环队列。 固定优先权:从IR0~IR7降序; 轮转优先权: 自动轮转:刚被服务的IR的优先级降至最低; 指定轮转:指定的IR的优先级降至最低。 PC机初始化为缺省屏蔽特性,固定优先权
22
全嵌套:禁止同优先级和低优先级请求发生;
嵌套方式: 全嵌套:禁止同优先级和低优先级请求发生; 特殊全嵌套:禁止低优先级请求发生。 应用:级联时主片特殊全嵌套,从片全嵌套。 级联结构 结束方式(ISR复位方式): 自动:中断响应后ISR中最高优先级位自动复位; 非自动:中断服务程序返回前,需要处理程序发出对ISR中相应位复位的中断结束命令; 不指定方式:ISR中最高优先级位复位; 指定方式:命令中指定的ISR中相应位复位。 PC机初始化为全嵌套,非自动结束方式
23
4.8259A的操作功能及命令 I/O端口地址:只提供二个端口(使用A0区别); 命令:初始化--ICW1~ICW4, 操 作--OCW1~OCW3。 状态:IRR、ISR、IMR、查询字。 I/O端口操作冲突时解决方法: 信息字节中有空闲位时:特征位方法; 信息字节中无空闲位时:时序方法、读/写区分法。
24
8259A命令关系表(地址以PC机中为例): 注:ICWx只有在初始化过程中才会出现。 PIC1 PIC2 操作 内容 特征位 时序
D4D3D2 20H 0A0H 写 ICW1 1×× 无 OCW2 00× OCW3 01× 21H 0A1H ICW2~ICW4 在初始化期间,ICW1之后ICW2→ICW4 OCW1 非初始化期间 读 IRR,ISR 查询字 OCW3决定 IMR 注:ICWx只有在初始化过程中才会出现。
25
(1)初始化命令ICW1 特征位:D4=1; 初始化命令ICW4主要设定嵌套、缓冲、结束方式,缺省值为全嵌套、非缓冲、非自动结束方式。
当SNGL=0,需要初始化命令ICW3来设置级联项。 PCH芯片将内嵌的8259 ICW1的D3位作废
26
(2)初始化命令ICW2 IRi的中断向量号 = ICW2+i 时序: ICW1→ ICW2→[ICW3]→[ICW4]。
例:如果ICW2为08H,则 IR3的中断向量号(中断向量)为08H+03H=0BH。 思考题:如果一个中断的类型号是16H,请问该中断接在IR几?该8259初始化的ICW2是多少?
27
主片:S7~S0分别对应相应的IR号的引脚,为1的位对应的引脚接有从片;
(3)初始化命令ICW3 级联方式结构设置: 级联结构 需要分别对主片和从片进行设置。 主片:S7~S0分别对应相应的IR号的引脚,为1的位对应的引脚接有从片; 从片:ID2~ID1的编号是该从片接到主片的IR引脚的IR号。
28
从片请求:与非级联一致,但其INT送到主片,服从主片的请求规则。
主 片: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#后,返回中断向量号。
29
(4)初始化命令ICW4 D0:用于8位(0)/16位(1)微机;PCH中该位始终为1 D1:非中断自动结束(0)/自动结束(1)方式;
从片非自动结束时,主、从片均需发EOI命令。 D2:缓冲方式(D3=1)时的主从片级联位置设置, 从片(0)/主片(1) ; 非自动结束时主片请求(最后/非最后一个)、从片请求(最后/非最后一个)处理。 D3:非缓冲(0)/缓冲(1)方式; D4:全嵌套(0)/特殊全嵌套(1)方式。
30
(5)操作命令OCW1 特征位:无,时序:无。 功能:写中断屏蔽寄存器IMR 实际上改变了中断优先级(屏蔽掉高优先级的中断请求)。 对IMR的读取在21H(主)、0A1H(从)端口做读操作。
31
(6)操作命令OCW2 特征位:D4D3=00; 功能:结束方式和优先权轮转管理; 结束方式管理:
D6D5=×0,自动结束,硬件自动清除ISR的相应位; D6D5=01,非自动结束[命令不指定清ISR的哪一位]; D6D5=11,非自动结束[命令指定清ISR的哪一位]。 优先权管理: D7=0,优先权固定;D7=1,优先权轮转。 D6的含义仍然有效
32
例:MOV AL, 20H OUT 20H,AL的含义? R SL EOI 0 0 L2 L1 L0 功能 0 0 0 0 0 0 0 0
自动EOI、优先权固定命令 非自动EOI[不指定] 、优先权固定命令 L2 L1 L0 非自动EOI[指定] 、优先权固定命令 自动EOI、优先权自动轮转命令 非自动EOI[不指定] 、优先权自动轮转命令 L2 L1 L0 非自动EOI[指定] 、优先权指定轮转命令 L2 L1 L0 自动EOI、优先权指定轮转命令 例:MOV AL, 20H OUT 20H,AL的含义?
33
(7)操作命令OCW3 特征位:D4D3=01; P RR RIS 功能 应用 0 1 0 读取IRR内容 MOV AL, 0AH
读取IRR内容 MOV AL, 0AH OUT 20H,AL IN AL,20H 读取ISR内容 MOV AL, 0BH * 不读取任何寄存器内容 1 * * 读取查询字信息 MOV AL, 0CH OUT 20H, AL IN AL, 20H
34
W2~W0,正在申请中断的若干中断源中优先级最高的中断源的编码。
查询字格式: I=0,无中断请求; I=1,有中断请求。 W2~W0,正在申请中断的若干中断源中优先级最高的中断源的编码。
35
特定屏蔽管理: ESMM SMM 功能 * 该操作对特殊屏蔽无效 取消特定屏蔽 设置特定屏蔽 设置方法: 用OCW1屏蔽部分IR[含自己], 用OCW3置SMM即可。 取消方法: 用OCW3取消特定屏蔽, 用OCW1取消被屏蔽的IR。
36
7.2.3 8259A初始化编程 out 20h(a0h), al 1.初始化编程步骤 out 21h(a1h), al
37
2.初始化编程 注意点: 不同8259A的I/O端口地址不同; 8259A级联时,每个8259A均必须有完整的初始化过程[端口地址和部分参数不同而已]; 全嵌套方式时,初始IR优先级IR0最高。
38
例: INTM00 EQU 020H ;8259A端口0 INTM01 EQU 021H ;8259A端口1 ……
MOV AL, B ;ICW1:边沿触发,要ICW4; ;单片方式,不要ICW3。 OUT INTM00, AL JMP SHORT $+2 ;I/O端口延时 MOV AL, B ;ICW2:设置中断向量,起始的 ;中断向量为08H。 OUT INTM01, AL JMP SHORT $+2 MOV AL, B ;ICW4:非缓冲,全嵌套,非自 ;动中断结束(EOI)。
39
问:以上左右两段对8259的访问程序中,最后一句分别是发的什么命令?
思考题: MOV AL, 12H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 02H MOV AL, 13H OUT 20H, AL MOV AL, 08H OUT 21H, AL MOV AL, 02H 问:以上左右两段对8259的访问程序中,最后一句分别是发的什么命令?
40
5.2.4 微机中8259A应用 1.PC机系统板上8259A的连接 1 15 A5 A Y0# 2 14 A6 B 3 13 A7 C
IOW# RD# 1 15 A5 A Y0# IOR# WR# 2 14 接8288 A6 B CS# INTA# 3 13 INTA# A7 C 12 INTR 74LS138 INT 接CPU 5 11 A8 G2B 8259A IR[7..0] 4 10 A9 G2A 接中断源 9 6 DB[7..0] AEN# G1 7 Y7# 接数据线 A0 A0 接地址线 中断控制器8259A的端口地址为20H、21H
41
2.现代微机中PCH中8259A级联 注意: 主、从区分; IRQ优先级; 请求与响应。
42
3. PCH中的中断请求触发方式设置 在PCH中,ICW1的D3位LTIM位无效,中断请求的触发方式由下面两个寄存器决定。
ELCR1——主控制器边沿/电平触发寄存器(地址4D0H) IRQ7 IRQ6 IRQ5 IRQ4 IRQ ELCR2——从控制器边沿/电平触发寄存器(地址4D1H) IRQ15 IRQ IRQ12 IRQ11 IRQ10 IRQ IRQx=0 :IRQx为边沿触发 IRQx=1 :IRQx为电平触发
43
;对主片8259A的初始化 INTM00 EQU 020H ;主8259A端口0 INTM01 EQU 021H ;主8259A端口1 ……
MOV AL, B ;ICW1:边沿触发,要ICW4;级联方式,要ICW3。 OUT INTM00, AL JMP SHORT $+2 ;I/O端口延时 MOV AL, B ;ICW2:设置主片的中断向量,起始的中断向量为08H OUT INTM01, AL JMP SHORT $+2 MOV AL, B ;ICW3:表示从8259A的INT输出是连接到主片的IR2。 MOV AL, B ;ICW4:非总线缓冲,特殊全嵌套,非自动EOI MOV AL, B ;ELCR1:全部边沿触发 MOV DX,4D0H OUT DX,AL
44
;对从片8259A的初始化 INTS00 EQU 0A0H ;从8259A端口0 INTS01 EQU 0A1H ;从8259A端口1 ……
MOV AL, B ;ICW1边沿触发,要ICW4;级联方式,要ICW3。 OUT INTS00, AL JMP SHORT $+2 MOV AL, B ;ICW2:设置从片的中断向量,起始的中断向量为70H OUT INTS01, AL MOV AL, B ;ICW3:设置从片的识别标志,指定对应主片的IR2。 MOV AL, B ;ICW4:非总线缓冲,全嵌套,非自动中断结束。 MOV AL, B ;ELCR2:全部边沿触发 MOV DX,4D1H OUT DX,AL
45
4.现代微机中断请求线连接 8259 8259输入 典型的中断源 被连接的引脚/功能 主片 内部 内部时钟/计数器0的输出 1 键盘
内部 内部时钟/计数器0的输出 1 键盘 通过SERIRQ来的IRQ1 2 从控制器的级联引脚 3 串行端口2 通过SERIRQ来的IRQ3 4 串行端口1 通过SERIRQ来的IRQ4 5 并行端口/普通 通过SERIRQ来的IRQ5 6 软磁盘 通过SERIRQ来的IRQ6 7 通过SERIRQ来的IRQ7 返回下页
46
8259 8259输入 典型的中断源 被连接的引脚/功能 从片 内部实时时钟 内部RTC 1 普通 通过SERIRQ来的IRQ9 2 通过SERIRQ来的IRQ10 3 通过SERIRQ来的IRQ11 4 PS/2鼠标 通过SERIRQ来的IRQ12 5 内部 基于处理器FERR#的状态机输出 6 基本SATA 从输入信号来或通过SERIRQ来的IRQ14 7 第二SATA 从输入信号来或通过SERIRQ来的IRQ15 SIO LPC47B27X … IRQx PCH SERIRQ CPU INTR IRQ14,15 转上页 返回第65页
47
7.3 现代微机中的中断处理 7.3.1 中断响应过程 在当前指令结束后,可屏蔽中断根据EFLAGS寄存器IF位决定是否响应;其他中断给予响应。 中断响应的步骤如下: 1.保护断点 通过堆栈及相关硬件实现EFLAGS、CS、EIP的保护。并清除IF和TF。 压栈的顺序是EFLAGS、CS、EIP 2.取得中断向量号 中断向量号与IRQ不对应。 对可屏蔽中断通过中断响应周期取得中断向量号。 其他中断直接取得入口地址,无须第2步
48
3.取得中断服务程序入口地址 对向量中断,通过中断向量号查中断向量表或中断描述符表取得。 4.转入中断处理程序 从中断处理程序入口地址转到中断处理程序。执行对中断的处理。 5.返回断点 恢复断点(EIP、CS、EFLAG顺序出栈)继续执行主程序。
49
7.3.2 现代微机中断控制 PCH PCI INTA 内部逻辑 两个 INTA# 北桥 CPU总线 中断向量号 INTA 主8259A
INTR 2芯片平台北桥被集成到CPU中 CPU IRQ
50
在上面的过程中有几点注意: 一个或多个IRQ到来的时候,置中断请求寄存器IRR的相应位 。如果中断没有被屏蔽,才可以发INTR。 PCH内部产生两个周期INTA#后,第一个INTA#脉冲,有最高优先级的ISR的相应位被置上,而IRR的相应位被复位。第一个脉冲的下降沿,主中断控制器利用内部3根专用线CAS向从中断控制器发送从识别码。第二个INTA#脉冲后,主或从识别码选中的从可编程中断控制器返回中断向量。 结束中断响应周期时,如果在自动中断结束(AEOI)模式下,则中断服务寄存器(ISR)的相应位在第二个INTA#脉冲的末尾被复位,否则ISR相应位保持置位直到中断处理程序末尾发出EOI命令。
51
7.3.3 中断识别及其优先级 1.中断识别 只有外部硬件中断需要进行识别,其余不需要识别。 中断识别由中断控制器完成。 2.中断优先级
原则:按机器故障、DMA、外围硬件、软件递减。 结果:异常>DMA>外围硬件>BIOS>DOS>自由。 即基本按中断向量表排序。 外围硬件一般可由用户修改其优先权。
53
IA-32的中断向量表在存储区的最低1KB字节中,对应256种中断,每个中断向量占4个字节
类型0的IP 类型0的CS 类型1的IP 类型1的CS 4*N 类型N的IP 类型N的CS 类型0的中断向量 类型1的中断向量 类型N的中断向量
54
7.3.4 中断向量表和实地址模式下中断处理程序的编写
中断向量表和实地址模式下中断处理程序的编写 一、 PC机中断向量表(IVT,用于实地址模式) 1) 中断向量表 按中断向量号顺序存放中断向量的存储区域。 每个中断向量占4字节。 对8088/8086固定在内存0000 : 0000开始的1KB范围内。 对IA-32处理器中断向量表的基地址和界限值放在IDTR寄存器中,并可用LIDT指令修改它们,为了兼容,实地址模式基地址还是0,界限还是为3FFH 2) 中断向量指针 中断向量表只有在实模式下使用。 指向存放中断向量地址第一字节的指针。 中断向量指针=中断向量号×4。 软件中断中自由中断的中断向量需用户自己装入。
55
二、 实模式下中断程序编写 1. 中断编程注意点 中断编程包括主程序部分和中断处理程序部分。 1)使用正确的中断向量号
二、 实模式下中断程序编写 1. 中断编程注意点 中断编程包括主程序部分和中断处理程序部分。 1)使用正确的中断向量号 根据中断处理程序要完成的功能,选择好正确的中断向量号,如:COM1串行通信用0CH号中断,Ctrl+Break键控制中断号是1BH,注意定时器中断一般不使用08H号,而使用更安全的1CH号中断。 如果是自己定义的软中断,注意不要和系统中断向量号相重合。
56
2)中断服务程序入口地址的正确设置(主程序中完成) 有两种设置中断服务程序入口地址(中断向量)的方法:
1)直接写中断向量表(假设中断向量号是0CH) CLI ; 关中断 MOV AX, 0 MOV ES, AX ; ES指向0000H段(中断向量表的段) MOV SI, 0CH*4 ; 一个中断向量4个字节 MOV AX, OFFSET SERVICE ; 中断入口偏移地址 MOV ES:[SI], AX MOV AX, SEG SERVICE ; 中断入口的段地址 MOV ES:[SI+2], AX STI ; 开中断 …… ; 中断处理子程序 SERVICE PROC FAR 2)使用DOS功能调用中断 MOV AX, SEG SERVICE MOV DS,AX MOV DX,OFFSET SERVICE MOV AX,250CH INT 21H
57
3)适当地保护现场 由于中断随时到来,所以中断处理程序中一定要保护好需要使用的寄存器。如果使用的寄存器多,可以保护所有寄存器,如果寄存器用的不多,可只将要用的寄存器压栈。 4)避免非软件中断中断处理程序中DOS重入 DOS的重入容易引起系统瘫痪,所以在中断处理程序中要避免调用DOS功能调用,如果是对外设或屏幕的操作,改用BIOS中断,如果是文件操作,要到中断处理程序外的主程序中完成。 5)中断程序执行时间的正确估计 中断处理程序执行时间要小于中断到来的周期或最短间隔时间,中断处理程序里不要出现死循环、需要人工干预的人机交互和时间很长的循环语句。
58
中断响应的时候系统会自动将IF清0,如果希望中断能有限嵌套(高级与本级中断能嵌套)则在现场保护后,用STI指令将中断屏蔽打开。
6)中断的打开与关闭 中断响应的时候系统会自动将IF清0,如果希望中断能有限嵌套(高级与本级中断能嵌套)则在现场保护后,用STI指令将中断屏蔽打开。 7)中断结束处理及返回 a) 如果现场保护后,执行过STI,这恢复现场前要执行CLI关闭中断。 b) 如果是外部硬件中断,恢复现场前应该发中断结束命令(EOI)。 MOV AL, 20H OUT 20H, AL ; 向主8259发EOI OUT 0A0H, AL ; 向从8259发EOI c) 恢复现场,使用和保护现场压栈顺序的逆序将寄存器的值弹出 d) 使用IRET中断返回指令返回
59
2. 中断处理程序举例(假设中断向量号是0CH)
; 主程序的相关部分 …… OLD0C DD ? .CODE MOV AX, 350CH ; 保存原来的0CH中断向量 INT 21H MOV WORD PTR OLD0C,BX MOV WORD PTR OLD0C+2,ES MOV AX, SEG SERVICE ; 写入新的0CH中断向量 MOV DS,AX MOV DX,OFFSET SERVICE MOV AX,250CH …… ; 其它程序段
60
; 中断处理子程序 SERVICE PROC FAR PUSHA ; 保护现场 PUSH DS STI ; 打开中断 …… ; 中断处理程序主体 CLI ; 关闭中断 MOV AL, 20H OUT 20H, AL ; 发中断结束命令 POP DS ; 恢复现场 POPA IRET SERVICE ENDP
61
7.3.5 保护模式下中断与异常的处理 1.中断描述符表(IDT) 表项长度:8字节,每个表项对应一个中断向量号。
表项类型:任务门、中断门、陷阱门。 注意三个门的图中下面是0~3字节,上面是4~7字节 通过特征位(b40~b44)区分不同类型。
62
表的位置:由中断描述符表寄存器(IDTR)指向。
表的长度:8字节×256=2KB。 2.中断描述符指针 指向中断描述符表中的中断描述符的指针。 中断描述符指针=IDT基地址+中断向量号×8。 3.中断门/陷阱门 内容:段选择符、属性和偏移量。 中断门与陷阱门区别: 通过中断门处理时EFLAG的IF被清0,通过陷进门处理IF不清0。 系统地址寄存器组包括IDTR、GDTR、LDTR、TR。 中断门的优先级比陷阱门高,是面向外部硬件中断的门,后者面向优先级低的中断。
63
中断服务子程序入口地址取得: 中断描述符 段描述符 中断向量号 CS段描述符缓冲器 7 0 IDT GDT/LDT IDTR 代码段
IDT GDT/LDT IDTR 代码段 段描述符 中断门/陷阱门 段基地址 ×8 CS 偏移 选择符 基地址 属性 属性 EIP 中断服务子程序 中断描述符 偏移 边界 基地址:选择符->CS(由TI位选择GDT/LDT)->基地址 偏移:偏移->EIP …… …… 线性地址 段描述符
64
4.任务门 内容:TSS选择符与属性。 TSS取得: 优点:中断任务和被中断任务完全隔离。 缺点:中断响应过程耗时长。 中断向量号
TR描述符缓存器 IDT GDT IDTR 任务门 TSS描述符 ×8 TR 基址 基址 TSS 选择符 段限 TSS 属性 …… …… 任务切换:任务门或直接写TR 线性地址 优点:中断任务和被中断任务完全隔离。 缺点:中断响应过程耗时长。
65
7.4 PCI中断 7.4.1 PCI中断请求 PCI中断线:INTA#、INTB#、INTC#、INTD#。
PCI中断源:PIRQA#~PIRQD#。 PCI中断源连接:通过映射到ISA中断(3~7,9~12,14~15)来实现。 特点: 当PCI中断被映射到一个ISA的IRQ后,该IRQ不可再被ISA设备(通过SERIRQ的中断)使用。 互斥IRQ:3~7,9~12;14,15非SERIRQ中断 PCI中断可与低电平有效的非ISA中断共享同一IRQ。 转第56页
66
实现: 设备31的0号功能的60H~63H、68H~6BH的PIRQ路由控制寄存器实现PIRQA#~PIRQH#与IRQ的映射关系。 PIRQ#路由控制寄存器[8bit]存放的是IRQ编码。 PIRQA# PIRQB# PIRQC# PIRQD# 3 5 7 60H~63H 8259A IR0 IR3 IR5 IR7 PCI中断请求: PCI中断请求必须为低电平触发方式。 多个PIRQ#信号线能连在同一个IRQ上。 不同PIRQ#的优先级由IRQ决定。 同一PIRQ#不同设备INT*的优先级由安装次序决定。
67
7.4.2 PCI中断响应周期 PCI中断响应为单周期响应。 HOST-PCI桥自动将双中断响应周期转换成单中断响应周期。
其他中断响应过程与8259A同,中断向量号通过HOST-PCI桥再返回给处理器。 中断响应周期中可插入等待周期。 中断服务程序入口地址由中断描述符表或中断向量表管理。
68
CLK FRAME# 1 2 3 4 5 AD C/BE# IRDY# TRDY# 无效 向量 0000 BE#s(1110) DEVSEL # PCI中断响应周期 地址期没有地址,隐含的目标设备是系统中断控制器。一般它负责驱动DEVSEL#,也可由PCI-ISA桥进行负向译码。
69
7.4.3 PCI中断共享 ^ PCI中断请求信号为漏极开路的。 同一PIRQ#不同设备的优先级最后安装的最高。
采用链表式处理方法。 方法:PNP配置时将同一PIRQ#的原中断向量存放到其设备驱动的特定寄存器后才替换为新的中断向量。 中断向量 (描述符) 中断处 理程序 设备2 设备1 ^ PIRQA#
70
7.5 串行中断 7.5.1 串行中断结构 SERIRQ INTR SIO IRQx PCH LPC47B27X CPU … PIRQx
7.5 串行中断 7.5.1 串行中断结构 SIO LPC47B27X SERIRQ INTR IRQx PCH CPU … PIRQx IRQ14,15 PIRQx … PCH 串行中断驱动部件 SERIRQ 串行中断分离部件 2个8259 部件 INTR IRQ14,15
71
SERIRQ包含IRQ0, 1, 3~15, PIRQA#~PIRQD#, SMI#和IOCHK#。但实际上并不支持IRQ0、8、13中断。实际的IRQ14、IRQ15实际上也不从SERIRQ中传到南桥。 SERIRQ线采用同步单线传输结构。 遵循PCI信号使用的三态协议。 S-取样阶段 信号为低电平。 R-恢复阶段 信号为高电平。 T-翻转状态 信号被释放 SERIRQ上信息分帧传输。
72
7.5.2 帧结构 1.开始帧 操作模式: 连续的(PCH单独产生开始帧) 静态的(一个串行IRQ设备来启动开始帧)
2.停止帧 长度:2或3个时钟宽度。(由SERIRQ配置寄存器决定) 含义:2—SERIRQ设备触发下次开始帧; 3—PCH触发下次开始帧。
73
3.数据帧 长度:21个时钟宽度。 驱动:需请求中断的设备在自己的数据帧中将SERIRQ驱动: IRQ0~15在没有中断请求的时候将SERIRQ线驱动为低电平 PCI INT[A:D]#,SMI#和IOCHK#在有中断请求的时候将SERIRQ线驱动为低电平 否则都将SERIRQ线变为三态,由上拉电阻将他们驱动到高电平 。 所谓自己的数据帧是指在21个时钟中数据帧号和本设备的IRQ号码相等那一数据帧。外设要在SERIRQ的上升沿开始计算帧。
74
7.6 APIC 7.6.1 APIC子系统组成 集成在处理器中的本地APIC 集成在系统芯片组(如PCH)中的I/O APIC
本地APIC和I/O APIC之间的连线 返回下页
75
本地APIC I/O APIC 本地APIC和I/O APIC之间的连线
在多处理器系统中,本地APIC发送处理器间中断(IPI)消息到系统总线上的其他本地处理器和并接收从这些处理器中来的IPI消息 I/O APIC 接收从系统或与它关联的I/O设备中发出的外部中断事件,并将这些中断转发给本地APIC作为中断消息 在多处理器系统中,提供一个将外部中断分布到所选的处理器或系统总线上的一组处理器中的本地APIC上的机制 本地APIC和I/O APIC之间的连线 在Pentium处理器和P6架构的处理器中使用的是3线组成的专用APIC总线 Pentium 4之后的处理器直接用系统总线来连接。I/O APIC通过PCH中的桥在系统总线上发送中断请求到处理器。桥产生中断消息到本地APIC 返回下页
76
单CPU系统中APIC 多处理器系统中的APIC
77
7.6.2 APIC子系统组成 1.本地APIC的中断源 1)本地连接的I/O设备 2)外部连接的I/O设备 3)处理器间的中断(IPI)
5)性能监视计数器中断 6)热敏中断 7)APIC内部错误中断
78
与本地中断有关的设备 1)本地向量表(LVT) 本地向量表(LVT)允许软件指定本地中断传递到处理器核的方式。 2)差错状态寄存器(ESR)
本地APIC将中断处理当中检测到的错误记录在差错状态寄存器(ESR)中。 另外,由于本地和I/O APIC只支持16到255这240个作为有效中断,所以当0~15号中断向量被本地APIC发送或接受,APIC将在它的错误状态寄存器中指明其为非法的向量。 3)除法配置寄存器(DCR) 4)初始值寄存器和当前计数寄存器
79
2. 本地APIC结构与寄存器
80
2. 本地APIC存在与启用 将EAX寄存器赋值为1作为源操作数来执行CPUID指令。在返回的EDX寄存器中位9为1说明该处理器存在片上本地APIC 启动或禁止本地APIC方法: 1)将IA_APIC_BASE MSR寄存器的位11清0,本地APIC将被禁止;将IA_APIC_BASE MSR寄存器的位11设置为1就启用了本地APIC。 2)使用本地APIC的伪中断向量寄存器中的启用/禁止APIC标识。
81
7.6.3 PCH中的I/O APIC 1. I/O APIC概述
82
2. I/O APIC 寄存器 直接访问的寄存器 (1)索引寄存器(INDR)FEC0_0000H
可以读/写的8位寄存器。存放需要间接访问的寄存器的8位索引编号值 (2)数据寄存器(DATR) FEC0_0010H 可以读/写的32位寄存器。当对索引寄存器指定的间接寄存器进行读/写时,数据寄存器用来存放准备读/写的数据 (3)EOI寄存器(EOIR) FEC0_0040H 只能写不能读,在APIC处于电平触发模式下可用,当得到EOI消息时,该寄存器的低8位(D7~D0)被赋予一个中断向量号,I/O APIC将这个中断向量号和重定向表寄存器中所有中断向量号部分进行比较,凡是向量号相等的重定向寄存器的远程中断返回位(Remote_IRR)均被清零,表示中断结束。该寄存器的其他位没用。
83
2. I/O APIC 寄存器 间接访问的寄存器 (1)ID寄存器(IDR)-索引编号为0H
可读/写的32位寄存器。它的D27~D24这4位必须由软件在使用APIC之前写入ID值,D15位是中间结果暂存位。APIC的ID作为APIC的物理名称,APIC总线对APIC的仲裁ID就来源于I/O APIC的ID。 (2)版本寄存器(VERR)索引编号为01H 只读的32位寄存器。它的D7~D0是APIC的版本号。D15位为1表示该版本的I/O APIC具有引脚声明寄存器。D23~D16指定最大重定向表寄存器数,取值范围为0~239。 (3)重定向表寄存器(REDIR_TBLR)索引编号从10H开始 PCH的I/O APIC中有24个重定向寄存器(RDR)形成的重定向表,它们都是可读/写的64位寄存器。重定向寄存器的信息用来将相应中断引脚上的中断转换成一个APIC消息。
84
7.6.4 APIC中断的处理 1.中断优先级 每个通过本地APIC传递到处理器的中断都有一个基于它的向量号的优先级。本地APIC利用这个优先级来决定何时为该优先级的中断服务。 每个中断向量都是一个8位的值,而中断向量号的高4位形成中断优先级类。最低优先级类是1,最高是15。 每个中断优先级类包含16个向量,这16个向量的相对优先级由中断向量的低4位决定。低4位数值越大,优先级越高。 优先级类0中的0~15号中断是非法的,也不会被传递。
85
2.任务优先级与处理器优先级 任务优先级 本地APIC中的任务优先级寄存器(TPR)是一个32位的可读写寄存器,只用了低8位,其中7~4位指定了任务优先级类,而3~0位定义了同类任务优先级中的子类优先级。任务优先级寄存器中的值越高,其优先级越高。
86
2.任务优先级与处理器优先级 处理器优先级 处理器优先级类是在处理器优先级寄存器(PPR)的7~4位中的一个0~15范围内的值。PPR是一个只读寄存器。处理器优先级类表示正在执行的处理器的当前优先级。 PPR的值按如下定义: PPR[7:4](处理器优先级类): TPR[7:4](任务优先级类)和ISRV[7:4](在服务的最高优先权中断的优先权)的最大者 PPR[3:0](处理器优先级子类)按如下方式确定: 如果TPR[7:4] > ISRV[7:4],PPR[3:0]等于TPR[3:0](任务优先级子类) 如果TPR[7:4] < ISRV[7:4],PPR[3:0]等于0 如果TPR[7:4] = ISRV[7:4],PPR[3:0]也许等于0或等于TPR[3:0],实际行为由模式指定。
87
3.中断的处理 与中断有关的3个寄存器 中断请求寄存器(IRR)。包含本地APIC已经接受,但还未分派到处理器的中断请求。当本地APIC接受一个中断请求时,它设置IRR中的相应位为1。 在服务寄存器(ISR)。包含已传递到处理器,但还未处理完的中断。当处理器处理一个中断时,它设置ISR中的相应位为1。 触发方式寄存器(TMR)。指定了每个中断的触发方式,某位为0,则相应中断为边沿触发,某位为1,则相应中断为电平触发。
88
本地APIC接收到的本地中断、中断消息和IPI的处理。
如果本地APIC确定自己是被MNI, SMI, INIT, ExtINT或SIPI中断指定的目标,则中断将直接发送给处理器核去处理。 如果本地APIC确定自己是被中断指定的目标,但中断不是②中列出的那些,则本地APIC设置IRR的相应位。 当IRR寄存器中有多个未决中断时,本地APIC每次派发它们当中的一个到处理器,派发原则是基于他们的优先级和PRR中当前处理器优先级。 当一个固定中断被分派到处理器处理时,处理例程的完成是由指令处理代码中的指令写本地APIC中的中断结束(EOI)寄存器来指明的。写EOI寄存器的结果是引起本地APIC从ISR队列中删除中断并且对电平触发的中断在总线上发送一个消息指明中断处理已经完成。MNI, SMI, INIT, ExtINT或SIPI中断的处理例程中不要写EOI寄存器。
89
补充作业练习 看下图完成以下题目: 1 15 A5 A Y0# 14 2 A6 B 3 13 A7 C 12 74LS138 A8 5 11
IOW# RD# 1 15 IOR# A5 A Y0# WR# 14 2 INTA# A6 B INTA# 3 13 A7 C INTR INT 12 74LS138 A8 5 8259A IR5 ≥1 11 接信号源 A9 G2B# A3 10 DB[7..0] A4 4 G2A# ≥1 9 A2 7 6 Y7# A0 AEN# G1 CS# A0 希望该8259采用电平触发,起始中断向量号是16,总线缓冲方式,全嵌套,非自动EOI。现在要求当IR5中断到来的时候,将变量COME+1,当COME=100时,程序退出(注意中断向量要恢复)。要求编写与中断相关的程序和中断处理程序。
Similar presentations