在启动时操作系统如何确定所有硬件?

fan*_*nte 1 hardware boot operating-system enumeration bios

我有这些相关问题:

  1. 有谁知道操作系统如何了解主板上连接的所有硬件?(我想这被称为“硬件枚举”)。

  2. 它如何确定特定 IO 地址上驻留的硬件类型(即:串行或并行或任何控制器)?

  3. 如何编写一个系统模块来完成这项工作?(假设尚未加载操作系统,仅加载 BIOS)。

我知道 BIOS 只是一个验证和一个用户友好的界面,用于在启动时配置硬件,之后对于大多数现代操作系统(win、Linux 等)没有真正的用途。此外,我知道对于 BIOS,找到所有硬件应该不难,因为它是由主板制造商专门调整的(谁知道有关它的一切!)。但对于 BIOS 之上的操作系统或应用程序来说,情况就完全不同了。正确的?

old*_*mer 5

在 PCI 出现之前,这要困难得多,每个产品都需要一个技巧,即使有,也很难弄清楚所有事情。使用 USB 和 PCI,您可以扫描总线以查找供应商和产品 ID,然后您可以进行特定于产品的发现(就像过去一样,这可能很困难)。有时,该委员会的详细信息受到 NDA 的保护,或者更糟糕的是,除非您在正确的团队中工作,否则您根本无法了解。

一般方法是基于检测(USB、PCIE 等供应商/产品 ID)加载驱动程序,或者根据该系列产品的文档为该系列产品编写驱动程序。既然你提到了 BIOS、win、linux,这意味着 X86 或 PC,并且几乎涵盖了自动检测功能。除此之外,您还依赖于知道系统中安装了哪些硬件以及附带的驱动程序的用户。或者以某种方式询问他们安装了什么(如果无法自动检测,则位于电缆末端或网络上的特定打印机是一个易于理解的示例)。

简而言之,您需要数十年的经验来尝试成功并应用它,但仍然会时不时地失败,因为您无法 100% 控制系统中的所有硬件,有数百家供应商各自在做自己的事情自己的事。

BIOS 枚举 x86 PC 的 pci(e),对于其他平台,操作系统可能会这样做。枚举包括根据 pci 兼容规则为设备分配地址空间。但在该地址空间内,您必须知道如何根据供应商文档(如果有)对该特定板进行编程。

  • BIOS如何枚举PCIE?有人阅读了 PCI 规范以及 PCIE 硬件和处理器的文档,并且刚刚实现了该规范。USB 也是如此,阅读规格,阅读硬件文档。 (2认同)