📄 interrupt-8259_5.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://www.huihoo.com/gnu_linux/own_os/interrupt-8259_5.htm -->
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT
face="Times New Roman" size=6><SPAN style="mso-tab-count: 1"><STRONG>2.5 PIC -
8259A</STRONG></SPAN></FONT></SPAN></P><SPAN lang=EN-US><FONT
face="Times New Roman" size=5><SPAN style="mso-tab-count: 1">
<P>
<P><FONT size=3>[</FONT><A
href="index.htm"
tppabs="http://pagoda-ooos.51.net/os_book/index.htm"><FONT
size=3>Home</FONT></A><FONT size=3>] [</FONT><A
href="interrupt_and_exception.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt_and_exception.htm"><FONT
size=3>Top</FONT></A><FONT size=3>] [</FONT><A
href="interrupt-handling_4.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-handling_4.htm"><FONT
size=3>Previous</FONT></A><FONT size=3>] [</FONT><FONT size=3><A
href="interrupt-sys_call_6.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-sys_call_6.htm">Next</A>]</FONT></P>
<P><STRONG>
<HR width="100%" SIZE=2>
</STRONG>
<P></P>
<P></P></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><STRONG>2.5.1 Overview</STRONG></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT face=宋体><FONT size=3><FONT
face="Times New Roman TUR"></FONT></FONT></FONT></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>在本章的第一节我们已经提到,中断的来源除了来自于硬件自身的NMI中断和来自于软件的INT
n指令造成的软件中断之外,还有来自于外部硬件设备的中断,这些中断是可屏蔽的。这些中断也都通过PIC(Programmable Interrupt
Controller)进行控制,并传递给CPU。在IBM PC极其兼容机上所使用的PIC是Intel 8259A芯片。8259A芯片的功能非常强大,但在IBM
PC上,我们只用到比较简单的功能。我们本节也只讨论其在PC上的使用。</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">一个8259A芯片的可以接最多8个中断源,但由于可以将2个或多个8259A芯片级连(cascade),并且最多可以级连到9个,所以最多可以接64个中断源。早期,IBM
PC/XT只有1个8259A,. 但设计师们马上意识到这是不够的,于是到了IBM
PC/AT,8259A被增加到2个以适应更多外部设备的需要,其中一个被称作Master,另外一个被称作Slave,Slave以级连的方式连接在Master上。如今绝大多数的PC都拥有两个8259A,这样
最多可以接收15个中断源。</SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">通过8259A可以对单个中断源进行屏蔽。</SPAN></FONT></SPAN><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"><STRONG><FONT face="Times New Roman" size=5> </P>
<P>
<HR width="100%" SIZE=2>
</FONT></STRONG>
<P></P>
<P></P>
<P><STRONG><FONT face="Times New Roman" size=5></FONT></STRONG></P><SPAN
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><STRONG>2.5.2 Principle</STRONG></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Times New Roman TUR" size=5><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN style="mso-tab-count: 1"><FONT face=宋体><FONT size=+0><FONT
size=3><FONT
face="Times New Roman TUR"></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></FONT> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>在一个8259A芯片有如下几个内部寄存器:</FONT></SPAN></SPAN></P>
<UL>
<LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1">Interrupt Mask Register (IMR)</SPAN></SPAN>
</FONT></FONT>
<LI><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"></SPAN></SPAN><FONT
face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1">Interrupt Request Register (IRR)</SPAN></SPAN>
</FONT></FONT>
<LI><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"></SPAN></SPAN><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" size=2>In
Sevice Register (ISR)</FONT></SPAN></SPAN></LI></UL>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>IMR被用作过滤被屏蔽的中断;IRR被用作暂时放置未被进一步处理的Interrupt;当一个Interrupt正在被CPU处理时,此中断被放置在ISR中。</FONT></SPAN></SPAN></P>
<P><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>除了这几个寄存器之外,8259A还有一个单元叫做Priority Resolver,当多个中断同时发生时,Priority
Resolver根据它们的优先级,将高优先级者优先传递给CPU。</FONT></SPAN></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman TUR"><SPAN
style="mso-tab-count: 1"><IMG src="interrupt-8259_5.files/piclogic.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/8259/piclogic.gif"></SPAN></FONT></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman TUR"><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New"
size=2>当一个中断请求从IR0到IR7中的某根线到达IMR时,IMR首先判断此IR是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入IRR中。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New" size=2>在此中断请求不能进行下一步处理之前,它一直被放在IRR中。一旦发现处理中断的时机已到,Priority
Resolver将从所有被放置于IRR中的中断中挑选出一个优先级最高的中断,将其传递给CPU去处理。IR号越低的中断优先级别越高,比如IR0的优先级别是最高的。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New" size=2>8259A通过发送一个INTR(Interrupt
Request)信号给CPU,通知CPU有一个中断到达。CPU收到这个信号后,会暂停执行下一条指令,然后发送一个INTA(Interrupt
Acknowledge)信号给8259A。8259A收到这个信号之后,马上将ISR中对应此中断请求的Bit设置,同时IRR中相应的bit会被reset。比如,如果当前的中断请求是IR3的话,那么ISR中的bit-3就会被设置,IRR中IR3对应的bit就会被reset。这表示此中断请求正在被CPU处理,而不是正在等待CPU处理。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New"
size=2>随后,CPU会再次发送一个INTA信号给8259A,要求它告诉CPU此中断请求的中断向量是什么,这是一个从0到255的一个数。8259A根据被设置的起始向量号(起始向量号通过中断控制字ICW2被初始化)加上中断请求号计算出中断向量号,并将其放置在Data
Bus上。比如被初始化的起始向量号为8,当前的中断请求为IR3,则计算出的中断向量为8+3=11。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"></SPAN></SPAN><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><FONT face="Courier New" size=2>CPU从Data
Bus上得到这个中断向量之后,就去IDT中找到相应的中断服务程序ISR,并调用它。如果8259A的End of Interrupt
(EOI)通知被设定位人工模式,那么当ISR处理完该处理的事情之后,应该发送一个EOI给8259A。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New"
size=2>8259A得到EOI通知之后,ISR寄存器中对应于此中断请求的Bit会被Reset。</FONT></SPAN></SPAN></P><SPAN
lang=EN-US><FONT face="Times New Roman TUR"><SPAN style="mso-tab-count: 1">
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New" size=2>如果8259A的End of Interrupt
(EOI)通知被设定位自动模式,那么在第2个INTA信号收到后,8259A
ISR寄存器中对应于此中断请求的Bit就会被Reset。</FONT></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New"
size=2>在此期间,如果又有新的中断请求到达,并被放置于IRR中,如果这些新的中断请求中有比在ISR寄存中放置的所有中断优先级别还高的话,那么这些高优先级别的中断请求将会被马上按照上述过程进行处理;否则,这些中断将会被放在IRR中,直到ISR中高优先级别的中断被处理结束,也就是说知道ISR寄存器中高优先级别的bit被Reset为止。</FONT></SPAN></SPAN></P><SPAN
lang=EN-US><FONT face="Times New Roman TUR"><SPAN style="mso-tab-count: 1">
<HR width="100%" SIZE=2>
<P align=left><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN
style="mso-tab-count: 1"><FONT face="Times New Roman TUR" size=5><STRONG>2.5.3
IRQ2/IRQ9 Redirection</STRONG></FONT></SPAN></FONT></SPAN></P><SPAN
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>为什么要将IRQ2重定向到IRQ9上?这仍然是由于兼容性问题造成的。</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2></FONT></SPAN></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New" size=2>早期的IBM
PC/XT只有一个8259A,这样就只能处理8种IRQ。但很快就发现这根本不能满足需求。所以到了IBM
PC/AT,又以级连的方式增加了一个8259A,这样就可以多处理7种IRQ。原来的8259A被称作Master PIC,新增的被称作Slave
PIC。但由于CPU只有1根中断线,Slave PIC不得不级连在Master PIC上,占用了IRQ2,那么在IBM
PC/XT上使用IRQ2的设备将无法再使用它;但新的系统又必须和原有系统保持兼容,怎么办?</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2></FONT></SPAN></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>由于新增加的Slave PIC在原有系统中不存在,所以,设计者从Slave
PIC的IRQ中挑出IRQ9,要求软件设计者将原来的IRQ2重定向到IRQ9上,也就是说IRQ9的中断服务程序需要去掉用IRQ2的中断服务程序。这样,将原来接在IRQ2上的设备现在接在IRQ9上,在软件上只需要增加IRQ9的中断服务程序,由它调用IRQ2的中断服务程序,就可以和原有系统保持兼容。而在当时,增加的IRQ9中断服务程序是由PC开发商开发的BIOS提供的,所以就从根本上保证了兼容。</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman"><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=center><FONT face="Times New Roman TUR"><SPAN lang=EN-US><FONT
face="Times New Roman"><SPAN style="mso-tab-count: 1"><SPAN lang=EN-US><FONT
face="Times New Roman TUR"><SPAN style="mso-tab-count: 1"><IMG
src="interrupt-8259_5.files/irq_cascade.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/8259/irq_cascade.gif"></P>
<HR width="100%" SIZE=2>
<P align=left><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN
style="mso-tab-count: 1"><FONT face="Times New Roman TUR"
size=5><STRONG>2.5.4 Programming
the 8259As </STRONG></FONT></SPAN></FONT></SPAN></P><SPAN
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT face="Courier New"
size=2>每一个8259A芯片都有两个I/O ports,程序员可以通过它们对8259A进行编程。</FONT></SPAN></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN style="mso-tab-count: 1">Master
8259A的端口地址是0x20,0x21;Slave 8259A的端口地址是0xA0,0xA1。</SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">程序员可以向8259A写两种命令字:</SPAN></FONT></SPAN></P>
<OL type=1>
<LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><EM><STRONG>Initialization Command Word
(ICW);</STRONG></EM>这种命令字被用作对8259A芯片的初始化。</SPAN></SPAN> </FONT></FONT>
<LI><FONT face="Courier New"><FONT size=2><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><EM><STRONG>Operation Command Word
(OCW):</STRONG></EM>这种命令被用来向8259A发布命令,以对其进行控制。O</SPAN></SPAN><SPAN
lang=EN-US><SPAN
style="mso-tab-count: 1">CW可以在8259A被初始化之后的任何时候被使用。</SPAN></SPAN></FONT></FONT></LI></OL>
<P><SPAN lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">下表的内容是Master
8259A的I/O端口地址,以及通过它们所能操作的寄存器。</SPAN></FONT></SPAN></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
face="Courier New" size=2></FONT><FONT face="Times New Roman TUR" size=5><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"> </P>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD><B>
<CENTER><FONT face="Courier New" size=2>Address</FONT></CENTER></B></TD>
<TD><B>
<CENTER><FONT face="Courier New" size=2>Read/Write</FONT></CENTER></B></TD>
<TD><B><FONT face="Courier New" size=2>Function</FONT></B></TD></TR>
<TR>
<TD rowSpan=5>
<CENTER><FONT face="Courier New" size=2>0x20</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Initialization Command Word 1
(ICW1)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Operation Command Word 2
(OCW2)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Operation Command Word 3
(OCW3)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Read</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Interrupt Request Register
(IRR)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Read</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>In-Service Register (ISR)</FONT></TD></TR>
<TR>
<TD rowSpan=4>
<CENTER><FONT face="Courier New" size=2>0x21</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Initialization Command Word 2
(ICW2)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -