【我所認知的BIOS】—>PCI 的中斷(PIC下)
2019-04-15 13:03 发布
生成海报
【我所認知的 BIOS 】 —>PCI 的中斷( PIC 下)
LightSeed
2009-5-13
1 、 PCI 中斷概述
注:整篇都是討論在 PIC ( 8259 )下的中斷過程。當 PCI 設備插到主板上後(本來南橋裏含有的當然就不用插啦),它要和其他設備通信,或者讓 CPU 幫它做這般這般,或者 CPU 讓它做那般那般等等。。。那麼他們究竟是怎麼通信的呢?這就是 PCI 中斷在中間起的強大作用。 PCI 中斷,有一個很大的特點,它可以共用。這個特點我先提出來,對於後面講做個鋪墊。
2 、 PCI 中斷的 HW
在談到 PCI 設備的時候,我要首先說明一下。我們平時用程式去 scan 的那個 device 是邏輯上的 device 。比如說 BUS#0DEV#31FUN0 中說的 device 是邏輯 device 。而平時我們說一個 PCI 顯卡, PCI 網卡設備,他們都是物理 device 。一個物理 device 可能會有多個邏輯 device 。這裡其實就是 function 的意思。邏輯 device 其實是 function 。這裡要搞清楚。圖 2.1 是對 PCI 設備中斷的抽象圖。
PCI 設備用 INTA~INTD pin 連接到 8259 來傳送中斷信號。需要說明的是,單 function 的 PCI 設備只能用 INTA 。
圖 2.1 PCI 設備中斷的抽象圖
正如圖 2.1 所示,設備引出的 INTx 連接經過中斷路由後連接到 8259 的 PIRQA~D 。
3 、 INTx 的繞線
細心的人肯定會發現,上面圖 2.1 中的連線是有繞的。那麼爲什麽 HW 要這樣做呢?這就牽涉到“ loading balance ”的概念。以下是引用程式設計俱樂部的帖子,原作者 liaoo
“ Interrupt pin 為出廠時就決定的 , 不能改變 . Ex. 使用 SE or ru check PCI Reg3Dh = 01/02/03/04 for INT#A/B/C/D. 而 interrupt line 則是 BIOS 知道了 "routing" 後去填的 . 例如 ,BIOS 知道
INT#A 最終會接到 PIC mode 的 8259 的 IRQ 11, 則 PCI Reg3Ch 在 PCI scan 階段會被填成 "0Bh". 至於你說的如何接 ,PCI spec 有提到 , 為了 "loading balance", board designer 可以決定 .Ex. 2 PCI devices, 都是利用 INT#A 發 interrupt(so their PCI Reg3Dh = 01h). 兩者接到同一個板子上 . 假如 ,board designer 決定將 :( 以下為假設的接法 )
PCI slot1 接成 : INT#A 接到 I-router 的 INT#B,INT#B 接到 I-router 的 INT#C,INT#C 接到 I-router 的 INT#D,INT#D 接到 I-router 的 INT#A PCI slot2 接成 : INT#A 接到 I-router 的 INT#A,INT#B 接到 I-router 的 INT#B,INT#C 接到 I-router 的 INT#C,INT#D 接到 I-router 的 INT#D
則當 2 PCI devices 接到 slot1 and 2 時 , 就發生 : 雖然都是透過 INT#A 發 interrupt, 但是 , 最後卻是從 " 不同的 source 出去的 ( Device 1 從 INT#B 出去 ,Device 2 從 INT#A 出去 ...) ”
4 、分配 IRQ 給 PCI 設備。
如前文所述,繞線好了後,經過路由 INTx 都連接到了 PIRQA~D 。 BIOS kernel 會把經過計算好的可以用的 PCI irq No. 分配給 PIRQA~D 。比如說 PIRQA~D 分別對應 IRQ5 , IRQ9 , IRQ5 , IRQ9 。那麼最終連接到 PIRQA 上的設備(邏輯設備)都會分配到 IRQ5 。至此 PCI IRQ 的分配就算是完成了。
5 、關於 PCI IRQ 的說明
有人肯定會疑問,爲什麽上面 PIRQA 和 PIRQC 對應的 IRQ No. 都是 5 呢?這個怎麼能通信啊?呵呵,您的擔心是正常的,但是又是工程師們已經解決了的問題。篇首有提到, PCI IRQ 是可以共用的。在這裡便被派上用場啦。
6 、關於 PCI IRQ Routing Table
6.1 PCI IRQ Routing Table 綜述
上面的幾點我們談的熱火朝天,只有確定了 PCI 設備的 INTx 連接到了南橋的 PIRQy 那麼就可以正確地把 IRQ No. 分配給相應的 PCI 設備了。但是這裡有一个缺点: OS 或者其他說軟體是無法知道硬體上究竟某個設備的 INTx 與南橋的 PIRQy 具體是怎麼對應的。 OS 或者其他軟體在不值得的情況下就不能正確分配 IRQ No. 給設備。那麼這個 PCI IRQ Routing Table 就挺身而出充當了描述硬體信息的這麼一個角 {MOD}。它在整個 IRQ 分配的過程中,是重中之重。那麼我們來分析一下它的架構。
6.2 PCI IRQ Routing Table 的結構
Byte Offset
Size in Bytes
Name
0
4
Signature
4
2
Version
6
2
Table Size
8
1
PCI Interrupt Router's Bus
9
1
PCI Interrupt Router's DevFunc
10
2
PCI Exclusive IRQs
12
4
Compatible PCI Interrupt Router
16
4
Miniport Data
20
11
Reserved (Zero)
31
1
Checksum
32
16
First Slot Entry
48
16
Second Slot Entry
(N + 1) * 16
16
Nth Slot Entry
關於上面的這個結構表,其實我是想用中文描述一下,但是又覺得真的不妥。有些文字翻譯過來以後就有點不好理解。我還是貼一下 PCI IRQ Routing Table spec 的原文吧。如果有人對這個的 E 版真的不太瞭解,那麼我想我可以嘗試一下翻譯過來。只是這個表頭其實在 BIOS code 中都是固定的,或者會自動算好的(所以知道就可以了)。重要的是“ Slot Entry ”。所以我要對這個部份詳細說明一下。
6.3 Slot Entry 的解析
Slot Entry: Each slot entry is 16-bytes long and describes how a slot's PCI interrupt pins are wire OR'd (線或) to other slot interrupt pins and to the chip set's IRQ pins. Each entry has the following format:
Byte Offset
Size in Bytes
Name
0
Byte
PCI Bus Number
1
Byte
PCI Device Number (in upper five bits)
2
Byte
Link Value for INTA#
3
Word
IRQ Bitmap for INTA#
5
Byte
Link Value for INTB#
6
Word
IRQ Bitmap for INTB#
8
Byte
Link Value for INTC#
9
Word
IRQ Bitmap for INTC#
11
Byte
Link Value for INTD#
12
Word
IRQ Bitmap for INTD#
14
Byte
Slot Number
15
Byte
Reserved
對於上表, Byte Offset 0 和 1 分別是 PCI Bus No. 和 Device No. 這是在軟體運行過程中判斷的標誌。“ Link Value for INTA# ”則是一個數字,分別是代表 INTA 連接到了南橋的 PIRQy 。比如說: 0 代表連接到了 PIRQA , 1 代表連接到了 PIRAB 。。。等等。後面以此類推。以上各個 slot 聯合在一起就是我們平時經常說的 PCI IRQ Routing Table 了。其實真正深入進去看,它也不是那麼神秘。
6.4 圖解 PCI IRQ Routing Table
讓我們從圖片的角度來說明一下。見圖 6.1
圖 6.1
PCI IRQ Routing Table 就像一個加工廠一樣,它把原始 HW 上的信息轉化成 OS 或者其他軟體可以識別的信息。
PCI IRQ Routing Table 其實就像一個洋蔥一樣,它可以分成一層一層的信息。讓我們看看圖 6.2 就一目了然了。
圖 6.2
7 、 PCI 中斷共用的處理
系統必須為每個中斷提供對應的中斷服務程式 ,當然這個程式的入口位址是在中斷向量錶中有填入的。 本文給出在路由機制中 , 設備 2 的 INTA # 和設備 3 的 I NTD # 共用,假設連接到了 PIRQB 。通常 , 如果多個設備使用同一個中斷請求線 IRQi , 則後登記的中斷入口會覆蓋先登記的服務程式的入口 , 先登記中斷的入口被存儲在後登記中斷的服務程式中 , 依次形成一條鏈。設備 1 的 INTA 發出中斷信號後,計算機經過一系列的過程會進入到 IRQ9 的 中斷 服務子程式( ISR )中, CPU 首先轉入最後登記入口的中斷服務中 , (這裡就先進入到設備 2 的中斷服務程式中去) 查詢該設備的中斷請求位元 , 若該位被置 1 , 則執行該程式 , 否則找到下一個共用中斷的入口 。(很明顯不是設備 2 ,那麼) 轉入下一個中斷服務程式執行 , 在該程式中再查詢該設備的中斷請求位元 , 判斷是否是該設備提出的中斷 。(這個時候,設備 1 舉手說,終於輪到我啦, CPU 大哥我要你幫我幹點事,好了後獎勵你一個香吻。。。)
我琢磨著畫個流程圖好理解點如下。
中斷流程圖
PS: 画这些图的时候真的花了不少时间,如果看的起我想转载的话,请说明出处。谢谢。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