亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 關(guān)于MMIO訪問(wèn)錯(cuò)誤 [打印本頁(yè)]

作者: Solaris12    時(shí)間: 2009-04-23 13:58
標(biāo)題: 關(guān)于MMIO訪問(wèn)錯(cuò)誤
請(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è)備的寄存器時(shí),過(guò)程中發(fā)生的錯(cuò)誤實(shí)際上會(huì)觸發(fā)一個(gè)root port上的中斷。

但當(dāng)一個(gè)地址沒(méi)有真正設(shè)備寄存器對(duì)應(yīng)的話,會(huì)產(chǎn)生root port上的中斷嗎? 還是產(chǎn)生一個(gè)CPU的trap?

[ 本帖最后由 Solaris12 于 2009-4-24 13:20 編輯 ]
作者: accessory    時(shí)間: 2009-04-24 00:29
這個(gè)要看PCIE的SPEC了吧? 不知道哪里能搞到免費(fèi)的?
作者: Solaris12    時(shí)間: 2009-05-21 16:14
原帖由 accessory 于 2009-4-24 00:29 發(fā)表
這個(gè)要看PCIE的SPEC了吧? 不知道哪里能搞到免費(fèi)的?



是否產(chǎn)生trap不屬于PCIE spec的范圍。

這個(gè)問(wèn)題我知道答案了,在x86上,只會(huì)有root port上的錯(cuò)誤中斷,沒(méi)有異常。

在SPARC上除了root port 中斷,還會(huì)有CPU上的trap.
作者: zx_wing    時(shí)間: 2009-05-21 16:47
原帖由 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è)備 ...

沒(méi)有真正的寄存器映射,產(chǎn)生的就是個(gè)page fault。
作者: Solaris12    時(shí)間: 2009-05-21 18:01
原帖由 zx_wing 于 2009-5-21 16:47 發(fā)表

沒(méi)有真正的寄存器映射,產(chǎn)生的就是個(gè)page fault。


你確定嗎?

同事說(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)有任何錯(cuò)誤,返回全f.


實(shí)驗(yàn)結(jié)果和你說(shuō)的不一樣啊。
作者: zx_wing    時(shí)間: 2009-05-21 19:03
原帖由 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)有 ...

>>找一個(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ī)定:
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.)

作者: Solaris12    時(shí)間: 2009-05-21 22:42
原帖由 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ī)定:



可能我說(shuō)的不清楚,ACPI里有個(gè)MMCFG表,這個(gè)表里有配置空間MMIO的物理地址。

根據(jù)BDF,可以算出每個(gè)設(shè)備的物理地址。這個(gè)是PCI fireware規(guī)范里講的,你可以去看下。

我前面講的實(shí)驗(yàn)和x86的機(jī)制1一點(diǎn)關(guān)系也沒(méi)有,全部是mov指令訪問(wèn)屬于MMIO方式。

我們要做的就是在支持MMIO的平臺(tái)上用MMIO的方式枚舉設(shè)備。
作者: bluesky_jxc    時(shí)間: 2009-05-22 09:31
標(biāo)題: 回復(fù) #7 Solaris12 的帖子
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)的。

[ 本帖最后由 bluesky_jxc 于 2009-5-22 13:10 編輯 ]
作者: Solaris12    時(shí)間: 2009-05-22 12:17
原帖由 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ì)改變的。





主要的區(qū)別在MMIO可以訪問(wèn)4K范圍的配置空間,IO只能256字節(jié)以內(nèi)。

通過(guò)BDF可以得到一個(gè)物理地址,這個(gè)地址可能沒(méi)有對(duì)應(yīng)的設(shè)備,也可能有。

如果沒(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)也可能不一樣。


這是x86的實(shí)現(xiàn),不同硬件平臺(tái)不同的,SPARC除了root port錯(cuò)誤中斷,還會(huì)有CPU的trap.
作者: bluesky_jxc    時(shí)間: 2009-05-22 12:39
標(biāo)題: 回復(fù) #9 Solaris12 的帖子
>>”通過(guò)BDF可以得到一個(gè)物理地址,這個(gè)地址可能沒(méi)有對(duì)應(yīng)的設(shè)備,也可能有“。

[ 本帖最后由 bluesky_jxc 于 2009-5-22 13:09 編輯 ]
作者: Solaris12    時(shí)間: 2009-05-22 12:56
原帖由 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 ...



怎么會(huì)等于沒(méi)說(shuō)呢?

我枚舉設(shè)備的時(shí)候,我就是拿一個(gè)不確定是否存在的BDF來(lái)枚舉?

只不過(guò)現(xiàn)在的枚舉是利用配置機(jī)制1,而我們現(xiàn)在要做的是用MMIO枚舉,而且BDF和每個(gè)設(shè)備配置空間基地址的對(duì)應(yīng)關(guān)系是規(guī)范里定義好了的。

