Cache&WriteBuffer学习总结

内存中的Buffer和Cache有什么区别? 我们知道可以使用free 和 top 等工具,来查看系统和进程的内存使用情况,我们也知道内存和 CPU 的关系非常紧密,而内存管理本身也是很复杂的机制。所以,接下来一点点抽丝剥茧 free # 注意不同版本的 free 输出可能会有所不同 $ free total used free shared buff/cache ... 阅读详情

关于Cache与WriteBuffer的原理可以查阅相关博客或书籍。这里我只想讨论哪种情况下不能使用Cache与WriteBuffer,以及使用Cache与WriteBuffer时给存储系统带来的一致性问题以及解决方法。

使用Cache通常需要存储器件具有下面的特性:

a.读操作将返回最后一次写入的内容,而且没有其它的副作用

b.写操作除了影响目标单元的内容外,没有其它的副作用

c.对同一目标单元的两次连续读取操作将得到相同的结果

d.对同一目标单元的两次连续写操作将会把第2次写操作的值写入目标单元,第1次写操作将没有意义

 

一.以下情况不能使用Cache与WriteBuffer

由于在ARM系统中,IO操作通常被映射为存储器操作,IO的输出操作可以通过存储器写入操作实现:IO的输入操作可以通过存储器读取操作实现,这样IO空间就被映射成了存储器空间。例如:ARM芯片,对USART,SPI接口的读写是通过映射存储器操作来实现的,当读SPI的数据时,是读特定寄存器地址,当写SPI数据时,是写特定的寄存器地址。由于前后两次读取同一地址的内容不相同,故对于ARM芯片的SPI,USART不能使用Cache。因而对于存储器映射的IO空间的操作就不能使用Cache技术。

 

由于写缓冲技术可能推迟写操作,它同样不适合对于存储器映射的IO空间的操作。例如:当CPU向中断控制器的IO端口写ACK,清除当前中断请求标志位,并重新使能中断,如果使用了写缓冲技术,CPU的写操作将被先写入高速的缓冲区,高速的缓冲区可能在以后某个时间再将结果写到IO端口,这样就造成一种假象,似乎外设又发出了中断请求。

 

由于上述原因,通常MMU允许将某些地址空间设置成uncacheable和unbufferable。MMU页表中地址转换条目的C和B位就是用于控制相应的存储空间的缓冲特性。其具体编码含义如下图所示:

 

程序设计中要注意以下几点:

1.       对于写回类型的Cache不能设置成Cached/Unbuffered.这是因为把它设置成Unbuffered是为了防止延迟存储访问操作的执行时间,而对于写回Cache,如果设置成Cached必然造成访问操作执行的延迟。

2.       对于存储器映射的IO空间要设置成Uncached/Unbuffered.原因已经在上面说了,如果在高级语言中访问存储器映射的IO空间时,还必须告诉编译器不要在优化时删掉有用的存储访问操作。在C语言中的作法是:使用关键字volatile声明存储器映射的IO空间来防止编译器在优化时删掉有用的存储访问。

3.       当程序的访问局部性很差时,应把存储区域设置成Uncached的。因为Cache引入的先提条件是建立在程序的时间局部性和空间局部性的。

 

 

二、存储系统的一致性问题

当存储系统中引入了Cache和写缓冲区时,同一地址单元的数据可能在系统中有多个副本,分别保存在cache中,写缓冲区中及主存中。如果系统采用了独立的数据cache和指令cache,同一地址单元的数据还有可能在数据cache和指令cache中有不同的版本。

当发生以下情况时,会产生不一致的情况:

1.       地址映射关系变化造成的数据不一致

情况1:Cache

在虚拟地址到物理地址映射发系发生变化前,如果虚拟地址A1所在的数据块已经预取在Cache中,当地址映射关系发生变化后,如果虚拟地址A1所在的物理地址发生了变化,这时当CPU访问A1时,再使用Cache中的数据块将会得到错误的结果。

  

解决方法:

   在地址映射关系发生变化之前,执行下面操作: 

 如果数据Cache为写回类型的Cache,清空该数据Cache

  使指令Cache中相应的块无效

 

  如果数据Cache不是写回类型的Cache,则使数据Cache中相应的块无效

  使指令Cache中相应的块无效

 

   注意:为什么要分写回类型的Cache讨论,因为对于写回类型的Cache,无效并不使数据写回到主存中,必须用清空操作才行

 

  情况2:WriteBuffer

