如何从 Linux 获取 BIOS 设备名称,与 Windows 设备管理器格式相同

如何从 Linux 获取 BIOS 设备名称,与 Windows 设备管理器格式相同

我的笔记本电脑有一个显示适配器,在 Windows 10 中我可以看到它BIOS 设备名称从..

设备管理器 > 显示适配器 > 属性 > 详细信息 > “BIOS 设备名称”

从那里我会看到一个弹出窗口,上面写着:\_SB.PCI0.GFX0

如果同一台笔记本电脑运行 Linux,我如何获取该信息?

干杯

更新

我需要此信息,因为我正在构建 hackintosh,并且需要构建 SSDT 来创建显示背光修复。我想帮忙Opencore project并提供一种在 Linux 中执行此操作的方法(目前)唯一的方法是切换到 Windows 并使用Device Manager

我尝试过dmidecodelspci但他们没有给我BIOS device nameWindows 提供的格式以及创建 SSDT 所需的格式。

我试过acpidump它让我更接近,但反编译的输出有反汇编错误。它包含我正在寻找的字符串\_SB.PCI0.GFX0,但我不知道如何创建一个脚本来读取该文件并将其与我的特定显示适配器相关联。例如:Intel(R) HD Graphics 4000.

这些是我迄今为止尝试过的命令,用于acpidump
将 ACPI 表从系统转储到文本文件:

sudo acpidump -o acpidump.out

从 acpidump 输出中提取二​​进制 ACPI 表

acpixtract -a acpidump.out

我现在有七个 ssdt*.data 文件。我将ssdt1.dat的二进制表反汇编成人类源码

iasl -d ssdt1.dat

这给出了一个很大的 .dsl 文件,这只是一千多行中的前 60 行。

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20190509 (64-bit version)
 * Copyright (c) 2000 - 2019 Intel Corporation
 * 
 * Disassembling to symbolic ASL+ operators
 *
 * Disassembly of ssdt1.dat, Mon Jun  7 09:54:08 2021
 *
 * Original Table Header:
 *     Signature        "SSDT"
 *     Length           0x00001EED (7917)
 *     Revision         0x01
 *     Checksum         0x9C
 *     OEM ID           "COMPAL"
 *     OEM Table ID     "CRV ORB "
 *     OEM Revision     0x00001000 (4096)
 *     Compiler ID      "ACPI"
 *     Compiler Version 0x00040000 (262144)
 */
DefinitionBlock ("", "SSDT", 1, "COMPAL", "CRV ORB ", 0x00001000)
{
    /*
     * iASL Warning: There was 1 external control method found during
     * disassembly, but only 0 were resolved (1 unresolved). Additional
     * ACPI tables may be required to properly disassemble the code. This
     * resulting disassembler output file may not compile because the
     * disassembler did not know how many arguments to assign to the
     * unresolved methods. Note: SSDTs can be dynamically loaded at
     * runtime and may or may not be available via the host OS.
     *
     * To specify the tables needed to resolve external control method
     * references, the -e option can be used to specify the filenames.
     * Example iASL invocations:
     *     iasl -e ssdt1.aml ssdt2.aml ssdt3.aml -d dsdt.aml
     *     iasl -e dsdt.aml ssdt2.aml -d ssdt1.aml
     *     iasl -e ssdt*.aml -d dsdt.aml
     *
     * In addition, the -fe option can be used to specify a file containing
     * control method external declarations with the associated method
     * argument counts. Each line of the file must be of the form:
     *     External (<method pathname>, MethodObj, <argument count>)
     * Invocation:
     *     iasl -fe refs.txt -d dsdt.aml
     *
     * The following methods were unresolved and many not compile properly
     * because the disassembler had to guess at the number of arguments
     * required for each:
     */
    External (_SB_.PCI0.GFX0, DeviceObj)
    External (_SB_.PCI0.GFX0._DOD, IntObj)
    External (_SB_.PCI0.GFX0.AINT, MethodObj)    // Warning: Unknown method, guessing 2 arguments
    External (_SB_.PCI0.GFX0.DD01._ADR, IntObj)
    External (_SB_.PCI0.GFX0.DD01._DGS, IntObj)
    External (_SB_.PCI0.GFX0.DD02._ADR, IntObj)
    External (_SB_.PCI0.GFX0.DD02._BCL, IntObj)
    External (_SB_.PCI0.GFX0.DD02._BCM, IntObj)
    External (_SB_.PCI0.GFX0.DD02._BQC, IntObj)

我想也许我需要反汇编,ssdt1.dat这样我就不会出现反汇编错误,然后有没有一种方法可以通过“Intel(R) HD Graphics 4000”之类的名称搜索反汇编文件中的设备,或者至少是显而易见的这是BIOS Device Name我的显示适配器的吗?

也许dmidecodelspciacpidump都可以组合成一个脚本吗?

任何其他帮助非常感谢。

柔性

答案1

我不知道这是否是最好的解决方案,或者它是否适用于每个 Linux 发行版,但我可以\_SB_.PCI0.GFX0使用以下命令找到我需要的信息:

# cat /sys/class/pci_bus/0000:00/device/0000:00:02.0/firmware_node/path

这也称为 ACPI 路径。为什么这个命令对我有用?

解释
在Linux中,一个PCI设备由16位域号、8位总线号、5位设备号和3位功能号来标识;最后三个数字通常称为设备的 BDF 或 B/D/F(总线/设备/功能)。

lspci命令可以使用...显示此标识号

# lspci -D
..
0000:00:02.0 VGA compatible controller: VMware SVGA II Adapter
..

该号码的格式0000:00:02.0domain:bus:device:function.

现在从终端使用此命令查找显示适配器的 ACPI 路径

# cat /sys/class/pci_bus/<domain:bus>/device/<domain:bus:device:function>/firmware_node/path

再说一次,我对这个主题不太了解,或者这个过程是否适用于所有发行版,但它确实适用于我的Ubuntu mate 20.04.1.

另一种黑客方法可能是按照我最初的问题中的步骤,使用acpidump,acpixtractiasl。然后只需在生成的反汇编 .dsl 文件中搜索DeviceObj.所以找到字符串:外部的 (SB.PCI0.GFX0,设备对象)意味着 ACPI 路径是\_SB_.PCI0.GFX0

参考
解释 lspci 的输出
有用的 Reddit 帖子

相关内容