標籤:blog http os 使用 io ar 2014 cti log
內容摘自《系統虛擬化:原理與實現》PCI 匯流排架構
PCI匯流排是典型的樹結構。把北橋中host-PCI橋看做根,匯流排中其他PCI-PCI橋,PCI-ISA橋(ISA匯流排轉PCI匯流排橋)等橋裝置和
直接連PCI匯流排的裝置看做節點,整個PCI架構可以概括成:
通過橋,PCI可以很容易被擴充,並且與其他匯流排相互掛接,構成整個系統的匯流排網路。與HOST-PCI橋相連的匯流排稱為匯流排0,
其他層次匯流排的編號,是在BIOS(或者作業系統)枚舉裝置時確定的。
裝置標識符
裝置標識符可以看做裝置在PCI匯流排上的地址,它的格式如下所示:
其中8位的bus欄位代表裝置所在的匯流排號,故系統中最多有256條匯流排。Device欄位表示裝置號,代表在bus所表示匯流排上的一個裝置。
Function表示功能號,標識具體裝置上的某個功能單元(邏輯裝置)。舉一個例子,一塊PCI卡,它上面有兩個獨立的裝置,這兩個裝置
共用一些電子線路,那麼這兩個裝置就是這塊PCI卡的兩個功能單元。如Function欄位長度暗示的,一個獨立的PCI裝置最多有8個功能
單元,Device和Function一般合起來用, 表示一條匯流排上一共最多能有256個裝置。通常用裝置標識符三個欄位的縮寫BDF來代表它。
PCI配置空間
對於程式員來說,不需要瞭解PCI裝置電路上的實現細節,只需要瞭解它的介面即可。PCI配置空間就是這麼一個介面,其結構如所示:
PCI裝置規範規定,裝置的配置空間最多為256個位元組,其中前64個位元組的格式i和用途是統一的,對程式員來說最重要的是
Base Address Registers和Interrupt Pin,Interrupt Line。
(1) Base Address Registers: 基地址寄存器,也就是常說的PCI bar。它報告裝置寄存器或者裝置RAM在I/O連接埠地址空間
(或物理地址空間)的地址。地址是由軟體(BIOS或作業系統)動態配置的。通常枚舉PCI裝置的軟體(BIOS或作業系統)會在
獲得平台所有PCI裝置之後,根據裝置數量,按照固定的演算法為每個裝置的PCI bar分配I/O連接埠(或物理地址)。裝置的電子線路
負責把這些連接埠(或地址)映射到自身的寄存器上,這樣,CPU就可以通過連接埠號碼(port I/O方式),物理地址(MMIO方式)訪問
到裝置了。使用哪種方式訪問,由PCI bar的最後一個位表示,該位為1時,表示是I/O連接埠;該位是0時,表示是MMIO連接埠。
(2)Interrupt Pin: 中斷針腳。 PCI中斷線的標準設計是4條:INTA,INTB,INTC,INTD,分別對應值0~3。該寄存器的值表示
裝置串連的是哪個中斷針腳。
(3)Interrupt Line: 裝置的中斷線。該寄存器只起一個保護作用,BIOS和作業系統可以自由使用它。BIOS通常用它來儲存裝置所連
的PIC/IOAPIC的管腳號。
x86架構把IO地址空間的0xCF8~0xCFF段預留給了PCI匯流排,用於訪問裝置的配置空間。其中前32位的寄存器為“地址寄存器”,後
32位為“值寄存器”。軟體把裝置的BDF和要訪問的配置空間的位元組位移寫入“地址寄存器”中,就可以通過“值寄存器”讀寫該配置空間了。
PCI裝置枚舉過程
PCI裝置的枚舉過程一般是由BIOS或者作業系統完成的。
從前面的PCI匯流排概要圖知道,PCI裝置和匯流排一起構成了樹結構,其中PCI-PCI橋是子樹的根節點,裝置枚舉的過程就是要在記憶體中
建立一顆和實際匯流排情況相符合的裝置樹。枚舉過程中最重要的步驟是發現PCI-PCI橋。這個可以通過PCI配置空間的HeaderType欄位判
斷,該欄位為1時表示橋裝置。PCI-PCI橋主要有三個屬性:
- Primary bus: 表示該橋所屬的根匯流排
- Secondary bus: 表示以該橋為根節點的子匯流排
- Subordinate bus: 表示該橋為根的子樹中,最大的匯流排號
下面以說明三者的關係。
如所示,對於“PCI-PCI橋1”,其Primary bus為匯流排0,Secondary bus為匯流排1,而以它為根的匯流排中最大的匯流排
號為2,所以其Subordinate bus為匯流排2。
裝置枚舉從根節點HOST-PCI橋開始,首先探測匯流排0上的各個裝置。當探測到第一個橋裝置時,為其分配Primary bus號和
Secondary bus號,其中Secondary bus號為1(即當前系統中最大匯流排號加1),Subordinate bus號暫時和Secondary bus
號相同,當在子樹中發現新匯流排後會自動調整該值。接著以該橋為根節點,繼續探測其下屬匯流排,其過程與前面相同,發現第一個
橋裝置後則以其為根繼續往下探測,如此反覆知道所有的子樹都探測完畢。
當PCI-PCI橋收到寫入0xCF8中的BDF後,會將Bus欄位與自身的Secondary Bus相比,相符則在下屬匯流排上搜尋裝置;如果
不相符,當Bus值落在Subordinate bus範圍內,則將該地址傳遞給下屬匯流排中各橋,否則不予理睬。
通過這種方式,BIOS或者作業系統可以枚舉出匯流排上所有裝置並為之分配資源,一旦PCI配置空間設定好,軟體就可以通過PCI
bar直接存取裝置了。
系統虛擬化學習筆記——PCI裝置