【问题标题】:Difference between usb_alloc_coherent and kzalloc/kmallocusb_alloc_coherent 和 kzalloc/kmalloc 的区别
【发布时间】:2015-05-12 03:18:02
【问题描述】:

USB 驱动程序的上下文中使用usb_alloc_coherentkzalloc/kmalloc 的根本区别是什么。两者都是一样的,为URB缓冲区分配一个内存区域。但是他们有什么区别。使用usb_alloc_coherent 代替kzalloc/kmalloc 有什么好处吗?

【问题讨论】:

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


    【解决方案1】:

    驱动程序以设备(端点)为中心,但内存分配必须参考 USB 控制器的功能。这是因为控制器执行从内存到 USB 总线的 DMA。所以usb_alloc_coherent 基本上包装了通用dma_alloc_coherent,但它是为控制器而不是端点调用的。使用 DMA-API 而不仅仅是 kmalloc 可确保不需要反弹缓冲区。

    这可以避免编写设备驱动程序的代码丑陋(破坏抽象)和处理一些极端情况。 usb_alloc_coherent 还使用内存轮询来加快速度。

    【讨论】:

      【解决方案2】:

      文档说:

      usb_alloc_coherent - 为 URB_NO_xxx_DMA_MAP 分配 dma-consistent 缓冲区

      这些缓冲区与 urb->transfer_flags 中设置的 URB_NO_xxx_DMA_MAP 一起使用 避免使用“DMA 反弹缓冲区”或破坏 IOMMU 等行为 URB 完成/重新提交期间的硬件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 2017-02-17
        • 2014-03-26
        • 1970-01-01
        • 2013-02-27
        相关资源
        最近更新 更多