在启动时,OS如何确定所有硬件?

时间:2015-09-17 15:24:08

标签: operating-system hardware enumeration boot bios

我有这些相关的问题:

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

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

  3. 如何编写可以完成这项工作的系统模块? (假设还没有加载操作系统,只有BIOS)。

  4. 我知道BIOS只是一个验证和用户友好的界面,可以在启动时配置硬件,在大多数现代操作系统(win,Linux等)之后没有实际用途。此外我知道,对于BIOS来说,找到所有硬件并不困难,因为它是由电路板制造商专门调整的(谁知道它的一切!)。但对于操作系统或BIOS以上的应用程序来说,这是一个完全不同的故事。正确?

3 个答案:

答案 0 :(得分:3)

预PCI比较困难,每个产品都需要一个技巧,即便如此,也难以解决所有问题。使用usb和pci,您可以扫描总线以查找供应商和产品ID,从中您可以进入特定于产品的发现(就像过去一样,这可能很困难)。有时,该董事会的详细信息受到NDA的保护,或者更糟糕的是,除非您在合适的团队中工作,否则您只是不了解。

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

简而言之,您需要花费数十年的经验来尝试成功并应用它,并且由于您没有100%控制系统中的所有硬件,因此仍然会失败,有数百家供应商在那里各自做自己的事情。

BIOS枚举x86 pc的pci(e),适用于OS可能执行的其他平台。枚举包括基于pci兼容规则为设备分配地址空间。但是在该地址空间内,您必须知道如何从供应商文档中对该特定电路板进行编程。

答案 1 :(得分:2)

抱歉,我的英语不是很好。

回答问题1和2:

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

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

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

检测过程非常简单:BIOS已经硬编码了主板的所有信息,包括所有通信端口。启动时,BIOS会向所有系统端口发送信号,询问问题"你是谁?你是做什么的?你是如何运作的?"所有连接的设备通过发送信息来回答。通过这种方式,计算机可以知道你有多少RAM,如果有键盘或鼠标,哪些存储设备可用,屏幕分辨率等...

显然,此过程仅适用于启动系统所需的基本模块,并且不适用于需要特定驱动程序的复杂外围设备:打印机,扫描仪,网络摄像头......所有这些复杂的外围设备都是在操作系统后通过软件加载的被指控。

回答问题3:

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

我希望我能帮助

答案 2 :(得分:1)

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

如果成功,则启动控制将转移到BIOS以进行进一步处理。

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

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

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

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

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