日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux 核心--7.PCI設(shè)備( 四 )



在圖6.5中沒有顯示出來的是一個(gè)指向系統(tǒng)中所有PCI設(shè)備的指針 , pci_devices 。系統(tǒng)中所有的PCI設(shè)備將其各自的pci_dev數(shù)據(jù)結(jié)構(gòu)加入此隊(duì)列中 。這個(gè)隊(duì)列被Linux核心用來迅速查找系統(tǒng)中所有的PCI設(shè)備 。


6.6.2PCI設(shè)備驅(qū)動(dòng)
PCI設(shè)備驅(qū)動(dòng)根本不是真正的設(shè)備驅(qū)動(dòng) , 它僅是在系統(tǒng)初始化時(shí)由操作系統(tǒng)調(diào)用的一些函數(shù) 。PCI初始化代碼將掃描系統(tǒng)中所有的PCI總線以找到系統(tǒng)中所有的PCI設(shè)備(包括PCI-PCI橋接器) 。

它通過PCI BIOS代碼來檢查當(dāng)前PCI總線的每個(gè)插槽是否已被占用 。如果被占用則它建立一個(gè)pci_dev數(shù)據(jù)結(jié)構(gòu)來描敘此設(shè)備并將其連接到已知PCI設(shè)備鏈表中(由pci_devices指向) 。

首先PCI初始化代碼掃描PCI總線0 。它將試圖讀取對(duì)每個(gè)PCI槽中可能的PCI設(shè)備廠商標(biāo)志與設(shè)備標(biāo)志域 。當(dāng)發(fā)現(xiàn)槽被占用后將建立一個(gè)pci_dev結(jié)構(gòu)來描敘此設(shè)備 。所有這些PCI初始化代碼建立的pci_dev結(jié)構(gòu)(包括PCI-PCI橋接器)將被連接到一個(gè)單向鏈表pci_devices中 。

如果這個(gè)PCI設(shè)備是一個(gè)PCI-PCI橋接器則建立一個(gè)pci_bus結(jié)構(gòu)并將其連接到由pci_root指向的pci_dev結(jié)構(gòu)和pci_bus樹中 。PCI初始化代碼通過類別代碼0x060400來判斷此PCI設(shè)備是否是一個(gè)PCI-PCI橋接器 。然后Linux 核心代碼將配置此PCI-PCI橋接器下方的PCI設(shè)備 。如果有更多的橋接器被找到則進(jìn)行同樣的配置 。顯然這個(gè)過程使用了深度優(yōu)先搜索算法;系統(tǒng)中PCI拓?fù)鋵⒃谶M(jìn)行廣度映射前先進(jìn)行深度優(yōu)先映射 。圖6.1中Linux將在配置PCI總線0上的視頻設(shè)備前先配置PCI設(shè)備1上的以太與SCSI設(shè)備 。

由于Linux優(yōu)先搜索從屬的PCI總線,它必須處理PCI-PCI橋接器二級(jí)總線與從屬總線序號(hào) 。在下面的pci-pci總線序號(hào)分配中將進(jìn)行詳細(xì)討論 。


配置PCI-PCI橋接器 - 指定PCI總線序號(hào)





圖6.6 配置PCI系統(tǒng):第一部分

為了讓PCI-PCI橋接器可以傳遞PCI I/O、PCI內(nèi)存或PCI配置地址空間 , 它們需要如下內(nèi)容:


Primary Bus Number:主干總線序號(hào)
位于PCI-PCI橋接器上方的總線序號(hào)
Secondary Bus Number:二級(jí)總線序號(hào)
位于PCI-PCI橋接器下方的總線序號(hào)
Subordinate Bus Number:從屬總線序號(hào)
在橋接器下方可達(dá)的最大總線序號(hào)
PCI I/O and PCI Memory Windows:PCI I/O與PCI內(nèi)存窗口
對(duì)于PCI-PCI橋接器下方所有PCI I/O地址空間與PCI內(nèi)存地址空間的窗口基址和大小 。
配置任一PCI-PCI橋接器時(shí)我們對(duì)此橋接器的從屬總線序號(hào)一無所知 。不知道是否還有下一級(jí)橋接器存在,同時(shí)也不知道指派給它們的序號(hào)是什么 。但可以使用深度優(yōu)先遍歷算法來對(duì)掃描出指定PCI-PCI橋接器連接的每條總線 , 同時(shí)將它們編號(hào) 。當(dāng)找到一個(gè)PCI-PCI橋接器時(shí) , 其二級(jí)總線被編號(hào)并且將臨時(shí)從屬序號(hào)0xff指派給它以便對(duì)其所有下屬PCI-PCI橋接器進(jìn)行掃描與指定序號(hào) 。以上過程看起來十分復(fù)雜 , 下面將提供一個(gè)實(shí)例以幫助理解 。


PCI-PCI 橋接器序號(hào)分配:步驟1
考慮圖6.6所顯示的拓?fù)浣Y(jié)構(gòu) , 第一個(gè)被掃描到的橋接器將是橋1 。所以橋1下方的總線將被編號(hào)成總線1,同時(shí)橋1被設(shè)置為二級(jí)總線1且擁有臨時(shí)總線序號(hào)0xff 。這意味著所有PCI總線序號(hào)為1或以上的類型1 PCI配置地址將被通過橋1傳遞到PCI總線1上 。如果其總線序號(hào)為1則此配置循環(huán)將被轉(zhuǎn)換成類型0 配置循環(huán) , 對(duì)于其它序號(hào)不作轉(zhuǎn)換 。這正是Linux PCI初始化代碼所需要的按序訪問及掃描 PCI總線1 。



圖6.7 配置PCI系統(tǒng):第二部分



PCI-PCI 橋接器序號(hào)分配:第二步
由于Linux使用深度優(yōu)先算法,初始化代碼將繼續(xù)掃描PCI總線1 。在此處它將發(fā)現(xiàn)一個(gè)PCI-PCI橋接器2 。除此橋接器2外再?zèng)]有其它橋接器存在 , 因此它被分配給從屬總線序號(hào)2 , 這正好和其二級(jí)接口序號(hào)相同 。圖6.7畫出了此處的PCI-PCI橋接器與總線的編號(hào)情況 。

推薦閱讀