【DMA】如何保证 DMA 和 cache 的一致性

news/2025/2/11 21:08:32/

一方面,当 CPU 要从cache 读取数据时,会先检查cache是否命中,如果命中就直接返回,此时便不再访问内存;另一方面,DMA 在 向内存写入数据。这样一来就造成了DMA 传输的内容和cache中缓存的内容不一致。

 

DMA 向内存写入数据

当 CPU 收到 DMA 的写请求时,说明有新数据要来了,为了保证一致性,CPU 要先清空 cache

  •  先对 cache 进行 clean 操作(检查dirty位,如果为真,写回下一级存储)
  • 再进行 invalid 操作,让 cache 中的数据无效化,下一次访问 cache,直接访问内存

当内存中有新数据时,因为缓冲策略,一方面会将数据返回给CPU,另一方面也会在cache中保存一份新数据。

 

DMA 从内存读取数据

当 CPU 收到 DMA 的读请求时,说明DMA要将数据写入到外设了,此时CPU 需要对 cache 进行flush 操作,将数据刷到内存中,此时 DMA 读取到的就是最新的数据了。

 

参考文章:

DMA cache一致性怎么保持(修改中)_星空语的博客-CSDN博客

内存CACHE中invaild、clean、flush的作用_cache flush_秋绘の枫的博客-CSDN博客


http://www.ppmy.cn/news/1015076.html

相关文章

【CSS】说说对BFC的理解

目录 一、概念 二、BFC的布局规则 三、设置BFC的常用方式 四、BFC的应用场景 1、解决浮动元素令父元素高度坍塌的问题 2、解决非浮动元素被浮动元素覆盖问题 3、解决外边距垂直方向重合的问题 五、总结 一、概念 我们在页面布局的时候,经常出现以下情况&am…

多重网格算法的cuda编程

这里写自定义目录标题 多重网格算法介绍问题描述——五点差分法求解二维泊松方程五点差分法Gauss迭代算法限制算子介绍提升算子二重网格算法多重网格算法多重网格cuda代码编写串行代码mg.c两重网格cuda并行代码jacobi迭代的cuda编程device_jacobiMakefilecuda_mg.cucuda_mg.hma…

如何从PostgreSQL中的Json数组中获取元素

我已经对此进行了大量搜索,但仍然无法回答.我正在使用PostgreSQL.在下面的示例中,列名称为"sections",列类型为json []. 我的专栏在数据库中看起来像这样: sections [{"name" : "section1","attributes": [{"attrkey1&quo…

多线程-Runable和Callable的区别

在Java中,多线程可以通过实现Runnable接口或使用Callable接口来实现。这两种方式有一些区别,如下所示: 返回值: Runnable接口的run()方法没有返回值,它表示一个没有返回结果的任务。Callable接口的call()方法有返回值…

云原生基础架构的最佳状态,就是没有架构?

云原生基础架构是通向云原生时代的基石,对于很多架构师来说,上云之后,架构为什么成为了云原生架构而不是传统的架构,两者有何区别?云原生基础架构是如何演进的?本文进行了全面梳理。 什么不是云原生基础架…

GitHub霸榜的顶级分布式笔记,阿里内部独家分享

微服务因其高内聚、低耦合、高扩展、敏捷开发为很多企业所用,当然,没有任何一项技术是完美的。系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务器并操作多个数据库实现。 毫不夸张地说,分布式事务已经成…

分布式和高并发的详细介绍

分布式系统和高并发性能是现代计算领域中的两个关键概念。随着互联网和计算技术的迅速发展,越来越多的应用需要能够处理大规模的数据和用户并发。在本文中,我们将深入介绍分布式系统和高并发性能的概念、特点、挑战和应对方法。 分布式系统的介绍 分布…

CentOS7删除用户完全指南

一、概览 在Linux中,用户账户是最重要的组成部分之一。在CentOS7中,管理员可以通过多种方式来管理用户账户。包括创建、修改和删除用户账户等。删除用户账户时,需要注意一些细节和陷阱,以确保操作的安全性和正确性。 二、删除用…