登录/注册

arm的bootloader

更多

在ARM架构中,Bootloader(引导加载程序)是一段在系统上电时首先执行的固件代码,其核心作用是为操作系统启动做好硬件初始化并加载内核。以下是关键要点:

主要功能

  1. 硬件初始化

    • 设置CPU时钟、关闭看门狗定时器
    • 初始化内存控制器(如SDRAM/DDR)
    • 配置必要的外设(如串口调试、GPIO)
    • 建立异常向量表(如复位、中断入口)
  2. 介质访问
    从存储设备(如Flash、eMMC、SD卡)读取内核镜像,支持常见文件系统(FAT、EXT4)或裸数据。

  3. 加载内核

    • 将操作系统内核(如Linux zImage)复制到内存指定位置
    • 传递启动参数(如设备树DTB、ATAGS)
  4. 安全启动(可选)
    验证内核签名(如TrustZone技术)

  5. 启动模式
    支持恢复模式、网络启动(TFTP)等特殊场景


典型启动流程

  1. Stage1(汇编层)

    • CPU复位后从0x00000000执行
    • 用汇编初始化核心寄存器、关闭中断
    • 初始化最小内存环境(如设置栈指针)
      
      _start:
      b reset_handler    ; 跳转到复位处理
      b undef_handler    ; 未定义指令入口
      ...                ; 其他异常向量

    reset_handler: mov r0, #0 mcr p15, 0, r0, c7, c10, 4 ; 数据同步屏障 ldr sp, =0x3000FFFF ; 设置栈地址 bl disable_watchdog ; 关闭看门狗 bl init_clock ; 初始化时钟 bl mem_setup ; 配置内存控制器

  2. Stage2(C语言层)

    • 切换到C环境,执行复杂初始化
    • 加载内核镜像到内存(如从SD卡复制到DDR)
    • 准备启动参数(设备树地址)
      void main() {
      uart_init();              // 初始化串口
      sd_card_init();           // 初始化SD卡
      load_kernel(0x8000);      // 加载内核到内存0x8000
      setup_dtb(0x9000);        // 传递设备树地址
      jump_to_kernel(0x8000);   // 跳转到内核
      }
  3. 启动内核
    通过汇编指令跳转到内核入口:

    jump_to_kernel:
     ldr r0, =0x8000       ; 内核地址
     ldr r1, =0x9000       ; 设备树地址
     mov pc, r0            ; 跳转执行

开源Bootloader示例

  1. U-Boot
    最广泛使用的ARM Bootloader,支持数百种开发板,提供命令行接口、网络引导等功能。

    # 典型U-Boot命令
    => tftp 0x8000 zImage    # 通过TFTP下载内核
    => bootm 0x8000          # 启动内核
  2. ARM Trusted Firmware (ATF)
    用于Cortex-A系列的安全启动框架,提供EL3底层支持。

  3. 专用Bootloader
    如树莓派的bootcode.bin,STM32的HAL Bootloader等。


开发要点

注意:具体实现因芯片型号(Cortex-A/M)和开发板而异。实际开发需参考芯片手册(如TRM)和板级支持包(BSP)。调试初期可通过串口输出日志(如printascii函数)跟踪执行流程。

如何才能将Bootloader和Application关联起来

接下来,我们要利用该Bootloader调试目标Application Project,如何才能将Bootloader和Application关联起来呢?就需要借助刚才提到的

2024-06-12 14:32:53

图解基于UDS的Flash BootLoader

这张图和恒润教程中的BootLoader流程大体是一致的。

2023-08-14 10:49:08

ARM处理器如何编写Bootloader

前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。

2023-07-26 09:10:47

用于汽车电控单元CAN Bootloader的设计与实现

  传统汽车电控单元对程序的烧写一般采用 BDM 调试接口实现,该方法不仅影响电控单元应用程序的开发效率,而且会给汽车电控单元后期的升级维护带来不便。使用嵌入式启动引导程序(即 Bootloader

资料下载 叶酤珵 2022-04-02 17:21:27

UDSonCAN的BootLoader上位机开发教程

目前,汽车 ECU 的数量越来越多,软件迭代速度越来越快,为解决汽车 ECU 软件在线更新的问题,遵循标准的BootLoader规范流程,开发了一款支持多种硬件设备,适用于多种ECU

资料下载 叶酤珵 2022-04-02 17:20:37

MCU Bootloader总结

Bootloader本文只探讨MCU(单片机)下的Bootloader,对ARM系列暂不做探讨。(1)

资料下载 安立路 2021-11-05 15:51:03

BootLoader与Linux内核的参数传递详细资料说明

不同的体系结构,如 ARM, Powerpc,X86,MIPS等。本文着重介绍 Bootloader与内核之间参数传递这一基本功能。本文的硬件平台是基于AT91RM9200处理器系统,软件平台是 Linux-2.6.

资料下载 佚名 2021-03-16 10:39:00

使用ARM实现uClinux移植的方案详细说明

本文针对基于ARM的uClinux 0S的特点,详细介绍了BootLoader,0S启动以及串口设置几个关键步骤进行了分析与设计。

资料下载 佚名 2019-11-01 16:15:00

一文了解bootloader

大多数Bootloader 包含两种操作模式。

2023-06-25 10:05:54

介绍ARM的cortex-M4以及A7内核的bootloader启动流程

本文简要介绍了ARM的cortex-M4以及A7内核的bootloader启动流程,大同小异。

2022-01-25 07:05:22

bootloader怎么根据自己的需求去设计流程

Bootloader本文只探讨MCU(单片机)下的Bootloader,对ARM系列暂不做探讨。(1)

2021-11-10 06:26:01

什么是Bootloader 浅谈STM32中bootloader的内存分配

1. 什么是Bootloader Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统

2021-02-15 06:10:00

如何编写ARM处理器的Bootloader

作者 | strongerHuang 微信公众号 | strongerHuang 之前从应用的角度给大家分享过Bootloader相关的文章,今天从底层原理来给大家描述ARM处理器如何编写

2020-10-27 11:02:36

STM32系统bootloader的应用有哪些

嵌入式开发中,经常需要bootloader进行程序固件升级和系统维护,所以bootloader是必不可少的功能。STM32系统自带的系统bootloader

2020-10-22 12:19:45

烧写bootloaderarm,需要下载器吗

假如是烧写bootloader到arm,是否需要下载器?

2020-07-16 08:10:26
7天热门专题 换一换
相关标签