免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2738 | 回复: 3

[BootLoader] 熟悉u-boot的启动流程 [复制链接]

论坛徽章:
0
发表于 2016-03-28 17:18 |显示全部楼层
u-boot的作用有两种:
1、初始化硬件  2、加载启动操作系统

u-boot执行流程(.c .S)分为两个阶段,内容如下:

第一阶段启动流程:
     1)设置为svc模式,禁止中断
     2)cpu_init_crit
            设置一级缓存,二级缓存
            禁止MMU
            设置电路       
     3)lowlevel_init
           1.关看门狗
           2.系统时钟初始化
           3.外接内存初始化
           4.uart初始化
           5.nand初始化

     4)判断当前运行地址是否为链接时指定的地址
          如果不相等则执行copy_from_nand
          完成代码由nand到外接的ram拷贝工作

代码框架如下:
copy_from_nand
            copy_uboot_to_ram
                nandll_read_blocks(CFG_PHY_UBOOT_BASE, COPY_BL2_SIZE);
                                     0x23e00000,      512k
                     nandll_read_page(buf, i + skipped_page)
                         nand_readpage
总结: 实现将nand 0 地址开始的512K内容搬移到外接RAM 0x23e00000

     5)使能MMU
         

     6)清空BSS功能
     7)跳转到start_armboot去执行
          ldr     pc, _start_armboot
            _start_armboot:
          .word start_armboot
   

第二阶段启动流程       
     1)该阶段的硬件初始化工作
     2)初始化环境变量
     3)倒数计时
          执行bootcmd中指定的命令
     4)进入for(:
         readline(CFG_PROMPT)
         run_command(cmd)
        {
            解析输入的字符串“;”
            匹配单条命令
            run_cmd()
        }

源码追踪如下:

入口函数
lib_arm/board.c

start_armboot(){
    1)相关硬件的初始化工作
     cpu_init();

     board_init()
    {
      gd->bd->bi_arch_number = MACH_TYPE;
      gd->bd->bi_boot_params = (PHYS_SDRAM_1+0x100);
     }
    ......
     for (; {    board.c  793行
        main_loop ();
     }

    void main_loop (void)
    {
    s = getenv ("bootdelay";   main.c 550行
    s = getenv ("bootcmd";    main.c 574行
     }
   
    if (bootdelay >= 0 && s && !abortboot (bootdelay))   main.c 582行  读秒没有被打断,则执行内核程序,否则跳到646行
    {
       "nand read.jffs2 0xc0008000 kernel;bootm 0xc0008000"   
        run_command (s, 0);                      582行
    }

    for (;    main.c  646行
    {
              len = readline (CFG_PROMPT);    main.c 655行
  
              int readline (const char *const prompt)    main.c 1141行
              {
                    return readline_into_buffer(prompt, console_buffer);
               }   
             
              strcpy (lastcommand, console_buffer);   main.c 659行
             run_command (lastcommand, flag);     main.c 680行
    }

    int run_command (const char *cmd, int flag)    main.c  1486行
   {
               /* Look up command in command table */   main.c 1566行
                if ((cmdtp = find_cmd(argv[0])) == NULL) {
                        printf ("Unknown command '%s' - try 'help'\n", argv[0]);
                        rc = -1;        /* give up after bad command */
                        continue;
                }                   

                  /* OK - call function to do the command */     main.c 1596行
                if ((cmdtp->cmd) (cmdtp, flag, argc, argv) != 0) {
                        rc = -1;
                }
     }
}

论坛徽章:
0
发表于 2016-03-28 17:25 |显示全部楼层
dianzan !~!!!!!

论坛徽章:
0
发表于 2016-04-07 10:32 |显示全部楼层
请问我想移植uboot到我的板子,看了很多教程,也不知道具体该怎么做,能请教下么?

论坛徽章:
0
发表于 2016-04-08 14:33 |显示全部楼层
写的不错!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP