初步了解完pci匯流排標準之後,我們接下來正式開始pcie裝置的漫遊之旅。從我們按下pc的電源按鈕開始,bios就接管系統控制權開始工作,它會先進行一些記憶體和裝置的初始化工作(當然,也包括我們的pci裝置),由於商業上的原因,phoenix等廠商的bios**需要授權協議,在此,我們以另外乙個款開源bios(openbios)為例,來剖析bios中,我們的pcie裝置是如何被找到以及初始化的。
pci裝置的掃瞄是基於深度優先搜尋演算法(dfs:depth first search),也就是說,下級分支最多的pci橋將最先完成其子裝置的掃瞄。下面我們以來具體說明,bios是如何一步步完成pci 裝置掃瞄的。
第一步:
pci host 主橋掃瞄bus 0上的裝置(在乙個處理器系統中,一般將與host主橋直接相連的pci匯流排被命名為pci bus 0),系統首先會忽略bus 0上的d1,d2等不會掛接pci橋的裝置,主橋發現bridge 1後,將bridge1 下面的pci bus定為 bus 1,系統將初始化bridge 1的配置空間,並將該橋的primary bus number 和 secondary bus number暫存器分別設定成0和1,以表明bridge1 的上游匯流排是0,下游匯流排是1,由於還無法確定bridge1下掛載裝置的具體情況,系統先暫時將subordinate bus number設為0xff。如下圖所示:
第二步:
系統開始掃瞄bus 1,將會發現bridge 2。系統將bridge 2下面的pci bus定為bus 2,並將該橋的primary bus number 和 secondary bus number暫存器分別設定成1和2,和上一步一樣暫時把bridge 2 的subordinate bus number設為0xff。如下圖所示:
第三步:
系統繼續掃瞄bus 2,將會發現bridge 4。系統將bridge 4下面的pci bus定為bus 3,並將該橋的primary bus number 和 secondary bus number暫存器分別設定成2和3,此後
系統繼續掃瞄後發現bus 3 下面已經沒有任何bridge了,意味著該pci匯流排下已經沒有任何掛載下游匯流排了,因此bridge 4的subordinate bus number的值已經可以確定為3了。
如下圖所示:
第四步:
完成bus 3的掃瞄後,系統返回到bus 2繼續掃瞄,發現bus 2下面已經沒有其他bridge了。此時bridge 2的subordinate bus number的值也已經可以確定為3了。如下圖所示:
第五步:
完成bus 2的掃瞄後,系統返回到bus1繼續掃瞄,會發現bridge 3,系統將bridge 3下面的pci bus定為bus 4。並將bridge 4的primary bus number 和 secondary bus number暫存器分別設定成1和4,此後系統繼續掃瞄後發現bus 4 下面已經沒有任何bridge了,意味著該pci匯流排下已經沒有掛載任何下游匯流排了,因此bridge 3 的subordinate bus number的值已經可以確定為4了。如下圖所示:
第六步:
完成bus 4的掃瞄後,系統返回到bus 1繼續掃瞄, 發現bus 1下面已經沒有其他bridge了。此時bridge 1的subordinate bus number的值已經可以確定為4,系統返回bus 0繼續掃瞄(bus 0下如果有其他它bridge,將重複上述的步驟進行掃瞄)。至此,本例中的整個pci的裝置掃瞄已經完成了。最終的裝置和匯流排的掃瞄結果如下圖所示。
了解了上面pci裝置掃瞄的大概流程,我們接下來看看bios**中具體是如何實現這些掃瞄的。
一般來說,我們可以通過兩個暫存器來訪問pci的配置空間(暫存器config_address與config_data),在x86體系下,這兩個暫存器分別對應0xcf8和0xcfc埠,對配置空間的訪問都是通過對這兩個暫存器的讀寫來實現先。config_address暫存器的具體位組成如下圖所示:
bus number : 匯流排號(8 bit),範圍0--255。
device number: 裝置號(5 bit),範圍0--31。
function number: 功能號(3 bit),範圍0--7。
register number: 暫存器號(6 bit),範圍0--63 (配置空間一共256個位元組,分割成64個4位元組的暫存器,從0--63編號)。
每個pci裝置可根據上圖所示的四個資訊:bus number, device number, function number,register number 來進行具體裝置的定位並對其配置空間訪問。當我們要訪問pci裝置的配置空間時,先根據以上格式設定config_address暫存器,然後再讀取config_data暫存器即可得到相應的配置空間暫存器的值。
因此,bios中pci配置空間的讀寫可以封裝成下面的函式:
PCIE 裝置掃瞄的過程
初步了解完pci匯流排標準之後,我們接下來正式開始pcie裝置的漫遊之旅。從我們按下pc的電源按鈕開始,bios就接管系統控制權開始工作,它會先進行一些記憶體和裝置的初始化工作 當然,也包括我們的pci裝置 由於商業上的原因,phoenix等廠商的bios 需要授權協議,在此,我們以另外乙個款開源b...
PCIe裝置的配置空間
關於pci裝置的配置空間網上已經有很多資料了,如下圖就是pci裝置必須支援的64個位元組的配置空間,範圍為0x00 0x3f。很多pci裝置僅僅支持者64位元組的配置空間。pci和pcie配置空間的區別如下文。此外pci pci x和pcie裝置還擴充套件了0x40和0xff這段配置空間,這段空間主...
PCIe裝置驅動demo
pcie pci express 是intel提出的新一代的匯流排介面,目前普及的pcie 3.0的傳輸速率為8gt s,下一代pcie 4.0將翻番為16gt s,因為傳輸速率快廣泛應用於資料中心 雲計算 人工智慧 機器學習 視覺計算 顯示卡 儲存和網路等領域。pcie插槽是可以向下相容的,比如p...