uboot的启动流程

15 篇文章 0 订阅
12 篇文章 0 订阅

uboot的启动流程:通用的uboot
ctags -R  在当前目录下生成tags的索引文件
ctrl +] 跳转
ctrl + o  后退


启动代码:arch/arm/cpu/armv7/start.o (.text*) 

第一个阶段:
 构建异常向量表
    ||
\/
b  reset
设置cpu的工作模式
关闭中断

||
\/
 bl  cpu_init_cp15  
 关闭cache  TLB 等于MMU相关
 关闭MMU
 ||
 \/
bl  cpu_init_crit
   ||
   \/
    b   lowlevel_init 
    判断uboot的状态,是否是被唤醒?
判断是否已经在内存中运行?
 如果不是--->初始化时钟、内存
  如果是 -》beq 1f
      ||
     \/
  bl uart_asm_init    初始化串口
        ||
        \/
    bl  _main  
初始化C语言运行环境、栈
         ||
         \/
     bl  board_init_f    C语言函数
 初始化一些全局变量
 gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);  0x40000100 uboot传递参数的地址
 
   遍历init_sequence数组,执行初始化函数。  
       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();
         }
       }  
 
   对高端内存空间的分配
   
   ||
   \/
   对相关寄存器的赋值,决定uboot要搬移的位置和大小。
   ||
   \/
   b   relocate_code  uboot的搬移
  
     搬移代码:   
 copy_loop:                                                                                                    
     ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */                                         
     stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */                                         
     cmp r0, r2          /* until source end address [r2]    */                                                 
     blo copy_loop 
 
 还要进行符号重定位。
  ||
  \/
  清空bss段
  
 143     ldr r0, =__bss_start    /* this is auto-relocated! */
     ldr r1, =__bss_end__    /* this is auto-relocated! */ 
     mov r2, #0x00000000 
  copy_loop:                                                                                                     
      ldmia   r0!, {r9-r10}       /* copy from source address [r0]    */                                         
      stmia   r1!, {r9-r10}       /* copy to   target address [r1]    */                                         
      cmp r0, r2          /* until source end address [r2]    */                                                 
      blo copy_loop 
  
  ||
  \/
  第二阶段:进入C语言代码
 ldr pc, =board_init_r 

           for (;;) {
             main_loop();
           }    
    uboot任务结束。


Linux  内核:
内核、操作系统

特点:
可以移植,支持的硬件平台广泛
高可扩展性
高可靠性、稳定性
模块化设计:高内聚、低耦合
遵循GPL开源许可协议的,开放系统。

Linux内核版本:
www.kernel.org
次版本号为偶数都是稳定版。

版本选择:
1、支持对应平台
2、比较成熟。

进程管理
内存管理
文件系统
网络协议
设备管理

linux内核源码的目录结构:
平台相关:arch

平台无关:block  crypto(加密算法)  driver  fs  ipc

文档:Documentation

内核配置、编译:

配置:
1、导入默认配置
    两种方法:
1)cp  arch/arm/configs/xxxx_config   .config
2) make  xxx_defconfig

2、编译
   make  uImage  生成内核镜像
   make  modules  生成模块
   make  dtbs   生成设备树文件
   make   clean      

添加自己的配置:就是操作 .config  文件
make  xconfig 需要QT库
make config  
make menuconfig  我们需要的, 


使用:
[] 有两个选项,Y: 选择,  N:不选择      使用空格切换。
< > 有三个选项,Y: 选择,  N:不选择 , M: 编译成模块
/ :搜索

添加菜单:修改Kconfig
menu xxx
  要添加的菜单:
     config FS4412_LED ---》和Makefile关联的名字
      tristate "FS4412_LED Deivce  Support"   菜单的名字
      depends on ARCH_EXYNOS4   
      help  support led device on board 
  
endmenu

tristate: 添加的菜单有三个选项,即 < >
bool : 添加的菜单有两个选项,即 []

depends on: 就是该菜单的显示需要依赖于某一个菜单。
default :设置默认状态 y, n, m
help: 帮助文档,可有可无
source : 需要引用其他菜单。
详情参考: Documentation/kbuild/kconfig-language.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_27205523

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值