可以參考

PCI FIRMWARE SPECIFICATION, REV. 3.0 P40

[ 本帖最后由 Solaris12 于 2009-5-22 13:00 編輯 ]
作者: bluesky_jxc    時(shí)間: 2009-05-22 13:08
標(biāo)題: 回復(fù) #11 Solaris12 的帖子
OK,你說(shuō)的是配置空間,我前面誤解了。通過(guò)BDF,和系統(tǒng)為PCI CFG空間的基地址,就可以得到其對(duì)應(yīng)的4K空間。

我收回前面說(shuō)的話
作者: Solaris12    時(shí)間: 2009-05-22 13:23
原帖由 bluesky_jxc 于 2009-5-22 13:08 發(fā)表
OK,你說(shuō)的是配置空間,我前面誤解了。通過(guò)BDF,和系統(tǒng)為PCI CFG空間的基地址,就可以得到其對(duì)應(yīng)的4K空間。

我收回前面說(shuō)的話



是配置空間,IO空間和Memory空間有BAR可以用啊。

謝謝你的答復(fù)。
作者: zx_wing    時(shí)間: 2009-05-22 13:59
原帖由 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) ...

我之前不知道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ò)了。
作者: epegasus    時(shí)間: 2009-05-22 16:04
摘自pci系統(tǒng)結(jié)構(gòu)中文版,18.10

如果配置寫交易的目標(biāo)不存在DEVSEL#不被任何PCI功能有效.

當(dāng)DEVSEL#保持無(wú)效時(shí),主pci橋交易與主設(shè)備失敗,并配置配置狀態(tài)寄存器的收到主失敗位.
當(dāng)收到主設(shè)備失敗的讀交易,橋向處理器返回全1做為讀數(shù)據(jù).
當(dāng)經(jīng)歷主設(shè)備失敗寫交易,橋的操作就像寫交易正常完成一樣.

因?yàn)檫@個(gè)原因全1的ID定為無(wú)效.

__________

我對(duì)host橋和CPU之間的關(guān)聯(lián)細(xì)節(jié)不清楚,也不知道該看什么資料.

[ 本帖最后由 epegasus 于 2009-5-22 16:11 編輯 ]
作者: Solaris12    時(shí)間: 2009-05-22 16:19
原帖由 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ò)了。 ...



1. 是

2. 是, 只不過(guò)有槽沒(méi)有插卡。

3. 保護(hù)模式下用mov指令,全f的結(jié)果。
作者: zx_wing    時(shí)間: 2009-05-22 16:38
原帖由 Solaris12 于 2009-5-22 16:19 發(fā)表



1. 是

2. 是, 只不過(guò)有槽沒(méi)有插卡。

3. 保護(hù)模式下用mov指令,全f的結(jié)果。

>>3. 保護(hù)模式下用mov指令,全f的結(jié)果。
那這個(gè)就不對(duì)了。保護(hù)模式下mov后的是虛擬地址,所以你訪問(wèn)到的是不知道映射到哪兒去的物理內(nèi)存。
作者: Solaris12    時(shí)間: 2009-05-23 00:31
原帖由 zx_wing 于 2009-5-22 16:38 發(fā)表

>>3. 保護(hù)模式下用mov指令,全f的結(jié)果。
那這個(gè)就不對(duì)了。保護(hù)模式下mov后的是虛擬地址,所以你訪問(wèn)到的是不知道映射到哪兒去的物理內(nèi)存。


使用之前整個(gè)MCFG區(qū)域是映射到虛擬地址空間的。只不過(guò)在boot早期階段Solaris的映射函數(shù)比較特殊。
作者: zx_wing    時(shí)間: 2009-05-23 10:01
原帖由 Solaris12 于 2009-5-23 00:31 發(fā)表


使用之前整個(gè)MCFG區(qū)域是映射到虛擬地址空間的。只不過(guò)在boot早期階段Solaris的映射函數(shù)比較特殊。

既然是整個(gè)映射的,那返回全f就是spec規(guī)定的訪問(wèn)不存在設(shè)備的情況。
看了一下linux的,貌似也是整個(gè)映射

  1. static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg)
  2. {
  3.         void __iomem *addr;
  4.         u32 size;

  5.         size = (cfg->end_bus_number + 1) << 20;
  6.         addr = ioremap_nocache(cfg->address, size);
  7.         if (addr) {
  8.                 printk(KERN_INFO "PCI: Using MMCONFIG at %Lx - %Lx\n",
  9.                        cfg->address, cfg->address + size - 1);
  10.         }
  11.         return addr;
  12. }

復(fù)制代碼





歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2