嵌入式Linux启动过程分析6-u-boot-2step-word description

第二阶段是从lib_arm/board.c中的start_armboot开始的

第二阶段也可以分为两个部分,init_sequence中的初始化部分,start_armboot函数后续的初始化部分,之后是main_loop等待用户处理或启动内核

1.初始化本阶段用到的硬件设备,在board.c中的init_sequence数组中预先定义的初始化函数.这中间有使用/include/configs/xxxxx.h中的宏开关来设定外围设备的功能。具体有:cpu_init ,board_init,interrupt_init,env_init,初始化串口init_baudrate/serial_init/console_init_f,检测内存映射dram_init.
2.start_armboot函数后续的初始化函数,flash_init,将环境参数读入内存指定的位置env_relocate,初始化网络设备IP/MAC/网卡驱动,进入main_loop进行循环
3.分析命令cmd执行相应的命令。启动内核的命令为:bootcmd


u-boot从flash中读出内核,然后启动,所以必须支持flash


如何添加一个命令
1.查看参考其他命令的形式,新建文件复制头文件
2.do_bootm复制,返回0
3.定义一个U_BOOT_CMD
4.编译修改Makefile---->修改common下的cobjs=......o   加上一个.o 文件
5.make


bootcmd分析
nand read.jffs2 0x30007FC0 kernel
从kernel分区读取内核到指定地址,此地址可以修改(在不影响其他部分的前提下)

kernel分区,Flash上是没有分区的,通过源码将分区写死了(就是定义了某段地址是干什么用的)在include/configs/xxxx.h中定义的

Flash上存的内核叫做u_Image,是由头部信息和真正的内核组成的。

boom命令:
1.读取头部,移动内核到合适的地方
2.启动内核do_bootm_linux:1.告诉内核参数2.跳转到入口地址启动内核


theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);

theKernel (0, bd->bi_arch_number, bd->bi_boot_params);  机器ID  参数地址


之后将控制权交给内核,没有u-boot的事了

你可能感兴趣的:(嵌入式Linux启动过程分析6-u-boot-2step-word description)