查看设备固件与驱动程序的差异,我真的不明白为什么我们在技术上需要区分。我知道固件不容易更改,它负责低级别的设备操作,而驱动程序在那里与主机操作系统进行通信。
问题是,为什么我们不能将这两层合二为一。只是一个知道如何与操作系统通信并将所有请求直接转换为低级设备操作的驱动程序。是为了便于开发(即减少开发该软件所需的开发人员知识)吗?是否可以使用不在闪存中的软件与设备通信?
查看设备固件与驱动程序的差异,我真的不明白为什么我们在技术上需要区分。我知道固件不容易更改,它负责低级别的设备操作,而驱动程序在那里与主机操作系统进行通信。
问题是,为什么我们不能将这两层合二为一。只是一个知道如何与操作系统通信并将所有请求直接转换为低级设备操作的驱动程序。是为了便于开发(即减少开发该软件所需的开发人员知识)吗?是否可以使用不在闪存中的软件与设备通信?
不,这两种类型的软件通常运行在不同类型的机器上。
固件在外围设备的处理器/控制器上运行,驱动程序在您机器的 CPU 上运行。这些通常甚至是不同的类型。
理论上,可以让您机器的 CPU 执行外围设备中的所有位转换。这在早期的计算机中已经完成。但这是要付出高昂代价的。
通常,外部协议涉及硬时序限制(想想网卡或 CRT 显示器)。您的 CPU 需要处理大量中断才能在正确的时间完成工作。出于这个原因,在著名的 Sinclair ZX-81 上,当 CPU 正在努力工作时,显示器会关闭 - 没有时间刷新屏幕 :)
因此,我们现在试图解耦外围设备的工作。当一个完整的网络数据包到达时, CPU 将得到通知,并且不必轮询线路以更改位。
固件直接使用设备的硬件在设备上运行。一种看待它的方式是,固件是操作系统的 API,无论计算机运行什么操作系统,如果它接收到 x 指令,那么固件将执行 y,并可能返回值 z。该设备将有自己的时钟来控制执行指令的速度,它有自己的内存,并且设备上的处理器可能与计算机不同,例如计算机可能是 amd64,但设备有 arm64 处理器。固件不直接与 CPU 或 ram 通信,它从总线获取指令,并将数据放回总线。
驱动程序在操作系统内核级别或操作系统用户级别运行在计算机上,驱动程序依赖于操作系统,并且必须满足操作系统的要求才能运行。驱动程序通常会处理任何需要计算机的 CPU 和/或 RAM 的工作,一旦指令的每次处理完成,指令就会通过固件传递给设备。
事实上,他们不必分开。
在很多情况下,我们可以遍历整个范围,从直接从中央 CPU 控制硬件,一直到尽可能多地在固件中实现。
以下是有关固件/驱动程序平衡的设计注意事项的不完整列表:
当然,可以创建一个 USB 闪存棒,将 NAND 语义暴露给驱动程序并保存控制器芯片。并以某种方式分发您的异国情调的驱动程序(适用于 Windows、Linux、MAC、Konica 打印机等...)。另一方面,用户和操作系统开发人员都希望 U 盘能够与标准块设备驱动程序一起使用。带非 HID 接口的光电鼠标?也不是一个好主意。
驱动程序(即使已编译)可用于轻松进行逆向工程和更改固件 - 更不用说了。视频芯片经常出现这种情况。
许多与无线电相关的固件(wifi、手机、蓝牙)强制遵守频谱规定。
等等等等...
最重要的是,有相当多的设备缺少 ROM 内存,因此固件实际上是驱动程序的一部分,并在每次开机时上传到设备。