×
单片机 > 单片机程序设计 > 详情

Tiny4412的MMU解析

发布时间:2020-05-30 发布时间:
|

1、Tiny4412的MMU和S3C6410都是一样的,以前的程序都可以运行,因为MMU有两个特点:

  ①MMU实在cp15协处理器里面操作的,协处理器由ARM公司统一设计,不会轻易变化,这部分代码和Samsung没有关系;

  ②MMU的功能就是把虚拟地址映射物理地址上去。

2、为什么裸机要讲MMU?

  因为中断,ARM地址的布局。现在三星处理器地址的布局和以前不一样,以前S3C6410的0地址是可以选的,比如nand flash启动的时候0地址对应片内内存;nor flash启动的时候0地址对应nor flash的0地址。也就是0地址我们可以选择是ROM或者RAM,根据前面JZ2440和OK6410的中断实验可以看出我们把中断向量表放在0地址开始的地方,一旦发生异常就会自动跳到相应的中断入口地址处执行。我们想构建自己的异常向量表的时候可以切换为nand flash启动,nand flash启动的话RAM就是映射在0地址这个地方,RAM映射在0地址我们想构建自己的中断异常向量表的时候就把异常向量表放到RAM这,也就是重启开机的第一句代码都可以由我们自己写。

   可是4412处理器不一样了,4412的0地址只能是ROM不能选择成RAM,0地址直接就是一个ROM,整个ARM一开机必须先执行它ROM里面的代码,它的ROM里的代码再去选择执行EMMC启动、USB启动、SD卡启动,这个时候异常向量表由ARM来决定,异常向量表依然在0地址,那这个时候构建自己的异常向量表还能不能下载到ROM里面呢?很显然ROM是不能更改的不能下载到ROM里面去,这就是要讲MMU的原因。

3、可以把异常向量表地址选成高地址0xFFFF0000,程序运行起来以后就往这跳,但是机器上并没有这个地址,就通过MMU来映射。

板子上的内存布局:0x40000000 - 0x80000000   共1G

uboot的链接地址(在uboot源码中修改过):0x43e00000

我们测试程序的时候就是用0x73000000的地方,不会把u-boot破坏掉。

4、tlb缓存的是虚拟地址和物理地址之间的对应关系;

5、icache、dcache也是缓存,但缓存的不是虚拟地址和物理地址之间的对应关系,ARM以前的版本缓存的是虚拟地址和数据的对应关系,在后面的物理cache上面缓存的是物理地址和内容的关系;

====================================================================

转载:http://blog.chinaunix.net/uid-28454895-id-3583559.html

MMU(Memory Management Unit,内存管理单元)在现代处理器中扮演着非常重要的角色。操作系统通过使用处理器的MMU功能,能实现以下功能:

    1)虚拟内存。有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。为了使用虚拟内存,操作系统通常要设置一个交换分区(通常是硬盘),通过将不活跃的内存中的数据放入交换分区,操作系统可以腾出其空间来为其它的程序服务。虚拟内存是通过虚拟地址来实现的。

    2)内存保护。根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。

   MMU给我感觉是个很复杂的东西,网上看了一些资料,勉强知道了一些表面的东西。它有两个作用:

1、把虚拟地址映射到物理地址;

2、对内存访问提供控制机制。

   我主要记录下我对映射表变换的理解。

   在ARM中,MMU另外提供了一张映射表(MVA),用于程序虚拟地址(VA)到物理地址(PA)的映射。MVA称为变换后的VA。在程序运行时,CPU只看到VA,而MMU和cache们只看到PA和MVA。应该说,在进程运行切换过程中,映射关系是动态变化的,因为不同进程和内存之间需要不同的映射关系,就需要不断的重做映射表,这个代价是很大的。所以,有必要让映射表中需要更新的内容很少,以减少性能开支,这就出现了“变换后的”VA,即MVA,如果VA<32M,需要使用进程标识号PID(通过读CP15的C13获得)来转换为MVA。

VA与MVA的转换方法如下(这是硬件自动完成的):

if(VA < 32M)

    MVA = VA | (PID<<25);   //VA<32M,即PID*0x02000000作为该进程起始地址

else

    MVA = VA;               //VA>=32M

如:假设两个进程1、2运行时的VA都是0-32M,则他们的MVA分别是0x02000000-0x03ffffff、0x04000000-0x05ffffff,这样进程切换就省事多了,不必进行重建页表等工作。

    但是,这同时带来了中断跳转的问题。当发生异常时,需要跳到0x0位置的异常向量表,这个0x0应该是VA,且小于32M,如果开启了MMU,就会被转换为MVA,而不同的PID产生不同的MVA,这就导致异常向量表的地址不统一了。所以,Linux采取了将0x0位置的向量表映射到高地址0xffff0000处,就没有上述的问题了,看了半天原来是这么回事。。。

    接下来,就是MVA如何映射PA的工作。s3c2410的datasheet中说到4中映射方案,其中最方便的是段(section)操作,具体见《s3c2410 MMU》的后半文。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR熔丝位操作时的要点和需要注意的相关事项