我正在尝试编写程序以在Linux上转储选项/扩展ROM。我已经具有必要的PCI端口IO,可以从偏移量0x30的PCI配置数据中获取扩展ROM的基址并启用它,但是当我尝试访问内存中的基址时,会出现段错误。因此,我试图了解当您从linux命令行执行“echo 1> rom”时发生了什么,因为在那之后rom似乎很容易访问(请参阅此处了解更多上下文:http://etherboot.org/wiki/romdumping)

例如。假设我执行以下操作:

lspci

01:00.0 VGA兼容 Controller :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,现在该行显示为“dfe00000 [size = 128K]的扩展ROM”)。

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

非常感激

最佳答案

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



因此,看起来“echo 1> rom”实际上仅允许通过sysfs读取rom。
也许由于默认情况下未将其映射到dfe00000,所以无法通过其栏访问rom吗?不确定,虽然值得检查。

关于linux - PCI设备的 “echo 1 > rom”有什么作用,我该如何以编程方式进行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16241986/

10-09 20:18