?? interrupt-sources_1.htm
字號(hào):
Interrupt
Controller)發(fā)送給CPU的,在PIC外部,掛接的都是外部硬件設(shè)備,比如時(shí)鐘,磁盤(pán),鍵盤(pán),RS232等。INTR是可以屏蔽的,我們可以通過(guò)對(duì)PIC編程來(lái)屏蔽某個(gè)或某些設(shè)備發(fā)出的IRQ。也可以通過(guò)CLI指令清除EFLAGS-IF標(biāo)志位來(lái)屏蔽所有來(lái)自于PIC的中斷。在IBM
PC及其兼容機(jī)上,所使用的PIC一般是一個(gè)或兩個(gè)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是軟件通過(guò)執(zhí)行INT
n指令產(chǎn)生的,其中n是中斷向量號(hào)。比如軟件執(zhí)行INT 36,則會(huì)迫使CPU執(zhí)行向量號(hào)為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范圍內(nèi)的所有中斷向量號(hào)都可以作為INT n指令的參數(shù)。</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又稱(chēng)作Machine-Check
Exception。P6系列的芯片實(shí)現(xiàn)了一套機(jī)器檢測(cè)架構(gòu),來(lái)提供檢測(cè)和報(bào)告芯片內(nèi)部操作或總線傳輸?shù)炔僮饕鸬挠布e(cuò)誤的機(jī)制,這些錯(cuò)誤包括:</FONT></P>
<UL>
<LI><FONT face="Courier New" size=2>系統(tǒng)總線錯(cuò)誤 (system bus errors); </FONT>
<LI><FONT face="Courier New" size=2>錯(cuò)誤檢測(cè)與糾正功能引起的錯(cuò)誤 (ECC errors); </FONT>
<LI><FONT face="Courier New" size=2>奇偶錯(cuò)誤 (parity errors); </FONT>
<LI><FONT face="Courier New" size=2>緩存錯(cuò)誤 (cache errors); </FONT>
<LI><FONT face="Courier New" size=2>TLB 錯(cuò)誤 (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>當(dāng)一個(gè)引起Machine-Check
Exception的錯(cuò)誤被檢測(cè)到以后,CPU會(huì)觸發(fā)一個(gè)Machine-Check Exception(向量18),并返回一個(gè)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的來(lái)源有兩個(gè):</FONT></P>
<UL>
<LI><FONT face="Courier New" size=2>CPU檢測(cè)到的程序錯(cuò)誤異常; </FONT>
<LI><FONT face="Courier New" size=2>軟件自身產(chǎn)生的異常。</FONT></LI></UL>
<P><FONT face="Courier New"
size=2>當(dāng)CPU在執(zhí)行一個(gè)程序(OS或Application)的時(shí)候,如果檢測(cè)到一個(gè)程序錯(cuò)誤,則會(huì)產(chǎn)生一個(gè)異常。Intel為每一個(gè)CPU可以檢測(cè)到的異常都定義了一個(gè)向量號(hào)。</FONT></P>
<P><FONT face="Courier New" size=2>另外,軟件可以通過(guò)執(zhí)行指令I(lǐng)NTO,INT 3,BOUND來(lái)產(chǎn)生一個(gè)異常。比如,INT
3指令可以引起一個(gè)斷點(diǎn)異常。</FONT></P>
<P><FONT face="Courier New" size=2>軟件可以通過(guò)INT n指令來(lái)模擬產(chǎn)生一個(gè)異常。如果INT
n指令中的n是一個(gè)被Intel定義的異常向量,CPU可以產(chǎn)生一個(gè)對(duì)應(yīng)那個(gè)向量的中斷,這個(gè)中斷將會(huì)調(diào)用相應(yīng)的ISR。因?yàn)檫@實(shí)際上是一個(gè)中斷,所以CPU不PUSH一個(gè)錯(cuò)誤碼到堆棧中去,雖然真正由硬件產(chǎn)生的針對(duì)那個(gè)向量的異常會(huì)那么做。對(duì)于這些產(chǎn)生錯(cuò)誤碼的異常來(lái)說(shuō),相應(yīng)的ISR會(huì)從棧中POP一個(gè)錯(cuò)誤碼。但如果它們被軟件通過(guò)使用INT
n指令來(lái)模擬產(chǎn)生的話,由于錯(cuò)誤碼沒(méi)有被產(chǎn)生并被壓棧,所以放置在棧頂?shù)腅IP(用來(lái)替代未被生成的錯(cuò)誤碼)會(huì)被POP出來(lái),并被丟棄掉。</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>被報(bào)告的方式; </FONT>
<LI><FONT face="Courier New"
size=2>在不破壞程序的連續(xù)性的前提下,引起當(dāng)前異常的指令是否能夠被Restart;</FONT></LI></OL>
<P><FONT face="Courier New"
size=2>Exceptions可以被進(jìn)一步細(xì)分為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>一個(gè)Fault一般來(lái)說(shuō)是可以被糾正的。一旦一個(gè)Fault被糾正,那個(gè)引起此Fault的程序可以繼續(xù)執(zhí)行,而不破壞程序的連續(xù)性。</FONT></P>
<P><FONT face="Courier New"
size=2>當(dāng)一個(gè)Fault被報(bào)告時(shí),CPU會(huì)將機(jī)器狀態(tài)恢復(fù)到引起此Fault的指令被執(zhí)行之前的狀態(tài),此Fault的ISR的返回地址(被保存的CS和EIP寄存器的內(nèi)容)被設(shè)置為指向引起此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>當(dāng)一個(gè)引起Trap的指令被執(zhí)行之后,一個(gè)Trap異常會(huì)隨即發(fā)生。在相應(yīng)的ISR被執(zhí)行之后,這個(gè)引起此Trap異常的程序可以繼續(xù)執(zhí)行,自身的連續(xù)性不會(huì)被破壞。</FONT></P>
<P><FONT face="Courier New"
size=2>針對(duì)一個(gè)Trap的ISR的返回地址被設(shè)置為指向那條引起此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>一個(gè)Abort并不總是報(bào)告那條引起異常的指令的精確位置,也不允許那個(gè)引起Abort異常的程序繼續(xù)執(zhí)行。</FONT></P>
<P><FONT face="Courier New"
size=2>Aborts被用來(lái)報(bào)告嚴(yán)重錯(cuò)誤,比如硬件錯(cuò)誤,以及系統(tǒng)表中(比如TLB)的數(shù)據(jù)不一致或者非法等錯(cuò)誤。</FONT></P>
<P><FONT face="Courier New"
size=2>當(dāng)一個(gè)Abort發(fā)生時(shí),引起此Abort的程序應(yīng)該被終止運(yùn)行。如果此程序是一個(gè)OS,則OS應(yīng)該Halt;如果此程序是一個(gè)運(yùn)行于OS之上的Application,則OS應(yīng)該對(duì)此程序進(jìn)行中止處理。</FONT></P></FONT></FONT></FONT></FONT></FONT></FONT></BODY></HTML>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -