2012-07-19 22:41:53
| 分類:
linux
| 標籤:
linux
計算機系統異常
|字型大小大中小
訂閱
異常是異常控制流的一種形式,它一部分是由硬體實現的,一部分是由作業系統實現的。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事件event,事件可能與當前指令的執行直接相關。比如發生虛擬儲存器的換頁,算數溢位,或者一條指令試圖除以零。另一方面,事件也可能和當前指令的執行沒有關係。比如乙個系統定時器產生訊號或者乙個i/o請求完成。在任何情況下,當處理器檢測到有事件發生的話,它就會通過一張叫做異常表exception table的跳轉表,進行乙個間接的過程呼叫(異常),到乙個專門設計用來處理這類事件的作業系統子程式(異常處理程式)。系統為每一種異常都分配了乙個唯一的非負整數的異常號。其中一些號碼是由處理器的設計者分配的,其他的號碼是由作業系統核心的設計者分配的。處理器的設計者負責的異常有除以零,缺頁,儲存器訪問違例,算術溢位等。作業系統核心的設計者負責的異常有系統呼叫system call,和來自外部i/o裝置的訊號。
異常可以分為四類:中斷interrupt,陷阱trap,故障fault,和終止abort。中斷:中斷是非同步發生的,是來自處理器外部的i/o裝置的訊號的結果。硬體中斷不是由任何一條專門的指令造成的,從這個意義上來說,它是非同步的。i/o裝置,比如網路介面卡,磁碟控制器等通過處理器晶元上的乙個引腳傳送訊號,並將異常號放到系統匯流排上,用來觸發中斷,這個異常號標識了引起中斷的裝置。
陷阱:陷阱是有意識的異常,是執行一條指令的結果。上面的中斷不是程式執行指令導致的,而是外部i/o裝置的訊號導致的。這就是區別。陷阱最重要的用途就是在使用者程式和核心之間提供乙個像過程一樣的介面,叫做系統呼叫。使用者經常要向系統請求服務,比如read,fork等等。為了允許對這些核心服務的受控的訪問,處理器提供了一條特殊的指令syscall n,當使用者想要請求服務n的時候,可以執行syscall n這條指令,然後將會導致乙個到異常處理程式的陷阱,這個處理程式並呼叫適當的核心程式。其實從程式設計師的角度來看,系統呼叫和普通函式之間是沒有區別的,然而他們的實現確實不同的。普通的函式執行在使用者模式(user mode)中,使用者模式限制了函式執行的類別,而且他們只能訪問使用者棧。而系統呼叫是執行在核心模式中的,核心模式允許系統呼叫執行指令,並訪問核心中的棧。等會我還會繼續說一下核心模式和使用者模式的區別。
故障:由錯誤情況引得,能夠被故障處理程式修正。當故障發生的會後,處理器將控制轉移給了故障處理程式。如果這個故障處理程式能夠修理這個故障的話,它就將控制返回到引起故障的指令,重新執行它。否則的話將返回到核心中的abort,abort會終止引起故障的應用程式。乙個經典的故障就是缺頁異常,當指令引用了乙個虛擬位址,而與該虛擬位址對應的物理頁面此時並不在記憶體中,因此必須從磁碟中取出來,這時就會發生故障(缺頁故障)。
終止:終止是不可恢復的致命錯誤造成的結果,通常是一些硬體錯誤。終止處理程式從不將控制再返回給應用程式。中斷的概念:
所謂中斷,是指cpu在正常執行程式時,由於程式的預先安排或內外部事件,引起cpu中斷正在執行的程式,而轉到發生中斷事件程式中。這些引起程式中斷的事件稱為中斷源。
其實從物理學的角度看,中斷是一種電訊號,由硬體裝置產生,並直接送入中斷控制器(如 8259a)的輸入引腳上,然後再由中斷控制器向處理器傳送相應的訊號。處理器一經檢測到該訊號,便中斷自己當前正在處理的工作,轉而去處理中斷。此後,處理器會通知 os 已經產生中斷。這樣,os 就可以對這個中斷進行適當的處理。不同的裝置對應的中斷不同,而每個中斷都通過乙個唯一的數字標識,這些值通常被稱為中斷請求線。
那麼當產生乙個中斷時,cpu是如何識別的呢?
在intel x86中可以支援256種向量中斷,為了使處理器能使別每種中斷源,給它們進行了編號----->叫做中斷向量
這些中斷向量在linux中是如何分配的:
編號0~31的向量對應於異常和非遮蔽中斷
編號32~47的向量(即由io裝置引起的中斷)分配給遮蔽中斷。
編號48~255的向量用來標示軟中斷。linux用其中的128或0x80來實現系統呼叫
非遮蔽中斷的向量和異常的向量是固定的。
4 使用者模式和核心模式
為了使作業系統核心提供乙個無懈可擊的程序抽象,處理器必須提供一種機制,限制乙個應用可以執行的指令以及它可以訪問的位址空間範圍。處理器通常是用某個控制暫存器中的乙個模式位mode bit來提供這種功能的,當設定了模式位的時候,程序就可以再核心模式中執行。乙個執行在核心模式的程序可以執行任何指令集合中的指令,並且可以訪問系統中任何儲存器的位置。當沒有設定模式位的時候,程序就執行在使用者模式中。使用者模式中的程序不允許執行特權指令,比如停止處理器,改變模式位等操作,也不能發起乙個i/o操作。更不允許使用者模式中的程序直接飲用位址空間中核心區內的**和資料。
那麼程序從使用者模式變成核心模式的唯一途徑就是通過諸如中斷,故障,陷阱來陷入系統呼叫。當這些異常發生的時候,控制就傳遞到了異常處理函式中,處理器將模式位從使用者模式變為核心模式。異常處理程式是執行在核心模式中的,當他返回到應用程式**時,處理器就把模式從核心模式改回到使用者模式。
深入理解計算機系統 異常
異常是異常控制流的一種形式,它一部分是由硬體實現的,一部分是由作業系統實現的。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。在處理器中,狀態被編碼為不同的位和訊號。狀態變化稱為事件event,事件可能與當前指令的執行直接相關。比如發生虛擬儲存器的換頁,算數溢位,或者一條指令試圖除以零。另一...
《深入理解計算機系統》 異常處理
異常表 在作業系統啟動時,系統建立和初始化了乙個被稱為異常表的跳轉表,條目k對應異常k的異常處理程式入口位址。異常的分類 中斷 interrupt 來自處理器外部i o裝置的訊號,並不是由專門的指令造成的,是非同步的,其處理程式成為中斷處理程式。陷阱 trap 故意的異常,是執行指令的結果,其作重要...
深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...