硬件编程 内存管理

内存管理(硬件编程)
一、MMU是什么?
早期的CPU(比如8086),或者现在用的MCU(单片机),程序直接运行在物理内存(SDRAM或者NOR Flash)上 。程序运行时,通过总线访问的数据,读写的地址都是物理地址 。例如,程序计数器PC中的值是预取指令所在的物理存储器的地址值 。
冯-诺依曼计算机模型
这种方法比较容易实现硬件电路的设计,程序的处理逻辑也比较简单,但是不适合复杂的系统,尤其是多任务操作系统 。首先,我们来看看原方法的不足和缺陷 。
物理内存不足 。比如一个程序运行需要64K内存,而机器只有32K物理内存 。
程序运行的地址不确定 。相同的程序可以每次加载到不同地址的存储器中 。
内存使用率低 。如果你需要运行一个程序,你需要将整个程序加载到内存中来运行它 。
无法支持多任务处理 。有一个问题是进程间地址空没有隔离,或者一个任务失败,可能导致整个系统宕机 。
然而,随着计算机科学技术的发展,所要解决的问题越来越复杂,单任务批处理已经不能满足需求 。此外,应用程序所需的内存量也在不断增加 。而且随着多任务的需求,这种技术架构已经不能满足需求 。在这种背景下,MMU应运而生,这说明任何技术的发展必然是需求驱动的 。MMU(内存管理单元)主要用于管理虚拟内存和物理内存的控制电路,还负责虚拟地址到物理地址的映射,提供硬件机制和多任务多进程操作系统的内存访问授权 。
如果处理器使能MMU,CPU执行单元发送的内存地址会被MMU截获 。CPU到MMU的地址称为虚拟地址(VA),MMU将这个地址翻译成另一个地址发送到CPU芯片的外部地址引脚,也就是将VA映射到PA,如下图所示:
MMU硬件电路的功能
二、MMU的具体功能
1.页表的映射转换
MMU的主要功能是虚拟地址到物理地址的转换 。但是“映射”有两个问题需要解决:映射的最小单位(粒度)和映射的规则 。
a、将虚拟地址空划分为一个称为页面的单元,对应的物理地址空也划分为页框,并且页面和页框的大小必须相同 。映射的最小粒度是从单个虚拟页面到物理页面,页面大小通常是4K,即一次至少要将整个4K大小的VA页面块映射到4K PA页面块(用从0开始的4K对齐来划分页面块),页面内偏移量不变 。
例如,VA的页面0x30004000~0x30004fff映射到PA的页面0x00008000~0x00008fff 。当CPU执行单元访问虚拟地址0x30004008时,实际访问的物理地址是0x00008008(0x30004008和0x0008008分别位于实地址和实地址/[/中 。以页面为最小单位,无法将VA中的一个页面分成若干小块分别映射到不同的PA,也无法将VA中属于不同页面的小块映射到PA中一个页面的不同部分,所以需要进行页面到页面的整体映射 。
B.MMU软件配置的核心是页表,页表描述了MMU的映射规则,即虚拟内存的哪些页映射到物理内存的哪些页框 。页表由表示映射规则的记录组成,每个记录称为一个页表条目(PTE) 。整个页表存储在片外存储器中 。MMU通过查找页表来确定一个VA应该映射到哪个PA,以及是否有权限映射 。
C.如果MMU每次都在位于外部存储器的页表中查找PTE,那么转换速度会大大降低,于是出现了TLB 。TLB(translation look aside buffers)是翻译快速表,也简称为快速表 。可以理解为MMU中存储页表的专用缓存,保存最近使用的PTE甚至所有页表 。收到虚拟地址后,MMU首先在TLB中查找它 。如果找到VA对应的PTE,就直接转换 。如果没有找到,它将在外部存储器页表中查找并将其替换到TLB中 。TLB是一种具有快速存取速度的片上SRAM 。通过在TLB中缓存PTE,可以节省MMU访问外部存储器页表的时间,从而加速虚拟和真实地址的转换 。TLB的工作原理和CPU缓存一样,只是TLB是专门为MMU缓存页表的 。
地址翻译的全过程
2.MMU的内存保护功能既然所有发送到内存的地址信号都要经过MMU的处理,那么如果只做地址翻译,岂不是浪费了这个专门安装的翻译层?显然,它有能力对虚拟地址访问做出更多的限制(就像路由器在转发网络数据包的同时可以过滤各种非法访问一样),比如内存保护 。可以在PTE条目中保留几个位来设置访问权限的属性,例如访问禁止、可读、可写和可执行 。设置后,当CPU访问一个VA时,MMU在页表中找到对应的PTE,将指令的权限要求与PTE中的限制条件进行比较,如果满足要求,则将VA转换为PA,否则不允许访问,并产生异常 。
三 。操作系统对内存管理单元的管理
实际上,MMU就是为了满足操作系统日益复杂的内存管理而产生的 。OSMMU和OSMMU之间的关系如下:
1.系统初始化代码会在内存中生成一个页表,然后将页表地址设置到MMU对应的寄存器中,这样MMU就可以知道页表在物理内存中的什么位置,以便在需要的时候查找 。之后MMU通过特殊指令启动,这就是边界 。之后程序中所有内存地址都变成虚拟地址,MMU硬件开始自动完成查表和虚实地址转换 。
2.在OS初始化的后期,创建第一个用户进程 。在这个流程中,还需要创建一个页表,并将其地址赋给流程结构中的一个指针成员变量 。也就是说,每个进程应该有一个独立的页表 。3.当用户创建一个新进程时,子进程复制父进程的一个页表,然后随着程序的运行,页表的内容逐渐更新变化 。
4.系统处理内存寻址,内存寻址由操作系统管理和维护,以确保正常进程 。
存储器寻址概述
【硬件编程 内存管理】上图是内存管理的硬件结构,其处理流程如下:
a、cpu发起寻址请求,被MMU接受;
b、如果在TLB缓冲区找到MMU,直接用映射后的物理地址读入主存;如果没有找到,则需要从当前进程的页表中查询,如果找到,则返回更新TLB;;
C.如果在页表中没有找到,当发现虚拟地址还没有分配给物理地址空时,就会触发缺页中断 。这时它会检查这个虚拟地址对应的磁盘文件的内容,加载到内存中,在页表中建立映射关系,程序就可以继续执行了 。
知道了地址翻译的过程,VA到PA的映射过程就一目了然了:MMU得到VA后先在TLB中查找,如果找不到匹配的PTE条目,就在外部页表中查找,替换成TLB;检查VA指令是否符合PTE条目中对访问权限的限制,如果不符合,则不继续,并抛出异常;满足要求后,根据VA的地址分段查询页表,保持偏移量(广义)不变,合并物理地址发送出去 。

    推荐阅读