📄 interrupt-sources_1.htm
字号:
Interrupt
Controller)发送给CPU的,在PIC外部,挂接的都是外部硬件设备,比如时钟,磁盘,键盘,RS232等。INTR是可以屏蔽的,我们可以通过对PIC编程来屏蔽某个或某些设备发出的IRQ。也可以通过CLI指令清除EFLAGS-IF标志位来屏蔽所有来自于PIC的中断。在IBM
PC及其兼容机上,所使用的PIC一般是一个或两个Intel 8259A芯片。</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"><STRONG></P></STRONG></FONT>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
size=5></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=4><STRONG>2.1.2.2 Software
Interrupt</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"><STRONG><FONT
face="Times New Roman TUR" size=5></FONT></STRONG> </P><FONT size=5>
<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>Software Interrupt是软件通过执行INT
n指令产生的,其中n是中断向量号。比如软件执行INT 36,则会迫使CPU执行向量号为36的ISR。</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="Courier New" size=2></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="Courier New" size=2>从0到255范围内的所有中断向量号都可以作为INT n指令的参数。</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=3></FONT> </P><FONT size=3><FONT
face="Times New Roman TUR">
<HR width="100%" SIZE=2>
</FONT>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><FONT
size=5></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><STRONG>2.1.3 Source of
Exception</STRONG></FONT></P></FONT><FONT size=4>
<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"><STRONG></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"><STRONG>2.1.3.1 Hardware
Exception</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"></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="Courier New" size=2>Hardware Exception又称作Machine-Check
Exception。P6系列的芯片实现了一套机器检测架构,来提供检测和报告芯片内部操作或总线传输等操作引起的硬件错误的机制,这些错误包括:</FONT></P>
<UL>
<LI><FONT face="Courier New" size=2>系统总线错误 (system bus errors); </FONT>
<LI><FONT face="Courier New" size=2>错误检测与纠正功能引起的错误 (ECC errors); </FONT>
<LI><FONT face="Courier New" size=2>奇偶错误 (parity errors); </FONT>
<LI><FONT face="Courier New" size=2>缓存错误 (cache errors); </FONT>
<LI><FONT face="Courier New" size=2>TLB 错误 (TLB errors)</FONT></LI></UL>
<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></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> </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>当一个引起Machine-Check
Exception的错误被检测到以后,CPU会触发一个Machine-Check Exception(向量18),并返回一个Error
Code。</FONT></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG><FONT
face="Times New Roman TUR"></FONT></STRONG> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG><FONT
face="Times New Roman TUR">2.1.3.2 Software Exception</FONT></STRONG></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"><STRONG><FONT
face="Times New Roman TUR"></FONT></STRONG> </P><FONT size=3>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"
align=left><FONT face="Courier New" size=2>Software Exception的来源有两个:</FONT></P>
<UL>
<LI><FONT face="Courier New" size=2>CPU检测到的程序错误异常; </FONT>
<LI><FONT face="Courier New" size=2>软件自身产生的异常。</FONT></LI></UL>
<P><FONT face="Courier New"
size=2>当CPU在执行一个程序(OS或Application)的时候,如果检测到一个程序错误,则会产生一个异常。Intel为每一个CPU可以检测到的异常都定义了一个向量号。</FONT></P>
<P><FONT face="Courier New" size=2>另外,软件可以通过执行指令INTO,INT 3,BOUND来产生一个异常。比如,INT
3指令可以引起一个断点异常。</FONT></P>
<P><FONT face="Courier New" size=2>软件可以通过INT n指令来模拟产生一个异常。如果INT
n指令中的n是一个被Intel定义的异常向量,CPU可以产生一个对应那个向量的中断,这个中断将会调用相应的ISR。因为这实际上是一个中断,所以CPU不PUSH一个错误码到堆栈中去,虽然真正由硬件产生的针对那个向量的异常会那么做。对于这些产生错误码的异常来说,相应的ISR会从栈中POP一个错误码。但如果它们被软件通过使用INT
n指令来模拟产生的话,由于错误码没有被产生并被压栈,所以放置在栈顶的EIP(用来替代未被生成的错误码)会被POP出来,并被丢弃掉。</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">
<HR width="100%" SIZE=2>
<P></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><STRONG></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><STRONG>2.1.4 Exception
Classifications</STRONG></FONT></P></FONT>
<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"></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="Courier New" size=2>按照如下原则,</FONT></P>
<OL type=1>
<LI><FONT face="Courier New" size=2>被报告的方式; </FONT>
<LI><FONT face="Courier New"
size=2>在不破坏程序的连续性的前提下,引起当前异常的指令是否能够被Restart;</FONT></LI></OL>
<P><FONT face="Courier New"
size=2>Exceptions可以被进一步细分为Faults,Traps,和Aborts。</FONT></P>
<P><FONT face="Times New Roman TUR" size=4><STRONG>2.1.4.1
Faults</STRONG></FONT></P>
<P><FONT face="Courier New"
size=2>一个Fault一般来说是可以被纠正的。一旦一个Fault被纠正,那个引起此Fault的程序可以继续执行,而不破坏程序的连续性。</FONT></P>
<P><FONT face="Courier New"
size=2>当一个Fault被报告时,CPU会将机器状态恢复到引起此Fault的指令被执行之前的状态,此Fault的ISR的返回地址(被保存的CS和EIP寄存器的内容)被设置为指向引起此Fault的那条指令,而不是指向这条指令之后的那条指令。</FONT></P>
<P align=center><IMG src="interrupt-sources_1.files/fault.jpg"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/sources/fault.jpg"></P>
<P align=center><FONT face="Times New Roman TUR"></FONT></P>
<P><FONT face="Times New Roman TUR"><STRONG><FONT size=4>2.1.4.2
Traps</FONT></STRONG></FONT></P>
<P><FONT face="Courier New"
size=2>当一个引起Trap的指令被执行之后,一个Trap异常会随即发生。在相应的ISR被执行之后,这个引起此Trap异常的程序可以继续执行,自身的连续性不会被破坏。</FONT></P>
<P><FONT face="Courier New"
size=2>针对一个Trap的ISR的返回地址被设置为指向那条引起此Trap的指令之后的那条指令。</FONT></P>
<P align=center><IMG src="interrupt-sources_1.files/trap.jpg"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/sources/trap.jpg"></P>
<P align=center><FONT face="Times New Roman TUR"></FONT></P>
<P><FONT face="Times New Roman TUR"><STRONG><FONT size=4>2.1.4.3
Aborts</FONT></STRONG></FONT></P>
<P><FONT face="Courier New"
size=2>一个Abort并不总是报告那条引起异常的指令的精确位置,也不允许那个引起Abort异常的程序继续执行。</FONT></P>
<P><FONT face="Courier New"
size=2>Aborts被用来报告严重错误,比如硬件错误,以及系统表中(比如TLB)的数据不一致或者非法等错误。</FONT></P>
<P><FONT face="Courier New"
size=2>当一个Abort发生时,引起此Abort的程序应该被终止运行。如果此程序是一个OS,则OS应该Halt;如果此程序是一个运行于OS之上的Application,则OS应该对此程序进行中止处理。</FONT></P></FONT></FONT></FONT></FONT></FONT></FONT></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -