驱动开发中的DMA是什么

DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。 使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来, 从而大大提高系统的吞吐率。 DMA通常与硬件体系结构, 特别是外设的总线技术密切相关。

DMA方式的数据传输由DMA控制器(DMAC) 控制, 在传输期间, CPU可以并发地执行其他任务。当DMA结束后, DMAC通过中断通知CPU数据传输已经结束, 然后由CPU执行相应的中断服务程序进行后处理。

DMA与Cache一致性

Cache和DMA本身似乎是两个毫不相关的事物。 Cache被用作CPU针对内存的缓存, 利用程序的空间局部性和时间局部性原理, 达到较高的命中率, 从而避免CPU每次都必须要与相对慢速的内存交互数据来提高数据的访问速率。 DMA可以作为内存与外设之间传输数据的方式, 在这种传输方式之下, 数据并不需要经过CPU中转。

假设DMA针对内存的目的地址与Cache缓存的对象没有重叠区域 , DMA和Cache之间将相安无事。 但是, 如果DMA的目的地址与Cache所缓存的内存地址访问有重叠, 经过DMA操作, 与Cache缓存对应的内存中的数据已经被修改, 而CPU本身并不知道, 它仍然认为Cache中的数据就是内存中的数据, 那在以后访问Cache映射的内存时, 它仍然使用陈旧的Cache数据。 这样就会发生Cache与内存之间数据"不一致性"的错误。

相关推荐
爱写代码的汤二狗4 小时前
第4章 载体选择:网站、小程序还是App?
人工智能·驱动开发·创业创新
charlie1145141918 小时前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(4)Rootfs 目录结构创建:Linux 文件系统的“骨架“
linux·驱动开发·学习·嵌入式开发·嵌入式linux
篮子里的玫瑰8 小时前
智能天气时钟项目(一):ESP32 AT指令集详解与STM32驱动开发
驱动开发·stm32·嵌入式硬件
俊俊谢19 小时前
LabVIEW如何排查和修复dll缺失问题
驱动开发·.net·labview·dll
musicml1 天前
从 Vibe Coding 到 SDD(规范驱动开发):AI 原生时代的软件工程化实践
人工智能·驱动开发·软件工程
不怕犯错,就怕不做1 天前
Linux中的IS_ENABLED 函数实战使用demo
linux·驱动开发·嵌入式硬件
the sun341 天前
我的第一个字符驱动:基于Linux2.4之前版本的古法编程
linux·驱动开发
charlie1145141912 天前
2026年正点原子开发板移植方案——从0开始的Rootfs之路(3)inittab 与 init 系统:Linux 启动的“第一号进程“全解析
linux·驱动开发·学习·嵌入式开发·嵌入式linux
智者知已应修善业2 天前
【文氏电桥振荡电路】2022-8-25
驱动开发·经验分享·笔记·硬件架构·硬件工程
春日见2 天前
GIT操作大全(个人开发与公司开发)
开发语言·驱动开发·git·matlab·docker·计算机外设·个人开发