【问题标题】:What does "echo 1 > rom" for PCI devices do, and how can I do it programatically?PCI 设备的“echo 1 > rom”有什么作用,如何以编程方式完成?
【发布时间】:2013-04-20 22:55:36
【问题描述】:

我正在尝试编写一个程序来在 linux 上转储选项/扩展 ROM。我已经有必要的 PCI 端口 IO 来从偏移 0x30 处的 PCI 配置数据中获取扩展 ROM 的基地址并使其启用,但是当我尝试访问内存中的基时,我得到了段错误。因此,我试图了解当您从 linux 命令行执行“echo 1 > rom”时会发生什么,因为之后 rom 似乎很容易访问(有关更多上下文,请参见此处:http://etherboot.org/wiki/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]”这一行 现在根据 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 > rom”时,它确实 NO 更改行以删除“禁用”,实际上它根本没有对lspci的输出。那么“echo 1 > rom”在做什么而我不是,这使得随后可以执行“dd if=rom of=/tmp/rom”?

非常感谢

【问题讨论】:

    标签: linux pci


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      然后我使用 setpci 来切换 PCI 配置空间中的“exROM BAR 启用位”。注意符号 value:mask 在 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”。

      【讨论】:

      • 您的回答非常复杂,值得赞赏。大多数人。不在 PC 中发生的二进制/内存内容中。 :)
      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 2020-01-04
      • 1970-01-01
      • 2023-04-07
      • 2011-05-05
      • 2013-07-30
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多