Jos*_*eph 7 linux drivers linux-kernel
我试图了解设备驱动程序是如何工作的,根据我目前所知道的,设备驱动程序只是操作系统和设备之间的“中间人”。我创建了下图来展示我对设备驱动程序的理解:
此外,应用程序不能直接与设备驱动程序交互,只有操作系统可以这样做(例如,如果应用程序想要打印某些内容,它会“告诉”操作系统,而操作系统会告诉设备驱动程序)。
我的理解正确吗?Windows 和 macOS 上的设备驱动程序的概念与 Linux 上的相同吗?
非常简短:
设备驱动程序最重要的一点是它运行在内核空间中,与内核具有相同的权限,因此可以直接访问硬件。应用程序(通常)不允许这样做。
因此,您可以将设备驱动程序视为内核的一部分,用于组织对某些硬件(“设备”)的访问。
应用程序可以在不同层次上与内核交互:从更高的抽象(例如文件系统)到中等抽象(块设备)到真正低级的抽象(一些文件在/proc/
或 中/sys
,一些ioctls
在设备中/dev
)。所以低级交互有时会非常直接地与设备驱动程序对话,只有一个非常薄的层,内核将调用重定向到设备驱动程序。所以“应用程序不能直接与设备驱动程序交互,只有操作系统可以做到这一点”是正确的,也是错误的。
此外,内核中有许多抽象层,就像您在图片中描述的那样(“操作系统发送的消息是相同的,设备驱动程序使用不同的消息与硬件对话。例如,块层接收一个一种消息,但将它们传递给不同的块设备。USB层接收一种消息,但可以使用不同的USB主机控制器。等等。
所以图片要困难得多,内核中有层和子系统,而实际与硬件通信的设备驱动程序位于该层次结构的底部。更令人困惑的是,设备驱动程序和其他层都以模块的形式出现(对于 Linux)。如果您键入lsmod
,您可以看到哪些模块处于活动状态,以及哪个模块使用了哪些其他模块。
此外,印刷是一个非常糟糕的例子;大多数特定于打印机的处理发生在用户空间中,而不是在设备驱动程序中。
Windows、Linux 和 MacOS 都遵循这些原则,但细节却大不相同。
这有帮助吗?
编辑:
今天在 Linux 上打印通常是用cups完成的。Cups 有一系列程序,可以为各种打印机呈现文档。所有这些程序都接收一个文件(文档为 pdf/postscript/...)并将其转换为打印机可以理解的格式的另一个文件。所有这些都发生在内核之外,因为这些都不需要访问实际的硬件。它只是读取和写入文件。只有最后一部分,当转换后的数据发送到打印机时,才使用内核。然后它可以使用各种路径,即使对于相同类型的打印机:通过网络、通过 USB、通过串行连接等。最后一部分通常不是特定于打印机的。
因此,Linux 并没有真正为大多数打印机提供特定于打印机的设备驱动程序。(对于几台打印机,您可能需要一台)。