【问题标题】:kernel driver or user space driver?内核驱动还是用户空间驱动?
【发布时间】:2014-09-10 23:13:45
【问题描述】:

我想就以下问题征求您的意见:我需要为 omap3 编写驱动程序,用于通过 fpga(通过 gpmc 接口)访问外部 dsp。 dsp 需要将文件加载到 dsp,并从 dsp 读取/写入缓冲区。内核中已经有 FPGA 驱动程序。内核是 2.6.32。于是我想到了以下选择:

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

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

使用UIO编写用户空间驱动,不使用内核fpga驱动,而是做fpga的访问,作为用户空间单一完整dsp驱动的一部分。

你认为什么是首选? 内核驱动比用户安全有什么优势,反之亦然?

谢谢,冉

【问题讨论】:

    标签: linux kernel driver


    【解决方案1】:

    * 用户空间驱动程序:

    • 更易于调试。
    • 支持您的大量库。
    • 允许您隐藏 IP 的详细信息(如果您这样做了,人们会非常讨厌您!)
    • 崩溃不会影响整个系统。
    • 处理中断的延迟更高,因为内核必须以某种方式将中断中继到用户空间。
    • 您无法从用户空间控制对设备的访问。

    * 内核空间驱动程序:

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

    作为一名内核工程师,我更喜欢在内核上下文中编写代码,这可能就是我在内核中编写整个驱动程序的原因。

    但是,我想说最好的做法是将驱动程序的功能划分为单元,并且只有在有理由时才将单元放入内核中。

    例如:

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

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      相关资源
      最近更新 更多