1. 程式人生 > >【OS學習筆記】十一 真實模式:中斷-軟中斷和硬中斷基本原理

【OS學習筆記】十一 真實模式:中斷-軟中斷和硬中斷基本原理

上一篇文章我們模擬作業系統的載入器程式,使用匯編語言實現了一個程式載入器:點選連結檢視上一篇文章:程式載入器的實現原理

本篇文章,是真實模式學習的結尾。在經過了那麼多坎坷,終於學完了8086的真實模式!!!最重要的是本篇文章沒有彙編程式碼,只講原理~~ 今天的內容比較簡單,學習一下中斷的原理-包括硬中斷和軟中斷。主要理解以下內容:

  • 硬中斷的工作原理
  • 軟中斷的工作原理
  • 中斷向量表

1、硬中斷

硬中斷一般是外部硬體中斷-就是從處理器外部來的中斷訊號。

當外部裝置發生錯誤或者有資料要傳送時,或者處理器交給它的任務處理完了,它都會向處理器傳送訊號,高速處理器。

如下圖,外部硬體中斷是通過兩個訊號線引入處理器內部的。這兩根線的名字恩別叫做NMI和INTR

在這裡插入圖片描述

當一箇中斷髮生時,處理器將會通過中斷引腳NMI和INTR得到通知。除此之外,處理器還需要知道發生了什麼,以便採取適當的處理措施。

每種型別的中斷都被統一編號,這稱為中斷型別號、中斷向量或者中斷號。

1.1 非遮蔽中斷(不可遮蔽中斷)

NMI接收的是不可遮蔽中斷。

不可遮蔽中斷的中斷號統一為2(因為所有不可遮蔽中斷都幾乎是致命的無法解決,所以處理器乾脆不處理的,統一將他們的中斷號令為2,處理器接收到2號中斷時直接放棄繼續正常工作,也不會試圖糾正已經發生的錯誤。)。

1.2 可遮蔽中斷

和NMI不同,INTR一般接收的是可遮蔽中斷。大多數的中斷也是可遮蔽中斷。

INTR接收可遮蔽中斷。

Intel處理器允許有256箇中斷。中斷號是0~255。如下圖是一箇中斷控制器,它管理傳送來的中斷訊號,決定是否將中斷傳送給CPU。
在這裡插入圖片描述
以上兩個8259晶片負責15箇中斷號的管理。注意這裡為什麼是15個而不是256個呢?其實是每次它管理的中斷號不一樣的,這一次可能管理的是10-25號,下次可能管理的是其他的號。

那麼在哪裡遮蔽中斷或者不遮蔽中斷呢?實際上有兩個位置,一個是8259內部,一個是處理器內部。

**8259內部:**在8259內部有一箇中斷遮蔽暫存器,這是個8位暫存器,對應著該晶片的8個輸入引腳,對應的位是0還是1決定了該引腳輸入的中斷是否能通過8259晶片。0表示允許 1表示阻斷

**處理器內部:**除了要看8259內部,最終還要看處理器。處理器內部的標誌暫存器FLAGS有一個標誌IF。這是中斷標誌。當IF為0時所有從INTR來的中斷都被忽略。當IF為1時處理器可以接收和相應中斷。

1.3、真實模式下中斷向量表

所謂中斷處理,就是處理器要執行一段與該中斷有關係的程式(指令)。處理器可以識別256箇中斷,那麼理論上就需要256箇中斷程式。

這些程式的實際位置並不重要,重要的是,在真實模式中,處理器要求將它們的入口點(還記得程式的入口點麼?不記得話看上一篇文章)集中存放到記憶體中的從實體地址0x00000處(0x0000:0x0000)到0x003ff處(0x0000:0x03ff)。共1KB的記憶體空間。這就是所謂的中斷向量表。

如下圖是真實模式下的中斷向量表:
在這裡插入圖片描述

中斷訊號來自哪個引腳,8259晶片是最清楚的,所以他會把相應的中斷號告訴處理器,處理器拿著這個中斷號,要順序做以下幾件事:

  • 保護斷點的現場

    • 首先將FLAGS暫存器壓棧,然後清楚它的IF位(防止在中斷的時候被打斷,如果想要有巢狀中斷,可以在編寫中斷處理程式時適時使用sti指令開放中斷)
    • 然後依次將CS於IP暫存器壓棧
  • 執行中斷處理程式

    • 由於處理器已經拿到了中斷號,它用中斷號乘以4(見上圖)就得到了該中斷的入口點的偏移地址和段地址
    • 接著將得到的段地址與偏移地址傳送給CS和IP
  • 返回到斷點接著執行

    • 所有中斷的程式的最後是一條iret指令。這將導致處理器一次從棧中彈出IP CS FLAGS的原始內容,於是轉到主程式繼續執行
    • 由於中斷處理程式返回時已經將FLAGS內容恢復,所以IF標誌位也恢復。也就是說可以接收新的中斷

2、軟中斷

和硬體中斷不同,軟中斷是處理器內部產生的。是由執行指令引起的。

軟中斷是由int指令引起的。這類中斷不需要中斷識別匯流排週期,中斷號在指令中給出。

更詳細的內容,可以見我另一篇部落格:中斷的概念與意義

3、總結

今天學會了以下內容:

  • 硬中斷
  • 軟中斷
  • 中斷向量表的概念與意義

筆記記得不是很全,如果有不懂的可以加我聯絡方式一起交流。

學習探討加個人:
qq:1126137994
微信:liu1126137994