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);//跳到内核中执行

                                             下面进入内核的启动 !!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章