内存管理(硬件编程)

80酷酷网    80kuku.com

内存管理(硬件编程)

一、什么是MMU

早期的CPU(比如8086),或者现在使用的MCU(单片机),程序是直接运行在物理内存上的(SDRAM或者NOR Flash)。程序在运行过程中通过总线访问的数据,读写的地址都是物理地址。例如,程序计数器PC中的值就是预取指令所在的物理内存的地址值。

MMU内存管理机制

冯-诺依曼计算机模型

这种方式比较容易实现硬件电路的设计,程序的处理逻辑也比较简单,但是并不适应于复杂的系统,尤其是拥有多任务的OS。我们首先看看原来的方式有哪些不足和缺陷。

  1. 物理内存不足。例如,某个程序运行需要64K的内存,而机器上只有32K的物理内存。

  2. 程序运行的地址不确定。同一个程序,每次被装载到内存的地址可能不一样。

  3. 内存使用率低。需要运行某个程序,就需要将整个程序装入内存才能够运行。

  4. 无法支持多任务。存在进程间地址空间不隔离的问题,或者一个任务失败了,可能会导致整个系统宕机。

然而随着计算机科学技术的发展,所需解决的问题越来越复杂,单任务批处理已不能满足需求了。而且应用程序需要的内存量也越来越大。而且伴随着多任务同时处理的需求,这种技术架构已然不能满足需求了。在这样的背景下,MMU 应运而生,也由此可见,任何一项技术的发展壮大,都必然是需求驱动的。MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权、多任务多进程操作系统。

如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将VA映射成PA,如下图:

MMU内存管理机制

MMU硬件电路的作用

二、MMU的具体功能

1、页表的映射转换

MMU的主要功能是虚拟地址到物理地址的转换。但凡"映射"都要解决两个问题:映射的最小单位(粒度)和映射的规则。

a、虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页框(frame),页和页框的大小必须相同。映射的最低粒度是单个虚拟页到物理页,页大小通常是4K,即一次最少要把4K大小的VA页块整体映射到4K的PA页块(从0开始4K对齐划分页块),页内偏移不变。

比如:VA的一页0x30004000~0x30004fff被映射到PA的一页 0x00008000~0x00008fff,当CPU执行单元访问虚拟地址0x30004008,实际访问的物理地址是0x00008008(0x30004008和0x00008008分别位于虚实两套地址空间,互不相干,不存在重叠和冲突)。以页为最小单位,就是不能把VA中某一页划分成几小块分别映射到不同PA,也不能把VA中属于不同页的碎块映射到PA某一页的不同部分,必须页对页整体映射。

b、MMU软件配置的核心是页表(Page Table),它描述MMU的映射规则,即虚拟内存哪(几)个页映射到物理内存哪(几)个页帧。页表由一条条代表映射规则的记录组成,每一条称为一个页表条目(Page Table Entry,即PTE),整个页表保存在片外内存,MMU通过查找页表确定一个VA应该映射到什么PA,以及是否有权限映射。

c、如果MMU每次地址转换都到位于外部内存的页表上查找PTE,转换速度就会大大降低,于是出现了TLB。TLB (Translation Lookaside Buffers)即转换快表,又简称快表,可以理解为MMU内部专用的存放页表的cache,保存着最近使用的PTE乃至全部页表。MMU接收到虚拟地址后,首先在TLB中查找,如果找到该VA对应的PTE就直接转换,找不到再去外存页表查找,并置换进TLB。TLB属于片上SRAM,访问速度快,通过TLB缓存PTE可以节省MMU访问外存页表的时间,从而加速虚实地址转换。TLB和CPU cache的工作原理一样,只是TLB专用于为MMU缓存页表。

MMU内存管理机制

地址转换的整个过程

2、MMU的内存保护功能
既然所有发往内存的地址信号都要经过MMU处理,那让它只单单做地址转换,岂不是浪费了这个特意安插的转换层?显然它有能力对虚地址访问做更多的限定(就像路由器转发网络包的同时还能过滤各种非法访问),比如内存保护。可以在PTE条目中预留出几个比特,用于设置访问权限的属性,如禁止访问、可读、可写和可执行等。设好后,CPU访问一个VA时,MMU找到页表中对应PTE,把指令的权限需求与该PTE中的限定条件做比对,若符合要求就把VA转换成PA,否则不允许访问,并产生异常。

三、操作系统对MMU的管理

实际上MMU是为满足操作系统越来越复杂的内存管理而产生的。OS和MMU的关系简单说:


1、系统初始化代码会在内存中生成页表,然后把页表地址设置给MMU对应寄存器,使MMU知道页表在物理内存中的什么位置,以便在需要时进行查找。之后通过专用指令启动MMU,以此为分界,之后程序中所有内存地址都变成虚地址,MMU硬件开始自动完成查表和虚实地址转换。


2、OS初始化后期,创建第一个用户进程,这个过程中也需要创建页表,把其地址赋给进程结构体中某指针成员变量。即每个进程都要有独立的页表。
3、用户创建新进程时,子进程拷贝一份父进程的页表,之后随着程序运行,页表内容逐渐更新变化。

4、系统处理内存寻址, 这个过程由操作系统进行管理和维护,保证流程的正常进行。

MMU内存管理机制

内存寻址总览图

上图是一个内存管理的硬件结构,处理流程:

a、cpu发起一个寻址的请求,由MMU接受处理;

b、如果MMU在TLB缓冲中找到,则直接用映射后的物理地址,去主内存读取;如果没有找到,则需要从当前进程的页表中查询,如果找到则返回更新TLB;

c、如果页表中没有,发现虚拟地址还没有分配物理地址空间的时候,会触发缺页中断,此时会去查看这段虚拟地址对应的磁盘文件内容,将其加载到内存中,在页表中建立起映射关系,程序就可以继续执行了。

总结
了解了地址转换的流程,VA到PA的映射过程就一目了然:MMU得到VA后先在TLB内查找,若没找到匹配的PTE条目就到外部页表查询,并置换进TLB;根据PTE条目中对访问权限的限定检查该条VA指令是否符合,若不符合则不继续,并抛出exception异常;符合后根据VA的地址分段查询页表,保持offset(广义)不变,组合出物理地址,发送出去。

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: