以nand flash启动,则,nand flash 前 8K 的内容就会被原原本本的(硬件自动)复制到 6410 片内
8K 内存中,且被映射到 0x0 地址中,然后从 0 地址开始运行。(ARM 的 CPU 都这样)
当程序大于 8K 时,就得用DDR(需要初始化 DRAMC 和 DDR )。启动时吧全部程序复杂到DDR里面。
问题:DDR共128MBYTE,那,把程序复制到DDR哪里?
答:复制到链接地址。
一个程序分为3段:
1.代码段:指令
2.数据段:有初始值并且初始值不等于零的全局变量、静态变量。
3.BSS段:初始值为零或无初始值的全局变量、静态变量。
二进制文件中不包含BSS段。
总结:
1.程序运行时,“应该”位于它的链接地址
2.由硬件决定了,一上电,则程序被复制到片内8K里面,从0x0开始运行。而又由
于程序大于8K,所以需要用到DDR,因此需要重定位,前面一小段代码把程序复制
到DDR上它对应的链接地址(这里的前一段代码作用有两个:一是重定位,二是把程序代码复制到对应DDR的链接地址上然后清零BSS段)。
3.那为何前面一小段代码能够正确运行?因为这一段代码是用位置无关码写的
位置无关码:
1)跳转用b,bl这些相对跳转指令
2)不用全局变量,静态变量。
从原理图上看出DDR由15条地址线链接,能访问2的15次方(即32k)个地址。
怎么访问DDR?
1.初始化 DRAMC (动态内存控制器)
1)地址线的设置(行/列地址)
2)位宽
3)设置时序(时间参数)
2.初始化 DDR
不会设置,需查找网络资源。
转载于:https://my.oschina.net/fengyeshangqing/blog/335159