日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

x86异常处理与中断机制(1)概述中断的来源和处理方式

發布時間:2023/11/30 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 x86异常处理与中断机制(1)概述中断的来源和处理方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考《計算機組成》(北京大學 MOOC)

1 異常與中斷的來源(為什么需要中斷)

首先,說明一下異常中斷這兩個概念。

它們兩個唯一的區別,就是,沒有什么區別。只是不同的地方不同的時間不同的人的叫法不一樣,所以,不用太在意區別了,以后我們統稱中斷

1.1 什么時候發生中斷

一句話!CPU正在干活的時候,有事情打擾它,不讓他繼續正常工作了,需要去處理其他事情。

那么是什么事情呢?這個事情分成兩類

  • 內部的事情
  • 外部的事情

1.1.1 內部的事情

簡而言之,就是執行指令的時候,出現狀況了

出現什么狀況了?舉例說明

  • 執行加法之后,結果超出了最大范圍,發生了溢出(也就是overflow中斷 int4)
  • 執行除法的時候,被除數是0,出現了除法零中斷(int 0)
  • 關于這一點,在80386手冊中是提及過的。

    這些中斷如何被判斷出來的?

    硬件判斷的!

    我們知到,在CPU中有ALU,ALU的輸出結果是有結果相關信號的,對于x86體系,會有各種各樣的標志位,標志位的結果,是硬件直接給出的,例如下圖的ALU的輸出結果(ZF SF CF OF)


    這些輸出的信號,會作用到CPU的其他部件,從而能夠讓CPU暫停當前工作轉而處理異常事件,至于具體發生了什么,我們后面會提及。

    關于內部事件的命名

    別看只是一個內部事件,關于它的命名有很多,我們來解釋一下,就能夠清晰明了了。

  • 內部中斷:這個不用解釋,內部發生了事情,引起CPU中斷當前的事情,轉而處理緊急事件,就是內部中斷。
  • 軟件中斷:我們剛才提及過,內部發生的事情,是指令的執行結果導致硬件產生了信號,觸發中斷,而軟件的本質就是指令序列,因此是軟件中斷。
  • 異常:正在執行的指令,執行完之后發現不正常,后面的指令不能繼續正常執行,就是異常
  • 1.1.2 外部的事情

    這個中斷是CPU外部向CPU發出的中斷信號,導致CPU不得不停下手頭的工作。例如8259A芯片。

    這里有一篇8259A芯片 詳解。

    外部中斷是外部硬件發出的,所以也叫硬件中斷,它是被外部信號直接打斷,也被稱為中斷


    最后,附上這個圖,作為上面內容的小結。

    1.1.3 內部中斷和外部中斷的區別

    用一個比喻來解決:

    • 內部中斷,就好比你在工作位工作,然后不小心把水碰撒了,你不得不停下工作,先把灑出來的水擦干凈,再繼續工作。
    • 外部中斷:你在工作,然后你的老板通知你馬上開會,你只能先去開會,開完會再繼續工作。

    1.1.4 未解決的細節問題

    我們知到MIPS架構下,中斷是在執行完每條指令后判斷是不是發生中斷,那么,對于內部中斷和外部中斷(x86下),具體細節又是什么呢?中斷什么時候判斷什么時候執行?

    下圖是MIPS的:

    x86也一樣的,因為指令執行的切換,需要EIP的改變,EIP的改變就需要到達指定時鐘周期,因此來說,執行下一條指令or中斷服務程序第一條指令的區別就是,EIP更新部件選擇更新的值不同而已,本質上都是更新EIP的值。

    1.2 發生中斷之后干什么

    好,現在CPU被某個事件打斷了,然后,CPU不得不處理這個事情,那么它接下來會干什么呢?

    假設現在進行了add指令,加法得到的結果溢出了,運算結果存儲不下,怎么辦?

  • 運算發生溢出,硬件電路檢測到了溢出,那么應該如何處理呢?如果用硬件處理,這將會比較麻煩,并且,如果以后想修改也很難,因為硬件固定下來了改變不了(當然,硬件會很快,可以實現硬件加速器)。
  • 使用軟件方式處理溢出,也就是說,如果遇到溢出,就執行一段程序去處理它,也就是一段指令序列。

    我們看一看第一個能夠處理溢出異常的計算機,如果檢測到發生溢出,就自動轉向地址0,執行提前存好的程序,執行完之后,再回去繼續執行原來的程序,這個地址0的程序是用來處理溢出的,這也就是中斷服務程序
  • 這樣就實現了計算機自動去處理溢出異常的情況,使得計算機不會因為異常而停機,同時,這個異常處理的程序,是軟件,后續還可以進行修改

    因此這里就有重要的點

  • 如何檢測溢出
  • 檢測出溢出之后,如何進入地址0執行相應指令
  • 執行完中斷處理程序后,如何返回去執行之前的程序
  • 對于問題1,設計一下ALU的硬件電路很容易解決,前面也提到過,不再細說,在《計算機系統基礎》(袁春風)教材里提及過這個細節。

    對于問題2,我們在檢測到運算結果溢出之后,把它發送給EIP指令地址更新部件,一旦溢出,在下一個周期,就會EIP = 0,就能夠執行0號單元的程序了。(這么一說,這里是在當前指令執行的時候檢測出異常,在下一條指令執行之前切換到了中斷服務程序,因此和MIPS一樣夾在中間)

    對于問題3,我們需要在執行中斷處理程序之前,保存好本來應該正常執行的指令的地址,以便于切換回去,這也就涉及到了保護現場和恢復現場的工作。


    剛才談及的是遇到內部中斷,現在看看外部中斷。

    對于80386來說,外部中斷通過8259A芯片給它發送的中斷信號,接收到中斷信號之后,在進行相關的處理,而8259A另一邊則連接各種外設(鼠標,鍵盤…)來,這樣CPU就能夠處理外部中斷請求了,具體操作還是

    • 保存現場
    • 執行中斷處理程序
    • 恢復現場

    這里是現場,是概括性的,具體包含的內容后續闡述。

    1.2.1 小結

    對于整個中斷的發生以及處理過程,怎么解釋呢?我們看一下:

    用一個比喻來解決:

    • 內部中斷,你在工作位工作(指令正常執行),然后不小心把水碰撒到了電腦上(遇到了內部中斷),你不得先保存正在編輯的文件然后關機(保存現場),把灑出來的水擦干凈(執行中斷處理程序),再打開電腦,打開剛才保存的文件(恢復現場),之后繼續工作(繼續執行指令)。
    • 外部中斷:你在工作,然后你的老板通知你馬上開會(外部中斷),你只能先保存好手頭工作,之后去開會,回來的時候打開之前保存的文件,繼續工作。

    2 整篇小結

    這里僅僅以僅有一個溢出異常處理為例子,來梳理一下整個流程。

  • 正在執行add指令,加完之后,發現結果太大,放不下,之后ALU產生了一個溢出信號
  • 溢出信號發送給了EIP更新部件,等到下一個時鐘周期到來的時候,EIP更新為0
  • 開始執行中斷處理程序
  • 該程序先保存好當前CPU各寄存器的值,保存好正常執行的下一條指令的地址
  • 然后執行溢出異常處理程序
  • 之后恢復CPU寄存器的值,恢復EIP的值
  • CPU繼續執行add指令之后的指令
  • 按照北大MOOC中給的例子就是,在當前頁面執行完加法,發現放不下,因此翻到第一頁去執行程序,執行完之后,再翻回來繼續執行。

    總結

    以上是生活随笔為你收集整理的x86异常处理与中断机制(1)概述中断的来源和处理方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。