2

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

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

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

请注意“扩展 ROM at dfe00000 [disabled] [size=128K]”的行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 > rom”时,它不会更改行以删除“禁用”,实际上它根本不会对 lspci 的输出进行任何更改。那么“echo 1 > rom”在做什么而我不是,这使得随后可以执行“dd if=rom of=/tmp/rom”?

非常感激

4

2 回答 2

2

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

“rom”文件的特殊之处在于它提供对设备 ROM 文件(如果可用)的只读访问。但是,默认情况下它是禁用的,因此应用程序应在尝试读取调用之前将字符串“1”写入文件以启用它,并在访问后通过将“0”写入文件来禁用它。请注意,必须启用设备才能进行 rom 读取才能成功返回数据。如果驱动程序未绑定到设备,则可以使用上面记录的“启用”文件启用它。

所以看起来'echo 1 > rom'实际上只能通过sysfs读取rom。也许您无法通过其栏访问 rom,因为它默认未映射到 dfe00000?不确定,但值得检查。

于 2013-06-03T13:25:10.247 回答
1

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

然后我使用 setpci 来切换 PCI 配置空间中的“exROM BAR 启用位”。请注意 setpci 的“写入”形式中的符号 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 长的文件中出现了一些看起来似是而非的二进制数据。

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

于 2018-09-04T21:07:21.653 回答