为什么我不能更改 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 配置寄存器的信息。
我想从 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 配置寄存器的信息。