現代系統經過使控制流發生突變來對這些狀況作出反應。咱們把這些突變稱爲異常控制流ide
做爲程序員,理解 ECF 很重要:函數
- 理解 ECF 將幫助你理解重要的系統概念。
- 理解 ECF將幫助你理解應用程序是如何與操做系統交互的。
- 理解 ECF 將幫助你編寫有趣的新應用程序。
- 理解 ECF 將幫助你理解並開發。
- 理解 ECF 將幫助你理解軟件異常如何工做。
- 異常是異常控制流的一種形式,它一部分是由硬件實現的,一部分是由操做系統實現的
- 異常( exception)就是控制流中的突變,用來響應處理器狀態中的某些變化。
- 當異常處理程序完成處理後,根據引發異常的事件的類型,會發生如下三種狀況中的一種:
1)處理程序將控制返回給當前指令 curr 即當事件發生時正在執行的指令。
2) 處理程序將控制返回給 酬,即若是沒有發生異常將會執行的下一條指令。
3) 處理程序終止被中斷的程序。
- 系統中可能的每種類型的異常都分配了一個惟一的非負整數的異常號。
- 異常表的起始地址放在一個叫作異常在基址寄存器的特殊CPU 寄存器裏。
- 異常相似於過程調用,可是有一些重要的不
同之處。
- ·過程調用時,在跳轉處處理程序以前,處理器將返回地址壓人找中。
- 處理器也把一些額外的處理器狀態壓到棧裏,在處理程序返回時,從新開始被中斷的程序會須要這些狀態。
- 若是控制從一個用戶程序轉移到內核,那麼全部這些項目都被壓到內核棧中,而不是壓到用戶棧中。
- 異常處理程序運行在內核模式下,這意味着它們對全部的系統資源都有徹底的訪問權限。
- 異常能夠分爲四類:中斷( interrupt)、陷阱 (trap)、故障 (fault) 和終止 (abort)。
1.中斷工具
- 中斷是異步發生的,是來自處理器外部的1/ 設備的信號的結果。
- 硬件中斷的異常處理程序一般稱爲中斷處理
程序。- 剩下的異常類型(陷阱、故障和終止〉是同步發生的,是執行當前指令的結果。咱們把這類指令叫作故障指令。
2.陷阱和系統調用學習
- 陷阱是有意的異常,是執行一條指令的結果。就像中斷處理程序同樣,陷阱處理程序將控制返回到下一條指令。陷阱最重要的用途是在用戶程序和內核之間提供一個像過程同樣的接口,叫作系統調用。
3.故障
- 故障由錯誤狀況引發,它可能可以被故障處理程序修正。當故障發生時,處理器將控制轉移給故障處理程序。若是處理程序可以修正這個錯誤狀況,它就將控制返回到引發故障的指令,從而從新執行它。不然,處理程序返回到內核中的 abort 例程, abort 例程會終止引發故障的應用程序。
4.終止
- 終止是不可恢復的致命錯誤形成的結果,一般是一些硬件錯誤,好比 DRAM 或者SRAM被損壞時發生的奇偶錯誤。終止處理程序從不將控制返回給應用程序。
- 除法錯誤
- 通常保護故障
- 缺頁
- 機器檢查
2.linuxllA32 系統調用
- Linux 提供上百種系統調用,當應用程序想要請求內核服務時可使用,包括讀文件、寫文件或是建立一個新進程。
- 異常是容許操做系統提供進程 (process) 的概念所須要的基本構造塊,進程是計算機科學中
最深入最成功的概念之一。- 進程提供給應用程序的關鍵抽象:
- 一個獨立的邏輯控制流,它提供一個假象,好像咱們的程序獨佔地使用處理器。
- 一個私有的地址空間,它提供一個假象,好像咱們的程序獨佔地使用存儲器系統。
- 若是想用調試器單步執行程序,咱們會看到一系列的程序計數器 (PC)值,這些值惟一地對應於包含在程序的可執行目標文件中的指令,或者是包含在運行時動態連接到程序的共享對象中的指令。這個 PC值的序列叫作這輯控制流,或者簡稱邏輯流。
- 每一個進程執行它的流的一部分,而後被搶佔 (preempted) (暫時掛起),而後輪到其餘進程。
- 一個邏輯流的執行在時間上與另外一個流重疊,稱爲併發流 (concurrent fiow) ,這兩個流被稱爲併發地運行.
- 多個流併發地執行的通常現象稱爲併發 (concurrency)。一個進程和其餘進程輪流運行的
概念稱爲多任務 (multitang).一個進程執行它的控制流的一部分的每一時間段叫作時間片(time slice)。所以,多任務也叫作時間分片(time.slicing).
- 進程也爲每一個程序提供一種假象,好像它獨佔地使用系統地址空間。在一臺有 位地址的機器上,地祉空間是 個可能地址的集合 0, 1,…, -l. 一個進程爲每一個程序提供它本身的私有地址空間。
- 處理器一般是用某個控制寄存器中的一個模式位 (mode bω 來提供這種功能的,該寄存器描述了進程當前享有的特權。當設置了模式位時,進程就運行在內核模式中(有時叫作超級用戶模式)。一個運行在內核模式的進程能夠執行指令集中的任何指令,而且能夠訪問系統中任何存儲器位置。
- 沒有設置模式位時,進程就運行在用戶模式中。用戶模式中的進程不容許執行特權指令(privi1eged instruction),好比中止處理器、改變模式位,或者發起一個I/O操做。也不容許用戶模式中的進程直接引用地址空間中內核區內的代碼和數據。任何這樣的嘗試都會致使致命的保護故障。反之,用戶程序必須經過系統調用接口間接地訪問內核代碼和數據。
- 操做系統內核使用一種稱爲上下丈切換 (context switch) 的較高層形式的異常控制流來實現多任務。
- 內核爲每一個進程維持一個上下文(context)。上下文就是內核從新啓動一個被搶佔的進程所需的狀態。
- 在進程執行的某些時刻,內核能夠決定搶佔當前進程,並從新開始一個先前被搶佔的進程。這種決定就叫作調度,是由內核中稱爲調度器( scheduler)的代碼處理的。
- 當內核選擇一個新的進程運行時,咱們就說內核調皮了這個進程。在內核調度了一個新的進程運行後,它就搶佔當前進程,並使用一種稱爲土下丈切換的機制來將控制轉移到新的進程,上下文切換
1)保存當前進程的上下文,
2) 恢復某個先前被搶佔的進程被保存的上下文,
3) 將控制傳遞給這個新恢復的進程。