首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Linux中的设备驱动程序需要在内核模式下运行?

为什么Linux中的设备驱动程序需要在内核模式下运行?
EN

Software Engineering用户
提问于 2017-05-28 22:39:54
回答 3查看 4.1K关注 0票数 0

假设我有一个通过USB端口连接到计算机的设备,我创建了一个应用程序来与这个设备通信。在这个应用程序中,我使用USB驱动程序与设备通信。

后来,我决定我的应用程序不想直接与USB驱动程序通信,所以我从我的应用程序中删除了与USB驱动程序通信的代码,创建了一个包含这些代码的设备驱动程序,所以现在我的应用程序将与新创建的设备驱动程序进行通信。

现在我读到Linux中的设备驱动程序需要在内核模式下运行。但这是为什么?

我的意思是当我的应用程序直接与USB驱动程序通信时,它是在用户模式下运行的。那么,为什么当我将与USB驱动程序通信的代码移动到设备驱动程序时,现在设备驱动程序需要在内核模式下运行,为什么设备驱动程序也不能在用户模式下运行呢?

EN

回答 3

Software Engineering用户

发布于 2017-05-28 23:06:43

移动的代码仍然可以在userland中运行,只是它不是一个驱动程序,而是一个库或类似的程序。我相信你所谓的驱动程序的名字是错误的,实际上不是一个驱动程序,只是一个中间共享库之类的。

设备驱动程序能够访问特权函数,并且可以访问用户软件不能访问的东西。这就是为什么它们必须处于内核模式。这也是为什么他们受到更多的审查,更难加载和运行,因为他们可能会造成麻烦。不可靠的驱动程序能够死锁一个系统,并可能使系统不稳定,没有办法让操作系统关闭它。

如果您有一组不需要该特权访问的代码,那么将其构建为驱动程序是毫无意义的。这就像在搬动家具之前试图获得建筑许可一样,很多麻烦都没有好处。

票数 3
EN

Software Engineering用户

发布于 2017-05-28 23:05:20

现在我读到Linux中的设备驱动程序需要在内核模式下运行。但为什么?..。为什么设备驱动程序不能在用户模式下运行?

驱动程序在内核模式下运行,而应用程序以用户模式运行,原因很多。例如

  • 驱动程序需要以可预测的方式对服务设备I/O具有较高的优先级(否则会有丢失某些数据的风险)。例如,驱动程序可能需要在不引起页面错误的情况下运行。将驱动程序内存放入内核是实现这一目的的简单方法之一。(事实上,这当然要复杂得多:通常驱动程序有少量的超高优先级代码,以及一些在内核中运行的不太关键的额外代码,以及两个共享内存。)
  • I/O指令和设备内存映射的I/O地址通常不受应用程序代码的保护,因此不允许应用程序直接访问这些资源。强制应用程序使用内核/系统调用允许操作系统在多个应用程序之间,甚至在多台虚拟机之间共享设备。
  • 让应用程序使用内核/系统读写接口来访问设备允许设备替换和升级设备驱动程序,而不依赖于应用程序。

相反,应用程序通常在用户模式下运行,从底层设备及其实现中获得一定程度的抽象。

我的意思是当我的应用程序直接与USB驱动程序通信时,它是在用户模式下运行的。

是的,但是应用程序与USB驱动程序的通信是通过内核/系统调用完成的,所以内核就是其中的一部分。此外,USB驱动程序本身通常在内核中;只有用于访问它们的库例程在应用程序或应用程序使用的库中。

如果编写自己的设备驱动程序,则可以将应用程序的所有功能放入设备驱动程序中,因此根本不需要用户模式应用程序。然而,由于许多原因,这通常不是一个很好的功能结构。例如,诸如分离关注之类的准则将被违反。

票数 2
EN

Software Engineering用户

发布于 2017-05-29 00:21:27

在Linux中,设备驱动程序不需要在内核模式下运行。完全有可能在用户模式下运行驱动程序。

例如,libusb库的目的是在用户模式下编写与操作系统无关的USB驱动程序.几乎所有的打印机驱动程序都处于用户模式。图形堆栈的一部分处于用户模式(尽管其中的多少以及边界往往每10-15年左右移动一次)。FUSE的目的是在用户模式下编写文件系统驱动程序。

如果您要问的是为什么设备驱动程序必须处于内核模式,那么答案是:它们不需要。在诸如Linux这样的单块内核中,它们往往是,但在微内核中,内核只提供最小的功能(虚拟内存、任务调度),其余的功能都在用户空间中实现。在nanokernels和exokernels中,内核中甚至更少:基本上,内核所做的唯一事情就是对资源的顺序访问。它甚至不能管理内存。

最后但并非最不重要的是,没有内核OSs,那里甚至没有内核:所有东西都在用户空间中运行。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/349752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档