操作系统是从 BIOS 获取此信息,还是自行扫描总线以检测系统上安装了哪些硬件。在网上环顾四周后,不同的来源说了不同的话。有人说 BIOS 检测到硬件,然后将其存储在内存中,然后操作系统读取,其他人说操作系统扫描总线(例如 pci)以了解硬件。
我会认为现代操作系统会忽略 BIOS 并自行完成。
任何帮助,将不胜感激。
谢谢。
操作系统是从 BIOS 获取此信息,还是自行扫描总线以检测系统上安装了哪些硬件。在网上环顾四周后,不同的来源说了不同的话。有人说 BIOS 检测到硬件,然后将其存储在内存中,然后操作系统读取,其他人说操作系统扫描总线(例如 pci)以了解硬件。
我会认为现代操作系统会忽略 BIOS 并自行完成。
任何帮助,将不胜感激。
谢谢。
一般来说,大多数现代操作系统(Windows 和 Linux)将重新扫描检测到的硬件作为引导序列的一部分。事实证明,相信 BIOS 来检测一切并正确设置它是不可靠的。
在典型的 x86 PC 中,有多种技术用于检测连接的硬件。
PCI 和 PCI Express 总线具有一种称为配置空间的标准机制,您可以对其进行扫描以获取连接设备的列表。这包括安装在 PCI/PCIe 插槽中的设备,以及芯片组中的控制器(视频控制器、SATA 等)。
如果检测到 IDE 或 SATA 控制器,操作系统/BIOS 必须与控制器对话以获取连接驱动器的列表。
如果检测到 USB 控制器,则 OS/BIOS 会加载 USB 协议栈,然后枚举连接的集线器和设备。
对于“旧版”ISA 设备,情况要复杂一些。即使您的主板上没有 ISA 插槽,系统中通常仍然有许多“ISA”设备(串行端口、并行端口等)。这些设备通常缺乏真正标准化的自动检测方法。要检测这些设备,有 2 个选项:
探测已知地址 - 串行端口通常位于 0x3F8、0x2F8、0x3E8、0x2E8,因此从这些地址中读取,看看那里是否有看起来像串行端口 UART 的东西。这远非完美。您可能有一个未扫描的非标准地址的串行端口。您也可能在其中一个地址处有一个非串行端口设备,该设备对被探测响应不佳。还记得 Windows 95 和 98 在安装过程中检测硬件时如何锁定很多吗?
ISA Plug-n-Play——随着 ISA 被 PCI 淘汰,该标准一度流行一时。您可能不会遇到很多支持此功能的设备。我相信在 Windows Vista 及更高版本中默认禁用 ISA PnP,但我现在正在努力寻找它的来源。
ACPI枚举 - 操作系统可以依靠 BIOS 在 ASL 代码中描述这些设备。(见下文。)
此外,系统中可能有许多非 PnP 设备处于半固定地址,例如TPM 芯片、HPET或笔记本电脑键盘上的那些“特殊”按钮。对于要向操作系统解释的这些设备,标准方法是使用 ACPI。
BIOS ACPI 表应向操作系统提供主板上设备的列表。这些表是用一种称为ASL(或 AML 编译形式)的语言编写的。在启动时,操作系统读取 ACPI 表并枚举任何描述的设备。请注意,要使其正常工作,主板制造商必须正确编写其 ASL 代码。 情况并非总是如此。
当然,如果所有自动检测方法都失败了,您可能会被迫手动安装驱动程序。您可以通过 Windows 中的添加新硬件向导来执行此操作。(具体步骤因您安装的 Windows 版本而异。)
我看到很多关于系统硬件的信息,除了内存,它是除 cpu 之外的主要重要部分之一,有趣的是也没有真正提及。这是公平的,因为也许有很多事情要列举,你有点看不到森林穿过树木。
对于 x86/64 平台上的内存,您需要查询 BIOS 或 EFI 以获取内存映射。对于 BIOS,这是 int 0x15 句柄 0xe820。EFI 有它自己的机制来提供类似的信息。
这将向您显示硬件等保留了哪些内存范围,以便您的操作系统知道不要管它们。(好吧,你当然也必须建造那部分;D)
对于其他平台,操作系统通常会配置为固定的内存大小,就像在嵌入式平台中一样。没有适合您的 BIOS,并且在内存上执行某种暴力破解充其量是不可靠的。(据我所知!-在 x86/64 之外没有太多经验!!!)
对于 CPU,您肯定会想查看 MSR、控制寄存器和 CPUID 函数来枚举 CPU 并查看它的功能。您可以查询是否支持例如 64 位模式,以及所有 cpu 上可能不存在的一些其他功能。
对于 pci 等其他硬件,我建议像 myron-semack 所说的那样研究 PCI 规范、pci-express,重要的是 ACPI 作为实现,这将使您处理硬件和电源管理。更通用/根据更新的标准。