📄 interrupt-8259_5.htm
字号:
<TD><FONT face="Courier New" size=2>Initialization Command Word 3
(ICW3)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Initialization Command Word 4
(ICW4)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Read/Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Interrupt Mask Register
(IMR)</FONT></TD></TR></TBODY></TABLE><FONT face="Courier New"
size=2>Addresses/Registers for Master 8259A</FONT></CENTER>
<P><FONT face="Courier New" size=2></FONT></P>
<P><SPAN lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">下表的内容是Slave
8259A的I/O端口地址,以及通过它们所能操作的寄存器。</SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN style="mso-tab-count: 1"></P>
<P><FONT face="Courier New" size=2></FONT>
<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>0xA0</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>0xA1</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>
<TD><FONT face="Courier New" size=2>Initialization Command Word 3
(ICW3)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Initialization Command Word 4
(ICW4)</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>Read/Write</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Interrupt Mask Register
(IMR)</FONT></TD></TR></TBODY></TABLE></CENTER>
<CENTER><FONT face="Courier New" size=2>Addresses/Registers for Slave
8259A</FONT></CENTER>
<DIV align=left><FONT face="Courier New" size=2></FONT> </DIV>
<DIV align=left><FONT face="Courier New" size=2>由于8259A芯片不仅能够用于IBM
PC/X86,也可以被用作MCS-80/85,对于这两者,在操作模式上有一些不一样,对于某些寄存器的设置也有所不同。我们后面仅仅讨论X86模式相关的内容。</FONT></DIV>
<DIV align=left><FONT face="Courier New" size=2></FONT> </DIV>
<DIV align=left>
<HR width="100%" SIZE=2>
</DIV>
<DIV align=left></DIV>
<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.5
Initialization</STRONG></FONT></SPAN></FONT></SPAN></P>
<P align=left><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><SPAN
style="mso-tab-count: 1"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
face="Courier New"
size=2>当主机Power-on或Reset之后,必须对两个8259A都进行初始化。事实上,BIOS已经这么做了。但不幸的是,BIOS对其进行的初始化的结果并非我们所需要。比如,我们要开发Protected
Mode下OS,我们要设置自己的IDT,那么我们就不能使用BIOS设置的IVT,而在对8259A初始化操作中,我们需要告诉8259A,其相关中断请求的起始向量号,而我们对IDT的中断向量布局和BIOS设置的IVT的中断向量布局可以是不一样的。这样,我们也需要对两个8259A进行初始化。</FONT></SPAN></SPAN></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">任何时候,只要向某一个8259A的第一个端口(0x20 for Master, and
0xA0 for
Slave)写入的命令的bit-4(从0算起)为1,那么这个8259A就认为这是一个ICW1;而一旦一个8259A收到一个ICW1,它就认为一个初始化序列开始了。你可以通过对照上边的表和后面的表,第一端口可写的有ICW1,OCW2和OCW3。而ICW1的bit-4要求必须是1,但OCW2和OCW3的bit-4要求必须是0。</SPAN></FONT></SPAN></SPAN></SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><FONT face="Courier New" size=2><SPAN
style="mso-tab-count: 1">8259A的初始化流程协议如下图所示,程序员对其进行初始化时必须遵守此协议:</SPAN></FONT></SPAN></SPAN></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN
style="mso-tab-count: 1"><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"><IMG src="interrupt-8259_5.files/pic_init.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/8259/pic_init.gif"></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></P>
<P align=center><SPAN lang=EN-US><FONT face="Times New Roman"><SPAN
style="mso-tab-count: 1"><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"></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></P>
<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><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"><FONT size=4>
<HR width="100%" SIZE=1>
<P></P>
<P align=left></FONT></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN><SPAN
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1"><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"><FONT
size=4><STRONG>ICW1</STRONG></FONT></P>
<CENTER>
<TABLE width="70%" border=1>
<TBODY>
<TR>
<TD><B>
<CENTER><FONT face="Courier New"
size=2>Bit(s)</FONT></CENTER><B></B></B></TD>
<TD colSpan=2><B><FONT face="Courier New" size=2>Function</FONT></B></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>7:5</FONT></CENTER></TD>
<TD colSpan=2><FONT face="Courier New" size=2>Interrupt Vector Addresses
for MCS-80/85 Mode.</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>4</FONT></CENTER></TD>
<TD colSpan=2><FONT face="Courier New" size=2>Must be set to 1 for
ICW1</FONT></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER><FONT face="Courier New" size=2>3</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>1</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Level Triggered
Interrupts</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Edge Triggered Interrupts</FONT></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER><FONT face="Courier New" size=2>2</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>1</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Call Address Interval of
4</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Call Address Interval of
8</FONT></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER><FONT face="Courier New" size=2>1 (SINGL)</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>1</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Single PIC</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Cascaded PICs</FONT></TD></TR>
<TR>
<TD rowSpan=2>
<CENTER><FONT face="Courier New" size=2>0 (IC4)</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>1</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Will be Sending ICW4</FONT></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD>
<TD><FONT face="Courier New" size=2>Don't need
ICW4</FONT></TD></TR></TBODY></TABLE><FONT face="Courier New"
size=2>Initialization Command Word 1 (ICW1) </FONT></CENTER>
<P><FONT face="Courier New" size=2></FONT></P>
<P><FONT face="Courier New" size=2>对于X86,bit-0必须被设置为1;由于当今的IBM
PC上都有两个级连的8259A,所以bit-1应该被设置为0;由于bit-2是为MCS-80/85服务的,我们将其设置为0;bit-3也设置为0;bit-4被要求必须设置为1;bit5:7是为MCS-80/85服务的,对于X86,应将全部将其设为0。</FONT></P>
<P><FONT face="Courier New" size=2>所以,在X86系统上,ICW1应该被设置为二进制00010001 =
0x11。</FONT></P>
<P align=left><SPAN lang=EN-US><SPAN style="mso-tab-count: 1"><SPAN
lang=EN-US><SPAN style="mso-tab-count: 1"><FONT
size=4><STRONG>ICW2</STRONG></FONT></SPAN></SPAN></SPAN></SPAN></P><SPAN
lang=EN-US><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1"><FONT
size=5><SPAN lang=EN-US><FONT size=3><SPAN style="mso-tab-count: 1">
<P><FONT face="Times New Roman TUR"></FONT>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD>
<CENTER><B><FONT face="Courier New" size=2>Bit</FONT></B></CENTER></TD>
<TD>
<CENTER><B><FONT face="Courier New" size=2>80x86
Mode</FONT></B></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>7</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>I7</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>6</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>I6</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>5</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>I5</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>4</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>I4</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>3</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>I3</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>2</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>1</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New" size=2>0 </FONT></CENTER></TD></TR>
<TR>
<TD>
<CENTER><FONT face="Courier New" size=2>0</FONT></CENTER></TD>
<TD>
<CENTER><FONT face="Courier New"
size=2>0 </FONT></CENTER></TD></TR></TBODY></TABLE><FONT face="Courier New"
size=2>Initialization Command Word 2 (ICW2) </FONT></CENTER>
<P><FONT face="Courier New" size=2></FONT></P>
<P><FONT face="Courier New"
size=2>ICW2被用作指定本8259A中的中断请求的起始中断向量,bit0:3必须被设为0;所以,其起始中断向量必须是8的倍数。比如,我们的OS的设计讲来自于Master
8259A的8个中断请求放在IDT的第32 (从0开始计)个位置到第39个位置,则我们应该将ICW2设为0x20。</FONT></P>
<P><FONT face="Courier New"
size=2>这样,当将来此8259A上接收到一个IRQ时,其低3位会被自动填充为IRQ号。比如,其收到一个IRQ6,将6自动填充到后3位,则生成的向量号为0x26。8259A会在收到CPU发来的第二个INTA信号之后,将生成的向量号放到Data
Bus上。</FONT></P>
<P><FONT face="Times New Roman TUR" size=4><STRONG>ICW3</STRONG></FONT></P>
<P><FONT face="Courier New" size=2>Master 8259A和Slave
8259A有不同的ICW3格式。</FONT></P>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD>
<CENTER><B><FONT face="Courier New" size=2>Bit</FONT></B></CENTER></TD>
<TD>
<CENTER><B><FONT face="Courier New"
size=2>Function</FONT></B></CENTER></TD></TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -