標籤

2017年2月15日 星期三

我對中斷的理解(以IRQ為主) - 1

太多轉貼的網誌有點無聊,今天來寫寫自己對於中斷的理解。


1. 軟體中斷與硬體中斷。

OS必須要知道硬體中斷的發生,像是我們敲敲鍵盤動動滑鼠的動作,OS都必須要去讀取keystroke,我們必須做更多事來處理硬體中斷,來確保CPU能夠順利再回到原來的狀態,這篇文章會提到比較多的IRQ便是屬於硬體中斷。

而軟體中斷,常見的TRAP或EXCEPTION,我都是用除以零去理解,當CPU都收到這種要求,產生算術邏輯錯誤,便會產生一個軟體中斷去中止PROGRAM。

2. IRQ的產生
Device要跟CPU要資源做事有兩種方式,一種是CPU來POLLING,但這種方式太浪費CPU資源,所以便有了IRQ( interrupt request),當Device需要CPU幫忙,便透過中斷跟CPU要資源。

3. 誰會發IRQ
這邊要講的是PCI device,一個PCI device會有四隻腳讓他發IRQ,INTA# INTB# INTC# INTD#,如果你是single function PCI device,就是透過INTA#,這部分是Boad designer去設計,BIOS只能read。

4. 8259 PIC - Programmable Interrupt Controller
早期需要中斷的DEVICE就是KEYBOARD、MOUSE、CMOS等等,後來越來越多device需要發中斷,而處理這些事情,便是靠傳說中的8259,8259長這樣:
「8259」的圖片搜尋結果
我們可以看到它是兩個接在一起的,就是說明IRQ不夠用的最佳例子(一個不夠我就接兩個),其中大部分的IRQ都被占用了,這部分可以參考WIKI: https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture)
可鍵盤滑鼠計時器等等都有占用到固定的IRQ了,一般而言沒有用的還有IRQ10, IRQ11就是我們可以用來分配的。對於8259而言,IRQ number小的優先權較大,由於IRQ2是用來串接的,所以優先權依序為0~1, 8~15, 3~7。

3.1 8259暫存器
暫略

3.2 Shared IRQ
8根不夠用,難道15根就夠用嗎,如果還是不夠怎麼辦。所以IRQ有共享的觀念,那要怎麼共享呢?很簡單,我們在IRQ前面加個P,他就Programmable了。

3.3. PIRQ
當然不是加個P就好了,share IRQ的同時,我們需要做什麼呢? INTEL當初的設計是找廠商在設計幾根PIN,線路圖長這樣。

這張圖是網路找的,應該是當初有根INTEL合作的廠商吧,我們可以看到這個CHIP有四根腳,分別是PIRQA#, PIRQB#, PIRQC#, PIRQD#。BIOS在POST的時候,會把可以用的IRQ收集起來,根據SYSYEM的狀況,把這些可用的PIN填入PIRQA# PIRQB# PIRQC# PIRQD#對應的register,這張圖為例,當我的PCI Slot 1透過INT A#發出了中斷,他接到了PIRQA#,透過register 60H,router知道要用IRQ9,最終便透過IRQ9發出,若透過INT C#發出中斷,對應到62H,一樣是IRQ9,自此IRQ透過register就Programmable,共享的概念就達成了。

到最後PIRQ也不夠用了,所以又多了PIRQE#...PIRQH#,是不是蠻無言的,這也為日後APIC的出現留下伏筆,下篇再談。

難道這樣就完成了嗎,不我們還差一點點,到這邊為止device只是發出IRQ,但是OS只知道有人發了IRQ,並不知道是誰發的,所以有了IRQ routing table。

4.1 IRQ routing table
早期這個table存在於memory,現在就是用ACPI去規範他。我節錄ACPI的sample code如下

Method(_PRT,0) {
Package(){0x0000FFFF, 0, LNKA, 0 },
Package(){0x0000FFFF, 1, LNKB, 0 },
Package(){0x0000FFFF, 2, LNKC, 0 },
Package(){0x0000FFFF, 3, LNKD, 0 },
}
這邊第一個參數就交代了device的訊息(D0, any fucntion)。
APIC在這邊的描述又有些不同,以後再提。

5.後述
可以看出即便在IRQ不夠的狀態下,錢還是要賺,硬體還是要出,所以出現了許多過渡產品,之後為了要相容這些,也衍生出不少問題。
無論如何,這都是我粗淺的理解,之後會繼續往下衍生,有錯還請先進指正。

沒有留言: