ARM体系之MMU

转载地址:https://i-blog.csdnimg.cn/blog_migrate/6cee1d6b4ae65bffa6cb9d0d1020ff3f.png

1  什么是MMU,MMU的作用

MMU是MemoryManagementUnit的缩写. 针对各种CPU, MMU是个可选的配件. MMU负责的是虚拟地址与物理地址的转换. 提供硬件机制的内存访问授权.

现代的多用户多进程操作系统, 需要MMU, 才能达到每个用户进程都拥有自己的独立的地址空间的目标. 使用MMU, OS划分出一段地址区域,在这块地址区域中, 每个进程看到的内容都不一定一样. 例如MICROSOFT WINDOWS操作系统, 地址4M-2G处划分为用户地址空间. 进程A在地址 0X400000映射了可执行文件. 进程B同样在地址 0X400000映射了可执行文件. 如果A进程读地址0X400000, 读到的是A的可执行文件映射到RAM的内容. 而进程B读取地址0X400000时则读到的是B的可执行文件映射到RAM的内容.

2MMU 作用

采用MMU还有利于选择性地将页面映射或解映射到逻辑地址空间。物理存储器页面映射至逻辑空间,以保持当前进程的代码,其余页面则用于数据映射。类似地,物理存储器页面通过映射可保持进程的线程堆栈。RTOS可以在每个线程堆栈解映射之后,很容易地保留逻辑地址所对应的页面内容。这样,如果任何线程分配的堆栈发生溢出,将产生硬件存储器保护故障,内核将挂起该线程,而不使其破坏位于该地址空间中的其它重要存储器区,如另一线程堆栈。这不仅在线程之间,还在同一地址空间之间增加了存储器保护。 

然而这种想法又遇到了另外一个问题,当ARM处理器响应异常事件时,程序指针将要跳转到一个确定的位置,假设发生了IRQ中断,PC将指向0x18(如果为高端启动,则相应指向0vxffff_0018处),而此时0x18处仍为非易失性存储器所占据的位置,则程序的执行还是有一部分要在FLASH或者ROM中来执行的。那么我们可不可以使程序完全都SDRAM中运行那?答案是肯定的,这就引入了MMU,利用MMU,可把SDRAM的地址完全映射到0x0起始的一片连续地址空间,而把原来占据这片空间的FLASH或者ROM映射到其它不相冲突的存储空间位置。例如,FLASH的地址从0x0000_0000-0x00ff_ffff,而SDRAM的地址范围是0x3000_0000-0x31ff_ffff,则可把SDRAM地址映射为0x0000_0000-0x1fff_ffff而FLASH的地址可以映射到0x9000_0000-0x90ff_ffff(此处地址空间为空闲,未被占用)。映射完成后,如果处理器发生异常,假设依然为IRQ中断,PC指针指向0x18处的地址,而这个时候PC实际上是从位于物理地址的0x3000_0018处读取指令。通过MMU的映射,则可实现程序完全运行在SDRAM之中。

①使用DRAM作为大容量存储器时,如果DRAM的物理地址不连续,这将给程序的编写调试造成极大不便,而适当配置MMU可将其转换成虚拟地址连续的空间。

②ARM内核的中断向量表要求放在0地址,对于ROM在0地址的情况,无法调试中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。

③系统的某些地址段是不允许被访问的,否则会产生不可预料的后果,为了避免这类错误,可以通过MMU匹配表的设置将这些地址段设为用户不可存取类型。

ARM出品的CPU,MMU作为一个协处理器存在.ARM结构的MMU要是有的话,一定是编号为15的协处理器. 可以提供32BIT共4G的地址空间.

3 MMU属性

虚拟地址到物理地址映射
ARM 处理器产生的地址叫虚拟地址,MMU 允许把这个虚拟地址映射到一个不同的物理地址去。这个物理地址表示了被访问的主存储器的位置。

存储器访问权限(permissions)
这些控制对存储器区域的不可访问权限、只读权限、读写权限。当访问不可访问权限的存储器时,会有一个存储器异常通知ARM 处理器。

     查找整个转换表的过程叫转换表遍历。它由硬件制动进行,并需要大量的执行时间(至少一个存储器访问,通常是两个)。为了减少存储器访问的平均消耗, 转换表遍历结果被高速缓存在一个或多个叫作 Translation Lookaside Buffers(TLBs)的结构中。通常在ARM 的实现中每个内存接口有一个TLB。当存储器中的转换表被改变或选中了不同的转换表(通过写CP15 的寄存器2),先前高速缓存的转换表遍历结果将不再有效。MMU 结构提供了刷新TLB 的操作。
     MMU 结构也允许特定的转换表遍历结果被锁定在一个TLB 中,这就保证了对相关的存储器区域的访问绝不会导致转换表遍历,这也对那些把指令和数据锁定在高速缓
存中的实时代码有相同的好处。

4存储器访问的顺序
当ARM 要访问存储器时,MMU 先查找TLB 中的虚拟地址表,如果ARM 的结构支持分开的地址TLB 和指令TLB,那么它用:
·  取指令使用指令TLB
·  其它的所有访问类别用数据TLB
如果TLB 中没有虚拟地址的入口,则转换表遍历硬件从存在主存储器中的转换表中获取转换和访问权限,一旦取到,这些信息将被放在TLB 中,它会放在一个没有使
用的入口处或覆盖一个已有的入口。关于转换表的信息和转换表遍历的实现参见转换过程一节。
一旦为存储器访问的TLB 的入口被拿到,这些信息将被用于:
         1. C(高速缓存)和B(缓冲)位被用来控制高速缓存和写缓冲,并决定是否高速
          缓存。(如果系统中没有高速缓存和写缓冲,则对应的位将被忽略)
         2. 访问权限和域位用来控制访问是否被允许。如果不允许,则MMU 将向ARM 处理
         器发送一个存储器异常;否则访问将被允许进行。
        访问权限、域和异常几节有详细描述。

      3. 对没有高速缓存的系统(包括在没有高速缓存系统中的所有存储器访问),物理地址将被用作主存储器访问的地址。对有高速缓存的系统,在高速缓存没有选中的情况下,物理地址将被用行取(line fetch)的地址。如果选中了高速缓存,则物理地址将被忽略。图3-1 说明了这种高速缓存系统


5.一级页表转换过程:

MMU 支持基于节或页的存储器访问:
节(Section) 构成1MB 的存储器块
支持3 中不同的页尺寸:
微页(Tiny page) 构成1KB 的存储器块
小页(Small page) 构成4KB 的存储器块
大页(Large page) 构成64KB 的存储器块
节和大页是支持允许只用一个TLB 入口去映射大的存储器区间。小页和大页有附加的访问控制:小页分成1KB 的子页,和大页分成16KB 的子页。微页没有子页,对
微页的访问控制是对整个页。存在主存储器内的转换表有两个级别:
第一级表 存储节转换表和指向第二级表的指针。
第二级表 存储大页和小页的转换表。一种类型的第二级表存储微页转换表。


MMU 把CPU 产生的虚拟地址转换成物理地址去访问外部存储器,同时继承并检查访问权限。地址转换有四条路径。路径的选取由这个地址是被标记成节映射访问还是
页映射访问确定。页映射访问可以是大、小和微页的访问。然而,转换过程总是由下面所描述的那样由第一级表的获取开始。节映射的访问只需要读取第一级表,页映射的访问还需要读取第二级表。
  5.1 转换表基址
  当片上(on-chip)的TLB 中不包含被要求的虚拟地址的入口时,转换过程被启动。转换表基址寄存器(CP15 的寄存器2)保存着第一级转换表基址的物理地址。只有bits[31:14]有效,bits[13:0]应该是零(SBZ)。所以第一级表必须在16KB的边界。
 5.2 取第一级表
    转换表基址寄存器(即cp15协处理器的C2寄存器)的 bits[31:14]与虚拟地址(就是在程序中给定的存储器的虚拟地址,在程序中用的地址)的bits[31:20]和两个0 位[bit0:1]连接形成32 为物理地址,如图3-2。这个地址选择了一个四字节的转换表入口,它是第一级描述符或是指向第二级页表的指针。


5.3 第一级描述符
第一级表的每个入口是一个描述它所关联的1MB 虚拟地址是如何映射的描述符。见表3-1,根据bits[1:0]的组合,有四种可能:
·  如果bits[1:0]==0b00,所关联的地址没有被映射,试图访问他们将产生一个转换错(fault)。因为他们被硬件忽略,所以软件可以利用这样的描述符的bits[31:2]做自己            的用途。推荐为描述符继续保持正确的访问权限。
·  如果bits[1:0]==0b10,这个入口是它所关联地址的节描述符。见节描述符和转换节参考中的细节。
·  如果bits[0]==1,这个入口给出粗糙第二级表(bit[1]==0),或精细第二级表(bit[1]==1)。每一种类型的表描述了它所关联的1MB 存储区域的映射。粗糙第二级表较小,每个表1KB,每个精细第二级表4KB。然而粗糙第二级表只能映射大页和小页,精细第二级表可以映射大页、小页和微页。


    

