13-MMU和Cache

本文介绍了嵌入式系统中的MMU(Memory Management Unit)和Cache的工作原理,包括Cache的局部性原理、数据存取流程,以及协处理器在其中的作用。通过实例分析了如何开启ICache,并展示了通过CP15协处理器指令操作Cache的过程。同时,文章探讨了MMU的功能,如地址映射、虚拟地址到物理地址的转换,以及MMU在权限管理和大容量应用运行中的作用。最后,提供了MMU代码示例,包括页表创建和启动MMU的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:
本文是本人在韦东山笔记的基础上加了一些注释,方便理解。原文地址:

第001节_Cache原理简述

我们很少会使用MMU或ICache。
cache简介(百科):
Cache存储器,电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static Random Access Memory 静态存储器)组成。它是位于CPU与内存间的一种容量较小但速度很高的存储器。CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。

我们看一下2440手册上的原理图:
在2440芯片里面除了CPU之外:
Instruction MMU :指令MMU;
Data MMU :数据MMU;
InstructionC ACHE(16KB) :指令cache;
Data CACHE (16KB) :数据cache

以上4个全都通过CP15协处理器来进行操作。

协处理器的含义作用 :coprocessor协助主处理器做某些事情, 比如在ARM系统中有cp0 – cp15一共16个协处理器,其中cp15负责管理mmu icache。
在这里插入图片描述
好了,上面说的比较抽象,下面写一个程序,看其反汇编,然后分析程序的运行,我们从中可以理解cache的内部机制:
我们写一个程序,0到100求和:

int sum()
{
   
	int I;
	int sum =0;
	for(i=0; I <= 100; i++)
		sum += I;
	return sum;
}

编译,查看其反汇编代码:
在这里插入图片描述
分析:

70: 	e50b3014    		str 	r3, [fp,#-20]  //这个应该就是sum 假设地址是A

78: 	e50b3010		str   r3,  [fp, #-16] //这个应该就是I 假设地址是B
					ldr   r3,   [fp, #-16] //也就是地址B中取出值
					cmp  r3, #100 //跟100比较
				//如果大于100程序跳到  a8 如果小于100则执行下面的for循环(从7c 到 a4)

指令保存在内存中,CPU根据这些执行进行操作(即保存在从内存如SDRAM中的0x30000000往上数)
而栈(即这里的sum和i)保存在内存的栈区(即内存如SDRAM的顶端内存区)

分析程序:

我们的CPU需要:
1 不断的读写地址A和B
2 不断的执行for循环里面代码
	2.1 取指令
	2.2 执行指令

:SDRAM非常慢,那么怎么提高程序执行效率?
为了回答这个问题,我们先引入一个感念,程序局部性原理:

时间局部性:在同一段时间里,有 极大的概率 访问同一地址的指令或数据
(在这个for循环中同一个地址指令经常被访问到)

空间局部性: 有 极大概率 访问到相邻空间的指令/数据

所以说,既然我们的SDRAM访问起来比较慢,那么我们能不能在CPU上开一个高速缓存,把这些指令放进高速缓存icache。当然是可行的。原理如下图:
也就是说我们把数据和指令暂时存储在cache存储器上。
cache存储器分为Instruction CACHE(指令cache)、Data CACHE (数据cache),通过CP15协处理器进行控制。
在这里插入图片描述
指令cache只有16KB, 数据cache也只有16KB ,而我们的SDRAM有64MB空间,显然不可能存储SDRAM中所有的内容,它只能存储一部分。cache的示意图:
在这里插入图片描述
看上面这个图,我们对程序运行进行分析:

以数据读为例

1 程序要读地址A的数据
ldr r0, [A的数据]
a. cpu以地址A去cache上查找A的数据,一开始cache上无数据,导致cache miss(即失败)。
b. 然后cpu就会把地址A发到SDRAM,取读数据,
	但是这时候会读入cache line读到cache存储器,(cache line即地址A附近的一篇内存区,叫做
	cache line: 8word 32byte,称为cache file )
	然后把地址A上的数据返回给CPU 。
2 程序如果再次读取地址A的数据的话:
	cpu以地址A查找cache,cache hit有数据则直接从cache返回数据给CPU。

3 程序要读地址B的数据,CPU也是以地址B查找数据,cache hit直接返回

4 假如,cache满了(假设经过刚刚的cache line读到cache之后,cache满了),
	而假如这时候我们有一个变量C,这个变量C在存储位置离变量A、B比较远(也就是说变量C不在刚刚的那个cache
	 line里,即并不在cache里)
	这时,CPU去访问变量C的地址,怎么办?答:
	 4.1 cache替换:老的数据从cache中弄出 
	 4.2 填充新数据

看上上一幅图,在数据写的时候,有一个write buffer,作用是:但数据写到buffer中,CPU就不管了。

查看2410芯片手册 附录- appendix4-caches, write buffer 585页,看下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值