分类: 服务器与存储
2009-03-03 21:02:23
1.首先建立好各个模式下的堆栈指针,注意把abort模式下的堆栈指针指向0x1ffffc!
|
2.关闭I/DCache,挤干write buffer,关闭mmu
|
3.将页表区域清零,页表的基地址是0x4000,结束地址是0x7ffc
|
4.写入1级页表。代码从0x30008000开始执行,对应的1级页表地址为0x4c00,0x30100000对应1级页表地址为0x4c04,一共2M地址空间,所以只用到两个1级页表项。
|
5.写入2级页表项。2级页表基地址是0x6000,2级页表项最后两位是01,所以对应的是4k大页。
|
6.为了产生页错异常,将数据段的2级页表项的最后两位设成00,这样mmu取到2级页表项的时候将发生数据异常,在异常处理函数中我们就可以重新修改页表了。注意代码中的红色部分!
|
7.创建一些特殊的页表。注意前面部分我们的1级页表项是从0x4c00开始放的,我们在0x4000处放置0x0000开始的页帧和0x8000开始的页帧的一级页表项,将这两个页帧的虚实地址映射为相等,2级页表放在0x4400和0x4420处。同理,为了实现abort异常的堆栈虚实地址相等,我们也需要单独设置这个页帧的页表。改页帧的1级页表放在0x4004,2级页表放在0x47fe。地址的映射关系在此就不详述了。
|
8.开启mmu。初始化过程结束。
|
9.下面开始讨论abort异常处理程序
|
10.关闭mmu
|
11.修改页表。先将所有的数据段的2级页表项置为01,然后将发生页错异常的段的物理地址映射到spm中,地址为0x04000000,最后从sdram中搬运数据到spm,这样下次访问该页帧时就可以从spm中访问数据了,而不需要到sdram中。
|
12.开mmu。
|
13.出栈。
|
总结:先写到这,任务尚未完成。