8259A的中断服务器寄存于,8259A中断控制器

本文详细介绍了8259A中断控制器的初始化过程,包括初始化命令字(ICW)的设置,如ICW1、ICW2、ICW3和ICW4,以及中断请求屏蔽、中断服务后的结束中断(EOI)操作和中断优先级处理的全嵌套模式。通过示例代码展示了如何配置中断向量和控制字,以确保中断系统的正确运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bit

80x86

Mode

7

I7

6

I6

5

I5

4

I4

3

I3

2

0

1

0

0

0Initialization Command Word 2 (ICW2)

ICW2被用作指定本8259A中的中断请求的起始中断向量,bit0:3必须被设为0;所以,其起始中断向量必须是8的倍数。比如,我们的OS的设计讲来自于Master

8259A的8个中断请求放在IDT的第32 (从0开始计)个位置到第39个位置,则我们应该将ICW2设为0x20。

这样,当将来此8259A上接收到一个IRQ时,其低3位会被自动填充为IRQ号。比如,其收到一个IRQ6,将6自动填充到后3位,则生成的向量号为0x26。8259A会在收到CPU发来的第二个INTA信号之后,将生成的向量号放到Data

Bus上。

ICW3

Master 8259A和Slave

8259A有不同的ICW3格式。

Bit

Function

7

IR7 is connected to a

Slave

6

IR6 is connected to a

Slave

5

IR5 is connected to a

Slave

4

IR4 is connected to a

Slave

3

IR3 is connected to a

Slave

2

IR2 is connected to a

Slave

1

IR1 is connected to a

Slave

0

IR0 is connected to a

SlaveInitialization Command Word 3 for Master 8259A (ICW3)

Slave 8259A被接在Master

8259A的那个IRQ上,则相应的位就被设置为1,其余的位都被设置为0。在IBM PC上,Slave 8259A被接在Master

8259A的IRQ2上,则此ICW3的值应该被设置为二进制00000100 = 0x04。

Bit(s)

Function

7

Reserved. Set to

0

6

Reserved. Set to

0

5

Reserved. Set to

0

4

Reserved. Set to

0

3

Reserved. Set to

0

2:0

Slave ID

000

Slave 0

001

Slave 1

010

Slave 2

011

Slave 3

100

Slave 4

101

Slave 5

110

Slave 6

111

Slave

7

Initialization Command Word 3 for Slaves

(ICW3)

Slave

8259A的ICW3的bit3:7被保留,必须被设为0;而bit0:2被设置为此Slave 8259A被接在Master

8259A的哪个IRQ上。比如,在IBM PC上,Slave 8259A被接在Master

8259A的IRQ2上,则此ICW3应被设为0x02。

ICW4

Bit(s)

Function

7

Reserved. Set to

0

6

Reserved. Set to

0

5

Reserved. Set to

0

4

1

Special Fully Nested Mode

0

Not Special Fully Nested Mode

3:2

0x

Non - Buffered Mode

10

Buffered Mode - Slave

11

Buffered Mode - Master

1

1

Auto EOI

0

Normal EOI

0

1

8086/8080 Mode

0

MCS-80/85

Initialization Command Word 4 (ICW4)

在80x86模式下,我们不需要使用8259A的特殊功能,因此我们将bit1:4都设为0,这意味使用默认的Full Nested

Mode,不使用Buffer,以及手动EOI模式;我们只需要将bit-0设为1,这也正是我们ICW0处提到的我们为什么必须要ICW4的原因。所以ICW4的值应该被设为0x01。

所以我们可以用下列代码初始化2个8259A芯片:

inline void

init_8259a(void)

{

/* icw1

*/

outb( 0x11, 0x20 ); /* master port A

*/

outb( 0x11, 0xA0 ); /* slave port A

*/

/* icw2

*/

outb( 0x20, 0x21 ); /* master offset of 0x20 in

the IDT */

outb( 0x28, 0xA1 ); /* slave offset

of 0x28 in the IDT */

/* icw3

*/

outb( 0x04, 0x21 ); /* slaves attached to IR line

2 */

outb( 0x02, 0xA1 ); /* this slave in IR line 2

of master */

/* icw4 */

outb( 0x01, 0x21 ); /* set as master

*/

outb( 0x01, 0xA1 ); /*set as slave

*/

}

2.5.6

Operation

一旦按照初始化协议初始化完成之后,程序员就可以在任何时候,以任何顺序向8259A发送操作控制字OCW了。

OCW1

Bit

PIC 2

PIC 1

7

Mask IRQ15

Mask IRQ7

6

Mask IRQ14

Mask IRQ6

5

Mask IRQ13

Mask IRQ5

4

Mask IRQ12

Mask IRQ4

3

Mask IRQ11

Mask IRQ3

2

Mask IRQ10

Mask IRQ2

1

Mask IRQ9

Mask IRQ1

0

Mask IRQ8

Mask

IRQ0Operation Control Word 1 (OCW1)

OCW1是用来做中断请求屏蔽用的操作控制字。如果你想屏蔽那个IRQ,只需要对照上表将相应的Bit置为1,然后发送给相应的8259A就可以了。比如我想屏蔽IRQ10,我只需要将0x0A写到端口0xA1。对应代码如下:

outb(0x0A, 0xA1);

OCW2

Bit(s)

Function

7:5

000

Rotate in Auto EOI Mode

(Clear)

001

Non Specific EOI

010

Reserved

011

Specific EOI

100

