×
嵌入式 > 嵌入式开发 > 详情

ARM中MMU的作用

发布时间:2020-08-14 发布时间:
|
让我们从历史发展的角度看MMU的作用

这一部分可结合蔡于清的讲解来看,下面的大部分内容转载此处,针对自己的理解做了一些扩充性说明。只是需要注意的是,在蔡于清此部分的讲解中,有几处小的错误,完成此部分的讲解后可以进行更正。

MMU功能部件是与虚拟内存技术(virtual memory)紧密联系在一起的。

第一阶段:最初,计算机内存很小,而且非常昂贵,大多数都是以KB为单位的。相应的,当时程序规模很小,不复杂,所以内存还是能够满足需求的。在看《Linkers andLoaders》的时候,也是从这个阶段讲解,不过此书的核心视角是从Linkers和Loaders的发展来看的。也就是,计算机刚刚出现时,还是比较简陋的,各种复杂的技术是伴随着人们需求的提高而出现的。把握住这一点,就可以从需求的角度入手探讨技术,可以分析它如何满足了这样的需求。通过这种分析,理解上就比较简单一些了。

第二阶段:程序规模扩大,考虑到成本问题,出现了overlay技术,也就是内存覆盖策略。基本的原理就是把程序分割成许多称为“覆盖块”的片断。覆盖块0首先加载运行,结束时调用另一个覆盖块。覆盖块的调度是由OS来完成的,但是事先需要分割,这部分工作是程序员借助Linkers来完成的。但是毕竟枯燥,由此带来的开销也比较大。于是进入第三个阶段。

第三阶段:出现virtual memory。虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上。比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。

伴随着这种技术的出现,“virtual address,即VA”和“physical address,即PA”也就出现了。一般来说,CPU看到的地址是VA,VA是有地址线来决定的。比如,s3c2410是32位的SoC,那么它的寻址空间为2^32=4GB,那么VA空间也就是4GB。但是在嵌入式系统中,物理存储器是不会有这么大的。现在这块s3c2410的实际内存SDRAM也就 64MB,远远小于4GB。也就是说,VA是4GB,PA是64MB,PA的地址空间是VA地址空间的子集。既然PA没有VA那么大,而且CPU只能看到 VA,那么CPU如何找到PA呢?这也正是MMU的基本作用之一,就是提供VA到PA的转换机制,除了硬件的支持外,软件上实际就是维护一张表,表中的内容是VA到PA的转换法则。由于有了MMU,那么就可以实现利用VA找到实际物理内存区域。

现在讨论为什么要实现VA到PA的映射。就ARM而言,系统上电后,CPU的PC指向0x00000000或者0xffff0000,这是由CPU的设计者决定的。在这个位置,一般安排非易失性存储器地址空间,比如rom,flash等。但是flash等响应速度慢,这就称为提高系统性能的一个瓶颈。而 sdram则具有很高的响应速度,为了提高系统运行速度,可以把flash中的应用程序下载到sdram中执行,也就是一个简单的loader的功能实现。这样就出现一个问题,ARM响应exception时,程序指针指向固定的VA,比如,假设发生了IRQ中断,那么PC执行0x00000018(如果是高端启动,则指向0xffff0018处。)但是此处仍然为非易失性存储器,也就是说,程序的一部分仍然在flash或者rom中执行。这时可以利用 MMU,把sdram的地址映射到0x00000000起始的一片连续地址空间,而把原来flash映射到其他不相冲突的存储空间位置。例如,flash 的地址范围0x00000000-0x00ffffff,sdram的地址范围0x30000000-0x31ffffff。那么可以把sdram映射到 0x00000000-0x1fffffff(此处地址空间未被占用)。映射完成后,如果处理器异常,假设依然为IRQ中断,pc指向 0x00000018,但是pc实际上是从物理地址0x30000018处读取指令。通过mmu的映射,可以实现系统运行的加速。这个地方也可以说明 bootloader中常见的中断向量表的设置,为什么有些使用b,有些使用ldr了。【b的跳转空间只能是+-32M,而ldr可以大的多了。】

在实际的应用过程中,还可能会把两片不连续的物理地址空间分配给sdram,而在os中,习惯上把sdram的空间连续起来,方便实现动态内存管理。通过mmu可以实现不连续的物理地址空间映射为虚拟地址空间。

另外一个需求就是,实现不同的运行级别,那么一些关键的代码可以设定不被普通应用程序访问。这也是通过mmu控制访问权限来实现的。

综上三个阶段所述,可见MMU的作用主要就是两个:

· 实现VA到PA的映射(可以因此实现方便的动态内存管理)
· 实现不同的访问权限。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
一只老鸟的嵌入式ARM学习心得