为什么我们已经有BIOS服务,还需要设备驱动程序?

4

我在一个测验中遇到了一个问题,无法回答。有人可以告诉我:

既然BIOS已经有与硬件通信的代码,为什么还需要设备驱动程序?


如果只有BIOS可用,那么一个高端的显卡如何告诉GPU如何运行所有漂亮的OpenGL/DX操作呢? - user2864740
2个回答

10

假设您在谈论传统的x86 BIOS,有几个大问题:

  1. BIOS只有与启动系统所需的有限设备通信的代码(存储控制器、以太网、USB键盘/鼠标、USB大容量存储)。 BIOS没有您的USB打印机或网络摄像头的驱动程序。这也是不实际的事情。有成千上万的设备需要驱动程序。 BIOS无法包含它们所有。这也意味着每个新硬件设备都需要一个BIOS更新。

  2. BIOS INT调用对于现代硬件来说是慢而且不可行的。它们设置为读/写小块数据(从磁盘读取几个字节,在屏幕上显示字符)。它们没有通过DMA从磁盘读取几兆字节到缓冲区的机制。请记住,原始的BIOS INT调用是针对软盘驱动器和文本模式显示开发的。

  3. BIOS INT层位于实模式下。任何现代操作系统都是保护模式。要在现代操作系统中进行BIOS调用,必须降到实模式,执行工作,然后返回保护模式。这是一个非常昂贵的操作。

但UEFI呢?新PC(几乎所有为Windows 7 x64及更高版本设计的设备)使用UEFI固件,而不是传统的x86汇编语言BIOS。虽然UEFI固件通常仍被称为“BIOS”。

当UEFI首次出现时,人们希望它将导致与操作系统无关的驱动程序。 UEFI提供了一个现代化基于C的API,较易于使用。它具有可安装驱动程序的概念。有一些机制供现代操作系统调用UEFI服务。但是,这并没有得到很多推广。UEFI“驱动程序”基本上只用于预启动。一旦操作系统接管,它就自己处理。

在操作系统中使用UEFI驱动程序仍会产生性能开销。此外,将“不透明”的UEFI驱动程序集成到现有的操作系统中也很困难。每个操作系统都有磁盘/文件系统驱动程序、网络堆栈、USB等多层驱动程序,它们的实现方式略有不同,因此很难让UEFI驱动程序适配各种操作系统。(请在大约十年后再询问。) 请注意,现代笔记本电脑还有一种与操作系统无关的“驱动程序”层,即ACPI。许多平台在其ASL/AML代码中拥有“驱动程序”,可向操作系统提供简单的事件通知。最常见的示例是笔记本电脑键盘上方的“特殊”按钮,用于启动应用程序或控制音量。这些按钮通常会触发操作系统响应的事件处理器。尽管如此,它仍是一个相当简单的通知系统。

0

BIOS 提供基本的输入/输出功能,而硬件具有远远超出基本功能的特点。没有驱动程序,使用这些特性是不可能的。

此外,一些硬件根本就不是基本的,除非安装驱动程序否则无法使用它们的功能。


@xxbbcc 是的,我意识到我搞反了 - 我查看了链接后才发现“哎呀”! - user2864740
谢谢您的快速回复。请再多解释一些!我想要更多技术上详细的答案。 - user3139987
@user2864740 哈哈,没问题。我也因为同样的原因迟到了。 - xxbbcc
@user3139987 你所说的技术是什么意思?这是一个很广泛的问题,而且有些离题了。 - Mehraban
@SAM 与什么不相关?这是有关汇编设备驱动程序的问题。我们已经涵盖了汇编、BIOS和设备驱动程序的细节。还有什么需要补充的吗?你给出的答案也在我的脑海中,但我的导师已经拒绝了它。他说:“这是一个外行人的回答”。那么我现在该怎么办? - user3139987

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接