【我所認知的BIOS】—>PCI SCAN
LightSeed
2009-5-12
1、PCI梗概
Study到現在已經快一年了,目前我自己理解,覺得PCI device在整個計算機的應用中是很重要,及其重要的一個東東。整由於它重要,所以可能一節我還講不完,分幾次把我所理解的PCI相關東東都總結一下。PCI是外設元件互連標準(Peripheral Component Interconnect)那麼我們平時說的PCI device就是符合這個標準的設備。(^.^廢話)這個標準由英代爾(Intel)公司1991年推出的用於定義局部匯流排的標準。此標準允許在電腦內安裝多達10個遵從PCI標準的擴展卡。最早提出的PCI匯流排工作在33MHz頻率之下,傳輸帶寬達到133MB/s(33MHz * 32bit/s),基本上滿足了當時處理器的發展需要。隨著對更高性能的要求,1993年又提出了64bit的PCI匯流排,後來又提出把PCI 匯流排的頻率提升到66MHz。目前廣泛採用的是32-bit、33MHz的PCI 匯流排,64bit的PCI插槽更多是應用於伺服器產品。從結構上看,PCI是在CPU和原來的系統匯流排之間插入的一級匯流排,具體由一個橋接電路實現對這一層的管理,並實現上下之間的介面以協調資料的傳送。
2、現實中的PCI
平時我們說XX買了一個不錯的PCI顯卡,YY買了一個PCI to USB的適配器,那麼它們都爲什麽會有個PCI三個字呢?是因為他們都是插在PCI插槽上,普通主板上的PCI插槽如圖1.1

圖1.1 普通的PCI插槽
3、PCI設備要運作,我們應該怎麼做?
PCI設備要運作,那麼就需要PCI SCAN。
******************引用 start**********************
[Why need PCI SCAN]
現在的computer system泰半由許多PCI devices所組成,因此,BIOS POST中另一個重要的 task is : PCI_SCAN !!!
它代表的是: BIOS會掃瞄 whole system,找出所有的PCI devices; initial them and build a linked list of PCI devices.在此list中的每一個node都代表一個PCI device,且含有其 characteristics !
Ex. Vendor ID,Device ID, PFA,Option ROM exist or NOT,...etc.
一旦建好此表,以後的 tasks 隨時都可以參考 !!!
所以, after PCI_SCAN,有兩件事完成了:
1. PCI device initialization;device config registers(Part A) are correctly set ...
2. One data structure is built to describe the PCI devices in whole system(建在memory中)
這也是屬於kernel code part ^_^ ( system 一般很少 hang at this stage...)
******************引用 end***********************
以上引用自<小華的部落格>
連接:http://biosengineer.blogspot.com/2007/10/bios-pci-scan-9.html
到這裡可能多半的人都會想到那麼怎麼去scan這些PCI device呢?
4、PCI device scan
4.1PCI設備的configuration space是什麽
顧名思義,PCI設備的configuration space是用來配置PCI device的。我們平時在BIOS修改的某些寄存器就是修改這個裏面的東東。這個space是嚴格按照PCI spec來做的,查看詳細的說,請參見PCI spec2.3的chapter 6 page 195。圖4.1是配置空間的位置說明,截于PCI spec。

圖4.1 PCI配置空間的map
4.2怎麼判斷PCI device存在
掃描PCI device一般都是這樣,讀取PCI設備的configuration space中vendor ID 和device ID,判斷他們是否為0xFFFF。若是,則說明該PCI device是不存在的。(因為每個PCI device的製造商都會把他們的ID填入這個位置,而且是read only的。)
4.3怎麼訪問PCI設備的configuration space
用CF8和CFC兩個端口來訪問,爲了能夠不失真我引用了spec里的原文來說明。“Two DWORD I/O locations are used to generate configuration transactions for PC-ATcompatible systems. The first DWORD location (CF8h) references a read/write registerthat is named CONFIG_ADDRESS. The second DWORD address (CFCh) references a read/write register named CONFIG_DATA”從CONFIG_ADDRESS和 CONFIG_DATA其實就很容易看出了,當我們向CF8端口(CONFIG_ADDRESS)寫入規定的格式地址時,便可以從CFC端口(CONFIG_DATA)讀回相應的數據。
4.4 PCI scan的技巧
這裡兩個小技巧:
① 在讀回的端口,你可以取其中的任何一個byte或者word甚至整個double word
② 爲了提高掃描的效率,其實可以先查看header type這個寄存器中的bit7。Bit7的0與1表示該PCI設備是否是single function的,若single function device那麼這個時候就可以直接scan下一個PCI 設備啦。
4.5 訪問舉例
圖4.1是向CF8端口寫入的地址格式,截圖于spec page 32

圖4.1
以下是一段訪問配置空間的code。
mov eax, 80020500h ;bus 2, device 0, function 5(这里原本我写错了,是网友goldencrest帮我纠正了过来,谢谢!)
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
in eax, dx
以此類推,變可以把PCI device的整個configuration space都讀取出來。效果圖見圖4.2

圖4.2 用ADU顯示出來的PCI configuration space數據截圖
以上是我對PCI scan的理解。不足之處還望各位指正。
本文详细介绍了PCI设备在计算机系统中的重要性及BIOS POST过程中PCI扫描的任务。解释了如何通过读取配置空间中的Vendor ID和Device ID来判断PCI设备的存在,并介绍了访问配置空间的方法。
1万+

被折叠的 条评论
为什么被折叠?



