uboot启动流程介绍

个人理解

uboot是一个引导程序,负责对开发板的一些硬件初始化设置,然后加载内核运行操作系统

需要操作硬件就要有有硬件的驱动程序,设备树之类的,一般都是一些常用的驱动程序比如有处理器、存储控制器、网络接口、串口、显示控制器之类

1.首先u-boot上电后执行的第一个文件为arch/arm/cpu/armv7/start.S文件,start.S文件准备好第二阶段的运行环境。
2.上面start.S执行完毕最终会调用到arch/arm/lib/board.c中的board_init_r函数,函数对会对flash、net、串口等进行初始化,最终会进入死循环,如下:
for (; ; )
{
main_loop (); //进入等待命令解析状态,直到启动内核后,u-boot就退出了。
}

stage1: (入口代码start.s 代码结构)

uboot的stage1代码通常放在start.文件中,用汇编语言写成,其主要完成一些依赖cpu体系结构的初始化

其主要代码部分如下

1、硬件设备初始化

设置状态寄存器cpsr,使得cpu进入svc特权模式,并且禁止FIQ和IRQ,

   关闭看门狗、中断、mmu

2、为加载Bootloader的第二阶段代码准备RAM空间

也就是初始化ram存储器

5、将u-boot的stage2拷贝到RAM中

6、设置好栈、清除bss段

栈是运行c语言必须的条件,因此在进入c语言之前必须要通过汇编进行栈的初始化

将bss段中存放的未初始化全局变量、静态变量变零

7、接到stage2的入口点(board_init_r标号,跳转到C语言函数)

在第一阶段进行的硬件初始化一般包括:关闭WATCHDOG、关中断、设置CPU的速度和时钟频率、RAM初始化等。这些并不都是必需的,比如S3C2410/S3C2440的开发板所使用的U-Boot中,就将CPU的速度和时钟频率的设置放在第二阶段

stage2(c语言代码部分)

board_init_f()

位于arch/<architecture>/lib/board.c

1、初始化本阶段的硬件设备(最重要的是系统时钟、初始化串口)

2、检测系统内存映射

3、将kernel和文件系统映射从flash‘读取到RAM中

4、为内核设置启动参数

5、退出

C语言代码部分 arch/arm/lib/board.c中的board_init_f是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot的主函数,该函数只要完成如下操作

1)调用一系列的初始化函数。
2)初始化Flash设备。
3)初始化系统内存分配函数。
4)如果目标系统拥有NAND设备,则初始化NAND(闪存)设备。
5)如果目标系统有显示设备,则初始化该类设备。
6)初始化相关网络设备,填写IP、MAC地址等。
7)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值