微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DMA 中的流映射和相干映射有什么区别

如何解决DMA 中的流映射和相干映射有什么区别

根据 Linux Device Drivers 一书作者的说法:必须确保操作系统和硬件之间的 DMA 地址映射范围应该相等

在尝试 DMA 之前必须回答的第一个问题是给定的设备在哪里 能够在当前主机上进行这样的操作

来自 Kernel.org 它说 流式映射设置的第一步是通过调用

        int dma_set_mask(struct device *dev,u64 mask);
    

DMA 一致映射/一致分配的第一步是通过调用执行的

       to dma_set_coherent_mask()   

在 E1000E 驱动程序和 RealTek 驱动程序中都这样做,因为它们在 pci 驱动程序的探测函数中使用此函数调用

       dma_set_mask_and_coherent    

用于流式传输和相干映射通知内核硬件支持的位掩码 64

这就是 RealTek 设备驱动程序启用两个 DMA 映射的方式

      dma_alloc_coherent(&pdev->dev,R8169_RX_RING_BYTES,&tp->RxPhyAddr,GFP_KERNEL);

net_device 的 open 函数内部

用于流式 DMA 映射

     alloc_pages_node  // allocating Kernel page for DMA
     dma_map_page(d,data,R8169_RX_BUF_SIZE,DMA_FROM_DEVICE); //Enabling Streaming mappingg?

也在开放函数

我的问题是为什么 DMA 有两个映射,为什么真正的驱动程序同时使用 Streaming 和 Coherent 映射?

就像在 RealTek 设备中一样,它只使用单页流映射和相干映射,所以基本上它的连接 Rx 描述符数组由指针表示,相干映射和页流映射连接到一个数组,它称为 {{1 类型的 Rx_databuff[256U] }}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。