本帖最后由 dannys0302 于 2014-6-4 10:31 编辑
芯片:i.mx6q
平台:E9卡片电脑
仔细看了手册,大体理解到:
1、启动时(我从SD卡启动),芯片会复制SD卡从0x400开始的4K内容到内部RAM。
2、内部ROM检测IVT和DCD,然后执行DCD去初始化外部内存。
3、拷贝boot_data中length指定长度的内容,到boot_data指定的地址去,然后跳转到entry指定的地址。
以上是我的理解,问题:
1、以上说法是否正确?
2、若以上说**确,那么说明,内部ROM是先执行DCD初始化DDR,再把代码拷贝到外部内存。那么DCD的绝对地址,应该和外部内存没有关系。
这个是我的可执行文件的开头一部分,此文件是可以运行的(成功点灯),可以看到,这里使用的地址偏移量是0x27800000(改成0x10000000也行,只要在DDR地址范围之内)。
即:
boot_data->start = 0x27800000
DCD绝对地址 = 0x2780042C
第一条指令地址entry = 0x278006E0
都是相对0x27800000偏移的,我也验证过,内部ROM确实会把代码拷贝到内存的这个地址(打印PC值看了)。
问题来了,既然是先执行DCD再拷贝代码,那么DCD的位置,应该和外部内存的地址无关,就是说,内部ROM,应该不能根据外部内存的地址,去寻找DCD所在位置,否则本末倒置了。
但我修改DCD绝对地址的值,会导致代码跑飞(灯点不亮),这是为什么?内部ROM是根据什么来寻找DCD的?
3、若启动流程分析正确,内部ROM会拷贝boot_data->length长度的代码,到外部内存中,目标地址是boot_data->start,但我把boot_data->length的值改为0,代码还是可以工作,这是为什么?
一直对启动流程不太理解,想搞个明白,麻烦各位大神解答一下,另,这个问题与板子和BSP无关,只是芯片的启动流程。
|