我一直想知道 BIOS(除了进行 POST、启动引导加载程序并在按下电源按钮后将控制权传递给操作系统之外)在操作系统运行时是否有任何目的或功能?
操作系统在运行时是否与 BIOS 通信?如果是,如何通信?
答案1
使用现代操作系统,几乎没有据报道,Linus Torvalds 曾说它的任务是“加载操作系统然后离开那里”。
较旧的操作系统(例如 MS-DOS)依靠 BIOS 通过调用中断来执行许多任务(例如磁盘访问)。
对于现代操作系统,引导加载程序可以快速切换到 32 位或 64 位模式并执行操作系统内核。内核可以注册自己的中断处理程序,用户空间应用程序可以调用这些中断处理程序。内核的例程可以更具可移植性(因为它们不依赖于特定硬件)、更灵活(操作系统供应商可以根据需要更改它们,而不必使用硬件附带的任何程序)、更复杂(它们可以执行任意复杂的代码,而不是编程到 BIOS 中的代码),并且更安全(因为操作系统可以控制对共享资源的访问并防止程序相互破坏,从而实现自己的任意权限方案)。
为了与特定硬件交互,操作系统可以加载并使用自己的设备驱动程序。因此操作系统或应用程序根本不需要调用大多数 BIOS 例程。事实上,出于安全原因,BIOS 中断甚至被禁用。由于 BIOS 处于 16 位实模式,因此现代操作系统更难调用它。
虽然在操作系统运行时 BIOS 的使用非常有限,但其功能仍然被外围使用。例如,当计算机睡眠时,操作系统不会运行,最终由固件将硬件设置为正确的状态以暂停和恢复操作系统。这些用途通常仅限于交流电源接口调用而不是调用完整的 BIOS 接口。ACPI 是 BIOS 扩展,它“将电源管理置于操作系统 (OSPM) 的控制之下,而不是以前的 BIOS 中心系统,后者依赖特定于平台的固件来确定电源管理和配置策略”。
请注意,官方的“BIOS”指的是特定的固件接口,但该术语通常用于指代一般的计算机固件。一些最近的计算机(尤其是 Apple 计算机)已将 BIOS(严格意义上)替换为UEFI,这当然就是实现这些功能所需要的。
有关 BIOS 的作用如何随着时间的推移而减弱的更多信息,请参阅维基百科。
答案2
BIOS 为操作系统提供了许多服务,其中大部分与电源管理有关:
- 修改 CPU 和总线时钟
- 启用/禁用主板设备
- 扩展端口电源控制
- 挂起到磁盘和挂起到 RAM
- 恢复事件设置
由于操作系统可以更快地恢复其状态(仅重新加载内核状态,并在需要时交换程序状态,这比重新加载整个 RAM 要快得多),因此大多数情况下操作系统都会实现磁盘暂停功能,但该功能仍然保留在规范中。
挂起到 RAM 不能由操作系统实现,因为它依赖于 BIOS 跳过 RAM 初始化和测试,因此操作系统需要一个 API 来告诉 BIOS 它打算使用当前 RAM 内容恢复。为了提供此服务,BIOS 要求操作系统保留某个 RAM 区域不变。
所有 BIOS 服务的操作系统接口都是一段虚拟机代码,需要在模拟器上运行,并生成硬件所需的 I/O 操作。对于挂起,这通常是这样实现的:执行硬件写入之一会触发中断,从而将控制权转移到 BIOS。
答案3
在现代系统(例如使用 UEFI 标准的系统)中,操作系统主要在三个领域使用 BIOS。第一个领域是一系列称为 UEFI 运行时服务的服务。这些服务允许操作系统获取只有 BIOS 知道的信息,例如 BIOS 使用的时间、启动顺序、当前用户安全配置文件、有关主板、DIMM 等的信息。
第二种是系统管理模式,它是内存的隐藏部分 (SMRAM),由高优先级中断 (SMM) 访问。许多 BIOS 使用它来实现高安全性 OEM 功能或实现硬件解决方法。
第三个是 ACPI。ACPI 提供配置、电源管理以及操作系统使用的硬件数据和代码,以增强操作系统驱动程序使用行业标准或设备驱动程序可以找到的信息。例如,是否有特殊信号来控制硬盘驱动器电源,或者是否有标准未涵盖的特殊方式来与电池通信。
蒂姆