2、关于boot的启动流程,分为三段:BL0,BL1,BL2,BL0被厂商固化到了处理器当中,启动会先执行这一段代码,具体做什么请看数
据手册,他会将BL1拷贝到内部SRAM中,这里就是体现启动方式的时候了,因为处理器会根据你的选择模式去到指定位置加载程序,这里比如选择了SD
卡,那么处理器就会到SD中的倒数第18个块开始取数据,这里指出,如果是SDHC卡,其实是到1024+18个块处取程序,因为处理器根本就看不到最
后的1024个块,这应该是6410内部固化代码存在的bug或者是故意为之,SD卡一个块是512个字节,所以18个块就是9K,但是6410要求最
后必须空出来1K,不知道用意何在,也许是为了以后的产品升级吧,所以正好是从倒是第18个块开始取8K的数据到内部的SRAM中,在前8K当中一定要
做一件很重要的事情,就是将整个uboot的加载和重定位到SDRAM当中去最后跳转到绝对地址运行,这样即使你的BL1还没执行完,也可以到
SDRAM中继续干活啦,前面是汇编,在重定位之前必须是位置无关代码,至于什么是位置无关,请百度吧,这一段完成一些基本初始化,最主要就是要加载和
重定位,另外就是堆栈的初始化,因为后面的C语言阶段是需要堆栈的,具体每个阶段都需要完成哪些东西,根据具体情况会有差别,当然第二阶段加载内核和参
数传递时必须有的,其实这些就好像我们的系统一样,有最小系统之说,基本必须的一定要有,其他都是根据具体情况而定。所以我们有的人会认为BL1是汇编
部分,BL2是C语言部分,其实不对,更合适的理解应该是这是UBOOT代码的完成任务的两个阶段。BL0在完成一些低级初始化之后就是将BL1拷贝到
SRAM,BL1在完成一些初始化之后将uboot代码拷贝到SDRAM中,重定位到编译器编译指定是位置,然后跳转,BL2就是完成一些复杂的初始
化,以及很多辅助调试功能,比如网络命令,usb命令,nand命令等等,最后执行你的bootcmd,将内核加载到指定位置,将bootargs放到
指定位置,传递给内核mach_type,bootargs的存放地址,然后跳转到内核执行,到这里uboot就完成使命然后消失了。所以说BLx我们
可以认为是uboot功能的几个阶段,其实如果只是基本功能的话,完全可以将代码压缩到8K以内,那么就不需要重定位。编译的时候直接从0地址开始就行
了。
3、另外有一个误区,我们在使用SD卡启动的时候,这个代码必须是拼接够256K然后再接上BL1的8K,形成一个264K的代码,然后通过软
件烧写到SD卡中,其实这个都是由于三星官网提供的UBOOt代码给忽悠的,因为代码里面前8K在重新加载完整UBOOT代码的时候是从256K+8K
开始,然后加载256K到SDRAM,其实我们不能决定的地址只有那个8K的位置,因为这是BL0决定的,我们无法改变,但是拷贝BL2我们是可以自己
决定的,也不一定必须是256K,不需要去拼接代码,我们可以放到整个SD卡的任何位置,另外我们还可以放一些其他的东西,比如开始动画,logo啥
的,只要你在UBOOT里面配置一下这个地址就行啦。过两天我会发布一个简化版的UBOOT,只完成基本功能,结构很简单也很清晰,帮助大家去理解启动
过程。接着还会发布一个我修改过的UBOOT源码,我加入了自定义的菜单,我会出一个相关的说明书,告诉大家怎么用,都需要修改那些东西。今天很晚了,
时间紧,就不说了!说的有的有一点模糊,大家谁有啥意见尽管说,或者我有错的地方,一定要帮忙指正一下,我们一起讨论!