linux - 使用附加参数在 linux 驱动程序中写入数据

标签 linux char driver device device-driver

我对驱动开发不是很熟悉,但我必须进行简单的驱动适配,我不确定要走的路。我不是在寻找详细的解释(我可以在书中查到),而是更多地了解什么是“最佳实践”,这些“最佳实践”向我展示了我收集知识的起点。

问题如下:

最初,我们有一个非常简单的字符驱动程序来执行此操作:

User       "write"         driver copies
Space ==== packets  =====> the data
Code       to open fd      from user space
           of the driver   and passes it to 
                           a hw controller

执行的简单调整是,现在,硬件 Controller 需要一个额外的数字标签来识别数据包的类型。通常情况下,这个标签应该与每个写入的数据包一起指定。

怎样做比较明智?

  • 创建一个单独的 ioctl 调用来提供此标记,然后执行真正数据包数据的“写入”调用(然后在用户空间使用“ioctl”和“写入”)。
  • 创建一个 ioctl 调用以同时传递标签和数据包数据(然后在用户空间中使用这个“ioctl”调用)
  • 创建一个额外的结构(在用户空间和驱动程序之间共享),包含标记和指向缓冲区的指针,然后在用户空间中“写入”这个结构(因此,从用户空间复制两次:一个用于结构和第二个用于数据包数据)。
  • ...?

我们非常欢迎任何提示/评论/建议。

最佳答案

第一个和第三个选项在性能方面实际上是相同的(两次调用内核并返回)但是使用 write 比 ioctl 更漂亮。

第二个选项为您节省了进入内核和返回内核的上下文切换,但是很丑陋。

我会定义一个包含数据包类型的第一个字节的结构,并用数据包数据放置一个缓冲区,但将使用 writev() 而不是 write() 将其发送到内核。

它不仅为您节省了额外的上下文切换,它实际上还允许您在对内核的一次调用中发送多个数据包(及其类型),如果可用的话。

有人会说我的建议和你的第二个没有区别。也许他们是对的:-)

关于linux - 使用附加参数在 linux 驱动程序中写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6842250/

相关文章:

linux - 了解 Linux 内核驱动程序

linux - 用于在 linux 或 window 中进行 Web 开发的 Iphone 模拟器

regex - SED 脚本 - 排除 self

linux - 如何将此 awk 命令的输出保存到文件中?

mysql - 将 varchar/char 转换为枚举

c++ - std::string 到 char*

linux - 以编程方式发送 SSH 转义字符

golang 中的字符串转换和 Unicode

c# - 驱动程序调用 Web 服务

c - KL25 DAC 驱动器在示波器上显示无输出