硬件编程 内存管理

内存管理(硬件编程)
1.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.虚拟地址空被划分为一个称为page的单元,同时对应的物理地址空也被划分 。单位是页框,页面和页框的大小必须相同 。映射的最小粒度是从单个虚拟页面到物理页面,页面大小通常为4K,即一次至少要将一个4K VA页面块映射到一个4K PA页面块(从0开始,用4K对齐方式划分页面块),页内偏移量为常数 。
例如,VA的页面0x30004000~0x30004fff映射到PA的页面0x00008000~0x00008fff 。当CPU执行单元访问虚拟地址0x30004008时,实际访问的物理地址是0x00008008(0x30004008和0x00008008位于虚拟和虚拟地址/[/]以页为最小单位意味着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是为了满足操作系统日益复杂的内存管理而产生的 。与奥斯穆的关系简述如下:
1.系统初始化代码会在内存中生成页表,然后将页表地址设置到MMU对应的寄存器中,这样MMU就可以知道页表在物理内存中的什么位置,以便需要的时候查找 。之后,MMU由特殊指令启动,该指令用作边界 。之后程序中所有的内存地址都变成虚拟地址,MMU硬件开始自动完成查表和虚实地址转换 。


推荐阅读