第六章中断8259.docx

上传人:b****5 文档编号:8028192 上传时间:2023-01-28 格式:DOCX 页数:31 大小:461.71KB
下载 相关 举报
第六章中断8259.docx_第1页
第1页 / 共31页
第六章中断8259.docx_第2页
第2页 / 共31页
第六章中断8259.docx_第3页
第3页 / 共31页
第六章中断8259.docx_第4页
第4页 / 共31页
第六章中断8259.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

第六章中断8259.docx

《第六章中断8259.docx》由会员分享,可在线阅读,更多相关《第六章中断8259.docx(31页珍藏版)》请在冰豆网上搜索。

第六章中断8259.docx

第六章中断8259

80x86的中断系统

一:

概述

1、中断的分类

1)硬件中断

有硬件引起的中断。

硬件中断又分成两种:

可屏蔽中断

不可屏蔽的中断

2)软件中断

INTN指令、异常、陷进。

2、中断的实质

实际上中断是一种引起程序运行的方式。

可以这样说:

什么叫中断呢?

就是停止当前程序的执行,转而执行另一个程序。

3、函数调用方式执行程序与中断执行程序有什么区别呢?

函数调用:

调用函数是程序的入口地址包含在指令中。

中断服务程序的入口地址在中断向量表中。

在获得所执行程序的入口地址的方式不一样。

二:

在实模式下的中断的基本术语

1、中断向量

中断向量就是中断服务程序的入口地址。

他包括两个方面的内容。

一方面:

段地址CS的内容

另一方面:

偏移地址IP的内容

因此:

一个中断向量是由两个部分构成的,每个部分是2个字节。

总共是4个字节。

2、中断向量表

在实模式下,将所有的中断向量存储在从00000H~003FFH容量为1K字节的一张表中。

3、中断向量号

在i386的系统中,为每一个中断从00H~0FFH分配一个编号N,这个编号叫中断向量号。

总共有256个中断向量号。

综上所述,中断向量表的结构如下图:

中断向量号

地址

IP

CS

0FF

1020

CSFF

IFPP

0FE

1016

CSFE

IPEF

….

….

2

00008

CS2

IP2

1

00004

CS1

IP1

0

00000

CS0

IP0

4、如何通过中断向量号找到中断服务程序的入口地址呢?

找中断入口地址就是找CS和IP。

我们已经知道中断向量号N。

IP4N

CS4N+2

5、软中断的执行过程

INT68H为例:

1)将FLAG状态标志寄存器入栈

2)将FLAG状态标志寄存器IF=0,禁止CPU响应外部中断源中断。

3)将N乘以4,得到中断向量N在中断向量表中的首地址。

4)将CPU的IP入栈,将地址为(4N+1)和(4N)的内存单元中的内容存入CPU的IP。

5)将断点的CS入栈,将地址为4N+3和4N+2的内容存入到CPU的CS寄存器中。

6)执行中断服务程序。

7)中断服务程序执行IRET指令,

A、将(SP+1,SP)中的内容存入CS

SP=SP+2

B、(SP+1,SP)中的内容存入IP,SP=SP+2

C、(SP+1,SP)中的内容存入FLAG,SP=SP+2。

6、中断向量表中存储着中断服务程序入口地址。

那么如何初始化中断向量表呢?

1)直接初始化

假设中断类型号为N、中断服务程序的名字叫INTNPROC

MOVAX,N---------------1

SHLAX,2

MOVSI,AX

MOVAX,OFFSETINTNPROC-2

MOV[SI],AX---------------3

MOVAX,SEGINTNPROC---4

MOV[SI+2],AX-------------5

1、将N乘积4,结果存入SI。

2、得到INTNPROC的偏移地址,也就是IP

3、将第二步得到的偏移地址存入到中断向量表

4、得到INTNPROC的段地址,也就是CS

5、将第四步得到的CS存入到中断向量表

2)调用DOS系统功能

入口参数:

段地址存入DS

偏移地址存入DX

中断类型号NAL

功能号:

AH=25H

假设中断类型号为N、中断服务程序的名字叫INTNPROC

MOVAX,SEGINTNPROC

MOVDS,AX

LEAAX,INTNPROC

MOVDX,AX

MOVAH,25H

MOVAL,N

INT21H

7、如何读中断向量表中的内容

执行如下指令:

MOVAL,N

MOVAH,35H

INT21H

指令执行完成后:

CS:

ES

IP:

BX

8、一个软中断的例子

假设我们自己实现一个INTN指令。

假设N=0EEH,实现后,当执行INT0EFH指令,要求显示“SHUAIGELIANGMEIGOODMORNING!

INT0EEH

代码如下:

DATASEGMENT

DISBUFDB"SHUAIGELIANGMEIGOODMORNING!

",0AH,0DH,'$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAH,35H

MOVAL,0EEH

INT21H

PUSHES

PUSHBX

MOVAX,SEGINTEEP

MOVDS,AX

MOVAX,OFFSETINTEEP

MOVDX,AX

MOVAH,25H

MOVAL,0EEH

INT21H

INT0EEH

INT0EEH

INT0EEH

POPDX

POPDS

MOVAH,25H

MOVAL,0EEH

INT21H

MOVAX,4C00H

INT21H

INTEEPPROC

PUSHDS

PUSHDX

PUSHAX

MOVAX,DATA

MOVDS,AX

LEAAX,DISBUF

MOVDX,AX

MOVAH,09H

INT21H

POPAX

POPDX

POPDS

IRET

INTEEPENDP

CODEENDS

ENDSTART

9、硬件中断的过程

1)外部中断源向8259提出中断请求

2)如果8259允许中断,8259就会通过8259的引脚INT向CPU提出中断请求。

3)如果CPU允许中断(FLAG.IF=1)CPU就会向8259发出两个INTA周期,在第二个INTA周期内,CPU会从8259的ICW2寄存器中取出中断类型号N。

4)将CPU的FLAG状态标志寄存器入栈。

同时将FLAG的IF清0

5)将断点的IP入栈,将(4N+1,4N)中的内容存入到CPU的IP寄存器中。

6)将断点的CS入栈,将(4N+3,4N+2)的内容存入到CPU的CS中。

7)转入到中断服务程序执行。

8)中断服务程序执行IRET

A、将(SP+1,SP)中的内容存入CS

SP=SP+2

B、(SP+1,SP)中的内容存入IP,SP=SP+2

C、(SP+1,SP)中的内容存入FLAG,SP=SP+2。

中断返回。

三:

保护模式下的中断响应过程

1、基本概念

1)中断向量

中断描述符:

32位偏移地址、段选择子、属性

2)中断向量号

00~0FFH

3)中断描述符

32位偏移地址、段选择子、属性

4)中断描述表

2、软件中断响应过程

1)将中断类型号N乘以8,加上IDRT的高32位。

定位中断描述符在IDT中的位置。

2)在IDT中找到中断描述表中的中断描述符。

3)通过中断描述符得到中断服务程序的偏移地址。

4)通过中断描述符中的段选择子,找到中断服务程序的段描述符。

5)将第4步中找到的段描述符的段基址加上第3步中的到的中断服务程序的偏移地址相加。

就得到了中断服务程序的入口地址。

6)CUP进行任务切换

3、在保护模式下硬件中断的执行过程

首先必须通过8259得到中断类型号:

从8259中得到中断类型号后,找到中断服务程序入口地址的过程与软中断相同。

6.3中断控制器8259

一:

概述

1、8259是一个28管脚、双列直插式芯片。

2、每片8259可以接8个硬件中断源

3、8259可以工作于单片方式或级联方式。

单片方式:

系统中只有一片8259。

此时,系统中最多有8个硬件中断源。

级联方式:

一片8259作为主片8259。

主片8259的8个中断请求信号,可以接从片8259,也可接硬件中断源。

4、8259有两种中断触发方式

什么叫中断触发方式:

就是指中断请求信号有效的方式。

8259有两种中断触发方式:

一种是电平触发方式;另一种是边沿触发方式。

5、8259有两种中断嵌套方式

一种是普通的中断嵌套

另一种特殊的中断嵌套

6、8259有两种中断屏蔽方式

一种是普通的中断屏蔽方式

一种是特殊的中断屏蔽方式

7、8259有两种中断结束方式

一种是自动的中断结束方式

一种是非自动的中断结束方式,其中非自动的中断结束方式又分为:

指定和和不指定的两种。

二:

8259的内部结构和外部引脚

8259的内部结构及外部引脚如图:

1、总线缓存器

链接数据总线,双向、8个引脚。

D0~D7

2、读写控制逻辑

RD读信号

当CPU执行IN指令时有效。

比如在PC机种8259的地址为20H,21H。

INAL,20H

执行该指令时RD=0;

WR写信号

当CPU执行OUT指令时有效。

比如:

OUT20H,AL

CS:

片选信号

由3个部分构成:

高位地址译码

M/IO

A0或BHE

A08259的片内寻址引脚

8259只有一根地址线,这也就意味着8259只有2个地址。

如果一个地址对应一个寄存器。

这也就意味着8259只能有2个寄存器。

必须注意:

8259内部可访问的寄存器是很多的。

8259内部有哪些可访问的寄存器呢?

4个命令寄存器:

ICW1

ICW2

ICW3

ICW4

3个操作命令字

OCW1

OCW2

OCW3

一个IRR中断请求寄存器

一个ISR中断服务寄存器

一个中断查询寄存器

也就是说8259内部有10可以通过程序访问的寄存器,但是8259只有2个地址。

A=0对应哪些寄存器呢?

ICW1只写

OCW2只写

OCW3只写

IRR只读

ISR只读

查询字

由于ICW1、0CW2、0CW是只写,而且他们的地址都为A0=1,这三个寄存器如何区别呢?

执行OUT20H,AL肯定是写到ICW1、0CW2、0CW中去了。

ICW1、0CW2、0CW3通过标志位来区分的。

也就是我们初始化的数据中有两个为作为标志位。

D4D3对应的寄存器

1*ICW1

00OCW2

01OCW3

如果是读:

只能从IRR或ISR中读。

也就是执行:

INAL,20H

只能从IRR或ISR中读。

那么怎么区分到底是从哪里读的呢?

实际上,8259在读这两个寄存器之前会通过OCW3发一个读命令。

OCW3的低两位是表示读IRR还是读ISR的。

OCW3D1D0

0*不读

10读IRR

11读ISR

也就是读IRR应该这样读:

MOVAL,00001010B

OUT20H,AL

INAL,20H

也就是读ISR应该这样读:

MOVAL,00001011B

OUT20H,AL

INAL,20H

如何读查询字?

通过OCW3发一个读查询字命令:

OCW3D2

0不读查询字

1读查询字

MOVAL,00001100B

OUT20H,AL

INAL,20H

A=1对应哪些寄存器呢?

ICW2只写

ICW3只写

ICW4只写

OCW1可读可写

如何区分到底是写的这四个寄存器中的哪个寄存器呢?

8259的初始化必须先初始化ICW1。

当初始化ICW2后,必须初始化ICW2,接下来根据需要初始化ICW3和ICW4。

最后,当8259初始化完成后所有对A0=1的读写操作都是读写的OCW1。

3、中断请求寄存器IRR

D7

D6

D5

D4

D3

D2

D1

D0

IR7

IR6

IR5

IR4

IR3

IR2

IR1

IR0

功能:

当8259接收到硬件中断源提出中断请求,就会将8259的IRR寄存器的相应位置“1”。

必须注意:

IRR在什么时候变成“0”?

当CPU响应中断时,会向8259发出两个INTA周期,第一个INTA周期内,就会将IRR的相应位清“0”。

4、中断服务寄存器ISR

D7

D6

D5

D4

D3

D2

D1

D0

IR7

IR6

IR5

IR4

IR3

IR2

IR1

IR0

功能:

表示CPU正在运行的中断。

IRi=1表示该中断源的中断服务程序正在执行中。

IRi=0表示该中断源的中断响应已经

结束。

比如ISR中的数据:

00010010表示IR1和IR4中断服务程序正在执行。

注意:

严格的讲,ISR表示的8259处理中断的过程已经结束。

我们所谓的中断结束方式,实际上就是指的8259ISR的相应位清“0”的方式。

当然,ISR什么时候置“1”?

ISR什么时候清“0”呢?

当CPU响应中断时,会发出两个INTA周期,在第1个INTA周期时将ISR的相应位置“1”。

ISR的相应位清“0”,分如下两种种情况。

第一种情况,如果8259工作于自动的中断结束方式(AEOI),在CPU向8259发出的第二个INTA周期内将8259的ISR的相应位清“0”。

第二种情况是,8259工作于非自动中断结束方式,必须在中断服务程序中,由OCW2发一个中断结束命令,将ISR中的相应位清“0”。

5、中断屏蔽寄存器IMR(OCW1)

IMR就是OCW1。

D7

D6

D5

D4

D3

D2

D1

D0

IR7

IR6

IR5

IR4

IR3

IR2

IR1

IR0

IRi=1表示该中断源被屏蔽。

IRi=0表示允许该中断源向CPU提出中断请求。

6、中断有限权电路

中断优先权电路如下图:

从图可以看出,

1)如果外部中断源提出中断请求,则IRR寄存器的相应位就会置“1”。

2)从IRR的输入的请求信号会与IMR的输出的值的“非”后进行“与”的操作。

如果IMR的相应位为“1”,与相应中断源对应的与门将输入“0”,因此该位所指示的中断源会被屏蔽。

