内存管理单元MMU - ARM内核扩展(一)

  • 了解物理地址和虚拟地址的关系
  • 掌握如何通过设置MMU来控制虚拟地址到物理地址的转化
  • 了解MMU的内存访问权限机制
  • 了解TLB、Cache、Writebuffer的原理,使用时的注意事项

在计算机开始阶段实际应用程序功能简单,程序文件较小,可以全部装在机器的内存中。随着技术的不断推进逐渐出现如下三个问题:

  1. 程序逻辑越来越复杂,程序文件不断扩充,对应的需要实际物理内存大小也在增加,甚至很多时候一个程序都无法全部装载到内存当中。
  2. 多道系统由很多程序需要同时执行,各个程序之间的在执行过程中数据空间是不能够重叠在一起的,权限管理和禁止访问等需求功能出现。
  3. 程序越来越繁多,手动规划地址或者自动脚本编译完成空间针对程序的分配无法实现。

计算机最初的理论模型就是一条无限长的纸袋,实际工程开发过程中告诉芯片电子特性不可能做到无限大,成本与其它配套供电也决定内存不可能做到无限大。这种情况下就需要从设计层面解决无线的需求和有限实际之间的矛盾,基于硬件的MMU虚拟内存和实际内存映射管理单元边应用而生。程序实际执行的时间和空间局部性告诉我们,我们短期之内并不需要将整个程序文件加载到内存当中。因此,我们可以通过复杂的调度算法实现同时将多个短时间内需要支撑的程序中各自某个范围段加载到硬件SDRAM中,然后对不同程序分时复用CPU资源。因此,我们实际运行的程序文件地址空间范围就可以扩充到总线宽度,对于32为CPU,虚拟内存空间范围为0 ~ 0xFFFFFFFF。拿实际s3c2440芯片为例,实际的物理空间大小事64M,0x3000_0000 ~ 0x3400_0000范围。MMU工作任务就是按照某种计算规则,完成物理地址空间、物理地址到虚拟空间、虚拟地址的映射任务。

1. 内存管理单元介绍

内存管理单元(Memory management unit)简称MMU,其在芯片设计中的物理位置是CPU<==>MMU<==>Memory controler<==>SDRAM(other controler)。它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。现代软件多用户多进程通过MMU是的各个用户进程能够拥有自己独立的地址空间,这种映射机制使得所有的应用程序“看起来”都拥有一样的地址空间,而内存访问权限的检查可以保护每个进程所用的内存不会被其他进程破坏(多个程序不同物理地址可能映射到相同的物理地址)。

ARM上的地址转换过程涉及3个概念,虚拟地址(VA,Virtual address),变换后的虚拟地址(MVA,Modified vritual address)和物理地址(PA,physical address)。没有启动MMU情况下,CPU核、cache、MMU、外设等素有设备看到的都是物理地址,地址空间规划按照芯片memory map章节中给定的样子划分。启动MMU后,CPU和对外发出虚拟地址VA;VA在CPU内部通过协处理器转换成MVA共cache和MMU使用,在这里又被转换为PA;最后使用PA读写实际的设备:

  1. CPU核看到的、用到的只是虚拟地址VA,至于VA如何最终落到物理地址PA上,CPU和是不需要例会的。
  2. cache和MMU看不到VA地址,它利用MVA地址转换为PA。
  3. 设计设备看不到VA、MVA,读写它们时使用的是物理地址PA。

CPU协处理指令完成VA和MVA地址的映射,中间具体通过C13寄存器来完成。计算规则对于VA<32M空间,需要使用进程PCI转换MVA地址。利用PID生成MVA的目的是为了减少进程切换时的代价,不适用MVA而直接使用VA的话,当两个进程所用的虚拟地址有重叠时,在切换进程时需重建页表、使无效cache等来避免地址重叠,这样将会有很大的代价。使用MVA后,进程切换审视很多,假设进程IP为1和2的两个进程编译结果VA地址是0~(32M-1),通过计算规则计算以后实际的MVA地址变成了0x0200_0000 ~ 0x03ff_ffff和0x0400_0000 ~ 0x05ff_ffff,这样就没有不要重新建立页表了。后面我们讨论中没有特别强调的情况下,地址默认是指MVA地址。

if( VA < 32M ) then
    MVA = VA | (PID << 25)
else 
    MVA = VA

2 地址转换算法

虚拟地址和物理地址之间进行转换算法一般可以通过一个公式或者某种表格完成这种地址关系的映射,这种映射算法肯定是按照某个段给定的一种划分关系,否则反而会占用大量不要的内存空间。映射过程表格成为页表(page table),页表由一个个条目(entry)组成;每个条目存储了一段地址对应的物理地址以及其映射访问权限,或者下一级页表的地址(多级页表)。在S3C2440中最多用到两级页表:以段(section,1MB)方式进行转换时使用以及页表,以页(page)的方式进行转换时使用过的两级页表。页的大小有3种,大页(64K)、小页(4KB)、极小页(1KB)。条目保存的描述符(descriptor)根据这些不同的映射规则自然后端描述符、大页描述符、小页描述符和极小页描述符,他们保存端、大页、小页或者极小页的起始物理地址;粗页表描述符、细页表描述符用来保存二级页表的物理地址。ARM中地址转换过程大概如下:

  1. 根据给定的虚拟地址找到一级页表中的条目;
  2. 如果侧跳木事段描述符,则返回物理地址,转换结束;
  3. 否则如果是二级页表描述符,继续利用虚拟地址在此二级页表中找到下一个条目;
  4. 如果第二个条目式也描述符,则返回物理地址,转换结束;
  5. 其他情况出错。

 图中TTB代表以及页表的地址,将它写入到协处理器CP15的寄存器C2(称为页表地址寄存器)即可,以及页表的地址必须是16K对应的(位【14:0】为0)。

 对于一级页表,32位CPU的虚拟地址空间达到4GB,每个描述符对应1M的虚拟地址,要么存储它对应的1MB物理空间的起始地址。要么存储下一级页表的基地址。使用MVA[31:20]来索引一级页表,得到一个描述符,每个描述符占据4字节,具体格式:

 具体描述符各个字段含义进行如下分析,最低两位bit给定一级页表的类型,通过这个类型划分不同的映射方式,2bit产生4中映射情况:

  1. 0b00:无效
  2. 0b01:粗页表(coarse page table)

