u-boot启动过程代码分析

基于u-boot2017和Rk3288产品板子


第一阶段:和架构相关的初始化
   Start.S (/ arch/arm/cpu/armv7文件夹中)---------- -> bl   _main  (start.S进入_main  入口在 \arch\arm\lib\crt0.S中 )------> board_init_f

        Start.S:保存重要寄存器、关闭中断、、初始化MMU、关看门狗等等  
                   会跳出到其他文件夹执行例如:bowlevel_init()(关两只狗函数)
   _main: (相当重要)     建立C的执行环境,然后跳转至 board_init_f函数
 
================================================================================================
第二阶段: 板级 的初始化
            _main (arch/arm/lib/crt0.S) ----> board_init_f ( 位于\arch\arm\mach-omap2\hwinit-common) -->  init_sequence_f (位于/common/board_f.c 会回调 一系列函数 )
---> (回到_main)  调用 board_init_r ( 位于common\spl\spl.c --> init_sequence_r (位于/common/board_r.c会回调一系列函数) -->  run_main_loop (在 /common/board_r.c中 ) --> main_loop (common\main.c)
 
 
                                                                                                                                                                      

            board_init_f:  
                      
            其中sdram_init()是初始化SDRAM的关键代码,其调用关系如下:
                                    Board_init_f--àhw_data_init()   --àearly_system_init()àsdarm_init()   / /初始化SDRAM
               
 
     borad_init_r:(重要) (位于common\spl\spl.c ):调用init_sequence_r执行内部函数完成:
初始化 NORFLASH, NANDFLASH,  初始化 ONENAND FLASH  初始化环境变量  初始化 PCI  设置 IP 地址  初始化各类外 设 :IIC LCD 、键盘、 USB  初始化控制台  建立 IRQ 中断堆栈   初始化以太网  初始化跳转表(定义了 U-Boot 中基本的常用函数库)
 
                  
遍历laoder,看哪个laoder和设备匹配, 将u-boot.img加载到内存,并进行解析
                 
               当镜像加载到内存时,此时SPL进行判断,加载的镜像时u-boot还是kernel然后便跳转到镜像的入口中进行执行。此时SPL的使命
               便完成了.
 
             通过验证,就board_init_r函数而言,在SPL中链接向SPL.c中的board_init_r函数,
             而在u-boot中,是链接向board_r.c中的board_init_r函数,那么我就从board_init_r函数入手,
             在board_init_r函数实现一个死循环,但是发现还是有信息能够输出,说明在board_init_r还进行了初始化的工作。
             其实在board_init_f中都已经 链接在别的文件中 了,他是 位于board_f.c文 件中
                    
             
          init_sequence_f :                     函数中最关键的是initcall_run_list(init_sequence_f);
          init_sequence_r  :                                                  initcall_run_list( init_sequence_r);
                       
                      这个数组的作用就是一个个的按顺序去调用这个数组里的函数。
    main_loop:    U-boot启动管理函数,关键函数
 
 
 
u-boot工作内容:
                      
 
U-boot存储器映射
                              
整体启动框架
                             
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值