copy_to_user 可以用于 IO 内存吗?

Posted

技术标签:

【中文标题】copy_to_user 可以用于 IO 内存吗?【英文标题】:Can copy_to_user be used for IO memory? 【发布时间】:2020-11-13 01:30:21 【问题描述】:

我有来自用户空间的缓冲区,需要用设备寄存器填充作为调试机制。将copy_to_user() / copy_from_user() 用于设备内存是否安全?如果不是,鉴于设备驱动程序位于内核空间中,最好的选择是什么?

【问题讨论】:

没有。您提到的 API 与 I/O 无关(在 PIO、MMIO、DMA 方面)。 您能建议将用户缓冲区复制到设备寄存器中的最佳方法吗?我目前正在通过 copy_from_user / to_user 将用户数据复制到中间缓冲区,然后进行内存映射 IO 以复制到设备寄存器中。我觉得这效率低下。 memcpy_toio()memcpy_fromio() 可能是您正在寻找的。但请注意,它们仅在内核空间中工作。 ***.com/questions/28518336/… 上接受的答案告诉我,我无法将这些 API 用于我的设备。我正在寻找将设备注册复制到/从用户空间。 不要相信 SO 上的所有内容,更多的评价人,更垃圾的答案是...... :-( 如果你考虑 MMIO 案例,有两个答案都是错误的。 【参考方案1】:

所有的cmets都错了。

    对于用户和内核空间之间的任何数据移动,您必须使用copy_from/to_user memcpy_from/toio() 保留用于内核空间和 MMIO 中的地址。将这些函数与用户空间地址一起使用是不安全的。

答案:

您可以简单地将copy_from/to_user() 直接与void * tovoid * from 中映射的MMIO 地址一起使用。这样你就不需要无用的中间缓冲区了。

仅用于可预取的内存,因为它可能读/写多次相同的内存和/或以无序的方式。

【讨论】:

以上是关于copy_to_user 可以用于 IO 内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux 内核版本 4.12.8 中未定义的 copy_to_user

可以将 socket.io 用于域套接字吗?

我们可以将 google stun 服务器(nodejs webrtc.io-client 的默认设置)用于商业应用程序吗?

如何从 Linux 内核访问用户空间内存?

内核空间和应用空间的数据拷贝(copy_to_user & copy_from_user)

什么是内存流和文件流?