計算機的異常控制:中斷、陷阱、故障、終止、程序上下文切換、訊號
總結《深入理解計算機系統》:異常控制流
1,計算機中的異常處理機制:處理器設計人員(如被零除、缺頁,儲存器訪問違例等)以及作業系統開發人員(如系統呼叫以及來自外部的IO裝置訊號等)為每種型別的異常分配了一個唯一的非負整數異常號。在系統啟動時,作業系統分配和初始化一張成為異常表的跳轉表,該表使用異常號k作為
索引,以每種型別的異常處理程式地址作為值。當處理器檢測到一個事件(比如CPU根據管腳狀態確定事件型別)發生時,確定異常號k,然後通過異常表目k轉到相應的處理程式。異常表的地址通常儲存在“異常表基址暫存器”中。
2,異常處理過程類似於過程呼叫:都會儲存當前暫存器狀態,和返回地址。
但是,(1)異常處理的返回地址要麼是當前執行指令,要麼是當前執行指令的下一條指令。
(2)異常發生時,如果此時核心代表使用者程式執行(比如說系統呼叫),這些狀態將會被壓入到核心棧,而不是壓入到使用者棧(過程呼叫壓入 方式)。
(3)此外,對於異常處理程式通常執行在核心模式,此時對於所有的系統資源具有訪問許可權。
3,異常的類別
(1)中斷:中斷是非同步發生的,來自處理器外部IO裝置的訊號(區別於同步異常:執行一條指令的結果),它不是由任何一條專門的指令造成的。例如網路介面卡、磁碟控制器通過向處理器晶片上的一個管腳發訊號,並將異常號放在系統總線上,來觸發中斷,這個異常號標識了引起中斷的裝置。中斷處理程式總是返回到當前指令的下一條指令。
(2)陷阱:陷阱是同步異常,是執行一條指令的結果。陷阱最重要的用途是在使用者程式和核心之間提供系統呼叫介面。陷阱總返回到當前指令的
下一條指令。
(3)故障:故障由錯誤引起,它可能被故常處理程式修正,如果修正成功,將返回到當前正在執行的指令,重新執行。否則處理程式返回到核心的abort歷程,將終止故障程式。故障的一個典型是缺頁異常。
(4)終止:由不可恢復的知名錯誤造成的結果,處理程式將返回到核心中的abort例程,終止應用程式。
4,程序的上下文切換(context switch)
核心為每個程序維護了一個上下文。上下文就是核心重新啟動一個被搶佔程序所需要的狀態集:通用暫存器,浮點暫存器,程式計數器,使用者棧,狀態暫存器,核心棧和各種核心資料結構(比如也表,程序表,檔案表等)。核心通過排程器來搶佔一個執行的程序:
(1)保護當前程序的上下文
(2)恢復某個先前被搶佔程序所儲存的上下文
(3)將控制傳遞給新回覆的程序。
以下情況會發生上下文切換:
(1)當核心代表使用者執行系統呼叫時。例如,系統呼叫因等待某個事件而發生阻塞,那麼核心可以讓當前程序休眠,切換到另一個程序,比如read請求磁碟訪問。
(2)使用者程式呼叫sleep系統呼叫,顯式的讓呼叫程序休眠。
(3)中斷可能引發上下文切換。比如所有的系統都有某種產生週期性定時器中斷的機制,典型的位1毫秒或10毫秒。每次發生定時器中斷時,核心判斷當前程序是否已經運行了足夠長的時間,並切換到另一個程序。
5,Unix訊號
一個訊號就是一條訊息,它通知程序一個某種型別的時間已經在系統中發生。每種訊號都對應某個型別的系統時間。
(1)底層的硬體異常是由核心異常處理程式處理的,對使用者程序通常不可見,而訊號提供了向用戶程序通知這些異常發生的機制。比如:一個程序試圖除以0,核心就會發送SIGFPE訊號。
(2)其他的訊號對應於核心或者其他使用者中較高層次的軟體事件。比如SIGINT、SIGKILL等。