为内存对象分配 DMA 资源之前,必须防止该对象移动。否则,在设备尝试向该对象进行写入时,系统会从内存中删除该对象。缺少对象会导致数据传送失败,并且可能损坏系统。防止内存对象在 DMA 传送过程中移动的过程称为锁定对象。
以下对象类型不要求显式锁定:
通过执行 strategy(9E) 获得的来自文件系统的缓冲区。这些缓冲区已由文件系统锁定。
设备驱动程序中分配的内核内存,如 ddi_dma_mem_alloc(9F) 分配的内核内存。
对于其他对象(如用户空间中的缓冲区),必须使用 physio(9F) 或 ddi_umem_lock(9F) 来锁定对象。使用这些函数来锁定对象通常在字符设备驱动程序的 read(9E) 或 write(9E) 例程中执行。有关示例,请参见数据传输方法。