1

这是关于 Linux 的问题(与驱动程序相关)。假设我们有一些硬件,能够进行大型 DMA 访问(多千兆字节读取或写入,您可能会想到 CUDA 卡或网卡)。要传输到设备/从设备传输的数据在用户空间中分配并放置在用户空间中。

所以,我认为正确的方法是mlock()使用 DMA 访问的内存范围。然后用户进程将调用我的驱动程序来启动 DMA 传输。开始传输后,我的用户空间进程仍在其他线程中工作。

一段时间后,当我相信数据被传输时,我想munlock()从用户空间线程做内存范围。

合法吗?如果我munlock()在实际 DMA 传输结束之前打电话怎么办?

这会munlock()成功还是失败?还是会阻塞直到 DMA 传输完成?

PS:问题最初来自 Zan Lynx,ID13422 在 SO。

4

1 回答 1

1

设备驱动程序负责锁定所有用于 DMA 的内存,并确保它保持锁定状态。

如果内存已经被锁定,驱动程序仍然需要获取对页面的额外引用,以防止它被过早解锁。

于 2013-09-22T14:57:57.340 回答