位[31:10]称为粗页表基地址(coarse page table base address),此描述符低10位填充0后就是一个二级页表的物理地址。此二级页表汉256个条目(所以大小为1KB),称为粗页表。其中每个条目表示4KB的物理地址空间,所以一个粗页表表示1MB的物理地址空间。

2.3. 0b10:段(section)

位[31:20]称为段及地址(section base),此描述符低20位填充0后就是一块1MB的物理地址空间起始地址。MVA[19:0]来表示1MB空间中寻址。随意,描述符的位[31:20]和MVA[19:0]就构成了这个虚拟地址MVA对应的物理地址。以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:

        (1)页表基地址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符,对应的这个条目共包含4096个,每个条目是我们真正的具体划分的描述。

        (2)取出段描述符[31:20],它和MVA[19:0]组成一个32位的物理地址,这个地址就是MVA对应的PA。

 2.4. 0b11:细页表(fine page table)

位[31:12]称为细页表基地址,此描述符的第12位填充0后就是一个二级页表的物理地址。此二级页表含有1024个条目(所以大小4KB),称为系页表(Fine page table)。其中每个条目大小为1KB的物理地址空间,所以一个细页表表示1MB的U物理空间。以大页(64KB)、小页(4KB)或者极小页(1KB)进行地址映射时,需要永达两级页表。二级页表有粗页表、细页表两种,联众页表的描述符如下:

 根据二级页表描述的低两位分为如下4种情况:

  1. 0b00:无效。
  2. 0x01:大页描述符
  3. 0x10:小页描述符
  4. 0x11:极小页描述符

3. 二级页表

3.1 0x01大页描述符

位[31:16]为大页表的基地址,此描述符的低16位填充0后就是一个快64KB的物理地址空间的其实地址。粗页表中每个条目只能表示4GB的物理空间,如果大页描述符保存在粗页表中,则连续16个条目都保存想听一个大页描述符。类似的细页表中的每个条目只能表示1KB物理空间,如果大页描述符保存在细页表中,则连续64个条目都保存同一个大页描述符。

 粗页表中的大页描述符具体地址转换过程:

  1. 页表基地址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到主页表描述符。
  2. 取出粗页表描述符的位[31:10],即粗页基地址,它和MVA[19:12]组成一个低两位为0的物理地址,基于此地址找到大页描述符。
  3. 去除大页描述符[31:16],即大页基地址,它和MVA[15:0]组成一个32位的物理地址,这个地址就是MVA对应的PA地址。

上面步骤2和3中,用于主页表中索引的MVA[19:12]和用于大业内寻址的MVA[15:0]有重合的位[15:12]。当位[15:12]从0b0000变化到0b1111时,步骤2返回的大页描述符相同。所以,粗页表中连续16个条目保存一个相同的大页描述符。大页描述符保存在细页表中时,地址转换过程与上面类似。

4. 内存的访问权限检查

内存的访问权限检查是MMU的主要功能之一,简单的说,它就是决定一块内存是否允许读、是否允许写。这个有CP15寄存器C3域访问控制、描述符域、CP15寄存器C1的R/S/A位、描述符的AP位等联合作用。

CP15寄存器C1中的A位表示是否对地址进行检查对齐。所谓对齐检查就是,访问字时是否为4字节对齐,访问半字时(2字节)时地址是否2字节对齐,如果地址不对齐则产生“Aligment fault”异常。无论MMU是否被开启,都可以进行对齐检查。CPU读取指令时不进行对齐检查,以字节为单位访问时不进行对齐检查。对齐检查在MMU的权限检查、地址映射前进行。

内存访问权限包括以下两点:

  1. “域”决定是否对某块内存进行权限检查
  2. “AP”决定如何对某块内存进行权限检查

5. TLB的作用

从虚拟地址到物理地址的转换过程可知,使用以及页表进行地址转换时,每次读/写数据需要访问两次内存,第一次访问获取一级页表的物理地址,第二次才是真正的读/写数据。使用两级页表时,每次数据读/写都需要访问3次内存,访问两次页表(一级页表和二级页表)才能获得物理地址,第三次才是真正的读/写数据。这样的转换过程大大降低了CPU的性能,有没有办法改进呢?程序执行过程中,所用到的指令、数据的地址往往集中在一个很小的范围内,其中地址、数据经常多次使用,这称为程序访问的局部性。由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段/大页/小页/极小页描述符),以避免每次地址转换时都到主存中查找,这样可以大幅的性能。这个存储器用来帮助快速的进行地址转换,成为“转译查找缓存”(Translation lookaside buffers,TLB)。

当CPU发出一个虚拟地址,MMU首先访问TLB。如果TLB中含有能够转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查;否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中(如果TLB已满,则利用round-robin算法查找到一个条目,然后覆盖它),下次再使用这个虚拟地址时就可以直接使用TLB中的描述符了。

使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前、在页表中的内容发生变化后,尤其需要注意这点。S3C2440可以使无效整个TLB,或者通过某个虚拟地址使无效TLB中的某个条目。一般的做法是:在启动MMU之前使无效整个TLB,改变页表时,使无效所涉及的虚拟地址对应的TLB中的条目。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值