我想通过 UEFI 获取有关硬件的信息。我知道,我可以在 Linux 中使用 fwts 工具获取 efi 变量并进行转储。另外,我知道 EFI shell 的“device”命令,它将显示由 UEFI 管理的所有设备。但我没有看到方法,如何从 Linux 获取该信息。我知道,有多种方法可以使用其他工具获取有关硬件的信息,但我想知道使用 UEFI 是否可以(如果用于我的学习)。
答案1
没有 UEFI 管理的设备。因为Linux操作系统调用了UEFI ExitBootServices函数。这是允许操作系统开始管理任何设备所必需的。
现代操作系统包括硬件设备的驱动程序。单个设备不应由两个不同的驱动程序驱动。这包括父设备/“总线”,它们用于枚举其子设备并与其通信。
例如,显示器上的 USB 集线器通过 USB-C 端口连接到计算机,该端口位于插入主板 PCI-E 插槽的 PCI-E 卡上。您的引导固件能够从连接到此 USB 端口的 USB 存储设备加载 EFI 可执行文件。但是,当您运行该可执行文件并调用 UEFI ExitBootServices 时,它就可以控制所有这些。
因此,一般规则是操作系统枚举所连接的硬件。固件不再具有控制权。您无法要求固件枚举当前连接的硬件并获得任何合理的结果。
一般规则也有例外。他们都非常难对付。所写的问题不包括枚举适用于您的计算机的所有例外情况的任何理由。所以不要这样做。
某些硬件信息可通过 ACPI 和 DMI 获得。从技术上讲,ACPI 表是通过 UEFI 提供的,通过传递一个指针(我想通过在操作系统由 UEFI 传递的内存映射中保留相关内存)。想必DMI也是类似的。
DMI 命令是dmidecode
. DMI 看起来主要是标识符的集合。其中一些是在启动时从硬件收集的。这些都不需要全面,所以基本上你需要有总线驱动程序来找到你需要的所有硬件设备。
有许多 ACPI 命令,包括acpidump
、 和acpixtract
。其中一个工具是一种名为 AML 的解释语言的反汇编程序,操作系统在各种场合运行该语言。
AML 可能听起来有点可怕,但它至少是经过设计的,这样您就可以避免操作系统驱动程序和 AML 驱动程序与相同的硬件关联,并导致冲突。例如,操作系统有一个用于嵌入式控制器设备的驱动程序,并且 AML 实际上可以与操作系统驱动程序通信。或者ACPI可以保留某些硬件资源,以便AML可以直接使用它们,并且OS知道不允许使用它们。
ACPI 还取代了以前版本的 ISA PNP。这用于枚举传统设备(例如串行端口),操作系统本身无法枚举它们。
同样,ACPI 名义上负责告诉操作系统查找初始 PCI 寄存器或 IO 内存地址。 (我不是最新的。但是如果 ACPI 说没有,我可以想象 Linux 无论如何都会尝试探测这个的正常地址)。
许多设备是通过 PCI 总线直接或间接访问的。
IIRC Windows 将通过将 PCI 显示为 ACPI 的子设备来在设备管理器中公开这一点。 Linux好像不麻烦(我pci0000:00/
直接in了/sys/devices
);我不记得 ACPI->PCI 是否是一种基本上没有必要公开的特殊格式,或者是否是 Linux 对它进行了特殊处理并且不费心将 ACPI 公开为父设备。