API 和设备驱动程序之间的区别

Difference between an API and a device driver

我试图了解它们之间的关系。据我所知,它们都可以成为 HAL 的一部分。如果是应用程序和显卡之间的通信 - API 可以自己完成工作还是我们必须同时依赖它们? API 可以直接与硬件通信还是我们总是需要一个中间的驱动程序来翻译 API 的命令?

TL;DR

将API视为描述做什么的规范,而驱动程序是描述如何[=37=的实现] 去做。

详情

作为一个人为的例子,假设我们有三个不同的声卡,我们希望它们在多个操作系统上都能很好地播放。我们可以 定义 一个 API 给卡制造商说 "Each card must support four methods: mute(), playsound(sound), volumeup() and volumedown()"。通过定义 API,我们得到了一个通用接口,允许操作系统设计人员支持音频设备而无需担心硬件细节。他们知道如果他们想使声卡静音,他们可以调用mute(),或者如果他们想调高音量,他们可以调用volumeup()

然后由设备制造商实施实际执行这些操作的驱动程序。三种不同声卡的驱动程序会有所不同,因为它们在硬件级别不同,但 API 是一致的,因此下一个更高的抽象级别(OS)不需要知道如何处理硬件。

有关更具体的示例,请考虑 Advanced Control & Power Interface (ACPI) 规范。它为操作系统定义了一个通用接口来管理硬件设备的功耗和热特性。设备驱动程序或固件必须实现一些方法才能成为 "ACPI Compliant"。这允许 Windows 操作系统和 Linux 变体都可以在硬件设备上执行相同的操作,而无需为硬件实现自己的驱动程序

注:Windows通过acpi.sys, which they call an "ACPI Driver". Don't let the terminology confuse you; even though they call it a driver, it is really a window into the ACPI interface. Linux uses the acpi kernel module执行ACPI动作做同样的事情,Linux不称它为驱动程序。也许 ACPI 不是 最好的 示例,但目前我没有更好的示例。