gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:34 27 4
gpt4 key购买 nike

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

问题如下:

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com