内核驱动或用户空间驱动?

时间:2014-07-20 07:26:58

标签: linux kernel driver

我想问你的建议如下:我需要为omap3编写驱动程序,通过fpga访问外部dsp(通过gpmc接口)。 dsp需要将文件加载到dsp,并从dsp读取/写入缓冲区。内核中已有FPGA驱动程序。内核是2.6.32。所以我想到了以下几个选项:

在内核中编写dsp驱动程序,它使用现有的fpga驱动程序。

编写与fpga内核驱动程序接口的用户空间驱动程序。

使用UIO编写用户空间驱动程序,该驱动程序不使用内核fpga驱动程序,但应该访问fpga,作为用户空间单个和完整dsp驱动程序的一部分。

您认为首选的选项是什么? 内核驱动程序优于用户的优势是什么,反之亦然?

谢谢,Ran

1 个答案:

答案 0 :(得分:3)

*用户空间驱动程序:

  • 更容易调试。
  • 支持你的大量图书馆。
  • 如果您愿意,可以隐藏您的知识产权的详细信息(如果您这样做,人们会非常讨厌您!)
  • 崩溃不会影响整个系统。
  • 处理中断的延迟较高,因为内核必须以某种方式将中断中继到用户空间。
  • 您无法控制从用户空间访问您的设备。

*内核空间驱动程序:

  • 难以调试。
  • 仅支持Linux内核框架。
  • 您始终可以提供二进制blob来隐藏IP的详细信息,但这很烦人,因为它必须针对特定内核生成。
  • 崩溃将导致整个系统崩溃。
  • 处理中断的延迟时间减少。
  • 您可以从内核空间控制对设备的访问,因为它是所有进程都看到的全局上下文。

作为一名内核工程师,我在内核环境中更容易/快乐地破解代码,这可能就是我在内核中编写整个驱动程序的原因。

但是,我想说最好的办法是将驱动程序的功能划分为单位,只有在有理由的情况下才将单位放在内核中。

例如:

  • 如果您的设备有共享资源(如MMU,硬件FIFO)并且您希望多个进程能够安全地使用它,那么您可能需要一些缓冲区管理器在内核中并且所有进程都将进行通信通过ioctl。
  • 如果您的驱动程序需要尽快响应中断(非常低延迟),那么您需要将处理中断的代码部分放在内核中断处理程序中,而不是将其放在用户空间中发生中断时通知用户空间。