看看设备固件与驱动程序之间的差异,我真的不明白为什么我们在技术上需要这种区别。我知道固件不容易改变,它承担低级设备操作,而驱动程序则用于与主机操作系统通信。
问题是,为什么我们不能将这两层合并为一层。只需一个知道如何与操作系统通信并将所有请求直接转换为低级设备操作的驱动程序。是为了便于开发(即减少开发此软件所需的开发人员知识)吗?难道不能使用不驻留在闪存中的软件与设备通信吗?
答案1
不,这两种类型的软件通常运行在不同类型的机器上。
固件在外围设备的处理器/控制器上运行,驱动程序在机器的 CPU 上运行。它们通常是不同类型的。
从理论上讲,可以让机器的 CPU 执行外围设备中的所有位拆解。早期的计算机已经实现了这一点。但这样做代价很高。
通常,外部协议涉及硬时序限制(例如网卡或 CRT 显示器)。您的 CPU 需要处理很多中断以在正确的时间完成工作。因此,在著名的 Sinclair ZX-81 上,当 CPU 正在努力工作时,显示器会关闭 - 没有时间刷新屏幕 :)
因此,我们现在尝试将外围设备的工作分离开来。当网络满载时,CPU 会收到通知包到达,并且不必轮询线路来改变位。
答案2
固件直接使用设备硬件在设备上运行。一种看法是,固件是操作系统的 API,计算机运行什么操作系统并不重要,如果它收到 x 指令,那么固件将执行 y,并可能返回值 z。设备将拥有自己的时钟来控制执行指令的速度,拥有自己的内存,设备上的处理器可能与计算机不同,例如,计算机可能是 amd64,但设备有 arm64 处理器。固件不直接与 CPU 或 RAM 通信,它从总线获取指令,并将数据放回总线上。
驱动程序在计算机上运行于操作系统内核级别或操作系统用户级别,驱动程序依赖于操作系统,必须满足操作系统的要求才能运行。驱动程序通常会处理任何需要计算机 CPU 和/或 RAM 的工作,一旦指令的预处理完成,指令就会通过固件传递给设备。
答案3
事实上,它们没必要分开。
在很多情况下,人们可以涵盖整个过程,从直接从中央 CPU 控制硬件一直到在固件中实现尽可能多的功能。
以下是有关固件/驱动程序平衡的设计考虑因素的不完整列表:
- 您想使用标准驱动程序或接口吗?
当然,你可以创建一个 USB 闪存棒,将 NAND 语义暴露给驱动程序并节省控制器芯片。并以某种方式分发你的奇特驱动程序(适用于 Windows、Linux、MAC、Konica 打印机等)。另一方面,用户和操作系统开发人员都希望 USB 棒能够与标准块设备驱动程序配合使用。带有非 HID 接口的光电鼠标?这也不是一个好主意。
- 您的某些功能专利/保密协议/商业秘密是否承受着负担?
驱动程序(即使经过编译)很容易被逆向工程和修改,而固件则很难。视频芯片经常出现这种情况。
- 是否符合法规?
许多与无线电相关的固件(wifi、蜂窝、蓝牙)强制遵守频谱规定。
- 成本?设计和制造费用通常都有一个最佳点。
等等等等...
除此之外,有相当多的设备缺少 ROM 内存,因此固件实际上是驱动程序的一部分,每次开机时都会上传到设备。