從按下PC的電源按鈕開始,BIOS就接管系統控制權開始工做,它會先進行一些內存和設備的初始化工做(固然,也包括PCI設備),因爲商業上的緣由,Phoenix等廠商的BIOS代碼須要受權協議,下面以另一款開源BIOS(openbios)爲例,來剖析BIOS中,PCIe設備是如何被找到以及初始化的。ios
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。如圖 1.1所示:spa
圖 1.1 PCIE掃描第一步.net
第二步:系統開始掃描Bus 1,將會發現Bridge 2。系統將Bridge 2下面的PCI Bus定爲Bus 2,並將該橋的Primary Bus Number 和 Secondary Bus Number寄存器分別設置成1和2,和上一步同樣暫時把Bridge 2的Subordinate Bus Number設爲0xFF。如圖 1.2所示:圖片
圖 1.2 PCIE掃描第二步內存
第三步:資源
系統繼續掃描Bus 2,將會發現Bridge 4。系統將Bridge 4下面的PCI Bus定爲Bus 3,並將該橋的Primary Bus Number 和 Secondary Bus Number寄存器分別設置成2和3,此後get
系統繼續掃描後發現Bus 3下面已經沒有任何Bridge了,意味着該PCI總線下已經沒有任何掛載下游總線了,所以Bridge 4的Subordinate Bus Number的值已經能夠肯定爲3了。it
如圖 1.3所示:io
圖 1.3 PCIE掃描第三步
第四步:
完成Bus 3的掃描後,系統返回到Bus 2繼續掃描,發現Bus 2下面已經沒有其餘Bridge了。此時Bridge 2的Subordinate Bus Number的值也已經能夠肯定爲3了。如圖 1.4所示:
圖 1.4 PCIE掃描第四步
第五步:
完成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了。如圖 1.5所示:
圖 1.5 PCIE掃描第五步
第六步:
完成Bus 4的掃描後,系統返回到Bus 1繼續掃描, 發現Bus 1下面已經沒有其餘Bridge了。此時Bridge 1的Subordinate Bus Number的值已經能夠肯定爲4,系統返回Bus 0繼續掃描(Bus 0下若是有其餘它Bridge,將重複上述的步驟進行掃描)。至此,本例中的整個PCI的設備掃描已經完成了。最終的設備和總線的掃描結果如圖 1.6所示
圖 1.6 PCIE掃描第六步
通常來講,能夠經過兩個寄存器來訪問PCI的配置空間(寄存器CONFIG_ADDRESS與CONFIG_DATA),在x86體系下,這兩個寄存器分別對應0xCF8和0xCFC端口,對配置空間的訪問都是經過對這兩個寄存器的讀寫來實現先。CONFIG_ADDRESS寄存器的具體位組成如圖 1.7所示:
圖 1.7 x86配置寄存器
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設備的掃描,而且爲每一個設備分配好了系統資源。