linux - 用户空间与内核空间驱动程序

标签 linux linux-kernel linux-device-driver embedded-linux

我正在寻找编写一个 PWM 驱动程序。我知道有两种方法可以控制硬件驱动程序:

  1. 用户空间驱动程序。
  2. 内核空间驱动程序

如果一般情况下(不考虑 PWM 驱动程序的情况),我们必须决定是使用用户空间驱动程序还是内核空间驱动程序。那么除了这些,我们还需要考虑哪些因素呢?

  1. 用户空间驱动程序可以直接将/dev/mem 内存映射到其虚拟地址空间,无需上下文切换。
  2. 用户空间驱动程序不能实现中断处理程序(它们必须轮询中断)。
  3. 用户空间驱动程序无法执行 DMA(因为可以从内核空间分配支持 DMA 的内存)。

最佳答案

从您列出的这三个因素中,只有第一个实际上是正确的。至于其余的——不是真的。用户空间代码可以执行 DMA 操作——这没有问题。有许多硬件设备公司在他们的产品中采用了这种技术。也可以有一个中断驱动的用户空间应用程序,即使所有的 I/O 都是通过完整的内核旁路完成的。当然,在 /dev/mem 上简单地做一个 mmap() 并不容易。

您必须在内核中拥有最少的驱动程序部分——这是为您的用户空间提供内核所需的最低限度所必需的(因为如果您考虑一下——/dev/mem 也由字符设备驱动程序备份)。

对于 DMA,它实际上太简单了——您所要做的就是处理 mmap 请求并将 DMA 缓冲区映射到用户空间。对于中断 - 有点棘手,无论如何,中断必须由内核处理,但是,内核可能不做任何工作,只是唤醒调用的进程,例如,epoll_wait()。另一种方法是像 DOSEMU 那样将信号传递给进程,但这很慢,不推荐使用。

至于您的实际问题,您应该考虑的一个因素是资源共享。只要您不必在多个应用程序之间共享设备,并且在用户空间中没有什么是您不能做的,那就去用户空间吧。您可能会在开发周期中节省大量时间,因为编写用户空间代码非常容易。但是,当两个或更多应用程序需要共享设备(或其资源)时,您可能会花费大量时间来实现它——想象一下多个进程同时 fork 、崩溃、映射(相同?)内存等. 毕竟,IPC 通常是通过内核完成的,所以如果应用程序需要开始相互“对话”,性能可能会大大降低。不过,对于某些性能关键的应用程序,这仍然在现实生活中完成,但我不想深入了解这些细节。

另一个因素是内核基础设施。假设您要编写网络设备驱动程序。在用户空间中这样做不是问题。但是,如果您这样做,那么您还需要编写一个完整的网络堆栈,因为无法使用 Linux 内核中的默认堆栈。

如果可能的话,我会说去用户空间,使事情工作的努力比编写内核驱动程序要少,并记住有一天可能需要将代码移动到内核中。事实上,根据是否定义了某些宏,为用户空间和内核空间编译相同的代码是一种常见的做法,因为在用户空间中进行测试要愉快得多。

关于linux - 用户空间与内核空间驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15286772/

相关文章:

python - 为什么 python 调用 sys.exit 时 upstart 服务不会停止

Linux 找不到动态链接的应用程序

python - Python 中有没有流行的库来监控 Linux/Unix 系统?

linux - 如何检查给定页面是否为内核模块中的 ZERO_PAGE?

c - request_irq中的dev_id参数是什么?

linux - ELF 二进制错误 Unix ("./X No such file or directory")

c - 如何编译/链接/构建小型可加载内核模块(LKM)?

linux - insmod : ERROR: could not insert module HelloWorld. ko: 不允许操作

linux - 如何使 bond0/eth0 接口(interface) UP

linux-kernel - 是否可以从 Linux (ioctl) 的内核空间调用用户空间回调函数?