在一個處理器系統中,每一個host?主橋都推出一棵PCI?總線樹。?一棵PCI?總線樹中有多少個PCIB?bridge ,?就含有多少條PCI?總線。?系統軟件在遍歷當前PCI?總線樹時,需要首先對這些PCI?總線進行編號,即初始化PCI?橋的primary, secondary?和Subordinate bus number?寄存器。
在一個處理器系統中,一般將與host?主橋直接相連的pci?總線命名為pci?總線0,?然后系統軟件使用dfs( depth first search)?算法,依次對其他pci?總線進行編號。值得注意的是,與host?主橋直接相連的pci?總線,其編號都為0,?因此當處理器系統中存在多個host主橋時,將有多個編號為0?的pci?總線。?但是這些編號為0的pci?總線分屬不同的pci?總線域,?其含義并不相同。
?在一個處理器系統中,假設pci?總線樹的結構如圖所示,
在pci?總線中,?系統軟件使用深度優先算法對PCI?總線樹進行遍歷,DFS?算法和廣度優先BFS(?breath First Searth)?算法是遍歷樹型結構的常用算法。與bfs?算法相比,dfs?算法的空間復雜度較低,?因此絕大多數系統在遍歷pci?總線樹時,都使用DFS?算法而不是BFS?算法。
DFS?算法是搜索算法的一種,其實現機制是沿著一棵樹的深度遍歷各個節點,并盡可能深地搜索樹的分支, DFS?的算法為線性時間復雜度。適合對拓撲結構未知的樹進行遍歷。?在一個處理器系統的初始化階段。PCI?總線樹的拓撲結構是未知的,?適合使用DFS?算法進行遍歷,?
1,?host?主橋掃描pci?總線0?上的設備,?系統軟件首先忽略這條總線上的所有pci?agent?設備,因為在這些設備之下不會掛接新的pci?總線。?
2,host?主橋首先發現pci?橋1,?并將pci?橋1的secondary bus?命名為pci?總線1.?系統軟件將初始化pci?橋1?的配置空間,?將pci 1?的primary bus number?寄存器賦值為0.?而將secondary bus number?寄存器賦值為1,?即pci?橋1?的上游pci?總線號為0,?而下游pci?總線號為1.
3,?掃描pci?總線1,?發現pci?橋2,?并將pci?橋2?的secondary bus?命名為pci?總線2,?系統軟件將初始化pci?橋2的配置空間,?將pci?橋2?的primary bus number?寄存器賦值為1,?而將secondary bus number?寄存器賦值為2.
4?
pci?總線device?號的分配
一條pci?總線會掛接各種各樣的Pci?設備,而每一個pci?設備在pci?總線下具有唯一的設備號。系統軟件通過總線號和設備各定位一個pci?設備之后,才能訪問這個pci?設備的配置寄存器。值得注意的是,系統軟件使用“地址尋址方式”?訪問pci?設備的存儲器和i/o?地址空間,這與訪問配置空間使用的"id尋址方式”不同。
pci?設備的idsel?信號與pci?總線的ad [31:0]?信號的連接關系決定了該設備在這個pci?總線的設備號。?如上文所述,每一個pci?設備都使用獨立的idsel?信號,該信號將與pci總線的ad[31:0]?信號連接。
pci?總線事務由一個地址周期加若干個數據周期組成。