我正試圖編寫一個程序來在Linux上轉儲選項/擴展ROM。我已經有必要的PCI端口IO來獲得一個擴展ROM的基地址在偏移0x30處的PCI配置數據,並使其啓用,但是當我嘗試訪問內存中的基地時,我得到一個段錯誤。所以我試圖理解當你從linux命令行執行「echo 1> rom」時發生了什麼,因爲在那之後ROM看起來很多可訪問(參見這裏的更多上下文:http://etherboot.org/wiki/romdumping)PCI設備的「echo 1> rom」是做什麼的,我該如何編程?
E.g.比方說,我做到以下幾點:
lspci的
01:00.0 VGA兼容控制器:ATI技術公司RV370 5B60 [的Radeon X300(PCIE)
CD/SYS /總線/ PCI /設備/0000:01:00.0
的lspci -x -v -s 01:00.0
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 5B60 [Radeon X300 (PCIE)]
Subsystem: ATI Technologies Inc Device 0402
Flags: bus master, fast devsel, latency 0, IRQ 27
Memory at d0000000 (32-bit, prefetchable) [size=128M]
I/O ports at dc00 [size=256]
Memory at dfde0000 (32-bit, non-prefetchable) [size=64K]
Expansion ROM at dfe00000 [disabled] [size=128K]
Capabilities: [50] Power Management version 2
Capabilities: [58] Express Endpoint, MSI 00
Capabilities: [80] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable+
Capabilities: [100] Advanced Error Reporting <?>
Kernel driver in use: radeon
Kernel modules: radeonfb, radeon
00: 02 10 60 5b 07 04 10 00 00 00 00 03 10 00 80 00
10: 08 00 00 d0 01 dc 00 00 00 00 de df 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 02 10 02 04
30: 00 00 e0 df 50 00 00 00 00 00 00 00 0b 01 00 00
注中說道:「dfe0000擴展ROM行0 [disabled] [size = 128K]「 現在根據PCI規範,我可以看到底部位應該設置爲1來啓用擴展ROM,所以我做了0xdfe00001的讀寫操作,然後我得到了
01:00.0 VGA compatible controller: ATI Technologies Inc RV370 5B60 [Radeon X300 (PCIE)]
Subsystem: ATI Technologies Inc Device 0402
Flags: bus master, fast devsel, latency 0, IRQ 27
Memory at d0000000 (32-bit, prefetchable) [size=128M]
I/O ports at dc00 [size=256]
Memory at dfde0000 (32-bit, non-prefetchable) [size=64K]
Expansion ROM at dfe00000 [size=128K]
Capabilities: [50] Power Management version 2
Capabilities: [58] Express Endpoint, MSI 00
Capabilities: [80] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable+
Capabilities: [100] Advanced Error Reporting <?>
Kernel driver in use: radeon
Kernel modules: radeonfb, radeon
00: 02 10 60 5b 07 04 10 00 00 00 00 03 10 00 80 00
10: 08 00 00 d0 01 dc 00 00 00 00 de df 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 02 10 02 04
30: 01 00 e0 df 50 00 00 00 00 00 00 00 0b 01 00 00
(注意在偏移的0x30現在線稱0×01 「在dfe00000擴展ROM [大小= 128K]」)。
但我無法訪問0xdfe00000。同時,當O在命令行中執行「echo 1> rom」時,它會執行而不是更改該行以刪除「disabled」,並且實際上它完全不會對lspci的輸出做任何更改。那麼,什麼是「回聲1> ROM」,我不這樣做,這使得隨後可以執行「dd if = rom of =/tmp/rom」?
非常感謝