s3c2440裸板mmu实例错误笔记

2019-07-14 02:38发布

昨晚自己写了一个mmu实例后,下载到开发板上死活没有反应,于是我找到一个mmu实例的源码,下载下去后,可以运行。之后再下载自己的程序,发现自己的程序居然也运行起来了。
我自己的程序并没有做实质性的改动,现象十分诡异。之后我想复现错误,于是拔掉电源,插上电源,再下载自己的程序,结果还是可以运行,各种修改程序都无法复现错误。
今天早上起来再插电源开机的时候,发现程序又失效了。于是我复现昨晚的操作,成功地再次让自己地程序跑起来。 会出现这种情况肯定是上一次下载的程序仍有部分再内存中,但是,我已经拔掉电源,按理说sdram中的程序应该是完全丢失,为什么经过一个晚上后才会丢失呢?我看到了闪闪发光的open-jtag,难道open-jtag也能给sdram供电(之前只拔了电源,并没有拔掉下载程序用的open-jtag)。当我再把jtag拔掉,重新开机后,发现程序又跑不起来了! 成功地复现了错误,这也印证了我的两个想法:
1.在这块板子上open-jtag确实可以给sdram供电;
2.下载一次源码后,源码残留在sdram中的信息,使得下一次我自己程序能够正常执行。 这就说明我自己的错误出现在sdram的内存中。
而mmu页表设置的描述符就是储存在sdram当中的,经过对mmu页表设置函数的排查后,发现确实是页表设置出了问题。
以下是错误代码 64 virtuladdr = 0xB0000000; 65 physicaladdr = 0x30000000; 66 while(virtuladdr < 0x4000000){ 67 *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000)|MMU_SECDESC_WB; 68 virtuladdr += 0x100000; 69 physicaladdr += 0x100000; 70 } 可以看出 virtuladdr赋值比他的判别值还大,这样一来while是无法执行的,所以地址映射肯定失败,把virtuladdr < 0x4000000改成virtuladdr < 0xB4000000就好了。