uboot启动过程(代码流程)
uboot启动过程:
第一阶段(汇编):(boot/fastboot/arch/arm/cpu/hi3798mx/start.S)//不同系统目录位置可能不同
-------->.../* 硬件相关初始化 */
ldr pc, _start_armboot -->跳转到第二阶段
第二阶段(C语言)
------->start_armboot():(boot/fastboot/arch/arm/lib/board.c)
设备外设的初始化
Android的recovery系统相关也在此。
logo显示也放于此
...
main_loop():进入命令循环检测
--------> (处理环境变量和控制台人机交互)
1.生成环境变量mtdparts, 调用mtdparts_init
2.在启动过程中
若无空格键按下则boot_zImage,即run_command(getenv("bootcmd"),0)--->读取内核存储位置
有空格键按下则 run_command("menu",0)
3.shell过程,读取用户的输入并执行相应的命令
{
从控制台获得命令,保存在全局变量console_buffer中
解析命令行字符串,分割命令与参数,最后执行 run_command(...);
}
//*----------------------------------------------------------------------------------------------------------
run_command读取控制台bootcmd:
例如:bootcmd='sf read 1000000 100000 700000;bootm 1000000'
第一条命令 从flash上读出内核 kernel是一个分区标志
第二条命令 启动命令指示了启动地址:bootm addr
---------------------------------------------------------------------------------------------------------*//
进入run_command()中
---->find_cmd()在“u_boot_cmd”段找到bootm命令
---->"bootm"命令的执行函数为do_bootm()
---->重启函数表;
---->检查是否有子命令;
---->bootm_start(cmdtp, flag, argc, argv)://获取镜像的信息并存入images
---->disable_interrupts();//禁用中断
........
---->//将镜像的数据从images.os.image_start复制到images.os.load 打印:Loading Kernel Image ... OK
bootm_load_os(images.os, &load_end, 1);
---->//根据操作系统的类型获取引导操作系统的函数
boot_fn = boot_os[images.os.os];
---->boot_fn(0, argc, argv, &images);//调用do_bootm_linux
进入do_bootm_linux():获取"bootargs"环境变量的值,最终将此值传递给linux内核.
---->void (*theKernel)(int zero, int arch, uint params);/* 第一个参数必须为0,第二个参数为机器类型,第三个参数为传递给内核参数的其实地址0x1000000。 */ :定义
---->theKernel = (void (*)(int, int, uint))images->ep;//镜像的入口地址处也就是需要执行的函数入口
.........//初始化传递给内核的标签(tag)
---->printf ("\nStarting kernel ...\n\n");//引导内核之前最后一次打印信息。
---->theKernel (0, machid, bd->bi_boot_params);//跳到内核中执行
下面进入内核的启动 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.