U-boot启动分析

U-boot简介

  U-boot是一种Bootloader,Bootloader代码是嵌入式系统复位后进入操作系统前执行的一段代码。通过Bootloader的代码初始化处理器的各寄存器以及其他外部设备,建立存储器映射图以及初始化堆栈,为操作系统提供基本的运行环境。

U-boot工程结构分析

  U-boot源代码树结构如下表所示:

子目录名作用
board开发板相关的定义和结构
common包含U-boot用到的各种处理函数
cpu各种不同类型的处理器相关代码
docU-boot文档
drivers常用外部设备驱动程序
examples存放U-boot开发代码样例
fs文件系统有关的代码
includeU-boot用到的头文件
lib_armARM体系结构有关的数据定义和操作
lib_genericU-boot通用的操作函数
net常用的网络协议,包括bootp、rarp、arp、tftp
post上电自检相关代码
rtc实时时钟有关操作
toolsU-boot有关的数据代码

  这里仅列出了主要的目录;部分子目录详解如下:
1)board目录存放与开发板有关的文件,该目录包括每个子目录至少提供Makefile和u-boot.lds两个文件,用来设置文件编译的方式以及开发板的硬件资源。
2)common目录是与体系结构无关的文件,包括实现各种命令的c语言源代码文件。
3)cpu目录存放与CPU相关的文件,在每个特定的子目录下都包括cpu.c、interrupt.c、start.S这三个文件,这三个文件是CPU初始化以及配置中断的代码。
4)tools目录存放U-boot编译过程中用到的一些工具代码。

U-boot总体工作流程

  与大多数Bootloader类似,U-boot的启动分成stage1和stage2两个阶段。stage1使用汇编语言编写,通常与CPU体系紧密相关,如处理器初始化和设备初始化代码等,该阶段在start.S文件中实现。使用汇编语言编写占用空间小而且执行速度快。stage1负责建立stage1阶段使用的堆栈和代码段,然后复制stage2阶段的代码到内存。stage2阶段一般包括初始化Flash器件、检测系统内存映射、初始化网络设备、进入命令循环、接受用户从串口发送的命令然后进行相应的处理。stage2使用c语言编写,用于加载操作系统内核,该阶段主要是board.c中的start_armboot()函数实现。U-boot中stage1工作流程如下图:

U-boot中stage1工作流程

U-boot启动流程分析

如图为U-boot在ARM处理器的启动步骤:

在这里插入图片描述
  U-boot的启动代码分布在start.S、low_level_init.S、board.c和main.c文件中。其中start.S是U-boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;low_level_init.S是特定开发板的设置代码;board.c包含开发板底层设备驱动;main.c是一个与平台无关的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
U-boot是一个开放源代码的引导加载程序,它是嵌入式Linux系统中非常重要的一部分。它主要负责完成硬件初始化、文件系统加载、内核启动、DTB传递等工作。下面是U-boot启动过程的详细分析: 1. 通电启动 当开关通电时,处理器会执行引导ROM中的启动代码。 2. 初始化寄存器 在进入U-boot之前,系统所有的寄存器都是未初始化的。U-boot要负责初始化CPU的所有寄存器,以确保所有设备都能正常工作。 3. 读取U-boot U-boot位于NOR或NAND闪存器中。为了读取U-boot,首先必须确定闪存器的类型和接口。当读取闪存器中的第一个块(一般是U-boot头)时,U-boot校验它的合法性,包括校验和、magic number、版本号等。如果校验失败U-boot将停止执行。 4. 解压缩U-boot 如果U-boot被压缩了,那么需要用解压缩算法对其进行解压缩。在这个过程中,需要注意解压缩的起始地址和大小。 5. 设置环境变量 U-boot提供了一些环境变量,可以用来配置系统参数,例如:IP地址、MAC地址等。在这一步骤中,U-boot会将环境变量加载到DRAM中进行管理。同时,也可以通过TFTP、NFS等方式从外部存储设备中加载环境变量。 6. 初始化硬件 在U-boot启动过程中,需要对各种设备进行初始化。这些设备包括:串口、网络接口、SD卡、USB设备、SPI设备等。初始化完成后,U-boot才能正常使用这些设备。 7. 加载内核 U-boot负责加载内核到指定的内存地址。这个过程可以通过很多方式来完成:串口、SD卡、网络等。在加载内核之前,U-boot还会加载设备树文件(DTB)。 8. 启动内核 U-boot会将内核启动参数(包括设备树的地址)传递给内核,并通过软件跳转实现内核启动。此时,U-boot的使命就完成了,内核将接管系统的控制权。 总之,U-boot启动过程非常复杂,但是也非常重要。因为U-boot提供了系统启动所需的所有基础设施,从而保证了Linux系统的正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值