当系统采用了写缓冲区时,在虚拟地址到物理地址映射关系发生变化前,如果CPU向虚拟地址A1的单元执行了写操作,该写操作已经将A1以及对应的数据写入到缓冲区中,当映射地址发生变化之后,如果虚拟地址A1所在的物理地址发生了变化,当写缓冲区将上面被延迟的写操作写到主存中时,使用的是变化后的物理地址,从而使写操作失败。

 

 解决方法:

1.       将相关的存储区域设置成非缓冲的。

或者

2. 在地址映射变化之前,将写缓冲区被延迟的写操作全部执行,即清空写缓冲区。

 

 注意:方法1是从整体上解决写缓冲区的问题。

 

2.       指令Cache的数据一致性问题

当系统中采用独立的数据Cache和指令Cache时,下面的情况会可能会造成指令不一致的情况。

情况:

  a.读取地址为A1的指令,从而包含该指令的数据块被预取到Cache中。

  b.与A1在同一个数据块的地址为A2的存储单元的数据被修改。这个写操作可能影响数据Cache中,写缓冲区中和地址为A2的存储单元的内容,但不影响指令Cache中A2的存储单元的内容。

  c.如果A2存放的是指令,当该指令执行的时候,将会发生指令不一致的情况

 

解决方法:在a,b之间插入如下的操作序列

对于使用统一的数据Cache和指令Cache的系统,不需要任何操作

 

对于使用独立的数据Cache和指令Cache的系统,使指令Cache内容无效

如果数据Cache是写回类型的,清空数据Cache,使数据写回主存

 

指令数据不一致的问题,通常发生在以下情况:当可执行文件加载到主存之后,在程序跳转到入口点开始处执行之前,先执行上述操作序列,以保证以下面指令的是新加载的可执行代码,而不是原来的旧代码。

 

3.       DMA造成的数据不一致问题

DMA操作会直接访问主存,而不会更新Cache和写缓冲中相应的内容,这样可能造成数据的不一致。

如果DMA从主存中读取的数据已经包含在Cache中,而且Cache中对应的数据已经被更新,这样DMA读到的将不是系统中最新的数据。同样,DMA写操作直接更新主存中的数据,如果该数据已经在Cache中,则Cache中的数据将会比主存中的数据“老”,也将造成数据的不一致。

 

解决方法:

在DMA读主存之前,清空数据Cache和清空写缓冲区

在DMA写主存之后,数据Cache中块使无效,或无效数据Cache

 

   最根本的解决方法:

   将DMA访问的存储区域设置成Uncahced/Unbuffered

 

 

 

 2011-4-21

 

AXI协议的transaction attributes和cache属性 1.cache的读写 参考:http://www.mamicode.com/info-detail-2032670.html allocate的理解,就是先让cache分配一个块,然后把write(CPU写)或read(CPU读)的date放进去 1.CPU读Cache时: ●若hit,则CPU直接从Cache中读取数据即可。 ●若miss,有两种处理方式: >Read t... 阅读详情

相关推荐

【ARM Cache 与 MMU/MPU 系列文章 3 – Cache 与 MPU 是什么关系?】

MPU 全称"Memory Protection Unit",中文叫“存储保护单元”,它是 Cortex-M 处理器内部的一个模块(注意:并不是所有 Cortex-M 版本都支持 MPU,并且在一些支持 MPU 的 Cortex-M 版本上,MPU 也是可选组件)。MPU 介于 Core 和 Bus matrix 中间。

CodingCos的博客 2052

cache和write buffer

Cache是一种容量小、速度快的存储器阵列,它位于主存和处理器内核之间,保存着最近一段时间处理器涉及到的主存块内容,主要是为了缓解慢速存储器和处理器之间的速度不匹配造成的访问瓶颈问题。write buffer经常和Cache配合使用。用来缓解处理器和Cache等高速设备和慢速存储器之间的写速度匹配问题。除了处理器和write buffer之外,与cache相关的还有MMU、总线架构等。如如果总线是

yubingjunj的专栏 4810

红帽RHCE考试下午-RHCE (RH294)任务概览[2021最新版]

RH294任务概览 考试时间4个小时,6台虚拟机,15道题 原来通过脚本或者集群做的题现在都需要使用playbook实现 考试时大概有6台虚拟服务器,都已经做好了互相的免密 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行 注意:考试时一定注意要求将playbook放在哪个用户的家目录中,就需要用指定的户登录做题!

SunMy的博客 5619

关于cache和write buffer

http://blog.chinaunix.net/uid-20662820-id-3917558.html 1. 关于cache和write buffer cache和write buffer都是内置于CPU内部的一小段高速存储器,cache中保存着最近一段时间被CPU使用过的内存数据,而write buffer则是用来应对内存的写操作的,将原本要写向内存的数据暂写到wri...

eric43的专栏 3680

微信小程序 - 详细实现可移动悬浮按钮,全屏悬浮元素图标可拖动拖拽并自动吸附边缘,微信小程序实现悬浮球吸附边缘+计算靠边靠拢效果(详细代码,拖拽中途放手,靠左就自动跑到屏幕左侧,反之靠右跑到屏幕右侧)

微信小程序,vue2,vue3,微信小程序悬浮功能小按钮,自动吸附边缘效果,微信小程序之可拖动悬浮按钮的实现,如何实现靠近边缘自动吸住功能,小程序右下角的悬浮效果,实现可拖动悬浮图标,自动向两边靠拢,悬浮按钮的实现,微信小程序悬浮球效果,微信小程序(可拖动悬浮按钮)当靠近屏幕边缘时会磁吸靠近,如何实现全局悬浮按钮,悬浮球判断吸附在左右,全屏悬浮能拖着走,小程序怎么做悬浮图标靠近左右两侧能吸附住,悬浮菜单按钮,悬浮球可拖拽,全局悬浮球,全局悬浮框,实现悬浮按钮可拖动,自动吸附边缘效果,若按钮此时位于页面中间偏

🏆 前端领域优质创作者 1万+

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

2020-09-22

转载:https://blog.youkuaiyun.com/hit_shaoqi/article/details/53243173 Cachable和Bufferable 一个Master发出一个读写的request,中间要经过很多Buffer,最后才能送到memory。这些Buffer的添加是为了outstanding,timing,performance等。 Buffer有两种类型:一种FIFO结构,仅仅就是保存发送Request给下一级或者返回Response给上一级。还有一种Buffer,在接受了上一级的Re

weixin_39662684的博客 184

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

西门子S7-1200PLC与FANUC机器人进行PROFINET IO通信的具体方法和步骤详解

Robot_PLC_HMI_Automation 1万+

Java NIO 之 Buffer(缓冲区)

一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来。这块内存被NIO Buffer包裹起来,对外提供一系列的读写方便开发的接口。 在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double

worldchinalee的博客 382

uniapp - [微信小程序] 实现点击预览各种文件 pdf文档、视频mp4、mp3音乐、图片图像、word/excel/ppt 等,uniapp小程序文件预览功能(详细示例代码,一键复制开箱即用)

uniapp,uniapp微信小程序,支付宝小程序平台端,uniapp实现文件在线预览,uniapp微信小程序怎么实现预览视频mp4,mp3音乐,图片,office文档,小程序平台如何在线预览word/excel/ppt文档,uniapp实现小程序端的文件查看功能,uniapp小程序端实现pdf文件预览,uniapp纯前端预览PDF、DOC、DOCX、图片、视频,uni-app文档、图片预览查看,uniapp文档预览功能,uniapp小程序端文件预览,uniapp小程序平台纯前端解析word,pdf,xls

✅ 精选推荐文章 1万+

使用R语言实现循环神经网络RNN进行文本生成

首先,让我们回顾一下循环神经网络(Recurrent Neural Networks,RNN)的基本概念。RNN是一种深度学习技术,特别适合处理序列数据,如时间序列和文本数据。RNN的关键特性是它的隐藏状态,这个状态可以捕捉到当前输入之前的信息。这使得RNN能够利用前面的信息来影响后续的输出,从而对序列数据进行有效的处理。

斌擎科技 725

AXI

1、Cachable和bufferable一个Master发出一个读写的request,中间要经过很多Buffer,最后才能送到memory。这些Buffer的添加是为了outstanding,timing,performance等。Buffer有两种类型:一种FIFO结构,仅仅就是保存发送Request给下一级或者返回Response给上一级。还有一种Buffer,在接受了上一级的Request...

weixin_30443895的博客 562

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9982

总线要点笔记

当AWCACHE[2]信号置低,但AWCACHE[3]置高时,该位置上的数据可能因为其他主机的操作、或者本机的读事务缓存于cache中,同样需要首先查找cache。SPLIT传输都增加了仲裁器和从机的复杂性,但是却有可以完全释放总线给其他主机使用的优点,但是 RETRY(响应)的情况就只允许较高优先级的主机使用总线。这种传输应该被从机忽略。对于表中的Device, 个人理解是指的是这部分地址实际上是外设中寄存器和内存的映射,不是真正的内存,对于外设,prefetch之类的优化方式往往不能用。

weixin_50518899的博客 2997

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 468

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

cacheable 和bufferable

