1,uboot分为两个阶段,
1.1阶段1代码在rom上运行,栈在cache,可以运行c语言代码,但是全局和静态变量不能被赋值。
1.2阶段2代码在ram上运行,可以完全运行c语言
1.3从rom搬运到ram所有全局变量,函数的地址都发生了改变,当然栈里面的变量是不用考虑这个地址问题的,都是临时的相对地址。为了解决这个问题,uboot链接的时候使用了GOT全局偏移地址表,即全局变量地址,静态变量地址,函数地址组成的。 搬运后,表里的每一项都统一加减搬运地址的差值就可以啦。代码中对这些变量,函数的访问都是通过 gp + GOT offset 来实现的。
多核启动时候,首先是主核启动,其他核等待主核初始化。主核初始化差不多了,已经把linux内核的起始地址给每个核填充好了,通过写寄存器,唤醒从核们reset。
进入linux后,仍然是主核做初始化,start_kernel。 初始化完毕后,逐个唤醒处于忙等中的从核。linux看到的主核是uboot传给linux的参数标识出来的。
阅读(3241) | 评论(1) | 转发(0) |