中斷是由硬件設備產生的,而它們從物理上說就是電信號,之后,它們通過中斷控制器發送給CPU,接著CPU判斷收到的中斷來自于哪個硬件設備(這定義在內核中),最后,由CPU發送給內核,由內核處理中斷。異常包括很多方面,有出錯,有陷入,也有可編程異常。
出錯保存的EIP指向觸發異常的那條指令。因此,當從異常返回時,出錯會重新執行那條指令,如我們熟悉的缺頁異常,由于是fault,所以當缺頁異常處理完成之后,還會去嘗試重新執行那條觸發異常的指令。
陷入保存的EIP指向觸發異常的那條指令的下一條指令,陷入不會重新執行因為異常的指令。陷入的最主要的應用是在調試中,被調試的進程遇到你設置的斷點,會停下來等待你的處理,等到你讓其重新執行了,它當然不會再去執行已經執行過的斷點指令。
可編程中斷:這類中斷可由編程者用int指令來觸發。在Linux中,使用了一個,也是唯一的一個可編程中斷,就是int 0x80系統調用。硬件對可編程中斷的處理與對trap的處理類似,即從這類異常返回時也是返回到觸發異常的下一條指令。
中斷和異常的相同點,最后都是由CPU發送給內核,由內核去處理。處理程序的流程設計上是相似的。
中斷和異常的區別,產生源不相同,異常是由CPU產生的,而中斷是由硬件設備產生的。中斷是異步的,這意味著中斷可能隨時到來;而異常是CPU產生的,所以,它是時鐘同步的。當處理中斷時,處于中斷上下文中;處理異常時,處于進程上下文中。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.