Bootloader概述和Uboot

Bootloader 基本概念

什么是Bootloader?

  • Bootloader是硬件启动的引导程序,是运行操作系统的前提;
  • 在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
  • 在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。

Bootloader的特点

  • Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
  • 在移植系统时,首先为开发板移植Bootloader。
  • Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

Bootloader的操作模式

  • 自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
  • 交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。

常用bootloader介绍

U-boot介绍

  • u-boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。遵循GPL条款。
  • 从FADSROM、8xxROM 、PPCBOOT、Armboot逐步发展演化而来;
  • 当前版本号:参考Makefile。
  • http://www.denx.de/wiki/U-Boot/WebHome

U-boot的特点:

 1. 代码结构清晰、易于移植(见目录结构)
 2. 支持多种处理器体系结构(见arch目录)
 3. 支持众多开发板(目前官方包中有200多种,见board目录)
 4. 命令丰富、有监控功能
 5. 支持网络协议、USB、SD等多种协议和设备
 6. 支持文件系统
 7. 更新较活跃,使用者多,有助于解决问题

U-BOOT 命令

命令分类

环境设置、数据传输、存储器访问、加载运行

  • printenv 显示所有环境变量
  • setenv 设置新的环境变量
  • saveenv 将当前定义的所有的环境变量值存入flash中
  • tftp 通过网络下载程序
  • protect 对Nor Flash写保护
  • erase 擦除Nor FLASH
  • emmc相关命令
    mmc read
    mmc write
    mmc dev
    mmc erase
  • bootcmd 自启动命令
  • go addr 执行内存中的二进制代码,简单的跳转到指定地址
  • bootm kernel-addr ramdisk-addr dtb-addr

U-BOOT 配置编译

U-Boot目录结构


编译U-boot

整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。

顶层目录下的 Makefile

  • 它负责u-boot整体配置和编译
  • 在Makefile中指定使用的交叉工具链
  • 配置u-boot: make origen_config
  • 编译: make

U-boot镜像下载烧录

  • 烧录编译产生的镜像 u-boot.bin
  • 初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
  • 专用的烧录工具如h-jtag或DNW等
  • 在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录
  • 其它方式 如SD卡 , Fastboot命令
  • 镜像固化位置
    ROM、NOR FLASH、NAND FLASH EMMC等

U-BOOT 启动流程

相关推荐
烬奇小云1 天前
使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行,并实现多个钩子(hook)来监控代码执行、系统调用和内存读写操作(二)
java·arm开发·python
CYRUS STUDIO1 天前
Android 下内联汇编,Android Studio 汇编开发
android·汇编·arm开发·android studio·arm
艾格北峰2 天前
STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55
arm开发·stm32·单片机·嵌入式硬件
橘色的喵3 天前
嵌入式ARM平台Linux网络实时性能优化
linux·网络·arm开发·性能优化·实时·内核优化
荣世蓥4 天前
2.ARM_ARM是什么
arm开发
憧憬一下4 天前
Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
arm开发·嵌入式硬件·嵌入式·c/c++·linux驱动开发
亿道电子4 天前
【ARM】MDK-E203 Undefined identifier
arm开发·stm32·单片机·arm
ShuQiHere4 天前
【ShuQiHere】️计算机架构:x86 与 ARM 指令集架构的对比与发展
arm开发·架构
CYRUS STUDIO4 天前
Android下的系统调用 (syscall),内联汇编syscall
android·linux·汇编·arm开发·arm·内联汇编
橘色的喵5 天前
C++编程:嵌入式Linux-ARM与外设中断交互的程序设计
linux·arm开发·select·interrupt·中断·低延迟·设备交互