u-boot的启动过程比较简单,大致做下面的工作: 基本上,这就是u-boot的启动要做的事情,我也曾经大致看过arm的启动代码,也是类似。 启动涉及到几个文件: start.S, cache.S, lowlevel_init.S 和 board.c 程序从start.S的_start开始执行。首先,初始化中断向量,寄存器清零,大致包括32 之后,配置寄存器CP0_STATUS,设置所使用的协处理器,中断以及cpu 这时,配置栈的地址,进行调用函数board_init_f(board.c) 内存划分好,就准备进行relocate code了。关于relocate code 上次讲到,内存划分好,准备进行relocate code。 但是,问题在于,flash上的地址和ram上的地址是不同的。当我们把代码从flash上搬移到ram上以后,当执行函数跳转时,代码里的函数地址还是flash上的地址,所以一跳就跳回去了。 这里,gp存放的就是GOT表的起始地址,而1088就是要调用函数的offset,也就是说GOT表的那个位置存放着它的地址。lw t9,1088(gp) 把函数地址放入t9, 然后调用就可以了。 知道了PIC的原理,解释u-boot relocate code的方法就简单了。 之后,就进入board.c的board_init_r函数,在这个函数里初始化 malloc,flash,pci 以及外设(比如,网口),最后进入命令行或者直接启动Linux kernel。
|
mips平台的u-boot启动流程
最新推荐文章于 2019-09-28 10:48:06 发布
转载自:
http://hi.baidu.com/rbdr/blog/item/63bffb5476360f4c564e00bf.htmlu-boot 启动流程(mips)
2011-06-13 17:55