s3c2440裸板mmu实例错误笔记

博主在实现MMU实例过程中遇到程序在开发板上时灵时不灵的诡异现象,通过复现错误和逐步排查,最终定位到页表设置函数中的地址映射错误,揭示了open-jtag在特定条件下能为SDRAM供电的现象。

昨晚自己写了一个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就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值