在usb_alloc_coherent
驱动程序的上下文中使用kzalloc/kmalloc
和USB
之间的根本区别是什么?两者都是一样的,为URB
缓冲区分配一个内存区域。但它们有什么不同。使用usb_alloc_coherent
代替kzalloc/kmalloc
是否有任何好处?
答案 0 :(得分:1)
驱动程序以设备(端点)为中心,但内存分配必须参考USB控制器的功能。这是因为它是从存储器到USB总线执行DMA的控制器。所以usb_alloc_coherent
基本上包装了泛型dma_alloc_coherent
,但是为控制器调用它,而不是端点。使用DMA-API而不仅仅是kmalloc
可确保不需要反弹缓冲区。
这可以节省设备驱动程序写入代码丑陋(破坏抽象)和处理某些极端情况。 usb_alloc_coherent
还使用内存轮询来加快速度。
答案 1 :(得分:0)
文档说:
usb_alloc_coherent - 为URB_NO_xxx_DMA_MAP分配dma一致性缓冲区
这些缓冲区与
urb->transfer_flags
中设置的URB_NO_xxx_DMA_MAP一起使用 避免使用" DMA弹跳缓冲器"或颠簸IOMMU等行为 URB完成/重新提交期间的硬件。