非硬件设备驱动程序

Non-Hardware Device Drivers

在 Windows 内部第 7 版中 - 在 Windows 内核体系结构
下提到了以下文字的书籍 设备驱动程序 - 这包括两个硬件设备驱动程序,它们转换用户 I/O 功能 调用特定硬件设备 I/O 请求和非硬件设备驱动程序,例如文件 系统和网络驱动程序。

谁能详细说说硬件设备驱动和非硬件设备驱动?

你的问题不清楚。如果您要一个非硬件设备驱动程序的例子,一个例子就是随机数生成器设备。例如,在 Linux 上,“/dev/random”设备提供了随机数生成器的软件实现,因此没有必要硬件的系统仍然可以具有此功能

假设您有多层 - 例如当进程发出文件 IO 请求时,它会转到虚拟文件系统层,该层可能会向文件系统层发送请求,该层可能会将 request/s 发送到软件 RAID 层,该层可能会向 USB 大容量发送请求存储设备驱动程序,它可以向 USB 控制器驱动程序发送请求。

您可以将这些图层分为 2 个主要类别:

a) “设备驱动程序”,其中有一个实际的设备。对于这些,设备驱动程序之间的关系倾向于反映硬件设备之间的层次关系(例如,“插入控制器的 PCI 总线,插入这些控制器的各种设备,插入这些设备的各种外围设备”可能成为“父级”树与 none 或更多子设备驱动程序通信的设备驱动程序是...").

b) “不驱动设备的东西,因此在技术上不是设备驱动程序”。对于上面的文件 IO 示例,这是 VFS、文件系统和软件 RAID 层。对于网络,它将是处理 TCP/IP 堆栈的代码(并确定路由等 - 哪个网卡应根据目标 IP 地址发送数据包)。对于用户输入(键盘等),它可能是输入法编辑器之类的东西。对于声音,它可以是根据 2D 位置确定声音在哪个扬声器(哪个声音card/s)上应该有多大声的代码。

对于大多数操作系统;设备驱动程序需要被视为“特殊”,因为它们需要使用普通 software/processes 无法使用的接口(可能还有直接硬件访问)。例如,对于整体内核,它们可能被视为内核扩展并(动态)直接链接到内核中。

但是; “不驱动设备的东西,因此在技术上不是设备驱动程序”最终需要类似的特殊支持(例如,使用正常 software/processes 不能使用但设备驱动程序可以使用的相同或相似接口的能力,链接到整体内核的能力等)。对于 OS 设计人员来说,设备驱动程序与“技术上不是设备驱动程序但需要相同访问权限的东西”之间的差异相对微不足道(与不需要 [=38= 的普通 software/processes 相比] 特殊访问);所以很容易使用同一个词来描述两者——例如称它们为“内核模块”(不管它们是否是设备驱动程序);或者称它们为“设备驱动程序”(不管它们在技术上是否是设备驱动程序)。

请注意,有几件事更容易混淆:

a) 实际上还有第三类——“虚拟设备”。在某些情况下,软件会尝试模拟真实设备(例如,使用 software/RAM 模拟硬盘驱动器的 RAM 磁盘;使用 PDF 文件格式转换器“打印”到文件等的打印机)。对于这些情况,emulation/virtualization 需要作为设备驱动程序实现(但从技术上讲没有设备被驱动)。

b) 使术语看起来更一致;一些操作系统偏向于将接口定义为“虚拟设备”。如果你足够努力,你可以假装任何东西都是某种抽象的虚拟设备(“它不是一个 compression/decompression 库,它是一个虚拟 compression/decompression 设备”,“它不是一个数据库管理引擎,它是一个虚拟关系数据存储设备", ...).

c) 一些操作系统也试图假装一切都是文件(例如 Unix - https://en.wikipedia.org/wiki/Everything_is_a_file)。在这种情况下,您可能有一个“伪装成文件的设备驱动程序”的目录(例如 /dev),并以“不是伪装成伪装成文件的设备驱动程序的设备驱动程序的东西”结尾进入同一目录。