CPU访问存储在内存中的数据时,如果这些数据被标记为可缓存,那么这些数据的副本会被存储在CPU的缓存中。这样,当CPU需要再次访问这些数据时,它可以直接从其高速缓存中获取这些数据,而不是从相对较慢的主存中获取。通过在缓冲区中存储数据,可以在数据准备好传输之前,将数据从其源移动到缓冲区。然后,当目标设备准备好接收数据时,可以从缓冲区中读取数据,而不是直接从源读取。bufferable 通常指,数据在搬移的过程中,是否可以暂时存储在一个缓冲区,存储数据,数据此时并没有真正存储在系统中,一般为一次性的操作。

just_go_go的博客 2650

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ARM的cache和写缓冲器(write buffer)

转:https://blog.youkuaiyun.com/gameit/article/details/13169445?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.chann...

9527的博客 1837

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

内存系列学习(四):Cache和Write Buffer一般性介绍

具有Cache的计算机,当CPU需要进行存储器存取时,首先检查所需数据是否在Cache中。如果存在,则可以直接存取其中的数据而不必插入任何等待状态,这是最佳情况,称为高速命中;当CPU所需信息不在Cache中时,则需切换存取主储器,由于速度较慢,需要插入等待,这种情况称高速未命中;在CPU存取主存储器的时候,按照最优化原则将存储信息同时写入到Cache中以保证下次可能的高速缓存命中。因此**,同一数据可能同时存储在主存储器和Cache中**。同样,按照优化算法,可以淘汰Cache中一些不常使用的数据。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 1751

ARM各种Memory类型理解

介绍ARM各种Memory类型理解

W1Z1Q的专栏 1万+

内存系列学习(五):ARM处理器中的Cache和Write Buffer

在cache存储系统中,把cache和主存储器都划分成相同大小的块。主存地址由块号B和块内地址W两部分组成,cache地址由块号b和块内地址w组成。当CPU访问cache时,CPU送来主存地址,放到主存地址寄存器中,通过地址变换部件把主存地址中的块号B变换成cache的块号b,并放到cache地址寄存器中,同时将主存地址中的块内地址W直接作为cache的块内地址w装入cache地址寄存器中,如果变换成功(又叫cache命中),就用得到的cache地址去访问cache,从cache中取出数据送到CPU中。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2719

CM3 内核存储器访问属性及DMB DSB ISB隔离操作

存储器访问属性 可否缓冲(bufferable) 可缓冲属性,一半用于数据写入操作,由于CPU执行速度与外部存储的速度之间存在差距,所以在存储器外部加入了buffer,导致数据写入存储器会延迟。 可否缓存 (cacheable) 缓存属性,即CPU是否具有cache,cache可以进行高速读写,将存储器中的指令或者数据读取到cache中供cpu使用。关于缓存存在以下三个个属性WT(write-through)、WB(write-back) 、WBWA。 以下定义只适合Cortex-M3 and Cortex

jieliangzi的博客 1657

各个通道典型域段解析

req LPID Logical Processor ID. Used in conjunction with the SrcID field to uniquely identify the logical processor that generated the request. 和srcid一起,唯一确定一个处理器源头; This field is used when a single Requester contains more tha

major的博客 526

AXI总线(top)

AXI总线是一种基于burst的传输总线,适合用在high-bandwidth和low-latency的场景,大致分为5个通道: read address read data write address write data write response AXI总线支持: 1)unaligned data transfer,包括SIZE的对齐和Wrap Burst的对齐; 2)Bur...

简单同学 1万+

浅谈 :ARM架构下的 cache 和 Write Buffers

涉及到ARM架构下的内存管理系统; 1.cache和write buffers的概念: cache是高速缓冲存储器,write buffers是写缓冲区,这两个东西位于主存储器和CPU之间,主要用来提高存储系统的性能; 2.cache和write buffers的作用原理: cache与主存之间以块(cache line)为单位进行数据交换,一个cache块的大小与系统有关,通常一个块为几个字; 例如一个 cache Line 大小为4字节,当CPU从主存中读取地址为 n 的数据时,...

qq_53522710的博客 954

AXI中需要注意的几个小点

Transfer和Burst burst是transfer的合集,一个burst里会有若干transfer Interconnect Interconnect可以给master来的transfer加上额外的ID tag,这使得来自每个master的ID tag都是独特的,一般设计为额外的4bits,master发出的ID tag为4bits,这样slave就必须设计为8 bits. 在来自master的信号中,interconnect会把这部分额外的ID tag给加上,在来自slave的信号中,中inter

岸边水的博客 9138
上一篇: ARM的MMU存储访问权限控制详解
下一篇: ucos的中断向量表构建
马中马
博客等级 码龄18年 112粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值