?? interrupt-handling_4.htm
字號:
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=+0><FONT size=3><FONT
face="Times New Roman TUR"> </P></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN>
<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=+0><FONT size=3><FONT
face="Times New Roman TUR">由于Fault類的Exception是一種可恢復異常,其ISR就是為了處理造成異常的條件,等處理結束后,CPU會返回重新執行那條引起異常的指令。一個最常用的例子是Page-fault
Exception——當系統引用一個Page時,如果這個Page不在RAM中,會引起Page-fault
Exception,而其ISR所作的就是將這個Page以某種算法調入RAM,這時候,引起Exception的條件已經解除了,當ISR結束之后,重新去執行那條引用此Page的指令,就不會再引起任何異常。所以,對于Fault類Exception,當發生時,在Stack中保存的CS和EIP的內容應該是那條引起Exception的那條指令的位置。</FONT></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><FONT face="Times New Roman TUR" size=3><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="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><SPAN lang=EN-US><FONT
face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">而Trap類Exceptions用于在進行下一步操作之前的條件檢查,比如INTO指令用于在執行下一條指令之前檢查EFLAGS的OF
flag,如果OF flag被設置,則引起一個Overflow
Exception;再比如BOUND指令用于在進行數組操作之前檢查一個對某個數組的索引是否越界,一旦越界,則會引起一個Bound Range Exceed
Exception;而這些Exceptions的ISR被用作消除這些引起異常的條件,然后指令從下一條繼續執行。另外,Trap類Exception也被用作調試目的,如INT
1和INT 3,一旦執行這兩個指令,則會引起一個Debug Exception或Breakpoint
Exception;這時候ISR的目的被用作暫時阻塞當前任務的運行,等阻塞解除后,任務可以從下一條指令繼續進行。這里所說的"下一條",指的不是指令物理順序,而是指令執行順序的。比如一個JMP指令執行時發生Trap
Exception異常,那么等ISR執行結束后,繼續執行的是JMP指令要跳轉去的位置的那條指令。</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="Times New Roman TUR" size=3><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="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">Abort類的Exception不支持可靠的Task Restart。Abort
ISR被設計為用來收集關于Abort
Exception發生時的診斷信息,然后盡可能優雅的當掉Application和系統。</SPAN></FONT></SPAN><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"></P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3"> </P>
<P class=MsoNormal
style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; tab-stops: list 21.0pt; mso-list: l5 level1 lfo3">Interrupts嚴格的支持被中斷程序的Restart。被保存在Stack中的CS,
EIP內容指向Interrupt發生時執行結束的那條指令之后的那條指令。如果當時被執行的指令有循環前綴(比如REP),則CPU會等到當前這次循環結束,相關寄存器被設置為下一次循環的內容之后,才會引發Interrupt。</P></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN>
<P>
<HR width="100%" SIZE=2>
<STRONG><FONT face="Times New Roman" size=5></FONT></STRONG>
<P></P>
<P></P>
<P><FONT face="Times New Roman" size=5><STRONG></STRONG></FONT></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.4.4 Error Code</STRONG><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN style="mso-tab-count: 1">
</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><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">如果一個Exception
Condition與一個段相關的時候,那么當這個Exception發生的時候,CPU會將一個Error
Code壓入ISR所使用的Stack中。</FONT></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><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> </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=+0><FONT size=3><FONT
face="Times New Roman TUR">Error
Code的格式如下圖所示:</FONT></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"
align=center><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><IMG src="interrupt-handling_4.files/error_code.gif"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/handling/error_code.gif"></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"
align=center><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></P><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">
<UL>
<LI><STRONG>EXT</STRONG> -
</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">External
event (bit 0). </FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果EXT被設置,則表示一個<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">External
event引起了這個Exception。比如一個硬件中斷。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN>
<LI><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"><SPAN lang=EN-US><FONT face="Times New Roman"
size=5><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN></FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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"><STRONG>IDT</STRONG> - Descriptor location (bit 1).
</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果IDT被設置,表示這個Error Code中的Segment Select
Index引用的是一個IDT中的Gate
Descriptor。否則,則表示引用的是一個GDT或當前LDT中的一個Descriptor。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN>
<LI><SPAN lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"></SPAN></FONT></SPAN><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"><STRONG>TI</STRONG> - GDT/LDT (bit 2).
</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN><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">如果IDT
bit被清除時,才使用這個bit來進一步區分Segment Select
Index引用的是GDT還是本地LDT中的Descriptor。被設置則表示本地LDT,否則表示GDT。</FONT></FONT></FONT></FONT></SPAN></FONT></SPAN></LI></UL><SPAN
lang=EN-US><FONT face="Times New Roman TUR" size=3><SPAN
style="mso-tab-count: 1">
<P><BR>當一個帶有Error Code的Exception發生時,一個Error
Code會被壓入棧頂,但必須注意的是,IRET指令并不Pop,所以ISR程序在執行IRET之前必須明確的刪除它。</P>
<P>當一個Exception是通過INT n指令產生的時候,即使對于那些產生Error Code的異常來說,CPU也不會將Error
Code壓棧。<BR></P></SPAN></FONT></SPAN></SPAN></FONT></SPAN></FONT></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></SPAN></FONT></SPAN></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -