linux - PCI 设备的 "echo 1 > rom"有什么作用,我如何以编程方式执行此操作?

标签 linux pci

我正在尝试编写一个程序来在 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

请注意“Expansion ROM at dfe00000 [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 处的 0x01 和现在显示“Expansion ROM at dfe00000 [size=128K]”的行)。

但我无法访问 0xdfe00000。同时,当 O 在命令行中执行“echo 1 > rom”时,它没有更改行以删除“disabled”,实际上它根本没有对lspci 的输出。那么我没有做的“echo 1 > rom”是做什么的,这使得随后可以执行“dd if=rom of=/tmp/rom”?

非常感谢

最佳答案

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

然后我使用 setpci 来切换 PCI 配置空间中的“exROM BAR 启用位”。请注意 setpci 的“写入”形式中的符号值:掩码:

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”。

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

相关文章:

windows - Windows 中的 lshw 等价物是什么,它可以像 lshw 在 Linux 上那样给我一个硬件树结构?

c - 通过 USB 使用 FPGA 访问 PC 的 PCI 卡

pci - pci_enable_device_mem 和 pci_enable_device 有什么区别?

hardware - 用户空间 PCI BAR 访问在每个偏移处返回 0xFF

pci - PCI/PCIe BAR 大小是如何确定的?

linux - Tomcat 正在启动但无法访问本地主机 :8080

xml - 有什么办法可以在 Linux 中将两个 xml 合并为一个 xml

c - 读取密码文件时,程序从未遇到 EOF

c - 写入/dev/mem 失败,地址错误

c - 将字段添加到共享库中的结构的最简单方法是什么?