x86體系結構MMIO方式訪問PCIE擴展配置空間

硬件讀寫工具RWEverything

在Windows下,我們用RWEverything很容易可以看到PCIE所有的配置空間。該實用程序可訪問幾乎所有計算機硬件,包括PCI(PCI Express),PCI索引/數據,內存,內存索引/數據,I / O空間,I / O索引/數據,超級I / O,時鐘發生器,DIMM SPD ,SMBus設備,CPU MSR寄存器,ATA / ATAPI標識數據,磁盤讀寫,ACPI錶轉儲(包括AML解碼),嵌入式控制器,USB信息,SMBIOS結構,PCI Option ROM,MP配置表,E820表,EDID和遠程訪問。並且還提供了一個命令窗口來手動訪問硬件。

x86體系結構MMIO方式訪問PCIE擴展配置空間

適用於硬件工程師,固件(BIOS)工程師,驅動程序開發人員,QA工程師,性能測試工程師,診斷工程師等的強大實用程序。該軟件可以在http://rweverything.com/download/下載。

x86體系結構MMIO方式訪問PCIE擴展配置空間

PCIE擴展配置空間訪問

通常我們會用CF8和CFC端口的方式訪問PCIE基本配置空間。該方式支持配置機制1或者配置機制2,訪問時藉助in/out指令。配置機制2只在某些特定的主板上被使用。 新的設計應使用配置機制1來產生配置空間的物理操作。這種機制使用了兩個特定的32位I/O空間,即CF8h和CFCh。這兩個空間對應於PCI橋路的兩個寄存器,當橋路看到CPU在局部總線對這兩個I/O空間進行雙字操作時,就將該I/O操作轉變為PCI總線的配置操作。寄存器CF8h用於產生配置空間的地址(CONFIG-ADDRESS),寄存器CFCh用於保存配置空間的讀寫數據(CONFIG-DATA)。 將要訪問配置空間寄存器的總線號、設備號、功能號和寄存器號以一個雙字的格式寫到配置地址端口 (CF8H-CFBH),接著執行配置數據端口 (CFCH)的讀和寫,向配置數據口寫數據即向配置空間寫數據,從配置數據口讀數據即從配置空間讀數據。

PCI-E的配置空間大小為4096字節,如下圖所示。其中前256字節是與PCI兼容的配置寄存器。配置機制1僅僅能訪問[0-255]偏移之間的寄存器,也就是標準的PCI配置空間的寄存器。對於擴展PCIE配置空間的寄存器[256-4095],僅僅能使用MMIO內存映射方式訪問。

x86體系結構MMIO方式訪問PCIE擴展配置空間

MMIO是另外一種讀寫PCIE配置空間的方式。MMIO即內存映射I/O,它是PCI規範一部分,I/O設備被放置在內存空間。從處理器角度看,內存映射I/O後系統設備訪問起來和內存一樣。這樣訪問PCI-E設備就可以使用讀寫內存一樣的彙編指令完成,簡化了程序設計的難度和接口的複雜性。

PCIE配置空間的寄存器被編址到系統的物理內存空間,在支持ACPI規範x86系統上,操作系統通過讀MCFG表獲得系統中全部設備PCI配置空間的基地址。操作系統在引導時,枚舉PCI設備,從而知道每一個PCI設備的Bus, Device, Function號。有了BDF這三個編號,加上從MCFG中得到的基地址,就能夠計算出給定設備的PCI配置空間在物理內存空間的地址。

x86體系結構MMIO方式訪問PCIE擴展配置空間

上圖為通過RW軟件能夠讀取MCFG的基地址。配置機制1一般用於操作系統引導時枚舉PCI設備階段此時內存映射方式是無法在此階段使用的,由於能夠用配置機制1來訪問不正確應實際物理設備的BDF,由於這時最壞情況是得到全1的錯誤碼。但用內存映射方式這樣做時,訪問不存在的物理地址會產生一個異常。某些legacy的PCI設備或者橋片本身就不支持內存映射方式,所以此時配置機制1是訪問PCI配置空間的唯一選擇。


分享到:


相關文章: