阳春市新兴铸管厂长:piaoxiang
来源:百度文库 编辑:九乡新闻网 时间:2024/05/20 12:47:20
vivi开发笔记(十二):MMU分析 (2007-08-16 21:31) 分类: Vivi
伴随着这种技术的出现,“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的映射(可以因此实现方便的动态内存管理) · 实现不同的访问权限。 三、结合s3c2410来分析MMU的几处硬件特点 首先看看ARM920T的框图: 可以验证前面的几个概念: ·位于中心的ARM9TDMI Processor Core发出的地址有两种,IVA和DVA,都是VA。其中I代表Instruction, D代表Data。也就是说,CPU核心看到的都是32bits的VA。 ·Dcache、Icache、Dmmu、Immu看到的都是对应的MVA(modified virtual address),这个是比较复杂的地方,下面专门拿出这个来讲解。 ·MMU处理后的输出地址都是对应的PA,通过AMBA Bus Interface连接到ASB总线上面。 这样,从硬件上对地址的概念就比较清晰了。也可以很明显的看出MMU的功能:将VA转换成PA。但是现在存在的一个问题是,MVA是什么,为什么要用到MVA? 可以看CP15协处理器的register 13。这个寄存器是进程识别寄存器,主要的操作如下: 很清晰,ProcID为7bits,剩下的25bits should be zero,也就是可以实现2^25=32M的地址对齐。从这个道理上讲,每个进程拥有32M的MVA地址空间,而最多支持的进程数为2^7=128个。这样,128*32M=4GB,正是全部的虚拟地址空间。但是,英文的datasheet上却并非如此,写的记录数字为64个进程,同样每个进程32M,怎么可能达到4GB?参看下图: 我觉得上图中的63应该改为127。因为这个63处不可能对应4GB,而应该对应2GB。判断此处属于datasheet的错误。 还有,这个procID是何时,有谁写入的?有谁来维护?根据推断,在bootloader阶段,只需要一个进程就可以了,所以,procID一直都是复位后默认的0,不需要改变。但是后面有了OS后,要想实现多进程,那么就需要对此维护了。所以procID的维护者是系统软件OS。在创建一个新进程的时候,要把进程号写入procID。 另外,关于MVA部分的转换公式,实际上还是有疑问的。 文件: mmu.tar.gz 大小: 7KB 下载: 下载
文章说明:calmarrow(lqm)原创
文章引自:http://piaoxiang.cublog.cn
这几天一直在看MMU部分,现在有了基本的认识,还不深入,解决了初级问题,并且仿照vivi完成了一个测试实例,对深入理解和验证推论的结果很有帮助。在学习的过程中,体会到几种方法还是比较实用的: · 从历史的角度去了解技术,梳理清楚发展主线,效率更高。 · 采用软硬件结合的方法分析,理解更为深入。 · 与同一爱好的朋友交流,可以发现认识的盲区,认识更为全面。 · 应该阅读英文的Datasheet,中文翻译往往有错误,有时候是致命的,以前在c8051F020的SPI的设计中就因为这个问题研究了一周,最后才发现中文翻译有问题,这也足以说明还是原版更具有可信度。但是呢,不要绝对化,原版也可能有错误。在阅读学习的过程中,如果理解到设计的巧妙,那么很好,拿来使用。如果暂时不能理解,或者认为原版有错误,那么不妨持怀疑的态度进行学习,即使错了,也能学到很多东西,甚至从错误中学到的东西更多。 · 充分利用网络资源。站在巨人的肩上可以更高更远!但是,你必须训练让自己具备找到巨人的能力! 下面开始MMU的探讨。因为还只是处于初级阶段,本文仅就MMU的基础方面和应用作一下探讨,其中还有没有明确的地方,待解决。 一、MMU是什么? MMU,英文名称为Memory Manage Unit, 中文可以为“内存管理单元”,或者“存储器管理单元”。MMU是硬件设备,它与virtual memory是紧密联系在一起的。 看一下s3c2410 datasheet Appendix 1中关于ARM920T的介绍(因为s3c2410采用的是ARM920T的处理器)。对ARM9系列处理器有如下几种: --ARM9TDMI(ARM9TDMI Core)
--ARM940T(ARM9TDMI core plus cache and protection unit)
--ARM920T(ARM9TDMI core plus cache and MMU)
伴随着这种技术的出现,“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的映射(可以因此实现方便的动态内存管理) · 实现不同的访问权限。 三、结合s3c2410来分析MMU的几处硬件特点 首先看看ARM920T的框图:
Reading from CP15 register 13 returns the value of the process identifier. Writing CP15 register 13 updates the process identifier to the value in bits [31:25]. Bits [24:0] should be zero.
Addresses issued by the ARM9TDMI core in the range 0 to 32MB are translated by CP15 register 13, the ProcID register. Address A becomes A + (ProcID x 32MB). It is this translated address that is seen by both the Caches and MMU. Addresses above 32MB undergo no translation.
if VA < 32M then
MVA = VA | (ProcID << 25)
else
MVA = VA