中斷衝突

電腦通訊 9547 391 2014-11-24

中斷是計算機的核心部分和外圍設備通訊的一個重要的接口,「中斷」的意思就是無論核心部分在做什麼,都要停下來處理,就是要執行一段專為這個外圍設備編寫的程序,執行完以後,才恢復剛才所做的工作。

舉個例子來說,我們每按一下鍵盤,就產生一個鍵盤中斷,CPU就要停下手邊的工作來處理,記錄下來哪個鍵被按下了,如果按下這個鍵要對應某一個操作,就趕快先做這個操作,做完之後,才恢復剛才的工作。對於接在串口上的MODEM也是一樣,從電話線上傳來數據了,這個串口就會產生一個中斷,CPU就要停下來,先將數據收下來,放到一個安全的地方。您能夠一邊寫文章,一邊從網上下載數據,就全靠中斷的正常工作。

如果鍵盤和MODEM的中斷是衝突的,也就是鍵盤和MODEM共同使用了一個中斷,計算機就無法判斷剛剛到達的數據是來自鍵盤還是來自MODEM,就有可能將MODEM收來的數據當作是您從鍵盤上輸入的,而在您正在寫的文章中輸入一大堆亂字符。顯卡的中斷如果和IDE硬盤控制器的中斷衝突了,就更危險了,所以,要想計算機正常工作,必須把中斷合理分配給外圍設備,讓它們沒有衝突。

現在大多數PC機都有16個硬中斷,從中斷0到中斷15。其中大部分已經被系統隱含分配了,以下是比較常見的分配方式:

中斷0 系統計時器

中斷1 鍵盤

中斷2 可編程中斷控制器

中斷3 COM2

中斷4 COM1

中斷6 軟盤控制器

中斷7 並行口LPT1

中斷8 系統CMOS/實時鐘

中斷12 PS/2鼠標

中斷13 數學協處理器

中斷14 第一IDE控制器

中斷15 第二IDE控制器

從上表看,只有5、9、10、11共4個中斷可以給用戶的新添設備使用。顯示卡一定要佔一個中斷。一般的多媒體計算機都有聲卡,由於歷史的原因,聲卡會強佔兩個中斷,分別用於MIDI和WAVE播放。個別設計不合理的聲卡還要再佔一個中斷,用於早期的那種直接聯接在聲卡上的CDROM,或者為以前沒有第二個IDE插槽的機器提供一個IDE接口,典型的例子就是ESS1868聲卡,它要強佔3個中斷。

必須的設備已經佔了這麼多中斷,就剩下一個可以用的中斷了(如果您用了ESS1868聲卡,已經沒有可以分配的中斷了)。如果您又加了一台掃瞄儀,要佔一個中斷;為了幾台計算機聯網,又添了一塊網卡;為了提高計算機的硬盤性能,添了一塊SCSI卡和一個SCSI硬盤……,行了,您已經沒有可以用的中斷了,這些設備就都添不上去了。

沒有中斷了怎麼辦?

找那個傻呼呼的只為PC機留這麼少中斷的人評理去?沒有用的,中斷過多的計算機一定工作不穩定,這個中斷還沒有處理完,下一個中斷又來了,後面還有3個中斷在排隊……。所以重要的是有效的利用這些僅有的中斷。

如何利用呢?那就是關閉沒有必要的中斷。

一般計算機只配一個鼠標,如果您配的是小口的PS/2鼠標,那麼您一定能空出一個串口來;如果您用串口鼠標,那麼中斷12您就用不著了,進BIOS設置,將「使用PS/2鼠標」那一項設為Disable。

您裝Utra-Wide-SCSI2的高速硬盤還留著IDE硬盤幹什麼?把數據備份好,老IDE硬盤賣了吧!又可以關掉兩個中斷了,記著將啟動盤設成「從SCSI啟動」。

您只有一個IDE硬盤和一個IDE光驅麼?將它們接到一根IDE線上去,關掉另一個IDE中斷。不過模式不同的硬盤和光驅不能掛到一起,否則會影響硬盤性能,比如支持UtraDMA33的硬盤和只支持PIO Mode3的光驅,或者支持UtraDMA66的硬盤和只支持UtraDMA33的光驅,它們都不應該掛在一起。

一般的計算機都沒有安裝USB設備,也可以將BIOS中有關USB所有選項設成Disable。有網卡了?軟驅就拆了吧,和同事共享一個軟驅也還比較方便。中斷6又可以空出來了!注意要將

BIOS中的「Report No FDD For WIN 95」一項設成「Yes」,否則您在Windows95/98里不小心點中了您那個不存在的A盤時,要等很長的時間Windows95/98才能判斷出您的A驅動器並不存在。

沒有安裝打印機,就一定別留著並口,中斷7也自由了!

