1. 程式人生 > 其它 >中斷 中斷描述符 中斷描述符表

中斷 中斷描述符 中斷描述符表

  • 中斷
  • 中斷識別碼
  • 中斷描述符(ID 中斷向量)
  • 中斷描述符表(IDT 中斷向量表)
  • 中斷描述符表暫存器(IDTR)
  1. CPU 中斷當前執行的程式,將 PC 指標跳轉到一個固定的位置,我們稱為一次中斷(interrupt)。
    中斷可以分為中斷和異常,異常又可以分為故障、陷阱、中止。
    給 CPU 一箇中斷號有三種方式
    a.中斷是一個非同步事件,通常由 IO 裝置觸發,比如點選一下滑鼠、敲擊一下鍵盤等。 可程式設計中斷控制器 IRQ 引腳線 -> CPU INTR 引腳 -> INTR 引腳訊號 -> 中斷號 -> CPU
    b.異常是一個同步事件,是 CPU 在執行指令時檢測到的反常條件。比如除法異常、錯誤指令異常,缺頁異常等。
    c.INT 指令 INT 指令後面跟一個數字,就相當於直接用指令的形式,告訴 CPU 一箇中斷號 比如 INT 0x80,就是告訴 CPU 中斷號是 0x80。Linux 核心提供的系統呼叫,就是用了 INT 0x80 這種指令
  • 無論是中斷還是異常,最終都是通過各種方式,讓 CPU 得到一箇中斷號。只不過中斷是通過外部裝置給 CPU 的 INTR 引腳發訊號,異常是 CPU 自己執行指令的時候發現特殊情況觸發的,自己給自己一箇中斷號。
  • 上面不管是因為硬體觸發中斷還是軟體觸發中斷,都是由硬體實現的中斷,因此都稱為硬中斷。為什麼叫硬中斷呢?因為這是 Intel CPU 這個硬體實現的中斷機制,注意這裡是實現機制,並不是觸發機制,因為觸發可以通過外部硬體,也可以通過軟體的 INT 指令。
  • 對應的由軟體實現的中斷,是純粹由軟體實現的一種類似中斷的機制,實際上它就是模仿硬體,在記憶體中有一個地方儲存著軟中斷的標誌位,然後由核心的一個執行緒不斷輪詢這些標誌位,如果有哪個標誌位有效,則再去另一個地方尋找這個軟中斷對應的中斷處理程式。
  1. 我們需要把不同的中斷型別進行分類,這個型別叫作中斷識別碼。比如按鍵,我們可以考慮用編號 16,數字 16 就是按鍵中斷型別的識別碼。
  2. 不同型別的中斷髮生時,CPU 需要知道 PC 指標該跳轉到哪個地址,這個地址,稱為中斷向量(Interupt Vector)
    中斷描述符表這個數組裡的儲存的資料結構,是一個叫 desc_struct 的結構
struct desc_struct {
    unsigned long a,b;
};

Linux 原始碼中,一箇中斷描述符的大小為 64 位,也就是 8 個位元組
4. 維護不同中斷識別碼與中斷向量的對應關係,如果設計最多有 255 箇中斷,編號就是從 0~255,剛好需要 一定空間的記憶體地址儲存中斷向量。這個空間,稱為中斷向量表。
作業系統初始化過程中,有很多結構都稱之為 XXX 表,其實就是個陣列罷了
以 linux-2.6.0 原始碼為例

struct desc_struct idt_table[256] = { {0, 0}, };
  1. 中斷描述符表暫存器
    中斷描述符表在哪裡,全憑各個作業系統的喜好,想放在哪裡就放在哪裡,但需要通過某種方式告訴 CPU,CPU 提前預留了一個暫存器叫 IDTR 暫存器,這裡面存放的就是中斷描述符表的起始地址,以及中斷描述符表的大小。
    作業系統的程式碼可以通過 LIDT 指令,將中斷描述符表的地址放在這個暫存器裡。作業系統啟動時將除法異常、非法指令異常、缺頁異常,以及之後可能通過 INT 0x80 觸發系統呼叫的中斷處理函式 system_call,就是這樣被寫到了中斷描述符表裡

https://mp.weixin.qq.com/s/bTfeI5p4eO5j6I9edeV73g
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=478#/detail/pc?id=4622