Rotate in Auto EOI Mode

(Set)

101

Rotate on Non-Specific

EOI

110

Set Priority Command (Use Bits 2:0)

111

Rotate on Specific EOI (Use Bits

2:0)

4

Must be set to

0

3

Must be set to

0

2:0

000

Act on IRQ 0 or 8

001

Act on IRQ 1 or 9

010

Act on IRQ 2 or 10

011

Act on IRQ 3 or 11

100

Act on IRQ 4 or 12

101

Act on IRQ 5 or 13

110

Act on IRQ 6 or 14

111

Act on IRQ 7 or

15Operation

Control Word 2 (OCW2)

通过将bit3:4设置为0,以说明这是一个OCW2。如果bit-6被设为1,则bit0:2有效,其操作则是面向某个IRQ的;否则将bit0:2设为0,其操作是面向整个8259A的所有IRQ的。我们一般只会用到No

Specific EOI——因为我们在初始化8259A时,制定的EOI

Mode为手动模式,所以当每次对应某个8259A芯片的IRQ的中断服务程序ISR执行结束后,都需要向8259A发送一个EOI,其对应的OCW2的值为0x20。需要注意的是,由于IBM

PC有2个级连的8259A,所以我们每次必须分别给两个都发一个。

比如下面示例代码用来向两个8259A芯片发送EOI,它需要在针对来自于两个8259A芯片的中断的服务程序ISR末尾处被调用:

inline void

send_eoi(void)

{

/* Send EOI to both master and

slave */

outb( 0x20, 0x20 ); /* master PIC

*/

outb( 0x20, 0xA0 ); /* slave PIC */

}

OCW3

Bit(s)

Function

7

Must be set to

0

6:5

00

Reserved

01

Reserved

10

Reset Special Mask

11

Set Special Mask

4

Must be set to

0

3

Must be set to

1

2

1

Poll Command

0

No Poll Command

1:0

00

Reserved

01

Reserved

10

Next Read Returns Interrupt Request

Register

11

Next Read Returns In-Service

RegisterOperation Control Word 3 (OCW3)

通过将Bit-3设为1,Bit-4设为0,以让8259A知道这是一个OCW3。OCW3中对我们最有意义的位是bit0:1,我们可以通过将bit-1设为1来通知8259A,下一个读端口的动作将要读取IRR或ISR寄存器的内容。

比如下面示例C++代码用来读取Master

8259A的IRR寄存器内容到__irr变量中:

void read_irr(unsigned char&

__irr)

{

outb(0x02, 0x20);

inb(&__irr, 0x20);

}

2.5.7

Full Nested Mode

为了让我们更加理解8259A的中断控制机理,我们需要说明一下Full Nested

Mode。在我们初始化时,只需要将ICW4的bit-4设为0,我们就选择了Full Nested

Mode。

Full

Nested

Mode其实就是实现按照中断请求的优先级别进行抢断处理的机制——如果当前一个IRQ正在被CPU处理,也就是说,当前CPU正在调用其中断服务程序

ISR;这时8259A又接到了新的IRQ,如果此IRQ的优先级大于正在处理的IRQ,那么,此IRQ就会被提交给CPU以优先处理;否则此IRQ则被

放置在IRR中,直到所有的高优先级中断被处理结束为止。

其处理过程大致如下:

ISR寄存器中有一个8-bit的字节,范围为bit[0,7];每一个bit对应一个IRQ(IRQ0-IRQ7对应bit[0,7])。当一个IRQ

被提交给CPU之后(收到来自于CPU的第一个INTA信号之后),其对应的bit会被设置为1。比如IRQ6被提交给CPU之后,IS

Register的bit-6会被设置为1。当此8259A收到一个EOI之后(对于手动模式,这意味着一个优先级别最高的中断请求被处理结束),会将

IS Register中被设置的最高优先级IRQ的对应的bit清为0。比如在收到一个EOI时,发现IS Register的bit-3,

bit-5,

bit-6被设置,那么被清除的则是bit-3(越小优先级别越高)。在清除优先级最高的bit之后,8259A会到IRR中察看是否有优先级别高于当前

正在处理的IRQ中优先级别最高的IRQ,如果有,则将此IRQ提交给CPU处理,同时设置相应的bit。还以上面的例子为例,当bit-3被清除之后,

如果发现在IRR中有一个IRQ4等待被处理,则将其提交给CPU,在收到来自于CPU的第一个INTA信号之后,则将IS

Register的bit-4置为1。

在此过程中,如果8259A接到更高优先级别的IRQ,则将其立即提交给CPU。比如,当前正在处理的IRQ为IRQ3,IRQ5,那么IS

Register中被设置的bit为bit-3,bit-5;如果此时接到一个IRQ1,则立即将其提交给CPU,在收到来自于CPU的第一个INTA信号之后,则将IS

Register的bit-1置为1。

此过程我们也可以看出,为了实现这种优先级机制,必须将EOI设为手动模式,也就是说必须将ICW4的bit-1设为0。因为,对于自动EOI模

式,8259A会在收到来自于CPU的第2个INTA信号之后,就自动将IS

Register中此IRQ对应的bit清0,而事实上,这个时候此IRQ对应的中断服务程序还没有被CPU调用,也就是说此IRQ还没有被处理结束,而

由于此IRQ对应的bit已经被清除,如果此IRQ是一个优先级很高的话,那么此IRQ的处理完全可以被一个优先级别更低的IRQ所中断。这不是我们所需

要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值