深刻理解計算機系統--異常

深刻理解計算機系統--異常 

2012-07-19 22:41:53|  分類: Linux |  標籤:linux  計算機系統  異常  |字號訂閱linux

 
 

1 異常

異常是異常控制流的一種形式,它一部分是由硬件實現的,一部分是由操做系統實現的。異常就是控制流中的突變,用來響應處理器狀態中的某些變化。在處理器中,狀態被編碼爲不一樣的位和信號。狀態變化稱爲事件event,事件可能與當前指令的執行直接相關。好比發生虛擬存儲器的換頁,算數溢出,或者一條指令試圖除以零。另外一方面,事件也可能和當前指令的執行沒有關係。好比一個系統定時器產生信號或者一個I/O請求完成。程序員

在任何狀況下,當處理器檢測到有事件發生的話,它就會經過一張叫作異常表exception table的跳轉表,進行一個間接的過程調用(異常),到一個專門設計用來處理這類事件的操做系統子程序(異常處理程序)。系統爲每一種異常都分配了一個惟一的非負整數的異常號。其中一些號碼是由處理器的設計者分配的,其餘的號碼是由操做系統內核的設計者分配的。處理器的設計者負責的異常有除以零,缺頁,存儲器訪問違例,算術溢出等。操做系統內核的設計者負責的異常有系統調用system call,和來自外部I/O設備的信號。網絡

2 異常的類別

異常能夠分爲四類:中斷interrupt,陷阱trap,故障fault,和終止abort。異步

中斷:中斷是異步發生的,是來自處理器外部的I/O設備的信號的結果。硬件中斷不是由任何一條專門的指令形成的,從這個意義上來講,它是異步的。I/O設備,好比網絡適配器,磁盤控制器等經過處理器芯片上的一個引腳發送信號,並將異常號放到系統總線上,用來觸發中斷,這個異常號標識了引發中斷的設備。ide

陷阱:陷阱是有意識的異常,是執行一條指令的結果。上面的中斷不是程序執行指令致使的,而是外部I/O設備的信號致使的。這就是區別。陷阱最重要的用途就是在用戶程序和內核之間提供一個像過程同樣的接口,叫作系統調用。用戶常常要向系統請求服務,好比read,fork等等。爲了容許對這些內核服務的受控的訪問,處理器提供了一條特殊的指令syscall n,當用戶想要請求服務n的時候,能夠執行syscall n這條指令,而後將會致使一個到異常處理程序的陷阱,這個處理程序並調用適當的內核程序。其實從程序員的角度來看,系統調用和普通函數之間是沒有區別的,然而他們的實現確實不一樣的。普通的函數運行在用戶模式(user mode)中,用戶模式限制了函數執行的類別,並且他們只能訪問用戶棧。而系統調用是運行在內核模式中的,內核模式容許系統調用執行指令,並訪問內核中的棧。等會我還會繼續說一下內核模式和用戶模式的區別。函數

故障:由錯誤狀況引得,可以被故障處理程序修正。當故障發生的會後,處理器將控制轉移給了故障處理程序。若是這個故障處理程序可以修理這個故障的話,它就將控制返回到引發故障的指令,從新執行它。不然的話將返回到內核中的abort,abort會終止引發故障的應用程序。一個經典的故障就是缺頁異常,當指令引用了一個虛擬地址,而與該虛擬地址對應的物理頁面此時並不在內存中,所以必須從磁盤中取出來,這時就會發生故障(缺頁故障)。編碼

終止:終止是不可恢復的致命錯誤形成的結果,一般是一些硬件錯誤。終止處理程序從不將控制再返回給應用程序。spa

 

 

3中斷的基本知識

中斷的概念:操作系統

所謂中斷,是指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操做。更不容許用戶模式中的進程直接飲用地址空間中內核區內的代碼和數據。

那麼進程從用戶模式變成內核模式的惟一途徑就是經過諸如中斷,故障,陷阱來陷入系統調用。當這些異常發生的時候,控制就傳遞到了異常處理函數中,處理器將模式位從用戶模式變爲內核模式。異常處理程序是運行在內核模式中的,當他返回到應用程序代碼時,處理器就把模式從內核模式改回到用戶模式。

相關文章
相關標籤/搜索