操作系统如何检测硬件?

RJS*_*h92 11 hardware operating-system kernel bios

操作系统是从BIOS获取此信息还是单独扫描总线以检测系统上安装的硬件.在网上浏览不同的消息来源说不同的事情.有人说BIOS检测到硬件,然后将其存储在操作系统随后读取的内存中,其他人则说OS扫描总线(例如pci)以了解硬件.

我会想到现代操作系统会忽略BIOS并自行完成.

任何帮助,将不胜感激.

谢谢.

myr*_*ack 14

一般来说,大多数现代操作系统(Windows和Linux)将重新扫描检测到的硬件作为启动顺序的一部分.信任BIOS以检测所有内容并正确设置已被证明是不可靠的.

在典型的x86 PC中,有一些用于检测连接硬件的技术组合.

PCI和PCI Express总线有一个称为配置空间的标准机制,您可以扫描该机制以获取连接设备的列表.这包括安装在PCI/PCIe插槽中的设备,以及芯片组中的控制器(视频控制器,SATA等).

如果检测到IDE或SATA控制器,则OS/BIOS必须与控制器通信以获取连接的驱动器列表.

如果检测到USB控制器,则OS/BIOS加载USB协议栈,然后枚举连接的集线器和设备.

对于"传统"ISA设备,情况稍微复杂一些.即使您的主板上没有ISA插槽,您通常在系统中仍有许多"ISA"设备(串行端口,并行端口等).这些设备通常缺乏真正标准化的自动检测方法.要检测这些设备,有两个选项:

  1. 探测已知地址 - 串行端口通常位于0x3F8,0x2F8,0x3E8,0x2E8,因此从这些地址读取并查看是否存在看起来像串行端口UART的内容.这远非完美.您可能在非标准地址处有一个未扫描的串行端口.您可能还在其中一个地址处有一个非串行端口设备,这些设备对被探测的响应不佳.还记得Windows 95和98在安装过程中检测硬件时如何锁定很多东西吗?

  2. ISA Plug-n-Play - 这个标准很受欢迎,因为ISA逐渐被淘汰,转而支持PCI.您可能不会遇到许多支持此功能的设备.我相信在Windows Vista及更高版本中默认禁用ISA PnP,但我现在很难找到它的来源.

  3. ACPI枚举 - 操作系统可以依靠BIOS在ASL代码中描述这些设备.(见下文.)

另外,系统中可能存在许多半固定地址的非PnP设备,例如TPM芯片,HPET或笔记本电脑键盘上的那些"特殊"按钮.对于要向OS解释的这些设备,标准方法是使用ACPI.

BIOS ACPI表应提供操作系统的主板上设备列表.这些表使用称为ASL(或编译表单的AML)的语言编写.在引导时,OS读入ACPI表并枚举任何描述的设备.请注意,为此,主板制造商必须正确编写其ASL代码. 情况并非总是如此.

当然,如果所有自动检测方法都失败了,您可能会被迫手动安装驱动程序.您可以通过Windows中的"添加新硬件向导"执行此操作.(具体步骤因您安装的Windows版本而异.)