rom"有什么作用,我如何以编程方式执行此操作?-6ren"> rom"有什么作用,我如何以编程方式执行此操作?-我正在尝试编写一个程序来在 Linux 上转储选项/扩展 ROM。我已经拥有必要的 PCI 端口 IO,可以从偏移 0x30 处的 PCI 配置数据中获取扩展 ROM 的基址并启用它,但是当我尝试访问-6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:03 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com