中斷(interrupt)、異常(exception)、陷入(trap)


中斷:是為了設備與CPU之間的通信。典型的有如服務請求,任務完成提醒等。比如我們熟知的時鍾中斷,硬盤讀寫服務請求中斷。中斷的發生與系統處在用戶態還是在內核態無關,只決定於EFLAGS寄存器的一個標志位。我們熟悉的sti, cli兩條指令就是用來設置這個標志位,然后決定是否允許中斷。在單個CPU的系統中,這也是保護臨界區的一種簡便方法。中斷是異步的,因為從邏輯上來說,中斷的產生與當前正在執行的進程無關。事實上,中斷是如此有用,Linux用它來統計時鍾,進行硬盤讀寫等。
異常:異常是由當前正在執行的進程產生。異常包括很多方面,有出錯(fault),有陷入(trap),也有可編程異常(programmable exception)。出錯(fault)和陷入(trap)最重要的一點區別是他們發生時所保存的EIP值的不同。出錯(fault)保存的EIP指向觸發異常的那條指令;而陷入(trap)保存的EIP指向觸發異常的那條指令的下一條指令。因此,當從異常返回時,出錯(fault)會重新執行那條指令;而陷入(trap)就不會重新執行。這一點實際上也是相當重要的,比如我們熟悉的缺頁異常(page fault),由於是fault,所以當缺頁異常處理完成之后,還會去嘗試重新執行那條觸發異常的指令(那時多半情況是不再缺頁)。陷入的最主要的應用是在調試中,被調試的進程遇到你設置的斷點,會停下來等待你的處理,等到你讓其重新執行了,它當然不會再去執行已經執行過的斷點指令。
可編程中斷:這類中斷可由編程者用int指令來觸發。在Linux中,使用了一個,也是唯一的一個可編程中斷,就是int 0x80系統調用。硬件對可編程中斷的處理與對trap的處理類似,即從這類異常返回時也是返回到觸發異常的下一條指令。關於可編程中斷,還有另外一種說法:軟件中斷(software interrupt),其實是一個意思.
 
 interrup即外中斷,指來自處理機和內存外部的中斷,包括 I/O 設備發出的 I/O中斷、外部信號中斷、各種定時器引起的時鍾中斷以及調試程序中設置的斷點等引起的調試中斷等。

trap即內中斷,主要指在處理機和內存內部產生的中斷。它包括程序運算引起的各種錯誤。軟中斷是通信進程之間用來模擬硬中斷的一種信號通信方式。

中斷和陷阱的主要區別:

1 、陷阱通常由處理機正在執行的現行指令引起,而中斷則是由與現行指令無關的中斷源引起的。

2 、陷阱處理程序提供的服務為當前進程所用,而中斷處理程序提供的服務則不是為了當前進程的。

3 、CPU 在執行完一條指令之后,下一條指令開始之前響應中斷,而在一條指令執行中也可以響應陷阱。

4 、在有的系統中,陷入處理程序被規定在各自的進程上下文中執行,而中斷處理程序則在系統上下文中執行。

軟中斷與硬中斷的比較:

相同點:其中斷源發中斷請求或軟中斷信號后, CPU 或接收進程在適當的時機自動進行中斷處理或完成軟中斷信號所對應的功能。

不同點:接收軟中斷信號的進程不一定正好在接收時占有處理機,而相應的處理必須等到該接收進程得到處理機之后才能進行。

也有人說trap是軟件引起的中斷,就是所謂的軟中斷,比如匯編語言里int指令就是引起了一個軟中斷;而有硬件管腳發起的中斷叫硬中斷。這樣看來,trap是中斷的一種。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM