我试图了解设备驱动程序是如何工作的,根据我目前所知道的,设备驱动程序只是操作系统和设备之间的“中间人”。我创建了以下图表,以显示我对设备驱动程序的理解:

另外,应用程序不能直接与设备驱动程序交互,只有操作系统才能这样做(例如,如果应用程序想打印什么东西,它会“告诉”操作系统,而操作系统告诉设备驱动程序)。
我的理解正确吗?在Windows和macOS上,设备驱动程序的概念是否与在Linux上的概念相同?
发布于 2017-05-15 19:53:53
非常简短:
设备驱动程序最重要的一点是它在内核空间中运行,具有与内核相同的权限,因此可以直接访问硬件。(通常)不允许应用程序这样做。
因此,您可以将设备驱动程序看作是内核中组织对某些硬件(“设备”)的访问的部分。
应用程序可以在不同级别上与内核进行交互:从较高的抽象(例如文件系统)到中等抽象(块设备)到真正低级别的抽象( /proc/或/sys中的一些文件,/dev中的设备中的一些ioctls )。因此,低层交互有时会非常直接地与设备驱动程序对话,只有一个非常薄的层,内核将调用重定向到设备驱动程序。因此,“应用程序不能直接与设备驱动程序交互,只有操作系统才能这样做”是正确的,也是假的。
此外,内核中还有许多抽象层,如图片中所描述的抽象层(“操作系统发送的消息相同,设备驱动程序使用不同的消息与硬件对话),例如,块层接收一种消息,但传递给不同的块设备,USB层接收一种消息,但可以使用不同的USB主机控制器等等。
所以画面要困难得多,内核中有层和子系统,实际上与硬件对话的设备驱动程序在这个层次结构的底部。更让人困惑的是,设备驱动程序和其他层都以模块的形式出现(对于Linux)。如果键入lsmod,您可以看到哪些模块处于活动状态,哪些模块使用其他模块。
而且,打印是一个非常糟糕的例子;大多数打印机特定的处理都发生在用户空间中,而不是在设备驱动程序中。
所有的Windows、Linux和MacOS都遵循这些原则,但细节非常不同。
这有用吗?
在Linux上的打印现在通常是用杯形完成的。Cups有一个程序集合,可以为各种打印机呈现文档。所有这些程序都接受一个文件(文档为pdf/postscript/.)并以打印机理解的格式将其转换为另一个文件。所有这些都发生在内核之外,因为所有这些都不需要访问实际的硬件。它只是读写文件。只有最后一部分,当转换后的数据被发送到打印机时,才使用内核。然后,它可以使用不同的路径,甚至对同一类型的打印机:通过网络,通过USB,通过串行连接等。这最后一部分通常不是打印机特定的。
因此Linux实际上并没有为大多数打印机提供特定于打印机的设备驱动程序。(对于几台打印机,您可能需要一台)。
发布于 2017-05-16 10:54:07
设备驱动程序只是操作系统和设备之间的“中间人”。
是的,差不多就是这样。
设备驱动程序是将标准化的编程调用转换为硬件组件的设备特定操作的“黑匣子”。
这样,程序就不需要知道特定硬件的内部工作原理;是特定的设备驱动程序以透明的方式执行映射,从而允许程序与硬件“对话”。
它们与内核分开构建,并在需要时激活(作为加载到内核的模块)。
https://unix.stackexchange.com/questions/364724
复制相似问题