?? interrupt-sources_1.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0062)http://www.huihoo.com/gnu_linux/own_os/interrupt-sources_1.htm -->
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=6><SPAN
style="mso-tab-count: 1"><STRONG>2.1 Sources &
Classification</STRONG></SPAN></FONT></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT
size=3></FONT></SPAN></FONT></SPAN></SPAN> </P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN
style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><SPAN
lang=EN-US><FONT face="Times New Roman" size=5><SPAN
style="mso-tab-count: 1"><FONT size=3>[</FONT><A
href="index.htm"
tppabs="http://pagoda-ooos.51.net/os_book/index.htm"><FONT
size=3>Home</FONT></A><FONT size=3>] [</FONT><A
href="interrupt_and_exception.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt_and_exception.htm"><FONT
size=3>Top</FONT></A><FONT size=3>] </FONT><FONT size=3>
[</FONT><FONT size=3><A
href="interrupt-vectors_2.htm"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/interrupt-vectors_2.htm">Next</A></FONT><FONT
size=3>]</FONT></P>
<P><STRONG>
<HR width="100%" SIZE=2>
</STRONG></SPAN></FONT></SPAN></SPAN>
<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>
<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>2.1.1 Overview</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"><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>
<P><FONT face="Courier New"
size=2>這件事情還可以有一些變化——事先你的老板通知你,今天將有一個非常重要的會議,但具體時間未定。你為了不錯過這次開會,你可以采取兩種方法來處理:一是你不再寫代碼,而是不斷的詢問老板的秘書是否當前時間要開會,直到開始開會為止;另外一種方法是你可以告訴老板的秘書,當開始開會的時候通知你一聲,而你在接到開會通知之前仍然去集中精力寫你的代碼。很明顯,第二種方法更加科學——你不必在一件無法確定發生時間的事情沒有發生之前進行盲目的等待,而是更加有效的利用你的時間來寫你的代碼,等事情真正發生之后,通過別人的通知來知道。</FONT></P>
<P><FONT face="Courier New"
size=2>這就是中斷的基本原理。在這個例子里,你是一個事務處理者,在沒有別的事件發生的前提下,你的工作就是寫代碼,當有其它事件發生的時候,你通過某種通知機制(比如別人的提醒),來中斷你寫代碼的任務,轉而去處理這件事情,等別的事情處理結束后,你繼續寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>中斷是可以嵌套的。我們仍然以程序員為例,加入你正在寫代碼,突然你的郵件程序通知你有郵件到達,而且這份郵件是需要你盡快回復的,于是你停止寫代碼,開始回復這封郵件,但這個時候,老板通知你馬上參加一個非常重要的會議,于是你又不得不停止回復郵件,去參加會議,等會議結束后,你馬上回來接著回復郵件,等郵件回復完成后,你繼續寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>中斷也可以有優先級。在上一個例子中,當你的代碼工作被一封重要郵件到達通知中斷后,你開始回復這封郵件,但這個時候,又來了另外一封相對不太重要的郵件,于是你暫時不理會這個新到的郵件,繼續回復之前的郵件,等回復完成后,你再來處理這封新到的,完成后,繼續寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>某些中斷是可以被屏蔽的。假如你是一個老板,某天你必須集中精力處理某件事情,于是你告訴你的秘書,你不想受任何打擾。那么當有人給你打電話的時候,你的秘書會幫你拒絕,而不是轉接給你,類似其它的事情,你的秘書也統統幫你屏蔽掉了——而這些事情在平常你沒有聲明屏蔽的情況下,是可以通知給你,交給你來處理的。</FONT></P>
<P><FONT face="Courier New"
size=2>但并非所有的中斷都是可以屏蔽的。在上一個例子中,即使你告訴你的秘書,你不想受任何打擾,但是當一些非常緊急的事情發生的時候,比如,你所工作的辦公大樓發生了火災,那么你必然會收到火警通知,從而打斷你手中的工作。</FONT></P>
<P><FONT face="Courier New"
size=2>對于可屏蔽的中斷,你可以有選擇的屏蔽。比如,你可以告訴你的秘書,不想接某人的電話,當你的秘書接到此人的電話時,會幫你處理掉,而不通知給你。對于其它的事情,則正常通知給你。</FONT></P>
<P><FONT face="Courier New"
size=2>另外,屏蔽中斷的方法除了通過你的秘書之外,你也可以自身完全評比,比如把自己關在一個屋子里,門口掛著“請勿打擾”,然后拔掉所有的電話線和網線,讓自己屏蔽掉你的秘書可以幫你屏蔽掉的所有中斷。只不過,這種方法你無法有選擇的屏蔽中斷,比如,你只是不想接某人的電話,其它電話你仍然想正常的接,那么你拔掉電話線則讓你拒絕了所有電話(或許可以使用帶有來電顯示的電話,但這只是個例子),而如果通過你的秘書,她則可以幫你進行識別和選擇。</FONT></P>
<P><FONT face="Courier New"
size=2>除了這些外部因素來中斷你當前手中的事務之外,你在處理這些事務過程中遇到的問題也可以中斷當前事務的處理。</FONT></P>
<P><FONT face="Courier New"
size=2>你再回到程序員的角色來——你正在寫代碼,但這個時候你碰到了一個難題,讓你的代碼無法寫下去,于是你不得不暫時停止寫代碼去請教別人,或者去查資料,等問題解決了之后,你重新回來繼續寫代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>還有一種情況,當你一邊寫,一邊測試你寫的代碼的時候,你發現了一個BUG,那么你也不得不停止繼續寫,而是去解決這個BUG,等BUG解決之后,再繼續寫下去。</FONT></P>
<P><FONT face="Courier New"
size=2>所幸,這個兩個例子中,問題畢竟還可能解決,從而讓寫代碼這件事務得以繼續處理。但有你無法保證你永遠幸運——當你為某一個項目寫代碼的事務被一個難題中斷時候,你停止寫代碼,轉去解決這個難題,但不幸的是,你發現你之前所寫的代碼的立足點都是錯誤的,那么繼續寫下去只能是南轅北轍,你所能做的只能放棄這個事務,重新開啟一個新的事務——重新設計,重新編碼。</FONT></P>
<P><FONT face="Courier New"
size=2>因為事務是被你在處理這些事務時遇到的意外問題打斷,所以以上三種情況我們稱之為異常。</FONT></P>
<P><FONT face="Courier New"
size=2>事務除了被事務中遇到的問題打斷之外,還可能被事務處理自身所需要的其它事務中斷。比如,我們把“寫”代碼作為一個事物,那么在“寫”的過程中,我們需要測試一下我們已經完成代碼的正確性,于是我們暫時停止“寫”,轉而去“測試”一下,等“測試”OK后,再繼續寫下去。</FONT></P>
<P><FONT face="Courier New"
size=2>最后,中斷你手中事務的原因就來自于你自身,比如你困了,餓了,生病了等等,都會讓你停止手中的工作,去休息,去就餐,去治療,等這一切OK之后,你或許可以繼續你的工作。這是你自身異常所造成的事務中斷。</FONT></P>
<P><FONT face="Courier New"
size=2>從上面的例子中,我們可以得知,對你手中事務的中斷來自于:1、你自身的非事務原因,比如生病;2、你自身在處理事務過程中遇到的問題(三種異常);3、外界因素;4、你手中事務的自身需要(比如例子中的代碼測試)。其中來自于1,2,4的中斷你是無法屏蔽的,而來自于3的中斷一部分是可以屏蔽的,一部分是不可屏蔽的。對于可屏蔽部分,你可以通過別人(比如,在這個例子中是你的秘書)來有選擇的進行屏蔽(當然也可以選擇全部評比),或者靠自己完全屏蔽。</FONT></P>
<P><FONT face="Courier New"
size=2>如果將你比做CPU,將你處理的事務比作CPU當前正在執行的軟件,將外界因素比做其它硬件,將你的秘書比作PIC(可編程中斷控制器),那么中斷將分類為:1、CPU內部硬件異常;2、軟件異常;3、外部硬件中斷;4、軟件中斷。其中3進一步被細分為可屏蔽中斷和不可屏蔽中斷。1,2,4則是完全不可屏蔽的。</FONT></P>
<P><FONT face="Courier New" size=2>在Intel
386系統上,PIC就是8259A,可屏蔽中斷可以通過8259A進行有選擇的控制,也可以由CPU自身完全屏蔽(通過cli指令)。軟件通過INT
n指令主動進行中斷,CPU在執行軟件時有可能被軟件指令執行異常所中斷,也可能被CPU自身的內部硬件異常所中斷。如下圖所示:</FONT></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><IMG src="interrupt-sources_1.files/intr_source.jpg"
tppabs="http://pagoda-ooos.51.net/os_book/interrupt/sources/intr_source.jpg"></P><FONT
face="Times New Roman TUR">
<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>Interrupt的來源從總體上分為硬件(外部)中斷和軟件中斷。其中硬件中斷分為不可屏蔽中斷NMI(Non-Maskable
Interrupt)和可屏蔽硬件中斷INTR。Exception的來源于CPU內部,比如軟件指令執行異常(比如被0除),或者CPU芯片硬件異常。</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>NMI、軟件中斷和異常以及硬件異常都是不可屏蔽的,狀態寄存器IF位的設置對它們沒有影響。只有INTR是可以屏蔽的,是否屏蔽取決于狀態寄存器IF的設置。</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></FONT>
<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>Excetpions被更進一步細分為faults,traps,和aborts。</FONT></P><FONT
face="Times New Roman TUR"><STRONG>
<HR width="100%" SIZE=2>
</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
face="Times New Roman TUR" 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.2 Source of
Interrupts</STRONG></FONT></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="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="Times New Roman TUR" size=4><STRONG>2.1.2.1 Hardware
Interrupts</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=3></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 Interrupts又稱為External
Interrupts,分為NMI和INTR。</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>NMI產生于硬件本身的突發性事件,比如斷電。NMI正如其名,是不可屏蔽的,也就是說不受EFLAGS-IF標志位的影響。NMI使用中斷向量號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
size=4><FONT face="Courier New" size=2></FONT> </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>INTR是通過可編程中斷控制器PIC(Programmable
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -