【发布时间】:2014-02-23 06:08:13
【问题描述】:
我在某个测验中有一个问题无法回答。谁能告诉我:
既然 BIOS 已经有与硬件通信的代码,为什么还需要设备驱动程序?
【问题讨论】:
-
如果只有 BIOS 可用,花哨的显卡如何告诉 GPU 如何运行所有漂亮的 OpenGL/DX 操作?
标签: operating-system device-driver bios
我在某个测验中有一个问题无法回答。谁能告诉我:
既然 BIOS 已经有与硬件通信的代码,为什么还需要设备驱动程序?
【问题讨论】:
标签: operating-system device-driver bios
假设您谈论的是传统的 x86 BIOS,有几个大问题:
BIOS 仅具有与启动系统所需的有限设备子集(存储控制器、以太网、USB 键盘/鼠标、USB 大容量存储)进行通信的代码。 BIOS 没有 USB 打印机或网络摄像头的驱动程序。也不实用。有成千上万的设备需要驱动程序。 BIOS 不能包含所有这些。这也意味着每个新的硬件设备都需要更新 BIOS。
BIOS INT 调用对于现代硬件来说太慢且不切实际。它们被设置为读取/写入小块数据(从磁盘读取几个字节,在屏幕上打印一个字符)。它们没有使用 DMA 从磁盘读取几兆字节到缓冲区的机制。请记住,最初的 BIOS INT 调用是为软盘驱动器和文本模式显示器开发的。
BIOS INT 层处于实模式。任何现代操作系统都是保护模式。要在现代操作系统中调用 BIOS,您必须进入实模式,完成工作,然后返回保护模式。这是一项非常昂贵的操作。
但是 UEFI 呢? 新 PC(几乎所有为 Windows 7 x64 及更高版本设计的)使用 UEFI 固件,而不是旧的 x86 汇编语言 BIOS。尽管 UEFI 固件通常仍被称为“BIOS”。
当 UEFI 首次出现时,人们希望它会导致独立于操作系统的驱动程序。 UEFI 提供了一个更易于使用的现代基于 C 的 API。它具有可安装驱动程序的概念。有mechanisms for a modern OS to call UEFI services。然而,这并没有获得太大的吸引力。 UEFI“驱动程序”几乎是用于预启动的东西。一旦操作系统接管它,它就会做自己的事情。
在操作系统中使用 UEFI 驱动程序仍会产生性能开销。此外,很难将“不透明”的 UEFI 驱动程序集成到现有操作系统中。每个操作系统都有多层磁盘/文件系统驱动程序、网络堆栈、USB 等。它们的做法都略有不同,很难找到适合的 UEFI 驱动程序。 (大约 10 年后再问。)
请注意,还有一个独立于操作系统的“驱动程序”层在现代笔记本电脑中使用得相当多:ACPI。许多平台在其ASL/AML code 中都有“驱动程序”,用于向您的操作系统提供简单的事件通知。最常见的例子是键盘上方笔记本电脑上用于启动应用程序或控制音量的“特殊”按钮。这些按钮通常会触发操作系统响应的event handler。不过,这是一个非常简单的通知系统。
【讨论】:
BIOS 为您提供基本输入/输出,而硬件具有远远超出基本的功能。没有驱动程序,就无法使用这些功能。
此外,有些硬件根本不是基本的,在安装驱动程序之前无法使用它们的功能。
【讨论】: