gpt4 book ai didi

memory-management - arm 架构上的 dma_map_single 内部结构

转载 作者:行者123 更新时间:2023-12-05 09:19:55 26 4
gpt4 key购买 nike

我试图了解 ARM 架构上的 DMA 内部结构,引用内核文档:http://lxr.free-electrons.com/source/Documentation/DMA-API-HOWTO.txt .

我的理解是我们在内核空间分配内存(有DMA约束)并传递给dma_map_single()函数,这个函数会根据DMA需要改变内存的映射属性(写组合或非缓存)。如果平台支持 IOMMU,它将返回设备总线的虚拟地址,或者返回可以从设备直接访问的物理地址。

理解正确吗?

目前,我无法映射它的源代码,任何带有代码片段的指针都会非常有帮助。

最佳答案

不完全是。

对于流式 DMA API(即 dma_map_*()/dma_unmap_*()),实际上没有重新映射。只有来自内核线性映射(即普通 kmalloc() 内存)的地址对流式 DMA 有效,因此由于 CPU 映射是可缓存的,dma_map_*() 操作用于非一致性设备将根据缓冲区的范围清理/使缓存无效,并依赖于 CPU 在相应的 dma_unmap_*() 之前不访问它。然后(如果合适的话)再次使缓存无效,以防同时发生任何推测性提取,然后 CPU 才能读取设备写入内存的任何数据。对于缓存一致的设备,这些都不需要,因此被跳过。

由于缓冲区位于线性映射中,因此 DMA 地址是 virt_to_phys() 偏移量的简单情况,减去任何特定于设备的偏移量以在某些情况下在物理内存和总线地址之间进行转换时髦的硬件(例如 Raspberry Pi 2/3 或 TI Keystone 2)-参见例如the ARM implementation of dma_map_page() (其中 dma_map_single() is merely a special case )。在涉及 IOMMU 的地方,还有一个额外的步骤,即为该物理地址创建一个 IOVA 映射,并返回该 IOVA 而不是底层总线地址。

请注意,对于 coherent DMA API(即 dma_alloc_coherent()),当设备本身缓存不一致时,我们在 vmalloc 区域中为分配的页面创建一个单独的不可缓存映射,然后将不可缓存别名用于所有 CPU 对该缓冲区的访问(在进行一些初始缓存维护以清除线性映射别名之后),因为与流式 DMA 不同,两者允许 CPU 和设备随时访问一致的缓冲区。

关于memory-management - arm 架构上的 dma_map_single 内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39071853/

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