gpt4 book ai didi

linux - 什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?

转载 作者:IT王子 更新时间:2023-10-29 00:31:31 28 4
gpt4 key购买 nike

什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?什么时候可以在 Linux 设备驱动程序中使用 DMA 映射 API 和 DMA 引擎 API?任何真正的 Linux 设备驱动程序示例作为引用都是很好的。

最佳答案

What is DMA mapping and DMA engine in context of linux kernel?

内核通常使用虚拟地址。 kmalloc()vmalloc() 等函数通常返回虚拟地址。它可以存储在 void* 中。虚拟内存系统将这些地址转换为物理地址。这些物理地址实际上对驱动程序没有用。驱动程序必须使用 ioremap() 映射空间并生成虚拟地址。

               CPU                  CPU                  Bus
Virtual Physical Address
Address Address Space
Space Space

+-------+ +------+ +------+
| | |MMIO | Offset | |
| | Virtual |Space | applied | |
C +-------+ --------> B +------+ ----------> +------+ A
| | mapping | | by host | |
+-----+ | | | | bridge | | +--------+
| | | | +------+ | | | |
| CPU | | | | RAM | | | | Device |
| | | | | | | | | |
+-----+ +-------+ +------+ +------+ +--------+
| | Virtual |Buffer| Mapping | |
X +-------+ --------> Y +------+ <---------- +------+ Z
| | mapping | RAM | by IOMMU
| | | |
| | | |
+-------+ +------+

如果设备支持 DMA ,驱动程序使用 kmalloc 或返回虚拟地址 (X) 的类似接口(interface)设置缓冲区。虚拟的内存系统将 X 映射到系统 RAM 中的物理地址 (Y)。司机可以使用虚拟地址 X 访问缓冲区,但设备本身不能,因为 DMA 不通过 CPU 虚拟内存系统。在某些系统中,只有 Device 可以直接对物理地址进行 DMA。在某些系统中,IOMMU 硬件用于将 DMA 地址转换为物理地址。请看上图,它将 Z 转换为 Y。

When DMA mapping API can be used in Linux Device Driver?

使用 DMA 映射 API 的原因是驱动程序可以将虚拟地址 X 返回到接口(interface),如 dma_map_single(),它设置任何所需的 IOMMU映射并返回 DMA 地址 Z。然后驱动程序告诉设备对 Z 执行 DMA,IOMMU 将其映射到系统中地址 Y 的缓冲区内存。

引用来自this link .

Any real Linux Device Driver example as a reference would be great.

A simple PCI DMA example

在 linux 内核中你可以查看 drivers/dma用于各种真实驱动程序。

关于linux - 什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463909/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com