Operating system 操作系统如何检测硬件?

Operating system 操作系统如何检测硬件?,operating-system,kernel,hardware,bios,Operating System,Kernel,Hardware,Bios,操作系统是从BIOS获取此信息,还是自己扫描总线以检测系统上安装了哪些硬件。在网上到处看看,不同的消息来源说了不同的事情。一些人说BIOS检测硬件,然后将其存储在内存中,然后由操作系统读取,另一些人说操作系统扫描总线(如pci)以了解硬件 我原以为现代OSs会忽略BIOS而自己做 任何帮助都将不胜感激 谢谢。一般来说,大多数现代操作系统(Windows和Linux)将在启动序列中重新扫描检测到的硬件。事实证明,相信BIOS能够检测一切并正确设置是不可靠的 在典型的x86 PC中,有多种技术可用于

操作系统是从BIOS获取此信息,还是自己扫描总线以检测系统上安装了哪些硬件。在网上到处看看,不同的消息来源说了不同的事情。一些人说BIOS检测硬件,然后将其存储在内存中,然后由操作系统读取,另一些人说操作系统扫描总线(如pci)以了解硬件

我原以为现代OSs会忽略BIOS而自己做

任何帮助都将不胜感激


谢谢。

一般来说,大多数现代操作系统(Windows和Linux)将在启动序列中重新扫描检测到的硬件。事实证明,相信BIOS能够检测一切并正确设置是不可靠的

在典型的x86 PC中,有多种技术可用于检测连接的硬件

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

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

如果检测到USB控制器,操作系统/BIOS将加载USB协议堆栈,然后加载连接的集线器和设备

对于“遗留”ISA设备,事情要复杂一些。即使主板上没有ISA插槽,系统中通常仍有许多“ISA”设备(串行端口、并行端口等)。这些设备通常缺乏真正标准化的自动检测方法。要检测这些设备,有两个选项:

  • 探测已知地址-串行端口通常位于0x3F8、0x2F8、0x3E8、0x2E8,因此请从这些地址中读取,并查看是否有类似串行端口UART的内容。这远非完美。您的串行端口可能位于未扫描的非标准地址。您还可能在其中一个地址处有一个非串行端口设备,它对被探测的响应不好。还记得Windows 95和98在安装过程中检测硬件时是如何大量锁定的吗

  • -随着ISA逐渐被淘汰,转而支持PCI,这一标准在一段时间内大受欢迎。您可能不会遇到许多支持此功能的设备。我相信在WindowsVista和更高版本中默认情况下ISA PnP是禁用的,但我现在正在努力寻找一个源代码

  • 枚举-操作系统可以依赖BIOS以ASL代码描述这些设备。(见下文。)

  • 此外,系统中可能有许多非PnP设备位于半固定地址,例如a或笔记本电脑键盘上的那些“特殊”按钮。对于要向操作系统解释的这些设备,标准方法是使用ACPI

    BIOS ACPI表应向操作系统提供主板上设备的列表。这些表是用一种叫做的语言编写的。在引导时,操作系统读取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实现,这将使您能够处理硬件和电源管理。更一般一点/根据较新的标准。

    首先,您需要指定您正在谈论的硬件?
    BIOS
    至少大多数人都知道,它现在是一种吱吱作响的x86现象,即使在那时,它也远远不是唯一的游戏。@Marko谢谢,我指的是主板上使用老式BIOS的32位cpu,而不是UEFI。如果有人走进商店,买了一台装有Windows的普通PC,Windows是如何了解该PC中的硬件的。我知道,在Vista Windows使用NTDETECT查找硬件之前,我很难找到Vista和更高版本OSs的硬件,是BCD吗?