假设我有一个通过USB端口连接到计算机的设备,我创建了一个应用程序来与这个设备通信。在这个应用程序中,我使用USB驱动程序与设备通信。
后来,我决定我的应用程序不想直接与USB驱动程序通信,所以我从我的应用程序中删除了与USB驱动程序通信的代码,创建了一个包含这些代码的设备驱动程序,所以现在我的应用程序将与新创建的设备驱动程序进行通信。
现在我读到Linux中的设备驱动程序需要在内核模式下运行。但这是为什么?
我的意思是当我的应用程序直接与USB驱动程序通信时,它是在用户模式下运行的。那么,为什么当我将与USB驱动程序通信的代码移动到设备驱动程序时,现在设备驱动程序需要在内核模式下运行,为什么设备驱动程序也不能在用户模式下运行呢?
发布于 2017-05-28 23:06:43
移动的代码仍然可以在userland中运行,只是它不是一个驱动程序,而是一个库或类似的程序。我相信你所谓的驱动程序的名字是错误的,实际上不是一个驱动程序,只是一个中间共享库之类的。
设备驱动程序能够访问特权函数,并且可以访问用户软件不能访问的东西。这就是为什么它们必须处于内核模式。这也是为什么他们受到更多的审查,更难加载和运行,因为他们可能会造成麻烦。不可靠的驱动程序能够死锁一个系统,并可能使系统不稳定,没有办法让操作系统关闭它。
如果您有一组不需要该特权访问的代码,那么将其构建为驱动程序是毫无意义的。这就像在搬动家具之前试图获得建筑许可一样,很多麻烦都没有好处。
发布于 2017-05-28 23:05:20
现在我读到Linux中的设备驱动程序需要在内核模式下运行。但为什么?..。为什么设备驱动程序不能在用户模式下运行?
驱动程序在内核模式下运行,而应用程序以用户模式运行,原因很多。例如
相反,应用程序通常在用户模式下运行,从底层设备及其实现中获得一定程度的抽象。
我的意思是当我的应用程序直接与USB驱动程序通信时,它是在用户模式下运行的。
是的,但是应用程序与USB驱动程序的通信是通过内核/系统调用完成的,所以内核就是其中的一部分。此外,USB驱动程序本身通常在内核中;只有用于访问它们的库例程在应用程序或应用程序使用的库中。
如果编写自己的设备驱动程序,则可以将应用程序的所有功能放入设备驱动程序中,因此根本不需要用户模式应用程序。然而,由于许多原因,这通常不是一个很好的功能结构。例如,诸如分离关注之类的准则将被违反。
发布于 2017-05-29 00:21:27
在Linux中,设备驱动程序不需要在内核模式下运行。完全有可能在用户模式下运行驱动程序。
例如,libusb库的目的是在用户模式下编写与操作系统无关的USB驱动程序.几乎所有的打印机驱动程序都处于用户模式。图形堆栈的一部分处于用户模式(尽管其中的多少以及边界往往每10-15年左右移动一次)。FUSE的目的是在用户模式下编写文件系统驱动程序。
如果您要问的是为什么设备驱动程序必须处于内核模式,那么答案是:它们不需要。在诸如Linux这样的单块内核中,它们往往是,但在微内核中,内核只提供最小的功能(虚拟内存、任务调度),其余的功能都在用户空间中实现。在nanokernels和exokernels中,内核中甚至更少:基本上,内核所做的唯一事情就是对资源的顺序访问。它甚至不能管理内存。
最后但并非最不重要的是,没有内核OSs,那里甚至没有内核:所有东西都在用户空间中运行。
https://softwareengineering.stackexchange.com/questions/349752
复制相似问题