中斷架構

如果程序總是順序執行,那麼事情將變得非常簡單。但事情往往和人們所期望的不太一樣,中斷和異常會打斷順序執行的程序流,轉而進入一條完全不同的執行路徑。操作系統的內核爲什麼那麼難懂,很大一部分要歸功於它們。下面將介紹現代CPU架構中的中斷和異常機制。

中斷架構

從某種意義上說,現代計算機架構是由大量的中斷事件驅動的。中斷提供給外部硬件設備一種“打斷CPU當前執行任務,並響應自身服務”的手段。

1、可編程中斷控制器

中斷從設備發送到CPU需要由被稱爲“中斷控制器”的部件轉發。中斷控制器發展至今,經歷了PIC(可編程中斷控制器)和APIC(高級可編程中斷控制器)兩個階段。

2、PIC

8259A芯片即常說的PIC,它具有IR0~IR7共8箇中斷管腳連接外部設備。中斷管腳具有優先級,其中IR0優先級最高,IR7最低。PIC有如下三個重要的寄存器。

(1)IRR中斷請求寄存器:共8位,對應IR0~IR7這8箇中斷管腳。某位置一代表收到對應管腳的中斷但還未提交給CPU。

(2)ISR服務中寄存器:共8位。某位置1代表對應管腳的中斷已經提交給CPU處理,但CPU還未處理完。

(3)IMR中斷屏蔽寄存器:共8位。某位置一對應的中斷管腳被屏蔽。

除此之外,PIC還有一個EOI位,當CPU處理完一箇中斷時,通過寫該位告知PIC中斷處理完成。PIC向CPU遞交中斷的流程如下:

(1)一個或多個IR管腳上產生電平信號,若對應的中斷沒有被屏蔽,IRR中相應的位 被置1。

(2)PIC拉高INT管腳通知CPU中斷髮生。

(3)CPU通過INTA管腳應答PIC,表示中斷請求收到。

(4)PIC收到INTA應答後,將IRR中具有最高優先級的位清0,並設置ISR中對應的位。

(5)CPU通過INTA管腳第二次發出脈衝,PIC收到後計算最高優先級中斷的vector,並將它提交到數據線上。

(6)等待CPU寫EOI。收到EOI後ISR中最高優先級的位被清0,如果PIC處於AEOI模式,當第二個INTA脈衝收到後,ISR中最高優先級的位自動清0。

3、APIC

PIC可以在UP(單位處理器)平臺上工作,但無法用於MP(多處理器)平臺。爲此APIC應運而生。APIC由位於CPU中的本地高級可編程中斷控制器和位於主板南橋中I/O高級可編程中斷控制器兩部分構成。其中IOAPIC通常有24個不具有優先級的管腳,用於連接外部設備。當收到某個管腳的中斷信號後,IOAPIC根據軟件(通常是操作系統)設定的PRT表,查找到管腳對應的RTE表通過RTE的各個字段,格式化出一條包含該中斷所有信息的中斷消息,再由系統總線發送給特定CPU的LAPIC,LAPIC收到該消息後擇機將中斷遞交給CPU處理。

在LAPIC內部,也有IRR、ISR和EOI寄存器,其中IRR、ISR爲256位,EOI爲32位,它們的功能和PIC的大體類似。APIC系統中,中斷的發起大致流程如下。

(1)IOAPIC收到某個管腳產生的中斷信號。

(2)查找PRT表獲得該管腳對應的RTE。根據RTE各字段格式化出一條中斷消息。並確定發送給哪個CPU的LAPIC。

(3)通過系統總線或APIC總線發送中斷消息。

(4)LAPIC收到中斷消息,判斷是否由自己接收。

(5)如確定接收,將IRR中對應的位置。同時確定此時是否將該中斷交由CPU處理。

(6)如果提交中斷給CPU處理,從IRR獲取最高優先級的中斷,將ISR中對應的位置,並提交中斷。對於edge觸發中斷,IRR中對應位此時清0.

(7)CPU處理完中斷,軟件寫EOI寄存器告知中斷處理完成,對於level觸發中斷,IRR中對應位此時清0.LAPIC可提交下一個中斷。

處理器間中斷

在MP(多處理器)平臺上,多個CPU要協同工作,處理器間中斷IPI 提供CPU之間相互通信的手段。cpu可以通過LAPIC的ICR(中斷命令寄存器)向指定的一個/多個CPU發送中斷。

操作系統通常使用IPI來完成諸如進程轉移,中斷平衡和TLB刷新等工作。

中斷的重要概念

(1)中斷的分類

中斷可以從多個方面進行分類。從中斷源的角度來看可以分爲如下幾類。

中斷可以從多個方面進行分類。從中斷源的角度來看,可以分爲如下幾類。

外部中斷:指連接在IOAPIC上設備產生的中斷、LAPIC上連接的設備或LAPIC內部中斷源產生的中斷以及處理器間中斷。

可屏蔽中斷:指可以通過某種方式進行屏蔽的中斷。與之對應的概念是不可屏蔽中斷。

軟件產生的中斷:指通過INT n 指令產生的中斷。

這樣的分類並非絕對,例如外部中斷通常是可屏蔽中斷,但也可能屬於不可屏蔽中斷。通常,根據外部中斷的觸發方式,又把它們分爲如下幾類。

(1)edge觸發中斷:指中斷邊沿方式觸發。ISA設備、時鐘設備多使用這種觸發方式。

(2)level觸發中斷:指中斷以電平方式觸發,在中斷的程序應答設備前,該電平一直有效。PCI設備使用這種觸發方式。

2、中斷的優先級

在使用PIC的系統中,PIC管腳決定了中斷的優先級,連接IR0的設備具有最高優先級,連接IR7的設備優先級最低。在APIC系統中,IOAPIC的管腳不再具有優先級,設備的中斷優先級由它所連接管腳對應RTE的vector字段決定。vector是x86架構用於索引IDT表的下標,範圍從0~255,值越大優先級越高。其中,32~255可以供外部中斷使用。

在現代操作系統中,有幾個概念和vector常聯繫在一起使用,這裏簡單介紹一下。

IRQ:PIC時代的產物,由於ISA設備通常是連接到固定的PIC管腳,所以說一個設備的IRQ實際是指它連接的PIC管腳號。IRQ暗示着中斷優先級,例如IRQ0比IRQ3有着更高的優先級。當前進到APIC時代後或許是出於習慣,人們仍然習慣用IRQ表示一個設備的中斷號,但對於16以下的IRQ它們不可能再與IOAPIC的管腳對應。

GSI:ACPI引入的概念,它爲系統中每個中斷源指定一個唯一的中斷號。IRQ和GSI在APIC系統中常常被混用,實際上對於15以上的IRQ它和GSI相等。

在這裏,GSI和IRQ可以看作等同的概念,表示某個設備的中斷號。它們與vector的關係由操作系統決定,通常是在設備驅動註冊中斷處理程序時由操作系統分配。

3、中斷的屏蔽

無論是在PIC收到中斷信號後還是LAPIC收到中斷消息後,並不一定都是馬上交給CPU處理的,這還要取決於CPU當前是否屏蔽中斷。當CPU屏蔽中斷時,中斷會被依附在PIC/LAPIC的IRR寄存器中,一旦CPU開啓中斷,會在第一時間相應PIC/LAPIC所依附的中斷。cpu可以通過以下幾種方法屏蔽/開啓中斷。

(1)CLI/STI指令:這是操作系統最常用的屏蔽/開啓中斷的方法。CLI指令將本CPU的EFLAGS寄存器的IF位清0,阻止接收中斷;STI指令將IF位置一,允許接收中斷。這兩條指令都只對當前CPU起作用,而不影響其他CPU。

(2)TPR寄存器:根據該寄存器值代表的優先級,部分屏蔽外部中斷。

(3)PIC/IOAPIC的中斷屏蔽位:PIC可以通過IMR寄存器屏蔽對應管腳。IOAPIC可通過RTE中的mask位屏蔽對應管腳。該方法不會將中斷依附到IRR而是直接忽略,對於edge觸發中斷可能導致中斷丟失。

4、IDT表

IDT表實際就是個大數組,用於存放各種“門”(中斷門、陷阱門、任務門),這些門是中斷和異常通往各自處理函數的入口。當一箇中斷或異常發生時,CPU用它們對應的vector號索引IDT表以獲得對應的“門”。每個門佔8B,x86最多有256個vector,故IDT表最大長度爲8*256=2048B

IDT表的基地址存放在IDTR寄存器中,該寄存器和GDTR類似,由一個基地址(Base)和長度(Limit)字段構成,通過LIDT/SIDT指令可以加載和存儲IDTR寄存器。IDT表要求被對齊到8B邊界以提高效率。

5、中斷門

“門”是入口,中斷門就是中斷入口。中斷門實際上是一種段描述符,稱爲系統描述符,由段描述符的S位控制。

其中,段選擇符、偏移量字段可以看成一個邏輯地址,通過索引GDT將該邏輯地址轉換成中斷處理函數入口的線性地址。這裏要特別注意的是DPL字段,很多操作系統把門的DPL設置成0,而在之前講過。只有當CPL<=DPL、CPL<=RPL訪問才被允許。

這就引出一個問題:程序在用戶態時CPL=3發生中斷,豈不是不能過一個DPL=0的中斷門。實際上,中斷門和陷阱門的DPL只在使用INT n指令引起中斷/異常時才檢查,硬件產生的中斷/異常不檢查。P字段代表該中斷門是否有效,清0無效。

雖然沒有強行規定中斷一定要使用中斷門,但通常操作系統是這樣做的。中斷門和陷阱門的唯一區別是程序通過中斷門跳轉後,EFLAGS寄存器的IF位自動清0,中斷關閉。而陷阱門沒有這樣的效果。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章