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

http://lhk518.blog.163.com/blog/static/3153998320084263554749/


實際上,本書沒有必要嚴格地去區分什麼是中斷,什麼是異常。由於本章要用到一點中斷和異常的概念,所以這裏稍微作一個介紹。
中斷:是爲了設備與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),其實是一個意思
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章