2013-04-26 117 views
1

我正試圖編寫一個程序來在Linux上轉儲選項/擴展ROM。我已經有必要的PCI端口IO來獲得一個擴展ROM的基地址在偏移0x30處的PCI配置數據,並使其啓用,但是當我嘗試訪問內存中的基地時,我得到一個段錯誤。所以我試圖理解當你從linux命令行執行「echo 1> rom」時發生了什麼,因爲在那之後ROM看起來很多可訪問(參見這裏的更多上下文:http://etherboot.org/wiki/romdumpingPCI設備的「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」?

非常感謝

回答

2

ROM是一種特殊的文件通常是讀保護的,除非「1」被寫入到它,從sysfs-pci.txt

的「ROM」文件是特殊的,因爲它提供了只讀如果可用,只能訪問設備的 ROM文件。然而,默認情況下,它被禁用,所以應用程序 應在嘗試讀取 調用之前將字符串「1」寫入文件以啓用該文件,並在向文件寫入「0」之後通過訪問將其禁用。注意 該設備必須啓用ROM讀取才能成功返回數據。 如果驅動程序沒有綁定到設備,可以使用上面記錄的 「啓用」文件啓用它。

因此,它看起來像'echo 1> rom'確實只能通過sysfs讀取rom。 也許你不能通過它的欄訪問rom,因爲默認情況下它沒有映射到dfe00000?不知道,值得檢查。