DMA与cache一致性的问题
Cache和DMA本身似乎是两个毫不相关的事物。Cache被用作CPU针对内存的缓存利用程序的空间局部性和时间局部性原理,达到较高的命中率,从而避免CPU每次都必须要与相对慢速的内存交互数据来提高数据的访问速率。DMA可以作为内存与外设之间传输数据的方式,在这种传输方式之下,数据并不需要经过CPU中转。
假设DMA针对内存的目的地址与 Cache缓存的对象没有重叠区域(如图11.12所示)DMA和 Cache之间将相安无事。但是,如果DMA的目的地址与 Cache所缓存的内存地址访问有重叠(如图11.13所示),经过DMA操作,与 Cache缓存对应的内存中的数据已经被修改,而CPU本身并不知道,它仍然认为 Cache中的数据就是内存中的数据,那在以后访问 Cache映射的内存时f,它仍然使用陈旧的 Cache数据。这样就会发生 Cache与内存之间数据“不一致性”的错误。
所谓 Cache数据与内存数据的不一致性,是指在采用 Cache的系统中,同样一个数据可能既存在于 Cache中,也存在于主存中, Cache与主存中的数据一样则具有一致性,数据若不一样则具有不一致性。需要特别注意的是, Cache与内存的一致性问题经常被初学者遗忘。在发生 Cache与内存不一致性错误后,驱动将无法正常运行。如果没有相关的背景知识,工程师几乎无法定位错误的原因,因为这时所有的程序看起来都是完全正确的。 Cache的不一致性问题并不是只发生在DMA的情况下,实际上,它还存在于 Cache使能和关闭的时刻。例如,对于带MMU功能的ARM处理器,在开启MMU之前,需要先置 Cache无效,对于TLB,也是如此,代码清单11.12给出的这段汇编可用来完成此任务。
/* 使cache无效 */
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c7, c10, 4
mcr p15, 0, r0, c8, c7, 0
因此申请DMA内存而避免Cache不一致的问题的话,就需要使用dma_alloc_coherent()
等方法申请;
DMA与cache一致性的问题的更多相关文章
- 【转】DMA和cache一致性
DMA和cache一致性问题 Cache原理 CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU ...
- DMA及cache一致性的学习心得 --dma_alloc_writecombine【转】
转自:https://www.cnblogs.com/hoys/archive/2012/02/17/2355914.html 来源:http://xmxohy.blog.163.com/blog/s ...
- Cache一致性与DMA
cache一致性与DMA 第一个问题 对于进行DMA操作的设备, 并不是所有系统都保持它们的cache一致性.在这种情况下, 准备进行DMA的设备可能从RAM得到陈旧的数据, 因为脏的cache行可能 ...
- 3.3.1 Cache一致性的基本概念
PCI设备对可Cache的存储器空间进行DMA读写的操作的过程较为复杂,有关Cache一致性的话题可以独立成书.而不同的处理器系统使用的Cache Memory的层次结构和访问机制有较大的差异,这部分 ...
- ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联
ARM Linux 内核 panic 之cache 一致性 ——cci-400 cache一致互联 CCI-400 集合了互联和一致性功能,有 2 个 ACE slave 接口和 3 个 ACE-Li ...
- Linux DMA访问的一致性
DMA访问的一致性 DMA对内存是直接访问的,而CPU对内存的访问有时会通过cache.不管是CPU还是DMA访问内存,都需要确保cache的一致性.本文只分析从DMA的角度,对内存的访问如何确保ca ...
- 《大话处理器》Cache一致性协议之MESI (转)
原文链接:http://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI 处理器上有一套完整的协议,来保证Cache ...
- ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播
ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播 Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式 ...
- Cache一致性协议之MESI
http://blog.csdn.net/muxiqingyang/article/details/6615199 Cache一致性协议之MESI 处理器上有一套完整的协议,来保证Cache一致性.比 ...
随机推荐
- 测试工具之RobotFramework安装
Robot Framework很多公司再用,图形化界面,类表格填写关键字和参数,几乎不需要编码知识,上手很快 最近看到某满公司使用的就是这个工具,特地看了下,确实很简单,对于初入测试行业的人来说是个很 ...
- UFLDL 教程学习笔记(一)神经网络
UFLDL(Unsupervised Feature Learning and Deep Learning)Tutorial 是由 Stanford 大学的 Andrew Ng 教授及其团队编写的一套 ...
- 使用git往gitee传数据时pull命令的使用
按‘i’进入编辑模式------->写入内容------>按Esc键退出-------->在左下角的冒号后面输入‘wq’,表示退出并保存
- SOA总结(脑图图片)
- Git学习系列之Windows上安装Git详细步骤(图文详解)
前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...
- Ubuntu编译安装最新的webkit
好久都没更新webkit 源码在ubuntu上编译了,网上搜了一下,基本上都是早期编译的webkit版本.可能是大家都去搞高大上的谷歌浏览器了吧. 今天就以ubuntu14.04版本作为编译环境来讲讲 ...
- JStorm-介绍
1.概述 JStorm 是一个类似于 Hadoop 的MapReduce的计算系统,它是由Alibaba开源的实时计算模型,它使用Java重写了原生的Storm模型(Clojure和Java混合编写的 ...
- 使用Sublime Text 2 和 MinGW 搭建C开发环境
使用工具 Sublime Text 2(Download) MinGW(Download)或者使用CygWin(Download)亦可 1.配置环境变量 下载和安装Sublime Text 2和Min ...
- SpringBoot入门之集成Druid
Druid:为监控而生的数据库连接池.这篇先了解下它的简单使用,下篇尝试用它做多数据源配置.主要参考:https://github.com/alibaba/druid/wiki/常见问题 https: ...
- loggin(日志模块)
这是一个提供日志功能的模块,它可以让你更敏捷的为你程序提供日志功能 一.常用日志记录场景及最佳解决方案: 日志记录方式 最佳记录日志方案 普通情况下,在控制台显示输出 print()报告正常程序操作过 ...