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 * to
或void * from
中映射的MMIO 地址一起使用。这样你就不需要无用的中间缓冲区了。
仅用于可预取的内存,因为它可能读/写多次相同的内存和/或以无序的方式。
【讨论】:
以上是关于copy_to_user 可以用于 IO 内存吗?的主要内容,如果未能解决你的问题,请参考以下文章
linux 内核版本 4.12.8 中未定义的 copy_to_user
我们可以将 google stun 服务器(nodejs webrtc.io-client 的默认设置)用于商业应用程序吗?