MMU

2019-07-13 06:11发布

data/attach/1907/i6ss3b62gowo64blnnu8nosypy4kw4of.jpg     本文所阐述的都是基于纯硬件分析,且基本来自《嵌入式Linux应用开发完全手册》。

1 MMU(Memory Managent Unit)

    存储管理单元,自ARM9之后的ARM处理器芯片就集成了MMU(ARM7无)。其作用主要包括两个方面:权限管理和内存映射。权限管理例如试图写入的存储单元只具备读属性,或者进程2试图写入进程1的地址时(这里指的是物理地址)1,都会被MMU所禁止。而内存映射。另外内存映射就是将虚拟地址映射成物理地址。     基于上述描述,MMU存在区域确认地方就是地址映射的执行效率问题,尽管地址翻译是硬件实现的,相比于直接访问会低些,但是大量建起的累积势必会造成系统效率低下。因此对于实时性具有高要求的操作系统不倾向于使用MMU。

 2 虚拟地址

    各种应用层程序、链接脚本使用的都是虚拟地址。虚拟地址的意义在于,由于部分程序很大,它所要求的内存空间超过了内存总容量,不能一次性装入内存;因此把需要的装入内存,其余部分用到时再从磁盘上调入,为了屏蔽这系列动作,使用虚拟地址概念,应用程序使用的都是虚拟地址。对于32位的CPU系统,虚拟内存地址范围是0~0xFFFFFFFF。

 3 硬件视图


    事实上过程1包含了两个步骤,先是CPU发出VA,然后VA经过转换成MVA后发送至MMU中。转换方法如下(纯硬件自动完成) If(VA < 32M) then          MVA= VA | (PID << 25); Else          MVA= VA; 这里的PID是指进程标识,(非操作系统中的进程标识),通过读CP15的C13获得。

4 虚拟地址到物理地址的转换方法

    对于MIPS架构的CPU转换方法非常简单     VA = 0xA000 0000 + PA;     对于ARM架构的CPU转换则是基于表的方式。     有两种表,一种是以段方式进行转换,也称为一级页表转换,只需要一次转换;第二种是以页方式进行转换,需要两次转换。前者访问的物理地址可称为物理段,后者称为物理页。转换关系如下图所示。

5 TLB

    由于页表都是存储在内存中的,因此从虚拟地址到物理地址的转换过程可知:使用一级页表进行地址转换时,每次读写数据都需要访问两次内存。而使用两级页表时,需要3次访问。因此为了加快访问,通过使用一个高速容量相对较小的存储器来存储近期使用到的页表条目,以避免每次地址转换时都到主存去查找。     整个流程描述为,当CPU发出一个虚拟地址时,MMU首先访问TLB。如果TLB中含有能转换这个虚拟地址的描述符,则直接进行地址转换和权限检查;否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中。

6 Cache

    程序开启cache后,程序执行更加高效。CPU读取数据时,如果Cache有则直接返回,否则从主存中读入数据,并存入Cache,下次再使用这个数据时,可以直接使用Cache中的复本。CPU写数据时有写穿式和回写式。所谓写穿式,就是发出写信号送到Cache的同时,也写入主存。而回写式,数据只写到Cache中,此时主存是不变的旧值。只有当Cache中的数据被换出或强制进行清空操作时,才将原更新的数据写入主存相应的单元中。   注释1:基于正常运行的逻辑,进程2是不可能访问到进行1的地址空间的,因为它们的虚拟地址空间会被映射到不同的物理地址之上。但是,不排除使用特殊手段,强制访问进程2的物理地址。