如何解决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
这就是 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 举报,一经查实,本站将立刻删除。