PCI设备的“echo 1> rom”有什么作用,我该如何以编程方式进行?

时间:2013-04-26 17:23:49

标签: linux pci

我正在尝试编写一个程序来转储linux上的选项/扩展ROM。我已经拥有必要的PCI端口IO,以便在偏移量为0x30的PCI配置数据中获取扩展ROM的基地址并使其启用,但是当我尝试访问内存中的基站时,我得到一个段错误。因此,当我从linux命令行执行“echo 1&gt; rom”时,我正在尝试了解发生了什么,因为之后rom似乎可以访问(请参阅此处了解更多上下文:http://etherboot.org/wiki/romdumping)< / p>

E.g。假设我做了以下事情:

lspci的

01:00.0 VGA兼容控制器:ATI Technologies Inc RV370 5B60 [Radeon X300(PCIE)]

cd /sys/bus/pci/devices/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

请注意“dfe00000上的扩展ROM [禁用] [大小= 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的0x01和现在说“扩展ROM为dfe00000 [size = 128K]”的行)。

但我无法访问0xdfe00000。同时,当O在命令行中执行“echo 1&gt; rom”时,它会 NOT 更改行以删除“禁用”,并且实际上它根本不做任何更改lspci的输出。那么“echo 1&gt; rom”做什么我不是,这使得它随后可以做“dd if = rom of = / tmp / rom”?

非常感谢

2 个答案:

答案 0 :(得分:2)

rom是一个特殊的文件,通常是读取保护的,除非从sysfs-pci.txt写入“1”:

  

'rom'文件的特殊之处在于它提供对设备的只读访问权限   ROM文件,如果有的话。但是,默认情况下禁用它,因此应用程序   应该在文件中写入字符串“1”以在尝试读取之前启用它   通过向文件写入“0”来调用并禁用它。注意   必须启用设备才能使rom读取成功返回数据。   如果驱动程序未绑定到设备,则可以使用该驱动程序启用它   'enable'文件,如上所述。

所以它看起来像'echo 1&gt; rom'真的只能通过sysfs读取rom。 也许你不能通过它的栏访问rom,因为默认情况下它没有映射到dfe00000?不确定,值得一试。

答案 1 :(得分:0)

我试图从NVidia VGA板(NVS310)中获取exROM内容-从Linux命令行:-) 这是我所做的,大约: 从lspci -vvn中,我发现我的电路板位于0000:02:00.0,其exROM为0xf7000000,大小为512 kB(并且其地址解码器在exROM BAR =通过PCI配置空间寄存器#c0的位0被禁用= =偏移量0x30)。

然后我使用setpci在PCI配置空间中切换该“ exROM BAR使能位”。注意setpci的“ write”形式的符号value:mask:

setpci --dumpregs
setpci -s 0000:02:00.0 ROM_ADDRESS
setpci -s 0000:02:00.0 ROM_ADDRESS=00000001:00000001
setpci -s 0000:02:00.0 ROM_ADDRESS
lspci -vvn -s 0000:02:00.0
dd if=/dev/mem of=vgabios.bin bs=64k skip=63232 count=8

这会在512 kB长的文件中产生一些看起来似是而非的二进制数据。

即使我在该伪文件中写了“ 1”,也无法通过/sys/bus/pci/devices/0000:02:00.0/rom进行访问。