google了一圈,發現xilinx論壇的一個回答比較好, 連接以下:express
https://forums.xilinx.com/t5/PCI-Express/PCI-express-Base-Address-Register/td-p/685289google
裏面講了如何訪問BAR指定的mem空間。spa
下面對BAR空間以及配置空間的訪問作一個系統的總結,其實就是在回答如下幾個問題:接口
- PCIe中四種tlp和BAR空間的關係是怎樣的?
- tlp是怎麼發起的?
- tlp是怎麼到相應的下游設備的?
1、四種tlp和BAR空間的關係
四種傳輸以下路由
類型 | 說明 |
---|---|
mem req tlp | 訪問mem空間 |
io req tlp | 訪問io空間 |
cfg req tlp | 訪問配置空間 |
message tlp | 設備專用 |
故名思義, mem req就是訪問mem空間的,io req就是訪問io空間的,cfg req就是訪問配置空間的,這個再清楚不過了,應該毫無爭議。文檔
2、tlp是怎麼發起的
結論:tlp是總線接口發起的。這貌似是一句屁話,可是事實確實是這樣的,疑惑可能在於software要作什麼事情,要知道,像usb但是要本身去配置trb的。這裏有個重要的模塊:atu。software要作的就是配置atu。get
atu又是啥? atu是地址轉換單元(Address Translation Unit)的縮寫,負責把cpu域的物理地址轉換到PCI域的總線地址。若是總線上有訪問對應CPU域物理地址的請求,將會經過atu生成tlp,tlp中的地址就是atu轉換後的地址。atu中還有一個重要的配置:tlp類型。不一樣的tlp路由策略是不同的,而路由策略影響對地址的解析。這裏就涉及tlp路由了。it
3、tlp路由
對於配置請求來說,地址被解析成總線號+設備號+功能號+偏移,文檔上講的基於ID的路由,因此訪問的是和設備對應的4KB配置空間。而對於io請求或者mem請求,是基於地址的路由,經過和各個設備的BAR空間範圍的比較來確認地址落在哪一個設備的BAR空間上,而後進行相應的讀寫操做。io
最後記錄一下wiki上關於PCIe各個版本的理論速度table