我只是想问一下,当我在搜索有关 BIOS 的信息时,我发现大多数都是过时的文章,所以我只是对它现在如何工作有几个简单的问题。
如果我没记错的话,BIOS 的主要用途是将信息从 HDD 加载到 CPU(主要是某些 OS)。后来,他们添加了可以使用 int 指令调用的小例程,这使得 PC 中的某些任务变得简单,例如访问 HDD 或访问 VGA 等。
但是如果我的理解仍然正确,所有这些工作都可以由具有 ring 0 模式的其他每个程序手动完成。我的意思是,BIOS 没有其他每个程序都无法拥有的特殊功能,对吗?
我知道在 DOS 时代 BIOS 例程被广泛使用。但是现在呢?我的意思是,现在的操作系统甚至还会使用 BIOS 例程吗?当所有东西都有驱动程序时?
但是 BIOS 仍然会进行大量更新,修复许多错误,所以我想知道 BIOS 现在到底起着什么作用。
例如,我想改变 FSB 频率。您可以通过 BIOS 进行此操作,但您必须有其他方法才能做到这一点,对吗?因为 BIOS 只是程序。
我认为您可能需要 BIOS 的唯一用途是操作系统和特定硬件(如芯片组)之间的兼容层,但是,如果您知道到达硬盘的确切方式(哪些端口以及向它们发送哪些数据),那么您可以在没有 BIOS 的情况下做到这一点,对吗?谢谢。
答案1
“BIOS” 中的“BIOS”部分确实是硬件和操作系统之间的兼容层。是的,您可以直接驱动硬件,但您需要为每种主板设计编写驱动程序代码,以便您的应用程序可以在每台机器上运行。在 Lotus 123 还是一个 DOS 应用程序的遥远过去,最初的几个版本直接驱动并行打印机端口以加快打印性能,如果您有一台真正的 IBM PC 或非常好的克隆机,这一切都很好,但在某些 PC 上,123 无法打印,因为并行端口的电子设备与 IBM 设计略有不同。
BIOS 硬件例程和中断机制也有助于在试图使用相同硬件或同时读取相同寄存器的多个应用程序之间进行仲裁,因此 BIOS 可以防止无政府状态 - 即在争夺对低级硬件的访问权的应用程序之间发生崩溃。
“BIOS”的另外两个部分是计算机的开机自检 (POST) 例程和“CMOS 设置程序”。
一段时间以来,人们一直在努力取代 BIOS 设计 - 尤其是因为它作为硬件兼容层的功能是以性能为代价的。现在,越来越多的计算机采用一种称为可扩展固件接口 (EFI - 现在已演变为统一 EFI 或 UEFI) 的替代方式构建 - Apple 已经使用 EFI 一段时间了,一些高端台式机和服务器机器也是如此。如果你想了解更多,请查看此维基百科文章。这是最近的新闻报道。
答案2
你误解了一个非常重要的事情。BIOS 不是软件,而是固件。它是标准化硬件级功能的部分。它是加载所有其他“程序”的部分。
允许操作系统直接驱动硬件的主要问题是改进。例如,传统 x86 处理器早已被证明是死胡同。现代“x86”处理器在内部不是 x86。相反,它们也有一个固件(在这种情况下称为微代码),因此它们看起来像是 x86 处理器。固件的使用是一种封装级别。此外,现代 x86 处理器需要支持指令,这是由于 8086 和 268 系统中存在的怪癖而需要的,即使它们现在不怎么使用。
基本上,操作系统本身并不关心硬件如何工作。它只看到 BIOS 显示的内容,而这些内容在硬件层面上可能正确也可能不正确。这使得从事计算机制造和设计的人员之间的责任分离,并允许每个组织关注与其最接近的部分。大多数程序员不知道处理器或主板在低级上是如何工作的,他们也不需要知道,因为他们针对指定的接口进行编程。另一方面,芯片组设计师知道主板是如何工作的,因此他们还将 BIOS 编程到指定的接口。主板制造商本身实际上并不是从头开始制造主板。他们将完整的组件集成到单个系统中,并对主板的 BIOS 进行一些修改,以与所用的组件配合使用。固件也存在,因为 BIOS 与网络芯片的固件或音频芯片的固件等进行通信。
您经常看到的 BIOS 更新不是某些核心功能的更新。相反,如今主板制造商需要尽快推出其产品,因此他们试图尽快修改 BIOS,这通常会导致错误。有时 BIOS 更新是为了修复其他设备的固件。例如,英特尔为其处理器的微码提供更新。如果在处理器中发现重大错误,英特尔会将这些更新发送给使用受影响处理器的主板制造商,这些制造商将进行 BIOS 更新,从而更新处理器的微码(微码是只读的,因此每次启动时都需要执行此操作)。
至于更改 FSB 频率等,您始终可以通过 BIOS 进行。只是有些 BIOS 会向程序公开负责 FSB 的组件,以便程序可以对其进行修改。不过,这些程序是专门的,因为它们需要知道它们正在使用什么。
另一点是硬件制造商。硬件本身需要知道在哪里寻找程序。在简单的微控制器系统上(它们在功能上就像 30 年前的计算机一样),您有程序起点。微控制器始终读取单个内存地址,其中存储了程序启动位置的数据。BIOS 为 PC 执行此操作。想象一下,如果处理器直接访问 HDD 上的数据会有多复杂。它需要知道从自身到芯片组、HDD 控制器和 HDD 本身的一切如何工作,以及操作系统存储在 HDD 上的哪个位置。
读了你的问题好几次之后,我认为你对 BIOS 及其定位的看法的主要问题是操作系统与现代 PC 上的硬件之间的联系有多紧密。人们已经决定在 PC 上操作系统不会与硬件紧密联系。随着时间的推移,事实证明这一决定是正确的。看看核心引导(维基百科文章) 项目。他们正在计算机的 BIOS 芯片中实现整个 GNU/Linux 操作系统。如您所见,他们在特定主板的可用信息方面存在许多问题,但他们也有自己的优势。他们的系统可以在几秒钟内启动。另一台有趣的计算机是橡子。他们的电脑有完整的操作系统,位于一个芯片上。还有苹果。他们的操作系统与硬件的联系并不那么紧密,因此可以制作黑苹果,但与 PC 的关系仍然更密切。
最后,我认为 BIOS 现存的主要原因是 PC 平台的开放性。制造 PC 硬件非常容易,其中一个主要原因是没有一家公司控制 PC 规格。如果要消除 BIOS(或其较新的替代品),您需要有人确保操作系统开发人员和硬件设计师同步,这将非常复杂。
答案3
很久以前,计算机没有引导 ROM。它有一个直接修改 RAM 的接口,可以暂停 CPU、更改 RAM,然后重新启动 CPU。因此,当您重新启动系统时,您必须确保 CPU 已暂停,输入引导代码,该代码将从纸带或诸如此类的东西上加载第二阶段引导加载程序 (2bl),然后“取消暂停”您的 CPU。
显然,ROM 在这里起到了决定性的作用。当您启动基于 x86 CPU 的系统时,它会从地址 FFFF:FFF0 开始执行。这是 x86 CPU 的硬连线功能。ROM 必须驻留在该地址,BIOS 的最上部确实如此(通常从 E000:0000 开始)。
BIOS 一词是从旧的 CP/M 操作系统中保留下来的。CP/M 的结构是最低层的 ROM BIOS、中间的 BDOS(基本磁盘操作系统)和用户前面的 CCP(控制台命令处理器)。BIOS 具有执行低级功能的例程,例如读取/写入特定磁盘扇区、从键盘读取键、将字符写入屏幕等。BDOS 将使用 BIOS 功能来实现文件系统,而 CCP 将是使用 BDOS 和 BIOS 功能的命令 shell。其想法是 BIOS 将包含硬件特定接口,并且 BDOS 和 CCP 在任何 CP/M 系统上都可以相同。
BIOS 还将保存处理器执行的初始代码,该代码初始化所需的硬件、显示启动画面、从第一个磁盘驱动器的第一个扇区加载 2bl 并运行它。
MS-DOS 1.0 基本上是 CP/M 的 x86 实现,从 2.0 版开始添加了笨拙的类 Unix 功能,其结构也相同。当时的 IBM PC BIOS 还包含原始 AT BIOS 中的增强功能,例如视频模式切换、图形功能和硬盘支持。
但是,大多数 DOS 程序在启动后不使用 BIOS 功能;出于性能原因,它们直接访问硬件。这在 32 位 CPU 普及后尤为重要;BIOS 仅在较旧的 16 位模式下工作,因此从 32 位模式调用它会进一步降低性能。
大约在 1990 年,PC 架构开始扩展,并开始包含 APM、PnP 和 PCI 等新内容。因此,BIOS 开始承担更多功能并变得更大。PC 也开始使用芯片组而不是分立元件。初始化芯片组是使 RAM 和其他组件(如 PCI 总线)可用所必需的,因此必须由 BIOS 引导代码来处理。出于某种原因,许多芯片组供应商不喜欢记录他们的设置过程是如何工作的。
APM 由 BIOS 函数处理;也就是说,要关闭系统,操作系统必须调用 APM 函数。ACPI 是 APM 的后继者,也是当今 BIOS 的重头戏。ACPI BIOS 负责在内存中创建一组表,描述许多非即插即用的硬件组件。启动操作系统会使用它来确定有多少个 CPU、系统有多少个 RAM 插槽、系统是台式机还是笔记本电脑、安装了多少个电池等。还必须调用 ACPI BIOS 来关闭系统或使其进入睡眠状态等。不过,操作系统代码没有理由不能处理 ACPI 调用。
大多数情况下,BIOS 更新是为了修复 ACPI 错误(因为 ACPI 很复杂且难以实现),或是为了引入增强的微码。所有现代 CPU 都允许微码更新,如果发布了新的微码更新,则必须更新 BIOS 以安装该新微码。普通程序可以更新 CPU 的微码。
SMI 也由 BIOS 处理。我确信 PC 中大多数与热和电源相关的硬件都会触发 SMI,其例程随后会调整风扇/CPU 速度和/或其他东西。其他东西也可以触发 SMI;请查看 Wikipedia 上的系统管理模式文章。但如果记录了硬件接口,那么也没有理由不能用操作系统代码替换此代码。
现代操作系统根本不使用 BIOS 进行硬件访问,电源事件除外。一些引导加载程序确实使用 BIOS 字符 I/O 来显示文本,并使用磁盘 I/O 加载操作系统引导代码。
所以我希望这可以阐明 BIOS 的作用,并且在大多数情况下,你对其工作原理的看法是完全正确的。