我一直在阅读" Linux设备驱动程序"作者:Jonathan Corbet。我有一些我想知道的问题:
答案 0 :(得分:9)
用户空间驱动程序和内核驱动程序之间的主要区别是什么?
用户空间驱动程序在用户空间中运行。内核驱动程序在内核空间中运行。
两者有什么限制?
内核驱动程序可以执行内核所能做的任何事情,因此您可以说它没有任何限制。但内核驱动程序更难以“证明正确”和调试。引入竞争条件,或者在错误的上下文中使用内核函数或使用错误的锁定都很容易。事情似乎会持续一段时间,但会导致问题(包括崩溃整个系统)。读取所有用户输入(来自设备和用户空间)时,驱动程序也必须小心,因为无效数据有时会导致崩溃。
用户空间驱动程序通常需要内核中的小垫片才能进行出价。通常,'shim'提供了更简单的API。例如,FUSE层允许人们以任何语言编写文件系统。它们可以安装,读/写,然后卸载。垫片还必须保护内核免受所有无效输入的影响。
用户空间驱动程序有很多限制。例如,内核保留一些内存以供在紧急情况下使用,但这对用户空间不可用。在内存压力期间,内核将杀死随机用户空间程序,但永远不会杀死内核线程。用户空间程序可能会被换出,这可能导致您的设备在几秒钟内无法使用。 (内核代码无法换出。)在用户空间中运行代码需要多个上下文切换。这些浪费了大量的CPU时间。如果您的设备是300波特调制解调器,没有人会注意到。但是如果它是一个千兆以太网卡,并且每个数据包必须在它到达真实用户之前转到你的用户空间驱动程序,那么系统将会遇到很大的瓶颈。
用户空间程序也更难以使用,因为您必须安装该用户空间软件,该软件通常具有许多库依赖性。内核模块“正常工作”。
为什么用户空间驱动程序现在比内核驱动程序更常用,更受欢迎?
问题是“这种复杂性真的需要在内核中吗?”
我曾经为一家制造USB加密狗的公司工作,该加密狗谈论了特定的协议。我们本可以写一个完整的内核驱动程序,但只是在libUSB上编写我们的程序。
优点:该程序可在Linux,Mac,Win之间移植。不用担心我们的代码与GPL。
缺点:如果设备需要向PC发送数据并快速获得响应,则无法保证会发生这种情况。例如,如果我们需要PC上的实时控制循环,那么有限的响应时间就更难了。 (在Linux上也许并非完全不可能。)
如果有办法在用户空间中进行,我会先尝试一下。只有当存在重大的性能瓶颈,或者将其保留在用户空间中时,才会移动它。即使这样,也要考虑“垫片”方法和/或“模拟器”方法(内核模块使您的设备看起来像串行端口或块设备。)
另一方面,如果已经有几个类似于你想要的内核模块,那么从那里开始。