第 1 部分针对 Oracle Solaris 平台设计设备驱动程序
9. 直接内存访问 (Direct Memory Access, DMA)
14. 分层驱动程序接口 (Layered Driver Interface, LDI)
DMA 句柄是表示对象(通常为内存缓冲区或地址)的不透明指针。设备通过 DMA 句柄可执行 DMA 传送。对 DMA 例程的若干个不同调用可使用句柄来标识为对象分配的 DMA 资源。
DMA 句柄所表示的对象全部包含在一个或多个 DMA cookie 中。DMA cookie 表示 DMA 引擎在数据传送中使用的一段连续内存。系统会根据以下信息将对象划分为多个 cookie:
驱动程序提供的 ddi_dma_attr(9S) 特性结构
目标对象的内存位置
目标对象的对齐
如果一个对象不满足 DMA 引擎的限制,则必须将该对象分为多个 DMA 窗口。一次只能为一个窗口激活和分配资源。使用 ddi_dma_getwin(9F) 函数可在一个对象内的多个窗口之间切换。每个 DMA 窗口都包含一个或多个 DMA cookie。有关更多信息,请参见DMA 窗口。
某些 DMA 引擎可以接受多个 cookie。此类引擎不用借助系统即可执行分散/集中 I/O。如果从一个绑定中返回多个 cookie,则驱动程序应重复调用 ddi_dma_nextcookie(9F) 以检索每个 cookie。然后,必须将这些 cookie 编程到引擎中。随后可对设备进行编程,以传送这些 DMA cookie 聚集所包含的总字节数。