usb_alloc_coherent和kzalloc / kmalloc之间的区别

时间:2015-05-12 03:18:02

标签: linux linux-kernel usb linux-device-driver device-driver

usb_alloc_coherent驱动程序的上下文中使用kzalloc/kmallocUSB之间的根本区别是什么?两者都是一样的,为URB缓冲区分配一个内存区域。但它们有什么不同。使用usb_alloc_coherent代替kzalloc/kmalloc是否有任何好处?

2 个答案:

答案 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完成/重新提交期间的硬件。