PCI設備的地址空間


PCI配置空間(PCI Configuration Space)
PCI設備(PCI device)都有一個配置空間,大小為256字節,實際上是一組連續的寄存器,位於設備上。其中頭部64字節是PCI標准規定的,格式如下:
 

 
剩余的部分是PCI設備自定義的。
PCI配置空間頭部有6個BAR(Base Address Registers),BAR記錄了設備所需要的地址空間的類型(memory space或者I/O space),基址以及其他屬性。BAR的格式如下:
 

 
可以看出,設備可以申請兩類地址空間,memory space和I/O space,它們用BAR的最后一位區別開來。
說到地址空間,計算機系統中,除了我們常說的memory address(包括邏輯地址、虛擬地址(線性地址)、CPU地址(物理地址)),還有I/O address,這是為了訪問I/O設備(主要是設備中的寄存器)而設立的,大部分體系結構中,memory address和I/O address都是分別編址的,且使用不同的尋址指令,構成了兩套地址空間,也有少數體系結構將memory address和I/O address統一編址(如ARM)。
有兩套地址空間並不意味着計算機系統中需要兩套地址總線,實際上,memory address和I/O address是共用一套地址總線,但通過控制總線上的信號區別當前地址總線上的地址是memory address還是I/O address。北橋芯片(Northbridge,Intel稱其Memory Controller Hub,MCH)負責地址的路由工作,它內部有一張address map,記錄了memory address,I/O address的映射信息,一個典型的address map如圖:
 
 

 
我們來看北橋是如何進行地址路由的。根據控制總線上的信號,北橋首先可以識別地址屬於memory space還是I/O space,然后分別做處理。
比如若是memory space,則根據address map找出目標設備(DRAM或Memory Mapped I/O),若是DRAM或VGA,則轉換地址然后發送給內存控制器或VGA控制器,若是其它I/O設備,則發送給南橋。
若是I/O space,則發送給南橋(Southbridge,Intel稱其I/O Controller Hub,ICH),南橋負責解析出目標設備的bus, device, function號,並發送信息給它。
PCI設備會向計算機系統申請很多資源,比如memory space, I/O space, 中斷請求號等,相當於在計算機系統中占位,使得計算機系統認識自己。
PCI設備可以通過兩種方式將自己的I/O存儲器(Registers/RAM/ROM)暴露給CPU:
在memory space申請地址空間,或者在I/O space申請地址空間。
這樣,PCI設備的I/O存儲器就分別被映射到CPU-relative memory space和CPU-relative I/O space,使得驅動以及操作系統得以正常訪問PCI設備。對於沒有獨立I/O space的體系結構(如ARM),memory space和I/O space是統一編址的,也就是說memory space與I/O space等價了,這時,即使PCI設備在BAR表明了要申請I/O space,實際上也是分配在memory space的,所以驅動無法使用I/O端口指令訪問I/O,只能使用訪存指令。在Windows驅動開發中,PCM_PARTIAL_RESOURCE_DESCRIPTOR記錄了為PCI設備分配的硬件資源,可能有CmResourceTypePort, CmResourceTypeMemory等,后者表示一段memory地址空間,顧名思義,是通過memory space訪問的,前者表示一段I/O地址空間,但其flag有CM_RESOURCE_PORT_MEMORY和CM_RESOURCE_PORT_IO兩種,分別表示通過memory space訪問以及通過I/O space訪問,這就是PCI請求與實際分配的差異,在x86下,CmResourceTypePort的flag都是CM_RESOURCE_PORT_IO,即表明PCI設備請求的是I/O地址空間,分配的也是I/O地址空間,而在ARM或Alpha等下,flag是CM_RESOURCE_PORT_MEMORY,表明即使PCI請求的I/O地址空間,但分配在了memory space,我們需要通過memory space訪問I/O設備(通過MmMapIoSpace映射物理地址空間到虛擬地址空間,當然,是內核的虛擬地址空間,這樣驅動就可以正常訪問設備了)。
 
為了為PCI設備分配CPU-relative space,計算機系統需要知道其所申請的地址空間的類型、基址等,這些信息記錄在設備的BAR中,每個PCI配置空間擁有6個BAR,因此每個PCI設備最多能映射6段地址空間(實際很多設備用不了這么多)。PCI配置空間的初始值是由廠商預設在設備中的,於是設備需要哪些地址空間都是其自己定的,可能造成不同的PCI設備所映射的地址空間沖突,因此在PCI設備枚舉(也叫總線枚舉,由BIOS或者OS在啟動時完成)的過程中,會重新為其分配地址空間,然后寫入PCI配置空間中。
 
通過memory space訪問設備I/O的方式稱為memory mapped I/O,即MMIO,這種情況下,CPU直接使用普通訪存指令即可訪問設備I/O。
通過I/O space訪問設備I/O的方式稱為port I/O,或者port mapped I/O,這種情況下CPU需要使用專門的I/O指令如IN/OUT訪問I/O端口。
 
常見的MMIO例子有,VGA card將framebuffer映射到memory space,NIC將自己的片上緩沖映射到memory space,實際上,最典型的MMIO應該是DRAM,它將自己的存儲空間映射到memory space,是占用CPU地址空間最多的“設備”。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM