關於《深入理解計算機系統》除零異常的一個問題?

在《深入理解計算機系統》這本書中,在「異常控制流」這一章節中,在Linux/IA32系統中的異常這一小節中,先提到了除0是一種故障(也就是四種異常中的第三種)。

然後又在「信號」這一小節中,提到當一個進程試圖除以0,那麼內核就會發送給它一個SIGFPE信號。

那麼我的疑問是:

1.除以零後,是先從異常表,找到除以零的異常處理方式,然後在給此進程發送信號么?

2.這本書提到,進程的上下文切換管理,是基於這四種底層異常的。那信號和這四種底層異常又有什麼關係?比如上面提到的除零。


快速給你寫個答案:

1. 你要把CPU和OS的行為分開

2. CPU就是一條指令一條指令解碼執行。當它執行到一個除零的要求,它執行不了,它可以怎麼辦呢?蠢一點的做法是停機,直接死菜。好的一點的做法,這段程序就不執行了,跳轉到另一個地方去執行。那個被執行的地址,就叫異常向量。異常向量,不過是預定義的一組執行地址。

3. 操作系統負責管理所有用戶的程序,如果你的程序要求執行一個除零錯,CPU跳到異常向量了,這段程序由OS提供。OS可以怎麼辦呢?蠢一點的做法,直接藍屏。好一點的做法,跳轉到應用程序給定的一個地方去執行,這個地方,就叫信號處理程序。你問的信號處理,就是那個地方的代碼

4. 上面回答了你第一個問題,你的第二個問題:一個用戶程序,在一個CPU上一個指令,一個指令地執行。正常來說,操作系統沒有任何機會打斷這個執行過程。要打斷,就需要機會,讓CPU換一個地方執行。CPU提供如下機會:

i. 來了個外部中斷(比如時鐘中斷),CPU切換到外部中斷向量執行,這是OS的代碼,OS直接跳轉到另一個用戶程序中執行即可

ii. 用戶程序自己幹了除零錯這樣的蠢事,CPU換到OS的代碼,OS就可以跳到另一個用戶程序執行

iii. 用戶程序主動發起系統請求,比如x86的軟中斷,或者RISC處理器常用的系統調用指令,都會進入OS設定的向量,然後OS就可以選擇下一個執行的程序。

在x86上,這些行為都是從各種異常向量上進入的,所以可以認為這是OS實現調度的方法。


Linux不知道,Windows的話,過程應該是:

CPU執行除0代碼-&>引發0號異常(#DE FAULT)-&>CPU將一些必要的參數壓棧-&>CPU通過IDT寄存器找到中斷向量表中0號異常的處理代碼地址並跳轉執行-&>OS內核中的異常分發函數檢查應用程序是否註冊了SEH-&>有則執行SEH註冊的處理代碼,無則直接幹掉應用程序。


除0,發生異常,陷入內核,內核設置signal標記,在異常處理返回前,會進行signal標記檢查,如果有signal,看應用有沒有設置處理方式,如果沒有,一般就終止程序運行。如果設置了忽略該信號,返回異常代碼繼續運行(會修改返回eip,變成除0以後的下一條指令),如果有處理函數,會返回處理函數運行。


推薦閱讀:

有哪些很少人知道的win10黑科技?
磁碟怎樣分區才合理?
時鐘在計算機系統中的作用可以稱作激勵(電學術語)么,為什麼?
為什麼CPU需要時鐘才能工作?
學習excel ,word ,ppt的具體用法,有什麼書籍,視頻,軟體可推薦的么?

TAG:操作系統 | 計算機系統 | 深入理解計算機系統書籍 |