目录
特殊属性快速路径 (DMA_ATTR_NO_KERNEL_MAPPING)
前述文章中,我们介绍了分配内存的几种方式以及着重介绍mmap方式的一个参数,本文介绍分配内存的过程。
内核源码及路径
| 路径 | 函数及宏 功能 |
| kernel\dma\mapping.c | dma_alloc_attrs |
| kernel\kernel\dma\coherent.c | dma_declare_coherent_memory dma_alloc_from_dev_coherent DMA设备一致性内存分配 |
| \kernel\kernel\dma\direct.c | dma_direct_alloc DMA CMA内存分配 |
| \kernel\include\linux\dma-mapping.h | dma_alloc_coherent |
| arch\arm64\mm |
arch_dma_prep_coherent 分配内存页后,将内存页转换虚拟地址并调用__dma_flush_area |
| \kernel\arch\arm64\mm\cache.S | __dma_flush_area 功能clean & invalidate D / U line |
| I:\rk3588\kernel\arch\arm64\include\asm\pgtable.h | pgprot_syscached 功能Mark the prot value as outer cacheable and inner non-cacheable |
CONFIG_DMA_DECLARE_COHERENT
声明设备默认支持硬件一致性DMA(Hardware-Coherent DMA),使得内核在分配DMA缓冲区时,自动假设设备与CPU缓存保持一致,无需软件维护同步。
| 场景 | 启用 CONFIG_DMA_DECLARE_COHERENT |
不启用 |
|---|---|---|
| 内存分配 | dma_alloc_coherent() 返回硬件一致性内存 |
默认返回非一致性内存(需手动同步) |
| 同步操作 | 无需调用 dma_sync_* |
必须显式同步缓存 |
| 设备树/ACPI配置 | 需设备节点包含 dma-coherent 属性 |
无特殊要求 |
| 性能 | 更高(无同步开销) | 较低(依赖软件同步 |
如何验证硬件是否真正支持一致性?
-
检查


1283

被折叠的 条评论
为什么被折叠?



