Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830456
  • 博文数量: 85
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 22:52
文章分类

全部博文(85)

文章存档

2011年(1)

2008年(1)

2007年(60)

2006年(23)

我的朋友

分类:

2007-03-18 23:41:22

实验背景:

使用PXA270处理器,目标平台为XSBASE27006年嵌入式竞赛平台)。由于PXA270的存储空间分配是相对固定的,例如0x0地址开始的384MB空间固定为静态存储区,而SDRAM空间为0xa0000000开始的256MB或以0x80000000开始的1GB地址范围,因此,如果在对速度以及实时性要求较高的嵌入式应用中,要把应用程序搬到SDRAM中运行,另外还要把中断向量表CopySDRAM中,而中断向量表必须存放在0地址处(有些处理器也可以使用0xffff0000高地址中断向量表),这时就必须要对地址空间进行重映射,将SDRAM空间映射到0x0地址开始的地方,而把FLASH空间映射到别处。

进行地址空间或说存储器重映射的办法,一般有如下几种:一是设置目标处理器自带的专用remap寄存器,通过硬件逻辑来完成重映射;二是有些处理器设计了Bank寄存器,可以用来修改存储器的起始地址;三是带有MMU的处理器,可以使用MMU来将物理地址映射到虚拟地址,完成地址空间的重映射。

对于PXA270处理器,可使用MMU来进行地址重映射。

实验平台使用32MBIntel NORFLASH存储器,64MBSDRAM

 

MMU的地址映射过程本身并不复杂,但在编程时如果不注意一些细节,加上又要使用CacheWrite-BufferBTB以及TLB时,很容易造成存储器内容一致性上的问题而导致混乱。建议在编写或改写MMU的程序前,一定要对MMU的地址映射过程有比较清楚的认识,对可能影响到MMU的操作和其他处理单元如Cache等要有一定了解,对MMU的控制单元CP15的相关处理器也有大概的认识,然后在实际的程序调试过程中,进一步加深理解和认识。

由于是第一次调试MMU的地址映射的程序,应尽可能地避免其他干扰因素,使用最简单的地址映射方式,目的在于清楚理解MMU地址映射过程,以及在程序中为MMU构建页表和描述符的过程,实现最简单的MMU的地址映射功能。

本实验首先选取一个最简单的已经调试通过的LED流水灯的ADS工程(不带MMU地址映射操作),然后参考一些bootloader以及示例程序,往该工程中加入MMU地址映射的功能,使用虚拟地址来点亮LED。采用一级段描述符进行地址映射,不使用CacheWrite-Buffer

 

......

 

小结:

       至此,我们已经正确地使用MMU完成了地址映射功能,并且可以得到如下结论:

       1.映射并使能MMU后,所有地址对于CPU而言都是虚拟地址,在程序中如果要访问某一物理地址,必须要使用其对应的虚拟地址。

       2.即使虚拟地址和物理地址相同,也必须为其建立页表进行映射,否则CPU认为这是无效的虚拟地址而无法访问。

       3.存储页表的内存空间必须在映射前后地址一致,即虚拟地址与物理地址相同。另外,还应保证使能MMU的代码段的虚拟地址与物理地址相同,否则在使能MMU时产生PC误指,造成混乱。

       4.在跳转指令以及使能MMU的指令前后可以添加2NOP指令来填充流水线,避免指令预取造成的干扰。

       5.使能MMU前要清空指令和数据Cache以及TLB,抽干写缓冲等。

       6.建立页表和构造描述符时要注意对访问权限、描述符类型作正确设定。

       7JTAG仿真器看到的地址与CPU一致。

       8.建立页表的工作可以放到一个子程序中,而使能MMU的指令则最好放在引导主程序boot.s中,这样可以在使能MMU后让引导程序顺序执行下去,最后装入用户主程序。如果将使能MMU的操作放在子程序中,则使能MMU后返回时,可能导致PC指向错误的物理地址。


[完整图文版点此下载]

阅读(4068) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~