分类:
2007-03-18 23:41:22
实验背景:
使用PXA270处理器,目标平台为XSBASE270(06年嵌入式竞赛平台)。由于PXA270的存储空间分配是相对固定的,例如0x0地址开始的384MB空间固定为静态存储区,而SDRAM空间为0xa0000000开始的256MB或以0x80000000开始的1GB地址范围,因此,如果在对速度以及实时性要求较高的嵌入式应用中,要把应用程序搬到SDRAM中运行,另外还要把中断向量表Copy到SDRAM中,而中断向量表必须存放在0地址处(有些处理器也可以使用0xffff0000高地址中断向量表),这时就必须要对地址空间进行重映射,将SDRAM空间映射到0x0地址开始的地方,而把FLASH空间映射到别处。
进行地址空间或说存储器重映射的办法,一般有如下几种:一是设置目标处理器自带的专用remap寄存器,通过硬件逻辑来完成重映射;二是有些处理器设计了Bank寄存器,可以用来修改存储器的起始地址;三是带有MMU的处理器,可以使用MMU来将物理地址映射到虚拟地址,完成地址空间的重映射。
对于PXA270处理器,可使用MMU来进行地址重映射。
实验平台使用32MB的Intel NOR型FLASH存储器,64MB的SDRAM。
MMU的地址映射过程本身并不复杂,但在编程时如果不注意一些细节,加上又要使用Cache、Write-Buffer、BTB以及TLB时,很容易造成存储器内容一致性上的问题而导致混乱。建议在编写或改写MMU的程序前,一定要对MMU的地址映射过程有比较清楚的认识,对可能影响到MMU的操作和其他处理单元如Cache等要有一定了解,对MMU的控制单元CP15的相关处理器也有大概的认识,然后在实际的程序调试过程中,进一步加深理解和认识。
由于是第一次调试MMU的地址映射的程序,应尽可能地避免其他干扰因素,使用最简单的地址映射方式,目的在于清楚理解MMU地址映射过程,以及在程序中为MMU构建页表和描述符的过程,实现最简单的MMU的地址映射功能。
本实验首先选取一个最简单的已经调试通过的LED流水灯的ADS工程(不带MMU地址映射操作),然后参考一些bootloader以及示例程序,往该工程中加入MMU地址映射的功能,使用虚拟地址来点亮LED。采用一级段描述符进行地址映射,不使用Cache和Write-Buffer。
......
小结:
至此,我们已经正确地使用MMU完成了地址映射功能,并且可以得到如下结论:
1.映射并使能MMU后,所有地址对于CPU而言都是虚拟地址,在程序中如果要访问某一物理地址,必须要使用其对应的虚拟地址。
2.即使虚拟地址和物理地址相同,也必须为其建立页表进行映射,否则CPU认为这是无效的虚拟地址而无法访问。
3.存储页表的内存空间必须在映射前后地址一致,即虚拟地址与物理地址相同。另外,还应保证使能MMU的代码段的虚拟地址与物理地址相同,否则在使能MMU时产生PC误指,造成混乱。
4.在跳转指令以及使能MMU的指令前后可以添加2条NOP指令来填充流水线,避免指令预取造成的干扰。
5.使能MMU前要清空指令和数据Cache以及TLB,抽干写缓冲等。
6.建立页表和构造描述符时要注意对访问权限、描述符类型作正确设定。
7.JTAG仿真器看到的地址与CPU一致。
8.建立页表的工作可以放到一个子程序中,而使能MMU的指令则最好放在引导主程序boot.s中,这样可以在使能MMU后让引导程序顺序执行下去,最后装入用户主程序。如果将使能MMU的操作放在子程序中,则使能MMU后返回时,可能导致PC指向错误的物理地址。