系統虛擬化學習筆記 PCI裝置

2022-08-12 20:54:13 字數 2658 閱讀 3122

pci匯流排是典型的樹結構。把北橋中host-pci橋看做根,匯流排中其他pci-pci橋,pci-isa橋(isa匯流排轉pci匯流排橋)等橋裝置和直接連pci匯流排的裝置看做節點,整個pci架構可以概括成下圖:

通過橋,pci可以很容易被擴充套件,並且與其他匯流排相互掛接,構成整個系統的匯流排網路。與host-pci橋相連的匯流排稱為匯流排0,其他層次匯流排的編號,是在bios(或者作業系統)列舉裝置時確定的。

其中8位的bus欄位代表裝置所在的匯流排號,故系統中最多有256條匯流排。device欄位表示裝置號,代表在bus所表示匯流排上的乙個裝置。function表示功能號,標識具體裝置上的某個功能單元(邏輯裝置)。舉乙個例子,一塊pci卡,它上面有兩個獨立的裝置,這兩個裝置共享一些電子線路,那麼這兩個裝置就是這塊pci卡的兩個功能單元。如function字段長度暗示的,乙個獨立的pci裝置最多有8個功能單元,device和function一般合起來用, 表示一條匯流排上一共最多能有256個裝置。通常用裝置識別符號三個欄位的縮寫bdf來代表它。

對於程式設計師來說,不需要了解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裝置的列舉過程一般是由bios或者作業系統完成的。

從前面的pci匯流排概要圖知道,pci裝置和匯流排一起構成了樹結構,其中pci-pci橋是子樹的根節點,裝置列舉的過程就是要在記憶體中建立一顆和實際匯流排情況相符合的裝置樹。列舉過程中最重要的步驟是發現pci-pci橋。這個可以通過pci配置空間的headertype欄位判斷,該字段為1時表示橋裝置。pci-pci橋主要有三個屬性:

下面以上圖說明三者的關係。

如上圖所示,對於「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配置空間設定好,軟體就可以通過pcibar直接訪問裝置了。

pci express 拋棄了pci所採用的多個裝置共享的並行的匯流排架構,轉而使用了與網路協議類似的點對點的序列通訊機制。多個pci express裝置(endpoint)通過交換器(switch)相互連線。與pci裝置中的橋裝置相似,通過交換器,可以搭建乙個樹形的pci express的拓撲結構。標準的pci express拓撲結構如下圖所示。

KVM虛擬機器PCI裝置直通

guest排他使用host上的某個pci裝置,就像將該裝置物理連線到guest上一樣 a.識別裝置 virsh nodedev list tree grep pcib.獲取裝置xml virsh nodedev dumpxml pci 8086 3a6c.detach裝置 virsh nodedev...

虛擬化學習(1)

虛擬化定義 通過技術手段將一台物理伺服器劃分為若干虛擬伺服器 虛擬化分類 1 完全虛擬化 通過虛擬化軟體欺騙虛擬機器核心就是真正的核心,它可以排程物理硬體,而實際上由虛擬化軟體在中間進行翻譯,幫助虛擬機器核心完成最終對硬體的排程。代表 vmware 完全虛擬化的缺點是 效率低 效能差 2 硬體輔助虛...

虛擬化學習小總結

這幾天看了一點虛擬化的東西,感覺這個比較簡單 學過計算機原理 不說沒有的了。簡單的總結一下自己對於虛擬化的一些看法吧。我學習虛擬化是為了了解一下,虛擬容器docker的一些東西。但是因為虛擬容器docker,我覺的會是在今後幾年,實用性特別強的東西。在聽過了王家林老師的docker課後,發現這個東西...