历史上的今天
今天是:2024年11月25日(星期一)
2021年11月25日 | ARM-I/Dcache, MMU关系
2021-11-25 来源:eefocus
三者的配置关系:
ICache | DCache | MMU | Allowed?
================================
Off | Off | Off | Yes
On | Off | Off | Yes
Off | On | Off | No
Off | Off | On | Yes
On | On | Off | No
Off | On | On | Yes
On | Off | On | Yes
On | On | On | Yes
非法的配置只有DCache打开,但是MMU关闭。在这种情况下,M位的配置会覆盖C的配置,ARM认为C没有打开。
I cache打开,MMU未打开。
在这种情况下,所以的取指都会被认为是可cache的。
ICACHE
引用:http://blog.csdn.net/bournechen/article/details/4925537
当系统上电或重起(Reset)的时候,ICaches功能是被关闭的,我们必须往lcr bit置1去开启它,lcr bit在CP15协处理器中控制寄存器1的第12位(关闭ICaches功能则是往该位置0)。ICaches功能一般是在MMU开启之后被使用的(为了降低MMU查表带来的开销),但有一点需要注意,并不是说MMU被开启了ICaches才会被开启,正如本段刚开始讲的,ICaches的开启与关闭是由lcr bit所决定的,无论MMU是否被开启,只要lcr bit被置1了,ICaches就会发挥它的作用。
大家是否还记得discriptor(描述符)中有一个C bit我们称之为Ctt,它是指明该描述符描述的内存区域内的内容(可以是指令也可以是数据)是否可以被Cache,若Ctt=1,则允许Cache,否则不允许被Cache。于是CPU读取指令出现了下面这些情况:
如果CPU从Caches中读取到所要的一条指令(cache hit)且这条指令所在的内存区域是Cacheble的(该区域所属描述符中Ctt=1),则CPU执行这条指令并从Caches中返回(不需要从内存中读取)。
若CPU从Caches中读取不到所要的指令(cache miss)而这条指令所在的内存区域是Cacheble的(同第1点),则CPU将从内存中读取这条指令,同时,一个称为“8-word linefill”的动作将发生,这个动作是把该指令所处区域的8个word写进ICaches的某个entry中,这个entry必须是没有被锁定的(对锁定这个操作感兴趣的朋友可以找相关的资料进行了解)
若CPU从Caches中读取不到所要的指令(cache miss)而这条指令所在的内存区域是UnCacheble的(该区域所属描述符中Ctt=0),则CPU将从内存读取这条指令并执行后返回(不发生linefill)
通过以上的说明,我们可以了解到CPU是怎么通过ICaches执行指令的。你可能会有这个疑问,ICaches总共只有512个条目(entry),当 512个条目都被填充完之后,CPU要把新读取近来的指令放到哪个条目上呢?答案是CPU会把新读取近来的8个word从512个条目中选择一个对其进行写入,那CPU是怎么选出一个条目来的呢?这就关系到ICaches的替换法则(replacemnet algorithm)了。 ICaches的replacemnet algorithm有两种,一种是Random模式另一种Round-Robin模式,我们可以通过CP15协处理器中寄存器1的RR bit对其进行指定(0 = Random replacement 1 = Round robin replacement),如果有需要你还可以进行指令锁定(INSTRUCTION CACHE LOCKDOWN)。
DCACHE
ARM cache架构由cache存储器和写缓冲器(write-buffer)组成,其中写缓冲器是CACHE按照FIFO原则向主存写的缓冲处理器。
一般来说CACHEABILITY和BUFFERABILITY都是可以配置的,所以,一块存储区域可以配置成下面4种方式:NCNB CNB NCB CB。 在实际应用当中,可以根据需要对主存进行配置。对I/O MAP来说,一般都需要采用NCNB方式,以保证对I/O的正确操作。而其他的存储区域一般都可以配置成CB方式,以获取最好的性能。
引入CACHE和WRITE BUFFER是为了提高存储访问的速度,提供系统性能。
如果CACHE打开的话,CPU读写主存的时候,都是通过CACHE进行的。
进行读操作的时候,如果在CACHE里面找到了所需的内容 (CACHE HIT),直接从CACHE里读取;
如果要读的内容不在CACHE上的时候 (CACHE MISS),先把所需的内容装载到CACHE里,在从CACHE上读取。
进行写操作的时候,数据先写到CACHE上。具体又可以分为WRITE THROUGH和 WRITE BACK两种方式。
如果是WRITE THROUGH方式的话,每次写操作都通过CACHE+WRITE BUFFER把数据直接写到主存当中去;
如果是WRITE BACK 方式的话,数据最初只是写到CACHE上,必要的时候(CACHE REPLACEMENT) 再将CACHE上的数据通过WRITE BUFFER实际回写到主存当中去。
DCaches使用的是虚拟地址,它的大小是16KB,它被分成512行(entry),每行8个字(8 words,32Bits)。
每行有两个修改标志位(dirty bits),第一个标志位标识前4个字,第二个标志位标识后4个字,同时每行中还有一个TAG 地址(标签地址)和一个valid bit。
与ICaches一样,系统上电或重起(Reset)的时候,DCaches功能是被关闭的,我们必须往Ccr bit置1去开启它,Ccr bit在CP15协处理器中控制寄存器1的第2位(关闭DCaches功能则是往该位置0)。与ICaches不同,DCaches功能是必须在MMU开启之后才能被使用的。
在这里我要对Ctt and Ccr=0进行说明,能够使Ctt and Ccr=0的共有三种情况,分别是
Ctt =0, Ccr=0
Ctt =1, Ccr=0
Ctt =0, Ccr=1
我们分别对其进行说明。
情况1(Ctt =0, Ccr=0):这种情况下CPU的DCaches功能是关闭的(Ccr=0),所以CPU存取数据的时候不会从DCaches里进行数据地查询,CPU直接去内存存取数据。
情况2(Ctt =1, Ccr=0):与情况1相同。
情况3(Ctt =0, Ccr=1):这种情况下DCaches功能是开启的,CPU读取数据的时候会先从DCaches里进行数据地查询,若DCaches中没有合适的数据,则CPU会去内存进行读取,但此时由于Ctt =0(Ctt 是descriptor中的C bit,该bit决定该descriptor所描述的内存区域是否可以被Cache),所以CPU不会把读取到的数据Cache到DCaches(不发生 linefill).
到此为止我们用两句话总结一下DCaches与Write Buffer的开启和使用:
1.DCaches与Write Buffer的开启由Ccr决定。
2.DCaches与Write Buffer的使用规则由Ctt和Btt决定。
史海拾趣
|
(1)打开储液室盖,将新制动液注入储液室,使液面达最高液位标记(如图 1所示“〈”标记)处。(2)如果制动系统刚进行过修理,或平时感觉到制动踏板发软、踏板行程过长,则应排除空气。排除空气应根据不同车型,严格按规定的程序进行操作。(3) ...… 查看全部问答> |
|
EVC4写的COM Dll 中如何接收其他应用程序发过来的消息 EVC4写的COM Dll,这个COM DLL是作为一个插件被一个WIN32程序调用,com dll实现了规定的接口函数,现在需要这个COM DLL能接收另外第三方程序发过来的消息通知,然后自己做一些事情,想使用SendMessage或PostMessage发过来的,但hWnd不能确定,后来 ...… 查看全部问答> |
|
请教: if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&g_Irq,sizeof(UINT32),&g_SysIntr,sizeof(UINT32),NULL)) { RETAILMSG(1,TEXT(\"ERROR:Failed to request sysintr value for Timer1 intur ...… 查看全部问答> |
|
人体的神经信号直接表征着人体自我的意思,研究神经信号为了解、识别人体提供了一条途径。多年来。目前,研究内容主要包括神经电极和神经信号调理电路两部分。神经电极可以将神经电信号从人体中提取出来,而神经信号调理电路则对神经信号进行去噪、 ...… 查看全部问答> |
|
把液晶控制器以总线连接方式接到2407DSP上,即 LCD 8位数据线 DB7-DB0 接到 DSP数据线 D15-D18 引脚 LCD的 R/W 接到 DSP地址线 A1 引脚 &nb ...… 查看全部问答> |
|
问: BQ77910锂离子保护 问者: 1740888BQ77910怎样设计才可搞成4-20串,还有评估主板上的J7上的TS是接主机的热敏电阻?J9上的三个引脚也是接主机还是测试用的啊,我知道CHGCTL是充电控制脚。J6脚上的功能是什么来的,麻烦专家分析。 答: 回复: BQ77 ...… 查看全部问答> |
|
今天天气不错,早上看了下RXT-51的操作手册,下午写几行代码试了下,一次性通过。搞了个数码管显示温度的的。 #include #include unsigned int TEM() ; void DS18B20int() ; #define   ...… 查看全部问答> |




