1. 程式人生 > >CSAPP:第八章 異常控制流1

CSAPP:第八章 異常控制流1

CSAPP:第八章 異常控制流1

關鍵點:異常

8.1 異常8.2 程序

  現代系統通過使控制流發生突變來對這些情況做出反應,一般而言,我們把這些突變稱為異常控制流(Exceptional Control Flow,ECF)。異常控制流發生在計算機系統的各個層次。

8.1 異常

  異常是異常控制流的一種形式,它的一部分由硬體實現,一部分由作業系統實現。異常就是控制流中的突變,用來響應處理器中的一些變化.如圖所示,當處理器狀態發生一個重要的變化時,處理器正在執行某個當前指令Icurr。在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事件。


  在任何情況下,當處理器檢測到有事件發生時,它就會通過一張叫做異常向量表的跳轉表,進行一個間接過程呼叫(異常),到一個專門設計用來處理這類事件的作業系統子程式(異常處理程式exception handler),當異常處理完成處理後,根據引起異常的事件型別,會發生以下3種情況中的一種:

 

  • 處理程式將控制返還給當前指令Icurr,即當事件發生時正在執行的指令;
  • 處理程式將控制返還給Inext,如果沒有發生異常將會執行下一條指令;
  • 處理程式終止被中斷的程式

8.1.1 異常處理
  在系統啟動時,作業系統分配和初始化一張稱為異常表的跳轉表,使得表目k包含異常k的處理程式的地址,如圖8-2.


  在執行時,處理器檢測到一個事件發生,並且確定了相應的異常號k。隨後處理器觸發異常,方法是執行間接過程呼叫,通過異常表的表目k,轉到相應的處理程式。
8.1.2 異常的類別
  異常可以分為四類:中斷(interrupt)、陷阱(trap)、故障(fault)和終止(abort),下表對這些類別屬性做了點總結。

 

1.中斷
  中斷是非同步發生的,是來自處理器外部的I/O裝置的訊號的結果。硬體中斷不是由任何一條專門的指令造成的,從這個意義上說它是非同步的。硬體中斷的異常處理程式常常稱為中斷處理程式。圖8-5描述了一箇中斷處理程式的過程。

2.陷阱和系統呼叫
  陷阱是有意的異常,是執行一條指令的結果。就像中斷處理程式一樣,陷阱處理程式將控制返回到下一條指令。陷阱最重要的用途是在使用者程式和核心之間提供一個像過程一樣的介面,叫做系統呼叫。
  使用者程式經常要向核心請求服務,比如讀一個檔案(read)、建立一個新的程序(fork)、載入一個新的程式(execve)、或者終止當前程序(exit)。為了允許對這些核心服務的受控的訪問,處理器提供了一條特殊的"syscall n"指令,當應用程式想要請求服務n時,可以執行這條指令。執行syscall指令會導致一個到異常處理程式的陷阱,這個處理程式解析引數,並呼叫適當的核心引數。圖8-6描述了一個系統的呼叫過程。

3.故障
  故障由錯誤引起的,它可能能夠被故障處理程式修正。當故障發生,處理器將控制轉移給故障處理程式。如果處理程式能夠修正這個錯誤,它就將控制返回到引起故障的指令,從而重新執行它。否則,處理程式返回到核心的abort例程,abort會終止當前應用程式。

4.終止
  終止是不可恢復的致命錯誤造成的結果,通常是一些硬體錯誤,終止處理程式從不將控制返還給應用程式。

8.2 程序

  程序的經典定義就是一個執行中程式的例項。系統中的每個程式都執行在某個程序的上下文中。上下文是由程式正確執行所需的狀態組成的。這個狀態包括存放在記憶體中的程式的程式碼和資料,它的棧、通用目的暫存器內容、程式計數器、環境變數以及開啟檔案描述符的集合。
  程序提供給應用程式兩個關鍵抽象。

  • 一個獨立的邏輯流,它提供一個假象,好像我們的程式獨佔地使用處理器。
  • 一個私有的地址空間,它提供一個假象,好像我們的程式獨佔地使用記憶體系統。

8.2.1 邏輯控制流
  考慮一個執行著三個程序的系統,如圖所示。處理器的一個物理控制流被分成了三個邏輯流,每個程序一個。每個豎線表示一個程序邏輯流的一部分。在這個例子中,三個邏輯流的執行是交錯的。程序A執行一會兒,然後是程序B開始執行到完成。然後是程序C運行了一會兒,程序A接著執行直到完成。最後是程序C可以執行到結束了。

  圖8-12的關鍵點在於程序是輪流使用處理器的。每個程序執行它的流的一部分,然後被搶佔(暫時掛起),然後輪到其他程序。
8.2.2 併發流
  一個邏輯流的執行在時間上與另一個流重疊,稱為併發流。這兩個流並稱為併發的執行。更準確的說,流X和流Y互相併發,當且僅當X在Y開始之後和Y結束之前開始,或者Y在X開始之後和X結束之前開始。圖8-12,A和B,A與C都是併發的執行。
  多個流併發地執行的一般現象被稱為併發。一個程序和其他程序輪流的執行的概念稱為多工。一個程序執行它控制流的一部分的每一時間段叫做時間片。因此,多工也叫做時間分片。
  注意,併發流的思想與流執行的處理器核數或者計算機數無關。如果兩個流在時間上重疊,那麼它們就是併發的,即使它們執行在同一個處理器上。如果兩個流併發的執行在不同的處理器核或者計算機上,那麼我們稱它們為並行流,它們並行的執行並且並行的執行。並行流是併發流的一個真子集
8.2.3 私有地址空間
  程序也為每個程式提供一個假象,好像它獨佔地使用系統地址空間。

8.2.4 使用者模式和核心模式

  • 核心模式(又叫超級使用者模式),可以執行任何指令,訪問任何記憶體位置。
  • 使用者模式,不允許執行特定許可權的指令。