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

时间:2016-03-12 14:22:16

标签: linux ubuntu configuration pci

我想从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 文件>,但保存后,文件似乎没有变化。 我确实以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

1 个答案:

答案 0 :(得分:1)

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

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

不幸的是,没有办法改变寄存器的只读属性,因为这几乎肯定是在硬件级别强制执行的。

假设您可以更改设备ID或供应商ID寄存器,我想这并不一定意味着工作的网络适配器,因为BIOS和操作系统将这些值用于ACPI和设备驱动程序。可能有一种方法可以在BIOS中伪造设备ID和供应商ID,但正如您所说,这不是一种选择,我认为它无论如何都不会起作用。

根据您的BIOS白名单的方式/原因,Qualcomm无线适配器与英特尔无线适配器可能会针对此问题提供一些解决方法。我说最好的解决方案是以某种方式改变BIOS白名单,可能是通过更新。

如果它有帮助,我有code可以修改任何设备的PCI配置寄存器(虽然这不会绕过硬件级别限制,如RO,RW,......)。我认为这不会解决您的问题,但至少您可以从中了解有关PCI配置寄存器的更多信息。