【问题标题】:Is it necessary to copy data from user space to the kernel before transfering it to an external device?在将数据传输到外部设备之前,是否需要将数据从用户空间复制到内核?
【发布时间】:2020-12-29 17:27:50
【问题描述】:

我有一个设备驱动程序,它为 readwrite 和其他一些文件操作提供了实现。对于从主机到外部设备的传输,建议在将用户空间数据传输到设备之前将其复制到内核空间,因为包含用户空间数据的页面可能会在传输过程中被换出。然而,这似乎是一个主要的开销。是否有可能使用驱动程序直接将用户空间数据传输到设备,而无需将中间副本复制到内核指针?当然,这需要防止可能的换出相应页面。类似的问题也适用于从设备到用户空间的传输。

【问题讨论】:

  • 你可以使用mmap来访问用户空间的内核地址
  • 是的,但在我的情况下,我需要使用设备驱动程序将数据传输到设备。不应直接从用户空间进行传输。
  • 这就是 O_DIRECT 标志在文件 I/O 中的作用。用户缓冲区必须正确对齐,内核将其锁定在内存中。

标签: linux-kernel linux-device-driver embedded-linux


【解决方案1】:

您需要向设备驱动程序发送数据。源数据来自哪里?如果它来自文件,您可以在用户应用程序中使用sendfile:它打开源数据文件(文件描述符 fd1),打开目标驱动程序(文件描述符 fd2)并将数据从 fd1 发送到fd2 调用 sendfile()。这是一个small articledd 工具的增强版本中展示了这个系统调用odd

【讨论】:

  • 设备驱动程序的数据来自用户空间应用程序。它将采用数组的形式。
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多