否则,来自IRR的信号,与IMR的输出值“非“后相“与”,后的值将分为两路。

一路输入到中断优先编码器,另一路输入到或门。

3)来自与第二步的信号中,只要其中一个中断请求信号没有被中断屏蔽寄存器屏蔽,或门的信号将有效,为“1“,该信号将作为第五步与门的一个输入信号。

4)中断优先编码器将会对将第二步的8个信号进行优先编码。

优先编码器的工作原理是:

只有8个输入信号中有一个为“1“将对输入信号进行编码。

比如当IR0=0,IR1=1,IR2~IR7为“0“,并且没有被屏蔽,则编码后:

A2A1A0=001B

比如当IR0~IR6都为0,而IR7=1时,并且没有被屏蔽,经过优先编码器编码后:

A2A1A0=111B

当有多个中断请求有效,并且没有被屏蔽是,则根据优先级别,将最高优先级的中断源的编码输出。

例如:

IR2、IR3、IR5同时有效并且没有被屏蔽。

则在固定优先权的情况下,IR2的优先级最高。

所以编码后的输出为:

A2A1A0=010B

5)比较器输出

比较器的两个输入一个来自于对中断请求信号进行优先编码的优先编码器。

另一个来自于对中断服务寄存器(ISR)进行优先编码后的值。

对中断服务寄存器(ISR)的优先编码与第四步相似。

在固定优先权的情况下,将这两个编码进行比较,比如ISR的编码为:

B2B1B0=100B

这表明了正在执行的中断服务程序为IR4中断源的服务程序。

而:

A2A1A0=001B

这表明了IR1提出中断请求。

比较器的输入值A>B,而输出有效的条件为:

A

因此满足条件,所以比较器的输出有效,即为高电平。

而如果:

A2A1A0=110B

比较器的输入值A>B,而输出有效的条件为:

A

因此满足条件,所以比较器的输出无有效,即为低电平。

6)来自于第三步和第五步的输出经过与门后,得到8259的INT信号,输出到8259的INT引脚。

8259的INT引脚连接到CPU的INTR引脚,向CPU提出中断请求。

8259的中断优先方式有两种:

固定优先权IR0最高IR7最低

优先权轮换

当前执行完的中断源的优先级最低。

比如:

当前IR3执行完成。

则IR3的优先级别最低。

那么谁最高呢?

IR3最低,那么IR4就是最高。

因此优先权就会变成如下:

低高

IR3IR2IR1IR0IR7IR6IR5IR4

译码器B

24译码器,38译码器

7、控制逻辑

引脚:

INT中断请求信号输出

INTA中断响应信号输入

寄存器组:

命令寄存器:

ICW1、ICW2I、CW3I、CW4

工作命令寄存器:

OCW1、OCW2、OCW3

8、级联缓存比较器

引脚:

CAS0、CAS1、CAS2

CAS0、CAS1、CAS2只在8259工作于级联方式时有效。

主片是输出,从片是输入。

如图从片8259A(比如从片1)的IR1提出中断请求,该请求通过从片1的INT引脚连接到主片8259A的IR2。

主片8259再通过其INT引脚连接到CPU的INTR引脚,向CPU提出中断请求。

我们知道CPU会执行两个INTA周期,其中在第二个INTA周期会从8259中的ICW2中取出一个中断类型号到CPU中。

那么,在级联的方式下主片8259和从片8259都有ICW2,CPU到底是从主片8259的ICW2中取中断类型号,还是从从片8259中取中断类型号呢?

我们可以看到,实际上主片8259的IR2连接的并非是中断源,而是从片8259。

所以实际上当主片8259的IRi(i=0~7)连接的是从片时,CPU响应中断时应该从从片的ICW2中取出中断类型号。

当然,这又会引出另一个问题,因为主片8259最多可以连接8个从片8259。

那么CPU怎么知道从哪片8259中取出中断类型号呢?

8259中有一个ICW3,只有在主从结构时才会用到。

主片中ICW3的某个位被初始化成1的话,就表示相应的IRi引脚,接的是从片8259。

如果初始化成“0”,表示接的是中断源。

比如下面3片8259按如下方式级联时,即主片的IR2和IR5连接的是从片。

那么主片的ICW3的值如下:

主片ICW3:

00100100

而从片8259的ICW3只有低3位有效,表示的是该从片8259是接到主片的哪个IRi上的。

比如:

第一片8259ICW3:

00000010

第二片8259ICW3:

00000101

下面是8259级联方式响应中断的过程示意如图:

