原帖由 Solaris12 于 2009-4-23 13:58 發(fā)表
請(qǐng)教一個(gè)硬件的問(wèn)題。
x86的物理內(nèi)存地址空間有4G靠下的一段范圍是MMIO的內(nèi)存,對(duì)這段內(nèi)存的訪問(wèn)實(shí)際上是對(duì)設(shè)備內(nèi)存和寄存器的訪問(wèn)。
假設(shè)你在訪問(wèn)PCIE的設(shè)備MMIO的區(qū)域,當(dāng)內(nèi)存地址對(duì)應(yīng)的位置有實(shí)際設(shè)備 ...
原帖由 Solaris12 于 2009-5-21 18:01 發(fā)表
你確定嗎?
同事說(shuō)他做了這個(gè)實(shí)驗(yàn),
1. 讀ACPI設(shè)備配置空間的基地址
2. 找一個(gè)不存在的BDF, 算出這個(gè)設(shè)備配置空間的基地址
3. 訪問(wèn)內(nèi)存方式,讀這個(gè)設(shè)備的vendorid
4. sparc panic, x86沒(méi)有 ...
Since 0 FFFFh is an invalid Vendor ID, it is adequate
for the host bus to PCI bridge to return a value of all 1's on read accesses to Configuration
Space registers of non-existent devices. (Note that these accesses will be terminated with a
Master-Abort.)
原帖由 zx_wing 于 2009-5-21 19:03 發(fā)表
>>找一個(gè)不存在的BDF, 算出這個(gè)設(shè)備配置空間的基地址
你說(shuō)的這個(gè)不是MMIO,是port I/O。訪問(wèn)PCI配置空間是通過(guò)0xCF8~0xCFF端口訪問(wèn)的。
對(duì)于非法訪問(wèn)訪問(wèn)返回全1在PCI spec中有規(guī)定:
原帖由 bluesky_jxc 于 2009-5-22 09:31 發(fā)表
IO和MMIO沒(méi)有本質(zhì)區(qū)別,通過(guò)IO和MMIO訪問(wèn)vendorID最后都由主橋轉(zhuǎn)成CFG access.
你的這個(gè)問(wèn)題和實(shí)現(xiàn)相關(guān)的,你訪問(wèn)的BDF不存在時(shí),主橋發(fā)起的CFG access沒(méi)有任何設(shè)備應(yīng)答,這個(gè)時(shí)候,我認(rèn)為返回全F是最好的實(shí)現(xiàn)方式。X86也是這么實(shí)現(xiàn)的。
你說(shuō)通過(guò)BDF可以得到物理地址?我的理解是,在特定平臺(tái)下,firmware也是特定的情況下,PCI插槽的設(shè)備特定的情況下,才能根據(jù) firmware的scan算法來(lái)得到,這個(gè)不具有普遍意義,舉個(gè)簡(jiǎn)單例子,如果我在bus num比較小的slot上插上一塊網(wǎng)卡(比如 bus num為2), 和我不插這塊網(wǎng)卡,導(dǎo)致bus num較大(比如5)的slot上分配到的物理地址就不會(huì)一樣,但是bus num為5的這個(gè)slot的BDF值不會(huì)改變的。
如果沒(méi)有設(shè)備應(yīng)答,或者出現(xiàn)映射的空間里沒(méi)有對(duì)應(yīng)的寄存器,訪問(wèn)這個(gè)寄存器時(shí)會(huì)發(fā)生target abort, 這個(gè)時(shí)候root port上會(huì)有錯(cuò)誤,但是這個(gè)錯(cuò)誤到底怎么處理,不同操作系統(tǒng)也可能不一樣。
原帖由 bluesky_jxc 于 2009-5-22 12:39 發(fā)表
>>”通過(guò)BDF可以得到一個(gè)物理地址,這個(gè)地址可能沒(méi)有對(duì)應(yīng)的設(shè)備,也可能有“。
這話說(shuō)了等于沒(méi)說(shuō),每一個(gè)物理地址都可以這么說(shuō),可能對(duì)應(yīng)一個(gè)設(shè)備,也可能沒(méi)有。通過(guò)BDF怎么得到物理地址,我說(shuō)了,這個(gè)和pci ...
原帖由 bluesky_jxc 于 2009-5-22 13:08 發(fā)表
OK,你說(shuō)的是配置空間,我前面誤解了。通過(guò)BDF,和系統(tǒng)為PCI CFG空間的基地址,就可以得到其對(duì)應(yīng)的4K空間。
我收回前面說(shuō)的話
原帖由 Solaris12 于 2009-5-21 22:42 發(fā)表
可能我說(shuō)的不清楚,ACPI里有個(gè)MMCFG表,這個(gè)表里有配置空間MMIO的物理地址。
根據(jù)BDF,可以算出每個(gè)設(shè)備的物理地址。這個(gè)是PCI fireware規(guī)范里講的,你可以去看下。
我前面講的實(shí)驗(yàn)和x86的機(jī)制1一點(diǎn)關(guān) ...
原帖由 zx_wing 于 2009-5-22 13:59 發(fā)表
我之前不知道MCFG這個(gè)東西,剛才去看了一下PCI firmware spec相關(guān)章節(jié)。對(duì)你同事做的實(shí)驗(yàn)有幾個(gè)疑問(wèn):
1. 訪問(wèn)的是否是通過(guò)BDF算出來(lái)的物理地址?
2.這個(gè)地址是在 base + size內(nèi)嗎? size = (cfg->end_bus_number + 1) << 20;
3. 最關(guān)鍵的一點(diǎn),你們是如何直接訪問(wèn)物理地址的?是在進(jìn)保護(hù)模式之間直接用的mov嗎?如果是,返回全f那肯定就是PCI spec規(guī)定的對(duì)不存在設(shè)備配置空間訪問(wèn)返回全f(見(jiàn)前面我貼的spec相關(guān)內(nèi)容)。如果不是,那你們?cè)L問(wèn)的地址根本就錯(cuò)了。 ...
原帖由 Solaris12 于 2009-5-22 16:19 發(fā)表
1. 是
2. 是, 只不過(guò)有槽沒(méi)有插卡。
3. 保護(hù)模式下用mov指令,全f的結(jié)果。
原帖由 zx_wing 于 2009-5-22 16:38 發(fā)表
>>3. 保護(hù)模式下用mov指令,全f的結(jié)果。
那這個(gè)就不對(duì)了。保護(hù)模式下mov后的是虛擬地址,所以你訪問(wèn)到的是不知道映射到哪兒去的物理內(nèi)存。
原帖由 Solaris12 于 2009-5-23 00:31 發(fā)表
使用之前整個(gè)MCFG區(qū)域是映射到虛擬地址空間的。只不過(guò)在boot早期階段Solaris的映射函數(shù)比較特殊。
歡迎光臨 Chinaunix (http://72891.cn/) | Powered by Discuz! X3.2 |