为什么我不能更改 linux 上的 PCI 配置寄存器?

Why can I not change the PCI configuration registers on linux?

我想从 PCI 设备更改 Vendor_ID 和 Device_ID。 但是,我所做的每一个更改都不会保存,我不知道为什么。

首先,我尝试使用 setpci 进行更改,结果是:

# sudo setpci -s 01:00.0 00.w
# 8086
# sudo setpci -s 01:00.0 00.w=168C
# sudo setpci -s 01:00.0 00.w
# 8086

然后我尝试使用两个不同的十六进制编辑器进行相同的更改,编辑位于 /sys/bus/pci/devices/0000:01:00.0/[ 的 config 文件=36=],但保存后,文件似乎没有变化。 我确实以 root 身份打开它,保存时没有出现任何错误。

我也尝试了 ethtool,但它甚至无法访问寄存器:

# sudo ethtool -e wlan0
# Cannot get EEPROM data: Operation not supported

我在 Lubuntu 15.10 和 Knoppix 7.6 上都尝试了上述所有操作,结果完全相同。

那么,为什么会这样呢? 如果寄存器受到保护,有没有办法解除它们的保护?

更多信息:

  • 提到的pci设备是Intel 7260-AC无线网络适配器
  • 我希望 BIOS 将其识别为 Qualcomm Atheros AR9485 无线网络适配器,因为它的白名单会阻止其他所有内容。
  • 修改 BIOS 不是一个选项。
  • 我是 运行 来自 USB 驱动器的 Lubuntu 和 Knoppix

PCI 配置寄存器通常具有只读 (RO)、读写 (RW) 或其他不太常见的属性。

问题是您正在尝试将值写入只读寄存器。我没有看到这个特定设备的文档,但我使用过其他英特尔 PCI 设备,但我从未见过 RW (read/write) 设备 ID 或供应商 ID 寄存器。比如96页的这个link,VID和DID寄存器是RO(只读)

遗憾的是,无法更改寄存器的只读属性,因为这几乎肯定是在硬件级别强制执行的。

假设您可以更改设备 ID 或供应商 ID 寄存器,我想这不一定意味着网络适配器可以正常工作,因为 BIOS 和 OS 将这些值用于 ACPI 和设备司机。可能有一种方法可以在 BIOS 中伪造设备 ID 和供应商 ID,但正如你所说,这不是一种选择,我认为它无论如何也行不通。

根据 how/why 您的 BIOS 是否将 Qualcomm 无线适配器与 Intel 无线适配器列入白名单可能会为此问题提供一些解决方法。我说最好的解决方案是以某种方式改变 BIOS 白名单,也许通过更新。

如果有帮助,我有 code 可以修改任何设备的 PCI 配置寄存器(尽管这不会规避硬件级别限制,例如 RO、RW 等)。我认为这不会解决您的问题,但至少您可以从中了解更多关于 PCI 配置寄存器的信息。