【说明】
前面我们说过,NAND启动的时候,6410会把NAND中前4页每页2KB(而不是前8KB,这里很多人理解错)复制到片内内存中,从物理地址0开始运行,那我们就有个问题了,如果我们的程序超过8KB怎么办?显然超过8KB的部分不会复制进片内内存,那超过8KB的部分在哪运行呢?这就是这节的要介绍的,代码重定位。
【DDR】
什么是DR,就是动态存储器,也就我们说的内存了,DDR其实第一个D是 double的意思,也就是双倍速率动态存储器
CPU可以直接对其进行随机访问,但是前提是要先用代码初始化DDR,这也是这一章实验部分的重点。
【重定位】
显然,程序应该放在内存中运行,可是我们的程序在片内内存,而且只有8KB,怎么办?
办法就是我们用这8KB程序初始化DDR,然后初始化NAND FLASH,再把NAND FLASH中完整的代码复制到DDR中,最后跳到DDR中运行
这个就是重定位, 这样重定位以后,程序运行就正常了,除非程序大小超过了内存(使用虚拟内存,及时超过也没事,这里我们是裸机,所以超过不行)
【一些问题】
办法想到了,但是又有一个新问题,那就是复制到DDR的哪里?它可有256MB,随便放哪吗?
显然不是,回忆前一节关于链接地址和物理地址的概念,如果复制到的地址不等于链接地址,程序是会出问题的。
所以,解决办法是,链接地址是哪,我们就复制到哪。记得我们给的链接脚本中程序开始地址吗?没错,0X50000000
在6410的体系中,这个是DDR的开始地址,所以,如果我们的程序用了这个链接脚本,我们就得把它复制到0X50000000开始的地方,也就是DDR最前面
当然,换了链接地址,重定位到DDR的地址也就得跟着变咯。
【还有问题】
问题不是解决了吗?还有什么问题吗?
又要回到我们的前8KB了,我们复制到DDR后,程序是能正常运行了,但是我们把这前8KB给忘记了,它可不是在0X50000000开始的地址处,它在0地址。
那这8KB不就是物理地址不等于链接地址吗?没错!就是不等!那这8KB运行不就出错了吗?
还记得地址无关码吗,没错,这8KB就得是地址无关码,所以它不会出错,它可以在任何物理地址运行。
【总结】
我们的片内内存只能放8KB程序,超过的部分不能正常运行,所以我们就在前8KB写地址无关码,去初始化DDR, 初始化NAND FLASH,
然后把完整的程序从NAND FLASH 复制到DDR中,再跳到里面执行。
为了保证程序正常运行,我们的链接地址要和复制后的物理地址相同,这使得前8KB物理地址不等于链接地址,但由于它是地址无关码,所以程序正常。