?? interrupt-sources_1.htm
字號(hào):
<!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>如果你是一個(gè)程序員,那么你工作的主要任務(wù)就是寫代碼,但除了寫代碼之外,你也可能去做一些別的事情,比如開會(huì)。假如有一天你正在聚精會(huì)神的寫代碼,你的老板過來通知你馬上去參加一個(gè)事先沒有任何通知的會(huì)議,那么你不得不放下手中的代碼去開會(huì)——盡管開會(huì)也是你工作的一部分,但你當(dāng)前正在進(jìn)行的編碼工作卻被開會(huì)打斷了,并且由于這是老板的要求,你不得不去做。等你開完會(huì)后,你重新回到你的座位,繼續(xù)寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>這件事情還可以有一些變化——事先你的老板通知你,今天將有一個(gè)非常重要的會(huì)議,但具體時(shí)間未定。你為了不錯(cuò)過這次開會(huì),你可以采取兩種方法來處理:一是你不再寫代碼,而是不斷的詢問老板的秘書是否當(dāng)前時(shí)間要開會(huì),直到開始開會(huì)為止;另外一種方法是你可以告訴老板的秘書,當(dāng)開始開會(huì)的時(shí)候通知你一聲,而你在接到開會(huì)通知之前仍然去集中精力寫你的代碼。很明顯,第二種方法更加科學(xué)——你不必在一件無法確定發(fā)生時(shí)間的事情沒有發(fā)生之前進(jìn)行盲目的等待,而是更加有效的利用你的時(shí)間來寫你的代碼,等事情真正發(fā)生之后,通過別人的通知來知道。</FONT></P>
<P><FONT face="Courier New"
size=2>這就是中斷的基本原理。在這個(gè)例子里,你是一個(gè)事務(wù)處理者,在沒有別的事件發(fā)生的前提下,你的工作就是寫代碼,當(dāng)有其它事件發(fā)生的時(shí)候,你通過某種通知機(jī)制(比如別人的提醒),來中斷你寫代碼的任務(wù),轉(zhuǎn)而去處理這件事情,等別的事情處理結(jié)束后,你繼續(xù)寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>中斷是可以嵌套的。我們?nèi)匀灰猿绦騿T為例,加入你正在寫代碼,突然你的郵件程序通知你有郵件到達(dá),而且這份郵件是需要你盡快回復(fù)的,于是你停止寫代碼,開始回復(fù)這封郵件,但這個(gè)時(shí)候,老板通知你馬上參加一個(gè)非常重要的會(huì)議,于是你又不得不停止回復(fù)郵件,去參加會(huì)議,等會(huì)議結(jié)束后,你馬上回來接著回復(fù)郵件,等郵件回復(fù)完成后,你繼續(xù)寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>中斷也可以有優(yōu)先級(jí)。在上一個(gè)例子中,當(dāng)你的代碼工作被一封重要郵件到達(dá)通知中斷后,你開始回復(fù)這封郵件,但這個(gè)時(shí)候,又來了另外一封相對(duì)不太重要的郵件,于是你暫時(shí)不理會(huì)這個(gè)新到的郵件,繼續(xù)回復(fù)之前的郵件,等回復(fù)完成后,你再來處理這封新到的,完成后,繼續(xù)寫你的代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>某些中斷是可以被屏蔽的。假如你是一個(gè)老板,某天你必須集中精力處理某件事情,于是你告訴你的秘書,你不想受任何打擾。那么當(dāng)有人給你打電話的時(shí)候,你的秘書會(huì)幫你拒絕,而不是轉(zhuǎn)接給你,類似其它的事情,你的秘書也統(tǒng)統(tǒng)幫你屏蔽掉了——而這些事情在平常你沒有聲明屏蔽的情況下,是可以通知給你,交給你來處理的。</FONT></P>
<P><FONT face="Courier New"
size=2>但并非所有的中斷都是可以屏蔽的。在上一個(gè)例子中,即使你告訴你的秘書,你不想受任何打擾,但是當(dāng)一些非常緊急的事情發(fā)生的時(shí)候,比如,你所工作的辦公大樓發(fā)生了火災(zāi),那么你必然會(huì)收到火警通知,從而打斷你手中的工作。</FONT></P>
<P><FONT face="Courier New"
size=2>對(duì)于可屏蔽的中斷,你可以有選擇的屏蔽。比如,你可以告訴你的秘書,不想接某人的電話,當(dāng)你的秘書接到此人的電話時(shí),會(huì)幫你處理掉,而不通知給你。對(duì)于其它的事情,則正常通知給你。</FONT></P>
<P><FONT face="Courier New"
size=2>另外,屏蔽中斷的方法除了通過你的秘書之外,你也可以自身完全評(píng)比,比如把自己關(guān)在一個(gè)屋子里,門口掛著“請(qǐng)勿打擾”,然后拔掉所有的電話線和網(wǎng)線,讓自己屏蔽掉你的秘書可以幫你屏蔽掉的所有中斷。只不過,這種方法你無法有選擇的屏蔽中斷,比如,你只是不想接某人的電話,其它電話你仍然想正常的接,那么你拔掉電話線則讓你拒絕了所有電話(或許可以使用帶有來電顯示的電話,但這只是個(gè)例子),而如果通過你的秘書,她則可以幫你進(jìn)行識(shí)別和選擇。</FONT></P>
<P><FONT face="Courier New"
size=2>除了這些外部因素來中斷你當(dāng)前手中的事務(wù)之外,你在處理這些事務(wù)過程中遇到的問題也可以中斷當(dāng)前事務(wù)的處理。</FONT></P>
<P><FONT face="Courier New"
size=2>你再回到程序員的角色來——你正在寫代碼,但這個(gè)時(shí)候你碰到了一個(gè)難題,讓你的代碼無法寫下去,于是你不得不暫時(shí)停止寫代碼去請(qǐng)教別人,或者去查資料,等問題解決了之后,你重新回來繼續(xù)寫代碼。</FONT></P>
<P><FONT face="Courier New"
size=2>還有一種情況,當(dāng)你一邊寫,一邊測試你寫的代碼的時(shí)候,你發(fā)現(xiàn)了一個(gè)BUG,那么你也不得不停止繼續(xù)寫,而是去解決這個(gè)BUG,等BUG解決之后,再繼續(xù)寫下去。</FONT></P>
<P><FONT face="Courier New"
size=2>所幸,這個(gè)兩個(gè)例子中,問題畢竟還可能解決,從而讓寫代碼這件事務(wù)得以繼續(xù)處理。但有你無法保證你永遠(yuǎn)幸運(yùn)——當(dāng)你為某一個(gè)項(xiàng)目寫代碼的事務(wù)被一個(gè)難題中斷時(shí)候,你停止寫代碼,轉(zhuǎn)去解決這個(gè)難題,但不幸的是,你發(fā)現(xiàn)你之前所寫的代碼的立足點(diǎn)都是錯(cuò)誤的,那么繼續(xù)寫下去只能是南轅北轍,你所能做的只能放棄這個(gè)事務(wù),重新開啟一個(gè)新的事務(wù)——重新設(shè)計(jì),重新編碼。</FONT></P>
<P><FONT face="Courier New"
size=2>因?yàn)槭聞?wù)是被你在處理這些事務(wù)時(shí)遇到的意外問題打斷,所以以上三種情況我們稱之為異常。</FONT></P>
<P><FONT face="Courier New"
size=2>事務(wù)除了被事務(wù)中遇到的問題打斷之外,還可能被事務(wù)處理自身所需要的其它事務(wù)中斷。比如,我們把“寫”代碼作為一個(gè)事物,那么在“寫”的過程中,我們需要測試一下我們已經(jīng)完成代碼的正確性,于是我們暫時(shí)停止“寫”,轉(zhuǎn)而去“測試”一下,等“測試”O(jiān)K后,再繼續(xù)寫下去。</FONT></P>
<P><FONT face="Courier New"
size=2>最后,中斷你手中事務(wù)的原因就來自于你自身,比如你困了,餓了,生病了等等,都會(huì)讓你停止手中的工作,去休息,去就餐,去治療,等這一切OK之后,你或許可以繼續(xù)你的工作。這是你自身異常所造成的事務(wù)中斷。</FONT></P>
<P><FONT face="Courier New"
size=2>從上面的例子中,我們可以得知,對(duì)你手中事務(wù)的中斷來自于:1、你自身的非事務(wù)原因,比如生病;2、你自身在處理事務(wù)過程中遇到的問題(三種異常);3、外界因素;4、你手中事務(wù)的自身需要(比如例子中的代碼測試)。其中來自于1,2,4的中斷你是無法屏蔽的,而來自于3的中斷一部分是可以屏蔽的,一部分是不可屏蔽的。對(duì)于可屏蔽部分,你可以通過別人(比如,在這個(gè)例子中是你的秘書)來有選擇的進(jìn)行屏蔽(當(dāng)然也可以選擇全部評(píng)比),或者靠自己完全屏蔽。</FONT></P>
<P><FONT face="Courier New"
size=2>如果將你比做CPU,將你處理的事務(wù)比作CPU當(dāng)前正在執(zhí)行的軟件,將外界因素比做其它硬件,將你的秘書比作PIC(可編程中斷控制器),那么中斷將分類為:1、CPU內(nèi)部硬件異常;2、軟件異常;3、外部硬件中斷;4、軟件中斷。其中3進(jìn)一步被細(xì)分為可屏蔽中斷和不可屏蔽中斷。1,2,4則是完全不可屏蔽的。</FONT></P>
<P><FONT face="Courier New" size=2>在Intel
386系統(tǒng)上,PIC就是8259A,可屏蔽中斷可以通過8259A進(jìn)行有選擇的控制,也可以由CPU自身完全屏蔽(通過cli指令)。軟件通過INT
n指令主動(dòng)進(jìn)行中斷,CPU在執(zhí)行軟件時(shí)有可能被軟件指令執(zhí)行異常所中斷,也可能被CPU自身的內(nè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"
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內(nèi)部,比如軟件指令執(zhí)行異常(比如被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、軟件中斷和異常以及硬件異常都是不可屏蔽的,狀態(tài)寄存器IF位的設(shè)置對(duì)它們沒有影響。只有INTR是可以屏蔽的,是否屏蔽取決于狀態(tài)寄存器IF的設(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="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被更進(jìn)一步細(xì)分為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>
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產(chǎn)生于硬件本身的突發(fā)性事件,比如斷電。NMI正如其名,是不可屏蔽的,也就是說不受EFLAGS-IF標(biāo)志位的影響。NMI使用中斷向量號(hào)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"
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -