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