我所认知的BIOS—PCI SCAN

本文介绍了PCI设备的基本概念,PCI在计算机系统中的重要性,以及如何进行PCI设备扫描。在BIOS POST过程中,PCI SCAN用于初始化和构建PCI设备链表。通过访问配置空间的特定端口来判断和访问PCI设备,文章还分享了PCI扫描的技巧和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【我所認知的BIOS—>PCI SCAN

LightSeed     

2009-5-12     

1PCI梗概

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

2、現實中的PCI

平時我們說XX買了一個不錯的PCI顯卡,YY買了一個PCI to USB的適配器,那麼它們都爲什麽會有個PCI三個字呢?是因為他們都是插在PCI插槽上,普通主板上的PCI插槽如圖1.1

 

 

1.1 普通的PCI插槽

3PCI設備要運作,我們應該怎麼做?

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 PCIdevices.在此list中的每一個node都代表一個PCI device,且含有其
 characteristics ! 

Ex. Vendor ID,Device ID, PFA,Option ROM exist orNOT,...etc. 

一旦建好此表,以後的 tasks 隨時都可以參考
 !!! 

所以, after PCI_SCAN,有兩件事完成了
:
1. PCI device initialization;device config registers(Part A) arecorrectly set ...
2. One data structure is built to describe the PCI devices in wholesystem(
建在memory


這也是屬於kernel code part ^_^ (system 一般很少 hang at this stage...)

******************引用 end***********************

 

以上引用自<</span>小華的部落格>

連接:http://biosengineer.blogspot.com/2007/10/bios-pci-scan-9.html

 

到這裡可能多半的人都會想到那麼怎麼去scan這些PCIdevice呢?

 

4PCIdevice scan

4.1PCI設備的configuration space是什麽

顧名思義,PCI設備的configuration space是用來配置PCI device的。我們平時在BIOS修改的某些寄存器就是修改這個裏面的東東。這個space是嚴格按照PCI spec來做的,查看詳細的說,請參見PCI spec2.3chapter 6 page 195。圖4.1是配置空間的位置說明,截于PCI spec

 

 

4.1PCI配置空間的map

4.2怎麼判斷PCI device存在

掃描PCIdevice一般都是這樣,讀取PCI設備的configuration spacevendor ID device ID,判斷他們是否為0xFFFF。若是,則說明該PCI device是不存在的。(因為每個PCI device的製造商都會把他們的ID填入這個位置,而且是read only的。)

4.3怎麼訪問PCI設備的configuration space

CF8CFC兩個端口來訪問,爲了能夠不失真我引用了spec里的原文來說明。“Two DWORD I/O locations are used to generate configurationtransactions for PC-ATcompatible systems. The first DWORD location(CF8h) references a read/write registerthat is namedCONFIG_ADDRESS. The second DWORD address (CFCh) references aread/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這個寄存器中的bit7Bit701表示該PCI設備是否是single function的,若single function device那麼這個時候就可以直接scan下一個PCI 設備啦。

4.5 訪問舉例

4.1是向CF8端口寫入的地址格式,截圖于spec page 32

 

 

4.1

以下是一段訪問配置空間的code

mov eax,80020500h    ;bus2, 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的理解。不足之處還望各位指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值