以从片1的IR1提出中断请求为例,我们看看中断响应的过程。

1)CPU向所有的8259发出第一个INTA周期。

2)主片接受到第一个INTA周后将当第一个INTA周期后,首先查看自己的ICW3发觉提出中断请求的IR2所对应的ICW3的相应位为“1”。

则表示该引脚接的是从片8259。

主片8259将会把我们前面所讲的优先权电路的优先编码器的输出A2、A1、A0的值输出到CAS2、CAS1、CAS0(实际上这也是中断类型号的第三位)。

在如图所示的情况下主片8259将输出:

CAS2CAS1CAS0=010

即表示是由接到主片的IR2上的那片从片8259的中断源提出的中断请求。

3)由于所有8259,包括主片和所有从片的CAS2、CAS1、CAS0都是互联的。

因此。

所有的从片8259都会接收到来自于主片的通过CAS2、CAS1、CAS0的信号。

4)从片8259接收到来自于主片的CAS2、CAS1、CAS0信号后,会将这个值与自己的ICW3的值进行比较。

从片1比较的结果是,主片8259发送过来的值与自己的ICW3中存储的从片ID号相等。

因此在第二个INTA周期来到时将会把自己的ICW2中的值作为“中断类型号N”输出,CPU将读取这个值作为中断响应时的中断类型号。

从片2比较的结果是,主片8259发送过来的值与自己的ICW3中存储的从片ID号不相等,因此,在第二个INTA周期来到时从片2什么都不做。

引脚SP/EN

到现在有一个问题我们任然没有提及,那就是8259怎么知道自己是主片8259还是从片8259呢?

这分成两种情况:

情况1:

如果8259工作于非缓冲方式此时由引脚SP/EN来决定8259是主片还是从片。

SP/EN=1该8259是主片。

SP/EN=0该8259是从片。

也就是我们在设计电路时,如果我们决定8259不用缓冲方式。

那么,就应该将主片的8259的SP/EN引脚与电源连接在一起,而将从片8259的SP/EN引脚与地(GND)连接在一起。

在这儿我们要解释一下什么是缓冲方式。

缓冲方式就是8259的数据线D0~D7连接到数据总线时要经过8286这样的双向数据收发器的缓冲,然后才能连接到数据总线。

如下图:

如果8259工作于缓冲方式

SP/EN作为数据缓冲信号使用。

接8286双向数据收发器的OE上。

三:

8259的命令寄存器组

1、ICW1

D0=1需要初始化ICW4

D0=0不需要初始化ICW4

D1=18259工作于单片方式。

意味着整个系统中只有一片8259。

系统最多有8个硬件中断源。

D1=08259工作于级联方式。

意味着需要初始化ICW3。

D3=1中断请求寄存器是电平触发方式。

也就是说:

中断请求信号IRi为高点平时将使得IRR中相应位置1。

D3=0中断请求寄存器是边沿触发方式。

也就是说:

中断请求信号IRi为正脉冲信号时将使得IRR中相应位置1。

D4=1必须为1,ICW1标志位。

2、ICW2

功能:

给CPU提供相应的硬件中断源的中断类型号N。

必须注意的是ICW2只能初始化高5位。

第三位可变的。

;也就是说第三位是随中断请求信号变化而变化。

比如,当前是由IR2提出的请求并且被相应,那么ICW2第三位就是“010”。

如果是IR5提出中断请求,并且被响应,那么ICW2第三位就是“101”。

举例:

在PC_XT机中,硬件中断是由两片8259构成的。

主片8259中断类型号从08H~0FH;从片8259的中断类型号从10H~17H。

如图:

主片8259的地址为20H~21H,从片8259的地址30H~31H。

初始化ICW2.

主片:

MOVAL,08H

OUT21H,AL

从片:

MOVAL,10H

OUT31H,AL

3、ICW3

ICW3只有8259工作于级联方式时才需要初始化。

也就是ICW2.D1=0。

主片8259的ICW3.Di=1表示中断请求信号引脚IRi接的是一个从片8259。

主片8259的ICW3.Di=0表示中断请求信号引脚IRi接的是一个中断源从片8259。

从片8259ICW3中存储的是从片8259的ID号。

表示该从片8259是连接到主片8259的那个IRi上的。

从片8259的ID号就是这个“i”的值。

比如从片8259接到主片8259的IR2上,那么从片的ID号就是“2”。

因为只有一个主片,而一个主片最多可以接8个从片,所以ID号从“0~7”。

也就意味着:

系统中只能有64个硬件中断源。

举例:

如下图,有三片

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1