我正在尝试编写程序以在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/