|
Linux下面的中斷分兩種: 同步的中斷,也稱為異常,之所以稱為"同步",是因?yàn)檫@些異常是在程序執(zhí)行的時(shí)候某條語(yǔ)句觸發(fā)的,比如除0錯(cuò)誤,缺頁(yè)異常等等,有名的段錯(cuò)誤也屬于其中的一種,這個(gè)時(shí)候,你的程序不能繼續(xù)往下走,而必須對(duì)這些異常做出回應(yīng),也就是處理. 異步的中斷,也就是中斷,之所以稱為"異步",是因?yàn)檫@些中斷是在當(dāng)前指令之外的指令觸發(fā)的.比如你的程序正在執(zhí)行,來(lái)了一個(gè)I/O請(qǐng)求,或者定時(shí)器到時(shí)間被觸發(fā)了,等等.也就是說(shuō),程序無(wú)法預(yù)知中斷在什么時(shí)候到來(lái).
有點(diǎn)兒亂了,小結(jié)一下:中斷分為兩種,同步的中斷叫做異常,一般由程序中的錯(cuò)誤觸發(fā);異步的中斷叫做中斷,一般由當(dāng)前程序外部觸發(fā),比如IO請(qǐng)求,定時(shí)器等觸發(fā).
每一個(gè)中斷與一根IRQ線(Interrupt ReQuest (IRQ) line)對(duì)應(yīng),而IRQ是連接到可編程中斷控制器(Programmable Interrupt Controller,簡(jiǎn)稱PIC)上的.它完成下面的工作: 1) 檢查與之相連的IRQ,看看哪個(gè)IRQ被觸發(fā)了,選擇最小的被觸發(fā)的IRQ. 2) 將被中斷的IRQ轉(zhuǎn)換為一個(gè)中斷向量 3) 將中斷向量存放在IO端口,CPU可以通過(guò)數(shù)據(jù)線讀取該中斷向量 4) 發(fā)出INTR指令,告訴CPU:有一條中斷被觸發(fā)了 5) 在以上步驟之后,PIC等待CPU對(duì)這個(gè)中斷做出響應(yīng),這段時(shí)間內(nèi)PIC不會(huì)去檢查新的中斷.當(dāng)CPU處理完這個(gè)中斷后,PIC再去清空INTR線以接收新的中斷. 6) 重復(fù)第一步
以上是PIC所做的,簡(jiǎn)單的說(shuō):監(jiān)控IRQ,將被觸發(fā)的IRQ轉(zhuǎn)換為中斷向量,然后通知CPU.
下面來(lái)看看CPU的控制單元是怎么做的.
<<深入理解Linux內(nèi)核>>中對(duì)這部分說(shuō)的比較詳細(xì)了(4.2.4節(jié)),下面做一點(diǎn)輔助解釋性的說(shuō)明: 1) 首先,每個(gè)中斷向量都與與之對(duì)應(yīng)的處理程序,可以簡(jiǎn)單的理解為,這是一個(gè)大的數(shù)組,數(shù)組索引是中斷向量,而存放的元素是函數(shù)指針,也就是對(duì)這些中斷進(jìn)行處理的函數(shù).在系統(tǒng)初始化的時(shí)候初始化每個(gè)中斷向量的處理函數(shù).
2) 書中的一段話,看著有點(diǎn)兒令人費(fèi)解的:Before dealing with that instruction, the control unit checks whether an
interrupt or an exception occurred while the control unit executed the previous
instruction. 實(shí)際上,這個(gè)查詢操作對(duì)程序來(lái)說(shuō)是透明的,是CPU的控制單元自己去做的事情,如果查詢到了有中斷被觸發(fā),再去調(diào)用上面已經(jīng)注冊(cè)的處理函數(shù).至于每次執(zhí)行指令之前是怎么做到高效查找的,我不清楚,哪位知道的麻煩告知一下.
3)中斷向量的分類為: 從0~31的向量對(duì)應(yīng)于異常和非屏蔽中斷。
從32~47的向量(即由I/O設(shè)備引起的中斷)分配給屏蔽中斷。
剩余的從48~255的向量用來(lái)標(biāo)識(shí)軟中斷。Linux只用了其中的一個(gè)(即128或0x80向量)用來(lái)實(shí)現(xiàn)系統(tǒng)調(diào)用。當(dāng)用戶態(tài)下的進(jìn)程執(zhí)行一條int 0x80匯編指令時(shí),CPU就切換到內(nèi)核態(tài),并開(kāi)始執(zhí)行system_call( )內(nèi)核函數(shù)
4) 由于中斷被觸發(fā)時(shí)需要保護(hù)現(xiàn)場(chǎng),所以在發(fā)生中斷調(diào)用處理函數(shù)之前需要保護(hù)現(xiàn)場(chǎng),也就是一些寄存器指針;而中斷處理完畢后需要恢復(fù)現(xiàn)場(chǎng),因此需要將這些寄存器恢復(fù).當(dāng)然,在切換的時(shí)候,還需要考慮程序的運(yùn)行權(quán)限等等.
以上就是對(duì)中斷和異常處理的大體流程.
|