中斷,異常,陷阱 概念

中斷:爲了設備與CPU之間的異步通信。是由設備向CPU發的信號。典型的有如服務請求,任務完成提醒等。比如我們熟知的時鐘中斷,硬盤讀寫服務請求中斷。

       中斷的發生與系統處在用戶態還是在內核態無關,只決定於EFLAGS寄存器的一個標誌位(中斷允許位)。我們熟悉的sti, cli兩條指令就是用來設置這個標誌位,然後決定是否允許中斷。在單個CPU的系統中,這也是保護臨界區的一種簡便方法(保護臨界區的方法一般有:關中斷、調度器上鎖、信號量)。中斷是異步的,因爲從邏輯上來說,中斷的產生與當前正在執行的進程無關。

軟中斷與硬中斷的比較:
相同點:其中斷源發中斷請求或軟中斷信號後, CPU 或接收進程在適當的時機自動進行中斷處理或完成軟中斷信號所對應的功能。
不同點:接收軟中斷信號的進程不一定正好在接收時佔有處理機,而相應的處理必須等到該接收進程得到處理機之後才能進行。

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


異常:爲了控制進程流,是由當前正在執行的進程產生。異常包括很多種類,有出錯(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即內中斷,主要指在處理機和內存內部產生的中斷。它包括程序運算引起的各種錯誤。軟中斷是通信進程之間用來模擬硬中斷的一種信號通信方式。

2 、陷阱處理程序提供的服務爲當前進程所用,而中斷處理程序提供的服務則不是爲了當前進程的。(陷阱會佔用進程的時間片)
4 、在有的系統中,陷入處理程序被規定在各自的進程上下文中執行,而中斷處理程序則在系統上下文中執行。

http://blog.chinaunix.net/cp.php?ac=blog

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章