如果您裝了PS/2鼠標、一個56K的MODEM、中文手寫板、打印機、掃瞄儀、網卡、外置ZIP驅動器、一塊20G的UtraDMA66硬盤、兩塊18G的UWSCSI2硬盤、連接著USB接口的攝像頭、還要通過IrDA紅外線端口和您的筆記本電腦通訊的話,就是神仙也救不了您,還是趕快買第二或是第三台計算機吧!

正是由於中斷機制,我才能有條不紊地「同時」完成多個任務,中斷機制實質上幫助我提高了並發「處理」能力。它也能給計算機系統帶來同樣的好處:如果在鍵盤按下的時候會得到一個中斷信號,CPU就不必死守著等待鍵盤輸入了;如果硬盤讀寫完成後發送一個中斷信號,CPU就可以騰出手來集中精力「服務大眾」了——無論是人類敲打鍵盤的指尖還是來回讀寫介質的磁頭,跟CPU的處理速度相比,都太慢了。沒有中斷機制,就像我們苦守廚房一樣,計算機談不上有什麼並行處理能力。

跟人相似,CPU也一樣要面對紛繁蕪雜的局面——現實中的意外是無處不在的——有可能是用戶等得不耐煩,猛敲鍵盤;有可能是運算中碰到了0除數;還有可能網卡突然接收到了一個新的數據包。這些都需要CPU具體情況具體分析,要麼馬上處理,要麼暫緩響應,要麼置之不理。無論如何應對,都需要CPU暫停「手頭」的工作,拿出一種對策,只有在響應之後,方能回頭完成先前的使命。

計算機系統實現中斷機制是非常複雜的一件工作,再怎麼說人都是高度智能化的生物,而計算機作為一個鐵疙瘩,沒有程序的教導就一事無成。而處理一個中斷過程,它受到的限制和需要學習的東西太多了。

首先,計算機能夠接收的外部信號形式非常有限。中斷是由外部的輸入引起的,可以說是一種刺激。其實現實世界中能輸入人類CPU——大腦的信號很多,圖像、氣味一樣能被我們接受,人的信息接口很完善。而計算機則不然,接受外部信號的途徑越多,設計實現就越複雜,代價就越高。因此個人計算機(PC)給所有的外部刺激只留了一種輸入方式——特定格式的電信號,並對這種信號的格式、接入方法、響應方法、處理步驟都做了規約(具體內容本文後面部分會繼續詳解),這種信號就是中斷或中斷信號,而這一整套機制就是中斷機制。

其次,計算機不懂得如何應對信號。人類的大腦可以自行處理外部輸入,我從來不用去擔心鬧鐘響時會手足無措——走進廚房關煤氣,這簡直是天經地義的事情,還用大腦想啊,小腿肚子都知道——可惜計算機不行,沒有程序,它就紋絲不動。因此,必須有機制保證外部中斷信號到來後,有正確的程序在正確的時候被執行。

還有,計算機不懂得如何保持工作的持續性。我在看電視的時候如果去廚房關了煤氣,回來以後能繼續將電視進行到底,不受太大的影響。而計算機則不然,如果放下手頭的工作直接去處理「意外」的中斷,那麼它就再也沒有辦法想起來曾經作過什麼,做到什麼程度了。自然也就沒有什麼「重操舊業」的機會了。這樣的處理方式就不是並發執行,而是東一鎯頭,西一棒槌了。

那麼,通用的計算機系統是如何解決這些問題的呢?它是靠硬件和軟件配合來協同實現中斷處理的全過程的。我們將通過Intel X86架構的實現來介紹這一過程。

CPU執行完一條指令後,下一條指令的邏輯地址存放在cs和eip這對寄存器中。在執行新指令前,控制單元會檢查在執行前一條指令的過程中是否有中斷或異常發生。如果有,控制單元就會拋下指令,進入下面的流程:

1.確定與中斷或異常關聯的向量i (0£i£255)

2.尋找向量對應的處理程序

3.保存當前的「工作現場」,執行中斷或異常的處理程序

4.處理程序執行完畢後,把控制權交還給控制單元

5.控制單元恢復現場,返回繼續執行原程序

整個流程如下圖所示:

圖一:中斷處理過程

什麼是中斷服務程序?

在響應一個特定中斷的時候,內核會執行一個函數,該函數叫做中斷處理程序(interrupt handler)或中斷服務程序(interrupt service routine(ISR))。產生中斷的每個設備都有相應的中斷處理程序。例如,由一個函數專門處理來自系統時鐘的中斷,而另外一個函數專門處理由鍵盤產生的中斷。

一般來說,中斷服務程序要負責與硬件進行交互,告訴該設備中斷已被接收。此外,還需要完成其他相關工作。比如說網絡設備的中斷服務程序除了要對硬件應答,還要把來自硬件的網絡數據包拷貝到內存,對其進行處理後再交給合適的協議棧或應用程序。每個中斷服務程序根據其要完成的任務,複雜程度各不相同。

一般來說,一個設備的中斷服務程序是它的設備驅動程序(device driver)的一部分——設備驅動程序是用於對設備進行管理的內核代碼。



,