首页 文章

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

提问于
浏览
2

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

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

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

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

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

谢谢,冉

1 回答

  • 3

    *** User-space driver:**

    • 更容易调试 .

    • 大量的库来支持你 .

    • 允许您隐藏IP的详细信息(如果您愿意的话,人们会非常讨厌您!)

    • 崩溃不会影响整个系统 .

    • 处理中断的延迟较高,因为内核必须以某种方式将中断中继到用户空间 .

    • 您无法控制用户空间对设备的访问 .

    *** Kernel-space driver:**

    • 难以调试 .

    • 仅支持Linux内核框架 .

    • 您始终可以提供二进制blob来隐藏IP的详细信息,但这很烦人,因为它必须针对特定内核生成 .

    • 崩溃将导致整个系统崩溃 .

    • 处理中断的延迟更少 .

    • 您可以从内核空间控制对设备的访问,因为它是所有进程都看到的全局上下文 .

    作为一名内核工程师,我更熟悉/快乐地在内核上下文中修改代码,这可能就是我在内核中编写整个驱动程序的原因 .

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

    For example:

    • 如果您的设备有共享资源(如MMU,硬件FIFO)并且您希望多个进程能够安全地使用它,那么可能您需要一些缓冲区管理器在内核中并且所有进程都将与它通信通过ioctl .

    • 如果您的驱动程序需要尽快响应中断(非常低延迟),那么您需要将处理中断的代码部分放在内核中断处理程序中,而不是将其放在用户空间中并通知用户发生中断时的空间 .

相关问题