【问题标题】:At boot time how OS determines all the hardware?在启动时操作系统如何确定所有硬件?
【发布时间】:2015-12-14 13:13:27
【问题描述】:

我有以下相关问题:

  1. 有人知道操作系统如何知道主板上连接的所有硬件吗? (我猜这叫做“硬件枚举”)。

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

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

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

【问题讨论】:

    标签: operating-system hardware enumeration boot bios


    【解决方案1】:

    实际上,当您打开系统时,BIOS 会从 ROM 启动 IPL(初始程序加载)。检查所有连接的设备是否正常工作,并检查键盘、CMOS、硬盘等强制设备。如果不成功,它会给 BIOS 一个错误标志。 BIOS 通过视频设备向我们显示错误。

    如果成功,则将启动控制权移交给 BIOS 进行进一步处理。

    以上所有过程都称为POST(开机自检)。

    现在 BIOS 有了控制权。它检查所有辅助存储设备以查找操作系统的引导加载程序。如果命中,则引导加载程序的内存地址被传输到 RAM。

    Ram 开始执行引导加载程序。这里只有操作系统开始运行。

    如果引导加载程序未命中,则 bios 会向我们显示引导失败错误。

    我希望你的疑问得到澄清......

    【讨论】:

    • 不幸的是它没有帮助我。正是当您说“检查所有连接的设备是否正常工作......”时。那是我愿意知道它是如何完成的真实的事情。我读过一些文献,当操作系统加载时,它正在验证和配置所有检测到的硬件。这也是我需要了解它是如何完成的一点。无论如何都非常感谢。
    【解决方案2】:

    对不起,我的英语不是很好。

    回答问题 1 和 2:

    在启动过程中,仅加载查找和启动操作系统所必需的硬件模块。

    这些硬件模块是:主板、硬盘、RAM、显卡、键盘、鼠标、屏幕(由显卡检测)、网卡、CD/DVD,以及一些额外的外围设备,如 USB 单元。

    您连接到计算机的每个硬件模块都有一个控制器,它就像一个小型 BIOS,其中包含存储设备的所有信息:制造商、设备类型、协议等

    检测过程非常简单:BIOS 已硬编码有关主板的所有信息,以及所有通信端口。启动时,BIOS 向所有系统端口发送一个信号,询问“你是谁?你是什么?你是如何工作的?”的问题。并且所有连接的设备都通过发送它们的信息来回答。通过这种方式,计算机知道您有多少 RAM,是否存在键盘或鼠标,可用的存储设备,屏幕分辨率等...

    显然,此过程仅适用于启动系统所需的基本模块,不适用于需要特定驱动程序的复杂外围设备:打印机、扫描仪、网络摄像头......所有这些复杂的外围设备都由软件加载,一旦操作系统已扣款。

    回答问题3:

    如果您想在引导期间加载特定模块,您必须: - 为这个模块创建一个控制器。 - 如果外设过于复杂而无法从控制器加载所有内容,则必须直接在 BIOS 模块中编写所有过程以控制该模块,或者重新编程 IPL 以管理该特定模块。

    希望对你有所帮助

    【讨论】:

      【解决方案3】:

      在 PCI 之前,这要困难得多,您需要为每个产品设计一个技巧,即便如此,也很难弄清楚所有事情。使用 usb 和 pci,您可以扫描总线以查找供应商和产品 ID,然后您可以进入特定产品的发现(就像过去一样,这可能很困难)。有时,该板的详细信息受 NDA 保护,或者更糟糕的是,除非您在合适的团队中工作,否则您无法了解。

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

      简而言之,您需要数十年的经验来尝试成功并应用它,但由于您无法 100% 控制系统中的所有硬件,因此仍然会时常失败,那里有数百家供应商每个人都在做自己的事。

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

      【讨论】:

      • bios如何枚举pcie?有人阅读了 pci 规范和 pcie 硬件和处理器的文档,并刚刚实现了规范。 USB 也是如此,阅读规范,阅读硬件文档。
      • 首先,感谢您告诉我们要遵循的路径(PCI 和 USB 规范)。所以基本上,在 x86 系统中,您所要做的就是向 PCI 和 USB 硬件询问连接到它们的其余设备。但是现在,你是怎么找到这两个哥们的呢?请原谅我在这些问题上的新手无知。顺便说一句,我想知道它是如何在非 PCI 和 USB 板(Beagle、Raspberry 等)中完成的。还是它们也遵守 PCI 和 USB 总线标准?
      • 树莓派有usb,不确定小猎犬。在某种程度上,这些平台属于“告诉我你有什么”类别。将 linux 移植到这些平台需要在模块中编译特定视频等。
      • pcie 和 usb,主板的 bios 非常特定于那个确切的主板,你为那个主板上的确切硬件编译代码,就 pcie 主机和网桥等,还有 usb主机硬件,以便键盘和鼠标在 bios 中工作或按键进入设置等。
      • dwelch,非常感谢!我在启动时看到这个硬件确认过程周围非常暗的区域。我认为有某种“做这件事的标准方法”适用于许多类型的硬件平台。但是多么令人失望!!!
      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多