【我所認知的BIOS】—>计算机中断系统(1)

来源:互联网 发布:php连接sql server 编辑:程序博客网 时间:2024/04/29 18:19

【我所認知的BIOS—>计算机中断系统(1

LightSeed     

2009-6-8     

中断有分为硬件中断和软件中断,顾名思义硬件中断是由计算机硬件产生的中断,类推软件中断是由计算机软件产生的中断。举个例子,当键盘有键按下需要CPU处理的时候就会经过8259产生一个中断,这个中断就是硬件中断。键盘是计算机硬件这个是不可否认的哦^.^DOS中断中的的INT 21H就是软件中断中的一种。一般来说可以这么理解,一切由8259负责产生的中断都是硬件中断。一切硬件中断都是由8259产生。(这里我也存在一个问题,CPU其实也是可以产生中断的,但是这个中断理论上应该不算是硬件中断。所以我也就没有把它规在硬件中断这一类。)鉴于篇幅太长,我分成几个小文章逐一讨论。

1、中断的基础知识

1.1  中断概念

中断是一种发生了一个外部的事件时调用相应的处理程序去处理的过程。见下图

 

1.2  CPU获取外部设备请求的两种方式

①查询方式

按序依次检查外设对应的状态变化,依据预先设定的规则,判断有请求,有则执行,无则继续。

优点:简单

缺点:加重CPU负担,浪费计算资源

②中断方式

中断是一种发生了一个外部的事件时调用相应的处理程序去处理的过程。

优点:需要用时才找CPU帮忙,能够并行处理多种I/O

缺点:程式设计以及实现过程比较复杂

1.3  早期的中断芯片8259programable interrupt controller

关于8259的背景资料以及其他资料不赘述,在此提纲挈领式地说一下它的背景。

编程中断控制器8259A
  Intel 8259A
是一种可编程中断控制器PIC,它是为管理Intel 80808085Intel 80868088CPU的可屏蔽中断而设计的,后来又被用于Intel 80286 CPU。在高档Pc系列机中,它的逻辑被集成到多功能接口芯片中。

  8259A
具有以下主要功能:

  ①
具有8级优先权控制,通过级联可扩展至64级优先权控制(PC上只扩展到16级);

  ②
每一级中断都可以屏蔽(笔者:来了中断也不汇报给CPU)或允许;

  ③
在中断响应周期,8259A可提供相应的中断类型号(笔者:供CPU计算得到中断向量号),从而能迅速转入中断服务程序;

  ④8259A
有几种中断管理模式,可以通过编程进行选择。

主要谈谈它关于中断请求的这个过程的一个详细论述,首先看看单个8259A对于中断的处理过程。

 

 

 


1 8259A中断响应流程图解

中断的过程可以简单地描述如下:(假如是KBD发生中断请求)

    键盘发生中断请求;

    8259A的中断请求寄存器做相应记录;

    优先级分析器做出判决,(假设键盘的优先级比当前处理的中断优先级更高);

    8259A通过INTRCPU发出中断请求;

    CPU准备相应,回发一个INTA#8259A,此时8259A会做出相应的寄存器处理;

    8259A会把中断类型码放到DATABUS上,CPU解析然后进入ISR CPU再发一个INTA#8259A,相应一系列动作完成。

整个过程详见流程图四,图解见图1。更多的细节没有描述出来。

1.4  PIC的级联

8259PC中都是成对出现的,因为一直以来为了解决硬件中断号数量上的不够所以考虑到了两块8259级联。(为什么不用三块呢?其实两块就足够了,又何必去浪费资源呢。)PIC级联的基本HW图见图1

 

 

1  cascade interrupt controller

当中断发生后CPU的过程 见如流程图三。

28259A7个寄存器

7个寄存器被分为两组,第一组寄存器为4个,它们叫做初始化命令字ICWinitialiaztion command word)分别为ICW1 ~ ICW4 第二组寄存器为3个,他们用来容纳操作命令字OCWoperation command word)分别称为OCW1 ~ OCW4  BIOS在初始化时修改的就是ICW这几个,至于OCW是由应用程序设定的,他们用来对中断处理过程作动态控制。在一个系统运行过程中,操作命令字可以被多次设置。

8259A是中断系统的核心器件,对它的初始化编程要涉及中断系统的软、硬件的许多问题,而且一旦完成初始化,所有硬件中断源和中断处理程序都必须受其制约。

2.1  ICW1 格式

 

 

 

 

2 ICW1格式

ICW1 的格式如图2所示,但是还必须要申明一点的是,ICW1initial的过程中port地址必须是偶地址,而ICW2 ~ ICW4 必须是奇地址。比如:20H21H之分。

2.2  ICW2 格式

    

3 ICW2格式

 


ICW2 是中断类型码的初始化命令字,对于全部的IRQ5位都是相同的,也因此被称为base address。举个例子,比如说base address01001B=9D),那么当ICW2 的值是01001001B)的时候,它所代表的中断向量号就是9+1=10,这时就产生了IRQ 10的中断。这种“寻址”的方式和其他的方式一样,[2:0]是偏移。如图3

2.3  ICW3 格式

ICW3 只有在一个系统中包含多片8259A时才有意义。而系统中多片8259A是由ICW1 D1SNGL)来指示的,所以只有当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的哪个pinIRx就被置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

2.4  ICW4 格式

 

 

6 ICW4  格式

ICW4用于设定8259A的工作方式,其格式如图6所示。说的比较清楚基本不用解释了。

2.5  关于OCW

initial 8259A的过程中BIOS不涉及它们,(当然不是说它们不重要,理解整个8259A的工作流程是应该的,也比较简单这里就不赘述了)所以这里就略写了。

OCW1 是中断屏蔽操作命令字,顾名思义可知其作用了。OCW2用于设置中断优先级方式和中断结束方式。OCW3用于设置或清除特殊屏蔽方式和读取寄存器的状态。

38259A的初始化流程

由于在ICW1 中的SNGL位有明确的严格的initial 8259的顺序,那么只有直接写进去就OK了(BIOS中是直接被置为1了,故什么都不用考虑了)。Initial的流程图见流程图2。

典型的initial程序如下:(我手上的8259A的端口地址为Master 20HSlave 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

 

 

 

原创粉丝点击