LightSeed
2009-6-8
中断有分为硬件中断和软件中断,顾名思义硬件中断是由计算机硬件产生的中断,类推软件中断是由计算机软件产生的中断。举个例子,当键盘有键按下需要CPU处理的时候就会经过8259产生一个中断,这个中断就是硬件中断。键盘是计算机硬件这个是不可否认的哦^.^。DOS中断中的的INT 21H就是软件中断中的一种。一般来说可以这么理解,一切由8259负责产生的中断都是硬件中断。一切硬件中断都是由8259产生。(这里我也存在一个问题,CPU其实也是可以产生中断的,但是这个中断理论上应该不算是硬件中断。所以我也就没有把它规在硬件中断这一类。)鉴于篇幅太长,我分成几个小文章逐一讨论。
中断是一种发生了一个外部的事件时调用相应的处理程序去处理的过程。见下图
①查询方式
按序依次检查外设对应的状态变化,依据预先设定的规则,判断有请求,有则执行,无则继续。
优点:简单
缺点:加重CPU负担,浪费计算资源
②中断方式
中断是一种发生了一个外部的事件时调用相应的处理程序去处理的过程。
优点:需要用时才找CPU帮忙,能够并行处理多种I/O
缺点:程式设计以及实现过程比较复杂
关于8259的背景资料以及其他资料不赘述,在此提纲挈领式地说一下它的背景。
编程中断控制器8259A
Intel 8259A是一种可编程中断控制器PIC,它是为管理Intel 8080/8085和Intel 8086/8088CPU的可屏蔽中断而设计的,后来又被用于Intel 80286 CPU。在高档Pc系列机中,它的逻辑被集成到多功能接口芯片中。
8259A具有以下主要功能:
①具有8级优先权控制,通过级联可扩展至64级优先权控制(PC上只扩展到16级);
②每一级中断都可以屏蔽(笔者:来了中断也不汇报给CPU)或允许;
③在中断响应周期,8259A可提供相应的中断类型号(笔者:供CPU计算得到中断向量号),从而能迅速转入中断服务程序;
④8259A有几种中断管理模式,可以通过编程进行选择。
主要谈谈它关于中断请求的这个过程的一个详细论述,首先看看单个8259A对于中断的处理过程。
图1 8259A中断响应流程图解
中断的过程可以简单地描述如下:(假如是KBD发生中断请求)
① 键盘发生中断请求;
② 8259A的中断请求寄存器做相应记录;
③ 优先级分析器做出判决,(假设键盘的优先级比当前处理的中断优先级更高);
④ 8259A通过INTR向CPU发出中断请求;
⑤ CPU准备相应,回发一个INTA#给8259A,此时8259A会做出相应的寄存器处理;
⑥ 8259A会把中断类型码放到DATABUS上,CPU解析然后进入ISR, CPU再发一个INTA#给8259A,相应一系列动作完成。
整个过程详见流程图四,图解见图1。更多的细节没有描述出来。
8259在PC中都是成对出现的,因为一直以来为了解决硬件中断号数量上的不够所以考虑到了两块8259级联。(为什么不用三块呢?其实两块就足够了,又何必去浪费资源呢。)PIC级联的基本HW图见图1。
图1 cascade interrupt controller
当中断发生后CPU的过程 见如流程图三。
7个寄存器被分为两组,第一组寄存器为4个,它们叫做初始化命令字ICW(initialiaztion command word)分别为ICW1 ~ ICW4 第二组寄存器为3个,他们用来容纳操作命令字OCW(operation command word)分别称为OCW1 ~ OCW4 而BIOS在初始化时修改的就是ICW这几个,至于OCW是由应用程序设定的,他们用来对中断处理过程作动态控制。在一个系统运行过程中,操作命令字可以被多次设置。
8259A是中断系统的核心器件,对它的初始化编程要涉及中断系统的软、硬件的许多问题,而且一旦完成初始化,所有硬件中断源和中断处理程序都必须受其制约。
图2 ICW1格式
ICW1 的格式如图2所示,但是还必须要申明一点的是,ICW1在initial的过程中port地址必须是偶地址,而ICW2 ~ ICW4 必须是奇地址。比如:20H与21H之分。
图3 ICW2格式 |
ICW2 是中断类型码的初始化命令字,对于全部的IRQ高5位都是相同的,也因此被称为base address。举个例子,比如说base address是01001(B)=9(D),那么当ICW2 的值是01001001(B)的时候,它所代表的中断向量号就是9+1=10,这时就产生了IRQ 10的中断。这种“寻址”的方式和其他的方式一样,[2:0]是偏移。如图3
ICW3 只有在一个系统中包含多片8259A时才有意义。而系统中多片8259A是由ICW1 的D1(SNGL)来指示的,所以只有当SNGL=0时,才设置ICW3 。并且ICW3 在主片和从片中的格式还不一样。在主片中格式如图4
D7 D6 D5 D4 D3 D2 D1 D0
IR7 |
IR6 |
IR5 |
IR4 |
IR3 |
IR2 |
IR1 |
IR0 |
图4 ICW3 在Master中的格式
Slave 8259A接在master的哪个pin上IRx就被置1(当然也可以接多片的)。而在slave中格式如图5。
D7 D6 D5 D4 D3 D2 D1 D0
0 |
0 |
0 |
0 |
0 |
IR2 |
IR1 |
IR0 |
图5 ICW3 在Slave中的格式
在从片中,D7~D3不用,为了兼容全部被清零。D2~D0则填接到Master上的第几pin。比如接到第5 pin时,ICW3 的值是00000101B。
图6 ICW4 格式
ICW4用于设定8259A的工作方式,其格式如图6所示。说的比较清楚基本不用解释了。
在initial 8259A的过程中BIOS不涉及它们,(当然不是说它们不重要,理解整个8259A的工作流程是应该的,也比较简单这里就不赘述了)所以这里就略写了。
OCW1 是中断屏蔽操作命令字,顾名思义可知其作用了。OCW2用于设置中断优先级方式和中断结束方式。OCW3用于设置或清除特殊屏蔽方式和读取寄存器的状态。
由于在ICW1 中的SNGL位有明确的严格的initial 8259的顺序,那么只有直接写进去就OK了(BIOS中是直接被置为1了,故什么都不用考虑了)。Initial的流程图见流程图2。
典型的initial程序如下:(我手上的8259A的端口地址为Master 20H,Slave A0H)
;------------------------------------------主片8259A的初始化程序为
MOV AL, 00010001B ; 级联, 边沿触发, 需要写ICW4
OUT 20H, AL ; 写ICW1
MOV AL, 00001000B ; 中断类型号8H
OUT 21H, AL ; 写ICW2
MOV AL, 00000100B ; 主片的IR2引脚接从片
OUT 21H, AL ; 写ICW3
MOV AL, 00000001B ;非特殊完全嵌套,非缓冲,非自动结束,80x86模式
OUT 21H, AL ; 写ICW4
;------------------------------------ -----从片8259A初始化程序为
MOV AL, 00010001B ; 级联, 边沿触发, 需要写ICW4
OUT A0H, AL ; 写ICW1
MOV AL, 01110000B ; 中断类型号70H
OUT A1H, AL ; 写ICW2
MOV AL, 00000010B ; 接主片的IR2引脚
OUT A1H, AL ; 写ICW3
MOV AL, 00000001B ;非特殊完全嵌套,非缓冲,非自动结束,80x86模式
OUT A1H, AL ; 写ICW4
流程图2