1、第7章 中 断 和 异 常 第7章 中 断 和 异 常 7.1 概述概述 7.2 中断中断 7.3 异常异常 7.4 中断及异常的暂时屏蔽中断及异常的暂时屏蔽 7.5 中断及异常的优先级中断及异常的优先级 7.6 实方式下的中断实方式下的中断 7.7 保护方式下的中断和异常保护方式下的中断和异常 7.8 中断优先级管理器中断优先级管理器8259A PIC 第7章 中 断 和 异 常 7.1 概概 述述图 7.1 中断过程 原程序CPU响应中断中断返回中断请求中断处理程序第7章 中 断 和 异 常 图 7.2 微处理器3种中断技术示意图(a)单线中断;(b)多级中断;(c)矢量中断 INTRCP
2、U+1#2#3#外设中断请求(a)INTR1INTR2INTR3CPU1#2#3#外设中断请求(b)D0D1CPUD7 INTR外设提供设备标志码外设中断请求(c)第7章 中 断 和 异 常 在单线中断技术中,多个外设的中断请求必须用“或”逻辑连接在一起,共同接到微处理器的一条中断请求线上。由于共用一条中断请求线,以下几个问题须予以解决:(1)中断源的识别。所谓中断源是指引起中断的原因或发出中断申请的来源。当中断请求信号INTR有效时,CPU必须判断是哪一个中断源发出的中断请求,这就是中断源的识别问题。(2)中断请求的优先权排队问题。当有多个中断源同时请求中断时,需根据轻重缓急先后次序予以处理
3、,这就是优先权排队问题。(3)中断的多级嵌套。在优先权级别较低的中断源被服务时,允许比它优先级别高的中断源请求中断。第7章 中 断 和 异 常 在多级中断技术中,微处理器有几条优先级别不同的中断请求线,若每一个中断源都有其对应的一条中断请求线,则发生中断时,微处理器就能识别中断源及其优先级别。这种中断技术的中断响应速度快,结构简单,但受微处理器封装引脚数的限制,通常为23条,最多也不过56条。例如8085-CPU有5条中断请求线,而80X86系列CPU有2条中断请求线。在矢量(亦称向量)中断技术中,由每个中断源(经接口)向CPU提供中断源的设备标志码,将程序转向相应中断源设备的中断处理程序,或
4、中断源提供中断处理程序的入口地址。由于矢量中断不需要查询中断源,故中断处理速度较快。第7章 中 断 和 异 常 异常是在指令执行期间检测到的不正常的或非法的状态,使指令不能成功执行。它与所执行指令有直接的联系。例如指令执行期间检测到段异常或页异常时,指令便不能执行下去。异常的发生源于微处理器内部,且总是与微处理器操作同步。因而,通常将软中断指令INTn及INT0等也归类于异常。此外,排错机制也是异常的一个例子。处理器对中断和异常的处理通常在两条指令之间进行。当执行一条带重复前缀的串操作指令时,为保证处理器对中断的及时响应,80386等设计成每条串指令都允许在每次重复操作后响应中断,且重复的串指
5、令也允许报告一个异常,而不丢失已完成各步的结果。例如,一条带重复前缀的查找指令,需要在300个字节中查找一个字符,在查找到250个字节时,仍未找到给定字符,且产生异常。这时第250步是该指令成功执行的最后一个执行步。因而,产生异常时,处理器将保存第250执行步的指针及计数值。异常原因排除之后,便可恢复该指令的执行,完成最后50个字节的查找操作 第7章 中 断 和 异 常 80386、80486中,采用矢量中断技术,每种中断或异常都有它自己的中断矢量,用8位二进制数表示。矢量号(或称中断类型号)用来从中断描述符表(保护虚地址方式时)或中断矢量表(实地址方式时)中选择给定中断的处理程序首地址。80
6、386及80486已将矢量号031 分配给异常;中断及软中断指令的矢量号可在0255范围内选择,但为避免与异常矢量号冲突,最好在32255的范围内选择。第7章 中 断 和 异 常 7.2 中中 断断 7.2.1 可屏蔽中断可屏蔽中断 经由INTR信号(高电平有效)请求的中断称为可屏蔽中断。它受中断允许标志位IF的影响和控制。当IF被软件采用STI指令置1时,表明可屏蔽中断被允许,CPU响应可屏蔽中断。当IF被软件采用CLI指令置0时,表明可屏蔽中断被禁止,CPU不响应可屏蔽中断,并将该中断信号挂起,直到IF被置位或外部事件撤消中断请求为止。IF位可禁止可屏蔽中断的这一特性可用来在程序代码的某一
7、特定区域(常称为程序的临界区)设置成禁止中断,以保证该区域内程序段的可靠执行。第7章 中 断 和 异 常 80X86系统中,可屏蔽中断源产生的中断请求信号,通常通过8259A可编程中断控制器进行优选权控制后,由8259A向CPU送中断请求信号INTR和中断标识码(中断矢量)。采用9个8259A芯片,可支持64个中断源,给每个中断源分配不同的中断矢量,并可对每个中断源分配和判断它们的中断优先级。第7章 中 断 和 异 常 7.2.2 非屏蔽中断非屏蔽中断 经由NMI信号线(边沿触发)请求的中断称为非屏蔽中断。它是不被IF禁止的中断。非屏蔽中断被响应时,其中断矢量号不由外部中断源提供,而是由系统固
8、定分配。80X86系统中,非屏蔽中断的矢量号为2,它的优先级别高于可屏蔽中断,但当正执行加载SS寄存器指令时产生NMI信号,则中断要等其后的指令执行完才能识别和响应。非屏蔽中断通常用来处理应急事件,如总线奇偶错、电源故障或电网掉电等。第7章 中 断 和 异 常 7.3 异异 常常 7.3.1 异常分类异常分类 产生异常后,系统根据引起异常的程序是否可被恢复这一原则,进一步又把异常分为故障(Fault)、陷阱(Trap)和中止(Abort)3 类。故障是引起该故障的程序可被恢复执行的异常,它也是在引起故障的指令执行之前就报告给系统的一种异常。对故障的检测,既可在引起故障的指令之前进行,也可在微处
9、理器恢复成故障指令执行之前的状态时进行。一旦故障被检测出,便在保护断点地址(指向引起故障的指令)后,将程序转入故障处理程序。故障处理程序执行完,故障也排除了,这样由IRET指令将程序返回有故障的程序时,引起故障的指令便得以正确执行。第7章 中 断 和 异 常 陷阱是在指令执行期间被检测到的,并在引起异常的指令执行之后向系统报告的一种异常。陷阱产生后,程序转向异常处理程序,这时,保存的断点地址指向引起陷阱的指令的下一条应该执行的指令。这里,下一条应该执行的指令不一定就是下一条指令。例如,若一个陷阱在一条转移类指令执行期间检测到,则保存在栈中的断点地址将指向要转移到的地址,而不是转移类指令之后的下
10、一条指令的地址。第7章 中 断 和 异 常 特别需要指出,软件中断指令INTn属于陷阱指令。该指令执行后使程序转入陷阱处理程序,断点地址指向下一条指令。中止是微处理器面临严重错误时产生的异常。例如,系统出现硬件错误或系统表中出现非法值或不一致的值时,便产生中止异常。引起中止的指令无法确定,产生中止时,正执行的程序不能被恢复。因而,产生中止异常后,系统需重建各种系统表格,或需重新启动操作系统。第7章 中 断 和 异 常 7.3.2 异常错误码异常错误码 图 7.3 异常错误码格式 选择器索引保留3116153210选择器索引153210 80286 错误码格式80386/80486 错误码格式域
11、值描述中断的程序引起异常由TI位决定表选择器用于GDIEXT=0=1外部事件引起异常选择器用于门描述符选择器用于LDIIDT=0=1TI=0=1TIIDTEXTTIIDTEXT第7章 中 断 和 异 常 错误码的格式类似于选择器格式,区别仅在于选择器中的RPL域在此被两个1位域替代了。其中位0定义为EXT域,EXT=1,表示错误由程序的外部事件(如硬件中断)引起;EXT=0,表示异常由程序引起。位1定义为IDT域,IDT=1,表明错误码索引域引出的描述符属于中断描述符中的门描述符;IDT=0,表明索引域的意义取决于TI域。位2定义为表索引域TI,TI=1,表明索引域指向局部描述符表LDT;TI
12、=0,表明索引域指向全局描述符表GDT。位3位15为索引域。索引域与TI组合成一个14位指针,指向与异常相关的表项。80386、80486产生页交换异常时,采用不同格式的错误码。第7章 中 断 和 异 常 7.3.3 处理器定义的异常处理器定义的异常 所谓处理器定义的异常是80X86处理器中保留自用的异常,共有16个。1.异常异常0 异常0定义为除法出错异常,是一种故障型异常。当微处理器执行除法指令时,若商太大使目的寄存器容纳不下,或是以零作除数,便产生该故障异常。异常0产生时,将除法指令(包括任何前缀)第一字节地址压入栈中,除数和被除数为除法指令执行前的值,并允许除法操作在故障处理程序执行完
13、后重新启动。除法出错不提供出错码。第7章 中 断 和 异 常 2.异常异常1 异常1定义为排错异常或称调试异常。排错异常有故障类的也有陷阱类的,其中的单步异常为陷阱。若TF=1,则微处理器处于单步方式。当一个调试异常产生时,微处理器设置调试状态寄存器DR6的相应位,以便反映异常的类型或引起异常的断点。位于0特权级的排错处理程序可以访问DR6。在一条指令中,可以检测不止一个排错异常并使DR6中同时有几个位置1。排错异常不提供出错码。第7章 中 断 和 异 常 3.异常异常3 异常3为断点中断,是一个采用单字节指令INT3的软件中断,微处理器将作为一个陷阱异常来处理。排错程序用INT3来支持程序断
14、点,并在转入断点处理程序时,压入栈中的CS及EIP值指向紧跟在INT3指令的一条指令。INT3陷阱不提供出错码。第7章 中 断 和 异 常 4.异常异常4 异常4定义为溢出陷阱。溢出陷阱由INTO指令通过矢量4提供一个条件陷阱。若EFLAGS 中的OF=1,则INTO指令产生陷阱;若OF=0,则不产生陷阱,继续执行INT0后边的指令。当溢出陷阱产生,转入溢出处理程序时,压入栈中的CS及EIP值指向INT0的下一条指令。溢出陷阱不提供出错码。第7章 中 断 和 异 常 5.异常异常5 异常5定义为边界检查故障。若传送给BOUND指令的操作数表明给定的索引指针要落到可能的数组边界以外时,便发生边界
15、检查故障。在转入故障处理程序时,压入栈中的CS及EIP值指向发生故障的BOOND指令。边界检查故障不提供出错码。第7章 中 断 和 异 常 6.异常异常6 异常6定义为无效操作码故障。从当前CS及EIP所指定的位置开始,若连续一个字节或多个字节所包含的内容不是80386(或80486等)指令系统中的任何一条指令,便发生无效操作码故障。无效操作码故障发生在试图执行该操作码时,而不是预取时。引起该故障的原因有3种:操作码字段的内容不是一个合法的指令代码;指令要求使用存储器操作数时,却使用了寄存器操作数;不能加锁的指令使用了LOCK前缀。第7章 中 断 和 异 常 7.异常异常7 异常7定义为协处理
16、器无效故障。80386、80486微处理器中,如果在一条ESC指令执行期间,控制寄存器CR0中的模拟位EM(Emulate)被置位,便会发生该故障;如果WAIT或ESC指令执行时,CR0中的监控处理器扩展位MP或任务转换位TS置位,也会产生异常7。协处理无效故障也不提供错误码。第7章 中 断 和 异 常 8.异常异常8 异常8定义为双重故障。双重故障属中止异常。当转入双重故障处理程序时,压入栈中的CS及EIP值不可能指向引起双重故障的指令,而且指令的重新启动不支持双重故障。双重故障出现在系统出现严重问题时,如段描述符表、页表或中断描述符表出现问题等。如果正通知给系统一个段或页故障时,又检测到一
17、个段故障;或者正通知给系统一个页故障时又检测到一个段或页故障,两种情况都会引起双重故障。然而,若正通知给系统一个段故障时又检测到一个页故障,这时通知给系统的是页故障而不是双重故障。如果正通知系统一个双重故障,又检测到一个段或页故障,则处理机暂停指令的执行,进入关机方式。这时好像执行了一条HLT指令,使微处理器空转,直到一个非屏蔽中断发生或微处理器重新启动为止。关机方式下,微处理器不响应INTR中断,双重故障不提供错误码。第7章 中 断 和 异 常 9.异常异常9 异常9定义为协处理器段越界异常,属于中止类异常,发生在浮点指令数超出段界限时。当转入异常处理程序时,压入栈中的CS及EIP指向被中止
18、的指令。然而,由于引起协处理器段越界指令不能被重新启动,即每次执行该指令总得到同样结果,故该异常是一种中止类异常。但是这种中止仅指正执行的程序的中止,而非系统的中止。协处理器段越界异常不提供错误码。80486中该异常未用,而用异常13取而代之。第7章 中 断 和 异 常 10.异常异常10 异常10定义为无效TSS故障。任务切换期间,如果新任务的TSS是一个非法的任务状态段(即发生除不存在异常以外的段异常时),便会产生无效TSS故障。该异常提供一个出错码,以便指明引起异常的段的选择子。出错码中的EXT位用来表示异常是否由不受程序控制的外部事件引起。例如,一个外部中断通过任务门进行任务切换时,可
19、能产生非法TSS故障。当无效TSS故障发生,转入故障处理程序时,压入栈中的CS及EIP值指向引起这一故障的指令;而当该故障作为任务切换的一部分发生时,则指向任务切换的第一条指令。第7章 中 断 和 异 常 11.异常异常11 异常11定义为段不存在异常,属故障类型。微处理器访问除SS以外的其它有效的段描述符时,若发现描述符中存在位P=0,便产生段不存在异常。该异常提供一个出错码,以便指明引起异常的段的选择子。如果该异常由外部事件引起,错误码中的EXT位置1;如果错误码涉及中断描述符表项,则IDT位置1。当段不存在故障发生,转入故障处理程序时,压入栈中的CS及EIP值指向引起这一故障的指令,或当
20、该故障作为任务切换的一部分发生时,指向任务切换的第一条指令。第7章 中 断 和 异 常 12.异常异常12 异常12定义为栈段故障。栈段故障产生的主要原因是,栈上溢或下溢,或在任务间或级别间变换时访问一个存在位P=0的栈段。任何明显或不明显的访问栈的操作都可能引起该故障。例如,PUSH、POP、ENTER、LEAVE及MOV SI,BP+6等指令执行时,均有可能产生栈段故障。栈段故障提供一个错误码压入故障处理程序的栈中。若故障由栈段不存在或级间调用时新栈的溢出引起,出错码将指明引起故障的选择器,并由故障处理程序检查出错码提供的选择子所对应的描述符的存在位来区分二者。若存在位P=1,则表明是新栈
21、溢出引起的故障;若存在位P=0,则表明是栈段不存在引起的故障。对除此之外的其它栈段故障源均给出错误码0。第7章 中 断 和 异 常 13.异常异常13 异常13定义为通用保护故障。它是一种没有预先分类的段异常,包含除已定义异常之外的所有异常。保护方式下产生的这种故障的情况举例如下:使用CS、DS、ES、FS、GS段寄存器时或是访问描述符时超出段的界限。采用DS、ES、FS、GS段寄存器访问内存时,段寄存器中含有空选择子。用系统段或一个可执行但不可读的段的描述符来加载DS、ES、FS或GS段寄存器。第7章 中 断 和 异 常 用一个只读、可执行段或系统段的描述符加载SS(但若失效选择子来自任务切
22、换时的TSS,则将产生异常10)。试图对只读代码段或数据段进行写操作,或对只执行段进行读操作,或对不可执行段进行执行操作。采用DS、ES、FS、GS段寄存器访问内存时,被访问内存数据段的特权级高于当前特权级。切换到正忙的任务。PG=1(页交换允许)和PE=0(保护禁止)时,加载CR0(仅对80386和80486)。超出处理器指令长度限制。第7章 中 断 和 异 常 14.异常异常14 异常14定义为页故障。对80386/80486微处理器来说,若从线性地址到物理地址的转换过程中,检测到错误,便产生页故障。当CR0中PG=1,允许分页时,如果需要地址变换的页目录或页表项中的存在位P=0,或当前任
23、务的特权级别不足以存取指定的页,或用不适当的访问类型访问一内存页,都会产生页故障。第7章 中 断 和 异 常 图 7.4 页交换失效错误码 未定义313U/S2R/W1P0域PR/WU/S描述失效由不存在页引起失效由页级别保护冲突引起失效由读引起失效由写引起失效发生在管理方式失效发生在用户方式值010101第7章 中 断 和 异 常 15.异常异常16 异常16定义为协处理器出错故障。当CR0中EM位=0(协处理器未被模拟),且协处理器发生了未被屏蔽的数字错误(如上溢或下溢)时,便会产生协处理器出错故障。把协处理器出错故障通知给系统,是在引起故障的浮点指令之后的下一条ESC协处理器指令或WAI
24、T指令执行时进行。协处理器出错故障发生,转入故障处理程序时,压入栈中的CS和EIP值指向引起错误的ESC或WAIT指令的第一字节。该故障不提供出错码,引起故障的指令的地址由协处理器保存。第7章 中 断 和 异 常 表表 7.1 异常一览表异常一览表 第7章 中 断 和 异 常 7.4 中断及异常的暂时屏蔽中断及异常的暂时屏蔽 中断及排错异常在某些条件下可被忽略或屏蔽。这时,被屏蔽的各种中断保持悬挂,而排错异常则被废弃。引起中断和排错异常忽略及屏蔽的条件如下:EFLAGS中的IF=0,屏蔽外部可屏蔽中断。IF=0时,执行STI指令,则在STI指令及下面一条指令执行期间,屏蔽外部可屏蔽中断。这是因
25、为一个过程执行完返回主程序前执行一条STI指令,允许可屏蔽中断发生,但希望在IRET指令执行完返回主程序后再响应中断。否则,若在IRET指令执行前响应中断,就会使过程不能返回,且过多占用堆栈。第7章 中 断 和 异 常 EFLAGS中的RF=1,屏蔽排错故障。系统正处理一个非屏蔽外部中断,则屏蔽任何新的非屏蔽中断。执行以SS为目的寄存器的MOV及POP指令时,将在该指令及下面一条指令(常是以ESP为目的寄存器的MOV及POP指令)执行期间屏蔽各种中断及排错异常。这样便可安全完整地更新一个栈指针。在指令前缀LOCK及被锁定的指令之间不允许中断。第7章 中 断 和 异 常 7.5 中断及异常的优先
26、级中断及异常的优先级 表表 7.2 中断中断/异常的优先级异常的优先级 第7章 中 断 和 异 常 7.6 实方式下的中断实方式下的中断 中断矢量FFH3FCH中断矢量FEH3F8H中断矢量FDH3F4H 段 偏移量中断矢量2中断矢量1中断矢量0OAH840限量=3FF基地址=0150150物理地址IDT 寄存器(仅限于80286及以后的处理器)以初值示出基地址 对80286是24位 对80386/80486是32位中断矢量表图 7.5 实方式的中断向量表第7章 中 断 和 异 常(1)条件IF=1NMI=0HOLD=0无内部中断IPCSPSWINTRINTAD0D7INTINTAD0D7(2
27、)中断请求INT=1(3)INTA=0送8259A(4)类型码N送CPUIR0IR1IR7CPU和总线控制逻辑8259A4*N4*N+2(6)0IF0TF(7)(4*N)IP(4*N+2)CS转入中断处理程序(5)保护断点IPCSPSW(9)返回主程序(2)中断请求主程序外设中断请求(7)转入中断处理程序IRET(9)返回主程序(8)开中断STI中断处理程序图 7.6 可屏蔽中断的响应和处理过程第7章 中 断 和 异 常 (1)CPU要响应可屏蔽中断请求,必须满足一定的条件,即中断允许标志置1(IF=1),没有异常,没有非屏蔽中断(NMI=0),没有总线请求。(2)当某一外部设备通过其接口电路
28、中断控制器8259A发出中断请求信号时,经8259A处理后,得到相应的中断矢量号,并同时向CPU申请中断(INT=1)。第7章 中 断 和 异 常 (3)如果现行指令不是HLT或WAIT指令,则CPU执行完当前指令后便向8259A发出中断响应信号(INTA=0),表明CPU响应该可屏蔽中断请求。若现行指令为HLT,则中断请求信号INTR的产生使处理器退出暂停状态,响应中断,进入中断处理程序。若现行指令为WAIT指令,且TEST引脚加入低电平信号,则中断请求信号INTR产生后,便使处理器脱离等待状态,响应中断,进入中断处理程序。此外,对于加有前缀的指令,则在前缀与指令之间CPU不识别中断请求;对
29、于目标地址是SS段寄存器的MOV和POP指令,则CPU在这些指令之后的一条指令执行后方响应中断。第7章 中 断 和 异 常 (4)8259A连续两次(2个总线周期)接收到INTA=0的中断响应信号后,便通过总线将中断矢量号送CPU。(5)保护断点。将标志寄存器内容、当前CS内容及当前EIP内容压入堆栈:(SP)(SP)-2(SP)+1(SP)(PSW)(SP)(SP)-2(SP+1(SP)(CS)(SP)(SP)-2(SP)+1(SP)(EIP)第7章 中 断 和 异 常 (6)清除IF及TF(IF0,TF0),以便禁止其它可屏蔽中断或单步中断发生。(7)根据8259A向CPU送的中断矢量号n
30、求得中断矢量,再查中断矢量表,得相应中断处理程序首地址(段内偏移地址和段地址),并将其分别置入EIP及CS中。(EIP)(4*N)(CS)(4*N+2)一旦中断处理程序的32位首地址置入CS及EIP中,程序就被转入并开始执行中断处理程序。第7章 中 断 和 异 常 (8)中断处理程序包括保护现场、中断服务、恢复现场等部分。(9)中断处理程序执行完毕,最后执行一条中断返回指令IRET,将原压入堆栈的标志寄存器内容及断点地址重又弹出至原处:(EIP)(SP)+1(SP)(SP)(SP)+2(CS)(SP)+1(SP)(SP)(SP)+2(PSW)(SP)+1(SP)(SP)(SP)+2 第7章 中
31、 断 和 异 常 图 7.7 中断处理流程图 执行指令中断请求?中断响应保护现场中断服务程序恢复现场返回执行下条指令YN第7章 中 断 和 异 常 可屏蔽中断处理程序通常由用户编写为一个过程,一般格式如下:INTER1 PROC FAR PUSH AX;保护现场 PUSH BX ;中断服务程序 STI ;开中断,以便允许多重中断 ;继续执行中断服务程序 (发中断结束命令)POP BX ;恢复现场 POP AX IRET ;返回主程序INTER1 ENDP 第7章 中 断 和 异 常 当用户使用类型n中断时,一方面将外设接口的中断请求信号与8259A相应引脚相连,另一方面要根据类型号n求出中断矢
32、量地址,并把中断处理程序首地址(中断矢量)送入矢量地址中,MOV AX,0 ;矢量表段址为0MOV ES,AXMOV DI,n*4;矢量地址送DIMOV AX,OFFSET INTER1;中断处理程序首地址存入表内CLDCTOSWMOV AX,SEG INTER1STOSW 第7章 中 断 和 异 常 异常、软件中断及非屏蔽中断的中断矢量号或由CPU固定分配好或由INT n指令提供。因此,不需要外设提供类型码(矢量号)。当转入中断处理程序时,首先CPU按序将FLAGS、CS及EIP寄存器的内容压入栈中。压入栈中的断点地址(CS及EIP值)取决于中断类型。若为陷阱,断点地址为引起陷阱的指令的后面
33、一条指令的第一字节地址。若为故障,则断点地址为引起故障的指令的第一字节地址。然后,将FLAGS中的单步陷阱标志TF和中断标志IF清零。最后,根据中断矢量号查得中断处理程序首地址,转入中断处理程序。实方式下产生的异常向栈压入错误码。第7章 中 断 和 异 常 7.7 保护方式下的中断和异常保护方式下的中断和异常 图 7.8 保护方式的中断描述符表 中断描述符表中断N的门8N中断N-1的门8(N-1)中断2的门中断1的门中断0的门10H80限量基地址IDT 寄存器基地址=24位 用于80286 =32位 用于80386/80486015第7章 中 断 和 异 常 保留(必须为0)DPL0类型代码段
34、选择器偏移量未用80286中断或陷阱门1506420任务门1412 11780386/80486中断或陷阱门域PDPL类型描述存在描述符特权级类型域的值按如下决定门类型:值0101B0110B0111B1110B1111B门类型任务门16bit(80286)中断门16bit(80286)陷阱门16bit(80386/80486)中断门16bit(80386/80486)陷阱门P偏移量(高)DPL0类型代码段选择器偏移量(低)保留1506420P保留DPL0类型TSS段选择器保留保留15P06420000图 7.9 中断描述符格式第7章 中 断 和 异 常 7.7.1 通过中断门及陷阱门的转移通
35、过中断门及陷阱门的转移 图 7.10 通过中断门或陷阱门的转移 SelectorAttributesOffset中断描述符表AttributesLimitBase入口点全局或局部描述符表线性地址空间第7章 中 断 和 异 常 图 7.11 通过中断门或陷阱门向内层转移 Outer SSOuter ESPEFLAGSOuter CSOuter EIPError CodeLimitIRET前的ESP指针中断后的ESP指针SS0内层栈外层栈0SS中断前及IRET后的ESP指针Limit向外返回向内中断堆线向下增长第7章 中 断 和 异 常 7.7.2 NT=0时的中断时的中断(或异常或异常)返回返回
36、 中断或异常处理程序执行完时,执行一条IRET指令,完成向主程序的返回。若通过中断门或陷阱门转入处理程序,在转入过程中已将NT清零,表明是同一任务内的程序转移。因而,NT=0时的中断(或异常)返回属同一任务的返回。然而,由于转入中断处理程序时,可以转入同级或更内层的级,故返回时是返回到同一级或外层级。第7章 中 断 和 异 常 7.7.3通过任务门的转移通过任务门的转移 系统产生某一中断或异常时,将该中断或异常的矢量号乘以8后作为指针去检索中断描述符表IDT,若检索到的描述符是一个任务门,则表示要转移到不同任务的处理程序。与CALL指令通过任务门进行任务切换一样,任务门提供一个16位选择子,以
37、指向处理程序任务的TSS段。该TSS段必须是一个可用的286 TSS段或386/486 TSS段。通过任务门到一个可用的TSS段,转入中断或异常处理程序的过程,与CALL指令通过任务门到可用的TSS段,实现任务切换的过程相同。唯一不同的是中断或异常通过任务门引起的任务切换和程序转移提供错误码。在任务切换完成后,如有必要,应将错误码压入新任务的堆栈中。第7章 中 断 和 异 常 如果中断或异常发生时,是通过任务门转入处理程序,则在转入过程中使EFLAGS中的NT位置1。这表明从处理程序返回主程序执行IRET指令时,必须返回到一个嵌套的任务。IRET指令应从当前TSS段的链接字段中索取返回到的任务
38、的TSS的选择子,从而完成任务切换和程序返回。第7章 中 断 和 异 常 7.8 中断优先级管理器中断优先级管理器8259A PIC 7.8.1 8259A的内部结构及引脚信号的内部结构及引脚信号 IR0IR1IR2IR3IR4IR5IR6IR7中断请求寄存器(IRR)优先权判别器(PR)中断服务寄存器(ISR)中断屏蔽寄存器(IMR)控制电路数据总线缓冲器读/写控制电路级联缓冲器/比较器D7D0RDWRA0CSCAS0CAS1CAS2SP/EN内部总线INTAINT图 7.12 8259A的结构框图第7章 中 断 和 异 常 图 7.13 8259A引脚图 12345678910111213
39、142827262524232221201918171615CSWRRDD7D6D5D4D3D2D1D0CAS0CAS1GNDCAS2SP/ENINTIR0IR1IR2IR3IR4IR5IR6IR7INTAA0VCC第7章 中 断 和 异 常 7.8.2 8259A的编程的编程 对8259A的编程分两步:第一步,在系统加电和复位后,用初始化命令字对8259A芯片进行初始化编程;第二 步,在操作阶段,用操作命令字对8259A进行操作过程编程,即实现对8259A的状态、中断方式和中断响应次序等的管理。这时,一般不再发初始化命令字。第7章 中 断 和 异 常 1.初始化命令字及其编程初始化命令字及其
40、编程共有4个初始化命令字ICW1ICW4。(1)ICW1命令字。命令字格式如下:1LTIMSNGLIC4D7 D6 D5 D4 D3 D2 D1 D0 其中表示无关位,其余各位意义是:LTIM用来设定中断请求信号的有效形式。LTIM=1表示中断请求信号IR0IR7高电平有效;第7章 中 断 和 异 常 SNGL用来表明8259A是单片工作方式(SNGL=1),还是级联工作方式(SNGL=0)。IC4位为1表示后面还要设置初始化命令字ICW4;IC4为0表示不再设置ICW4。命令字中D4位为1表明该命令字是ICW1,是和其它命令字区别的标志。ICW1命令字由CPU向8259A写入时,写入地址号是
41、偶数,即A0=0。第7章 中 断 和 异 常 (2)ICW2命令字。ICW2命令字用来设置中断类型号基值。所谓中断类型号基值是指0中断源IR0所对应的中断类型号,它一定是个可被8整除的正整数,其格式如下:T7T6T5T4T3000D7 D6 D5 D4 D3 D2 D1 D0 当8259A接收到CPU发回的中断响应信号INTA=0后,便通过数据总线向CPU送中断类型号字节。该字节的高5位即为ICW2的高5位,低3位根据当前CPU响应的中断是IR0IR7中的哪一个而定,分别对应000111。ICW2命令字设置时采用8259A的奇数地址,即A0=1。第7章 中 断 和 异 常 (3)ICW3命令字
42、。ICW3命令字仅用于8259A级联方式时,指明主8259A的哪个中断源(IR0IR7中的一个)与从8259A的INT引脚相连,也即指明从8259A的INT引脚和主8259A的哪一个中断源请求信号(IR0IR7中的一个)相连。ICW3命令字设置时采用奇数地址,其格式如下:S7S6S5S4S3S2S1S0D7 D6 D5 D4 D3 D2 D1 D0 主8259A 00000ID2ID1ID0从8259A 第7章 中 断 和 异 常(4)ICW4命令字。图 7.14 ICW4的格式及各位意义 SFNMBUFM/SAEOIPM000D7D6D5D4D3D2D1D01 8086/8088模式0 80
43、80/8085模式1 中断自动结束0 中断正常结束X 非缓冲方式0 缓冲方式/从片1 缓冲方式/主片0111 特殊全嵌套方式0 正常全嵌套方式第7章 中 断 和 异 常 图 7.15 8259A初始化编程流程图 ICW1ICW2SNGL=1?ICW3IC4=1?ICW4地址A0=0A0=1A0=1A0=1YYNN第7章 中 断 和 异 常 2.操作命令字及其编程操作命令字及其编程 在按规定的顺序对8259A置入初始化命令字后,8259A便处于准备就绪状态,等待中断源发来的中断请求信号,并处于完全嵌套中断方式。若想变更8259A的中断方式和中断响应次序,或想从8259A内读出某些寄存器内容,就应
44、向8259A写入操作命令字。操作命令字可在主程序中写入,也可在中断服务程序中写入。(1)8259A的中断方式。8259A的中断方式有5种:完全嵌套方式、循环优先方式、特殊循环方式、特殊屏蔽方式和查询方式。第7章 中 断 和 异 常 完全嵌套方式。这是最基本的中断方式。8259A在初始化编程后便处于这种方式。其特点是优先级次序随序号的递增而变低,即IR0优先级最高,IR1次之,而IR7优先级最低。在完全嵌套方式、CPU开中断情况下,执行某中断处理程序期间,不能响应本级或较低级中断,但能响应较高级中断。第7章 中 断 和 异 常 自动循环方式。这实际上是等优先权方式。其特点是某一中断请求被响应后,
45、该中断级便自动成为最低的中断级,其它中断源的优先级别也相应循环改变,以使各中断源被优先响应的机会相同,亦即优先等级是轮流的。例如IR4请求的中断结束后,自动变为最低优先级,而相邻的IR5请求的中断级变为最高级,IR6请求的中断变为次高级;IR5请求的中断完成后,IR6请求的中断变为最高级,IR7请求的中断变为次高级。第7章 中 断 和 异 常 指定最低级的循环排序方式。该方式也称特殊循环方式。在这种方式下,能在主程序或服务程序中通过指定某中断源的优先级为最低级,而其它中断源的优先级也随之改变的方法,来改变各中断源的优先等级。例如指定IR4请求的中断级为最低级,则IR5请求的中断便为最高级,IR
46、6请求的中断为次高级。第7章 中 断 和 异 常 特殊屏蔽方式。该方式与完全嵌套方式的排序方法不同,除了用操作命令字OCW1屏蔽掉的中断级和正在服务和中断级外,允许其它任何级的中断请求中断正在服务的中断。用这种方法可在程序的不同阶段改变中断级的优先次序。查询法排序方式。该方式用查询的方法响应与8259A相连的8级中断请求。采用该方式时,8259A的INT引脚不用,或CPU处于关中断状态,以便CPU不能响应INT线上来的中断请求。这时若要选择最高优先级,必须先用操作命令字发查询命令,然后再用输入指令识别当前有无中断请求及优先级最高的中断请求。第7章 中 断 和 异 常 (2)中断结束(EOI:E
47、nd of Interrupt)。这里中断结束(EOI)是指对8259A内部中断服务寄存器ISR的对应位复位的操作。这有两种方法:自动EOI方式和EOI命令方式。自动EOI方式。这是指在第二个INTA脉冲的后沿之后,由8259A自动清除ISR中已置位的那些位中优先级最高的位。这种自动结束中断方式只适用于非多重中断的情况。因为在中断响应周期中已将该级的ISR位清除,因而8259A无法区别正在处理的中断级等级,也就无法响应多重中断。第7章 中 断 和 异 常 EOI命令方式。该方式是在中断服务程序末尾,向8259A发中断结束命令,以便使ISR中和该服务程序对应的位复位,表明服务程序已完。有两种EO
48、I命令:普通的EOI命令和特殊的EOI命令。普通的EOI命令自动使ISR中已置位的中断级中的最高级复位,也即结束当前正在服务的中断。它适用于完全嵌套方式。特殊的EOI命令用来使指定的中断级结束,即命令字中特定的3位编码指定ISR中某一位复位。这种命令字可使用于任何中断方式。第7章 中 断 和 异 常 (3)操作命令字。8259A有种操作命令字:OCW1,OCW2,OCW3。OCW1操作命令字。该命令字用来设置中断源的屏蔽状态,其格式为:M7M6M5M4M3M2M1M0D7 D6 D5 D4 D3 D2 D1 D0 Mi=1,表明相应中断源IRi的中断请求被屏蔽,8259A不会产生发向CPU的I
49、NT信号;Mi=0,表明相应中断源IRi的中断请求未受屏蔽,可以产生发向CPU的INT信号,请求CPU服务。设置OCW1的I/O地址是8259A的奇数号地址,即A0=1。此外,对同一地址的输入指令将把OCW1设置的屏蔽字读入CPU。第7章 中 断 和 异 常 OCW2命令字。OCW2操作命令字用来控制中断结束方式及修改优先权管理方式,格式如下:RSLEOI00L2L1L0D7 D6 D5 D4 D3 D2 D1 D0 OCW2的特征位是D4D3=00。其余各位的意义说明如下:R(Rotate)位为1,表明中断级的优先顺序是自动循环方式;R位为0,表明中断级的优先顺序是固定的,0级最高,7级最低
50、。第7章 中 断 和 异 常 表表 7.3 L2L0编码与编码与IR号的对应关系号的对应关系 L2、L1、L0000001010011100101110111对应的IR号 01234567 EOI(End of Interrupt)位为1,表明OCW2操作命令字的任务之一是用作结束中断命令;EOI位为0,则不执行结束中断操作。第7章 中 断 和 异 常 表表 7.4 OCW2的各种格式及应用的各种格式及应用 第7章 中 断 和 异 常 STISTISTIIRET正在执行的程 序IR1、IR3同时请求IR1服务程序IR0请求IR0服务程序ISR0位清0STIIRETSTIIRETISR1位置1I