Bit[1:0]

一级描述符类型标识。00:无效;01:粗页;10:段;11:细页由于没有使用复杂的操作系统,所以此为为10

CB

该一级描述符对应的存储空间的cacheWrite Buffer特性控制位,如表4-4所示

U

由用户定义

Domain

指明该存储空间所属的域号0~15;见前面“MMU中的域”说明

P

保护标志位;只有ARMv5或以上版本处理器有定义

AP

访问权限控制位,详见前面“ARM处理器的存储域”说明

TEX

ARMv5以上版本处理器中有定义,如果TEX等于1,表示系统支持写时分配cache

粗粒度二级页表基址:

如果bit[1:0]=01,那么该存储空间是二级分大页管理,1=4KB,粗粒度二级页表基址表示的是页描述符表的基址,1KB对齐,一张页描述符表占1KB空间,256个页描述符条目,描述了1MB空间的映射关系以及访问权限和域控制属性

段基址:

如果bit[1:0]=10,那么该存储空间是分段管理,该段描述符号描述了1MB存储空间的映射关系以及访问权限和域控制属性,段基址就是该存储空间的物理基地址,1MB对齐

细粒度二级页表基址:

如果bit[1:0]=11,那么该存储空间是二级分小页管理,1=1KB,细粒度二级页表基址表示的是页描述符表的基址,4KB对齐,一张页描述符表占4KB空间,1 024个页描述符条目,描述了1MB空间的映射关系以及访问权限和域控制属性


在S3C2440中使用的是段(section)描述符,在此只针对段地址进行描述一级描述符,所以此时为1:0

得到的一级描述符格式入下图所示:


注:次图为段描述符(section)即一级描述符中的bit[1:0]位为1,0

section base address 为段基地址,sbz意思是should be zero,ap是读写权限控制位,domain为域,c,b位介绍如下

C

B

写通类型cache

写回类型cache

可选择写通属性的写回类型cache

0

0

Uncached/unbuffered

Uncached/unbuffered

Uncached/unbuffered

0

1

Uncached/buffered

Uncached/buffered

Uncached/buffered

1

0

cached/unbuffered

不可预测

写通cached/buffered

1

1

Cached/buffered

Cached/buffered

写回cached/buffered

4-4


S3C2440 micro 2440开发板中对mmu.c解释

void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
{
volatile U32 *pTT;
volatile int i,nSec;
pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);
nSec=(vaddrEnd>>20)-(vaddrStart>>20);
for(i=0;i<=nSec;i++)

       *pTT++=attr |(((paddrStart>>20)+i)<<20);
}

//上面这个函数是分析的重点。vaddrstart是虚拟地址的起始地址,vaddrend是虚拟地址的结束地址,paddrstart是物理地址的开始地址,也就是把内存上从paddrstart开始到距离paddrstart ((vaddrend>>20)-(varrdstart>>20))的这部分内存空间映射到虚拟地址上。

以MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);   //bank6-1 为例:

虚拟起始地址是0x30000000,结束地址是0x30100000,物理地址是0x3000000,RW_CB是对内存的访问权限控制。从0x30000000(起始地址)到0x300FFFFF的内存是1M,从0x30100000(结束地址)到0x301FFFFF又是1M,因此函数将0x30000000到0x30100000的虚拟地址映射到物理地址0x30000000开始的2M空间。参考下图:


函数中_MMUTT_STARTADDRESS的值是0x33ff8000这是我们从2^32的虚拟地址中取出做为映射物理地址的地址。

pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);得到的pTT为0x33ff8300,就是说2M的物理地址将从这里开始得到映射 。

nSec=(vaddrEnd>>20)-(vaddrStart>>20);得到的是对Translation Table中段(section)的索引(index),其中每段为1M。这里我们得到的nSec是1。


for(i=0;i<=nSec;i++) //i取到0和1,也就是两个段(2M)

       *pTT++=attr |(((paddrStart>>20)+i)<<20);将物理起始地址的高12位+index做为Translation Table中的section base address,再或上内存权限控制位,而后加上pTT就是最终的虚拟地址,再进入下个循环对下一个块进行映射。内存权限控制位在这里是RW_CB,查mmu.h得知

#define RW_CB   (AP_RW|DOMAIN0|CB|DESC_SEC)    //计算得RW_CB:1100 0001 1110,对应下图中的低12位(AP2位,Domain4位,Domain的值对应协处理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER 16个区域中的一个 ),这里AP是11,表明对supervision和user都是可读可写。Domain是0000,对应Control Register3中的file0(区域0),file0中的两位决定了是否对该内存区域进行访问权限的检查。


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值