⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt-8259_5.htm

📁 编写自己的操作系统
💻 HTM
📖 第 1 页 / 共 4 页
字号:
    <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&nbsp;Slave 
8259A</FONT></CENTER>
<DIV align=left><FONT face="Courier New" size=2></FONT>&nbsp;</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>&nbsp;</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&nbsp;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&nbsp;</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&nbsp;</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 + -