这是关于Linux(与驱动程序相关)的问题。假设我们有一些硬件,能够进行大型DMA访问(多兆字节读取或写入,您可以考虑使用CUDA卡或网卡)。要传输到设备/从设备传输的数据在用户空间中分配,并放置在用户空间中。
所以,我认为正确的方法是使用DMA访问的mlock()
内存范围。然后用户进程将调用我的驱动程序以启动DMA传输。传输开始后,我的用户空间进程仍在其他线程中工作。
一段时间后,当我相信传输数据时,我想从用户空间线程中做munlock()
内存范围。
合法吗?如果在实际DMA传输结束之前调用munlock()
该怎么办?
这munlock()
会成功还是失败?或者它会阻止,直到DMA传输完成?
PS:来自Zan Lynx的question is originally,来自SO的id13422。
答案 0 :(得分:1)
设备驱动程序负责锁定所有用于DMA的内存,并确保它保持锁定状态。
如果内存已被锁定,则驱动程序仍需要获取对页面的其他引用,以防止它过早解锁。