總結《深入理解電腦系統》:異常控制流程
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等。