Lazy loaded image
🥳嵌入式Linux开发
Uboot启动过程分析
Words 3534Read Time 9 min
2025-9-10
2025-9-10
type
date
slug
category
icon
password
  1. 关于本项目 — [野火]嵌入式Linux镜像构建与部署——基于LubanCat-i.MX6ULL开发板 文档
  1. u-boot完全分析与移植_哔哩哔哩_bilibili
    1. 基于百问网的IMX6ULL或STM32MP157开发板,完全分析u-boot,并且移植一个新版本的u-boot
       
Uboot 启动第一阶段
Uboot 启动第二阶段
Uboot 加载内核阶段

IMX6ULL 完整内存映射布局表

The memory system consists of these components:
  • Level 1 cache—32 KB instruction, 32 KB data cache
  • Level 2 cache—unified instruction and data (128 KB)
  • On-Chip Memory:
    • Boot ROM, including High-Assurance Boot (HAB, 96 KB)
    • Internal fast access RAM (OCRAM, 128 KB)
  • External memory interfaces:
    • 16-bit LP-DDR2, 16-bit DDR3-400, and LV-DDR3-400
    • 8-bit NAND-flash, including support for Raw MLC/TLC, 2 KB ,4 KB, and 8 KB page size, BA-NAND, PBA-NAND, LBA-NAND, OneNAND™, and others
    • BCH ECC up to 40 bits
    • 16-bit NOR flash
    • 16-bit PSRAM, Cellular RAM
    • Dual-channel/single-channel QuadSPI flash

1. 内部存储器映射

起始地址
结束地址
容量
内容
说明
0x00000000
0x00017FFF
96KB
BootROM Code
CPU上电后执行的固化代码
0x00900000
0x0091FFFF
128KB
OCRAM (On-Chip RAM)
内部高速缓存,启动时使用

OCRAM 详细布局 (启动阶段)

起始地址
结束地址
容量
内容
用途
0x00900000
0x00903FFF
16KB
SPL Code
Secondary Program Loader
0x00904000
0x00907FFF
16KB
SPL Stack
SPL运行时栈空间
0x00908000
0x0091BFFF
80KB
SPL Heap/BSS
SPL数据段和堆空间
0x0091C000
0x0091FFFF
16KB
BootROM数据
ROM代码工作区域

2. 外部DDR3内存映射 (512MB)

起始地址
结束地址
容量
内容
说明
0x80000000
0x8007FFFF
512KB
保留区域
系统保留,避免冲突
0x80080000
0x8077FFFF
~119MB
Linux Kernel Image
内核镜像加载区域
0x80800000
0x8087FFFF
512KB
Kernel解压缓冲区
内核解压临时空间
0x83000000
0x8307FFFF
512KB
Device Tree Blob
设备树二进制文件
0x84000000
0x85FFFFFF
32MB
Initial Ramdisk
初始化RAM磁盘
0x87800000
0x87FFFFFF
8MB
U-Boot运行区域
详见下表
0x88000000
0x9FFFFFFF
384MB
Linux运行时内存
内核运行时动态分配

3. U-Boot详细内存布局 (0x87800000-0x87FFFFFF)

起始地址
结束地址
容量
内容
详细说明
0x87800000
0x8780001F
32B
异常向量表
ARM异常向量表(8个向量×4字节)
0x87800020
0x878003FF
992B
异常处理代码
各种异常的处理函数
0x87800400
0x8785FFFF
~384KB
U-Boot主代码段(.text)
主要功能代码
0x87860000
0x8787FFFF
128KB
只读数据段(.rodata)
常量、字符串等
0x87880000
0x878BFFFF
256KB
数据段(.data)
已初始化全局变量
0x878C0000
0x878FFFFF
256KB
BSS段(.bss)
未初始化全局变量
0x87900000
0x879FFFFF
1MB
堆空间(Heap)
动态内存分配
0x87A00000
0x87BFFFFF
2MB
栈空间(Stack)
函数调用栈
0x87C00000
0x87DFFFFF
2MB
环境变量区
U-Boot环境变量存储
0x87E00000
0x87EFFFFF
1MB
设备树临时区
设备树修改缓冲区
0x87F00000
0x87FFFFFF
1MB
命令缓冲区
命令行解析和缓存

4. 布局设计原因分析

4.1 起始地址选择原因

BootROM (0x00000000)
  • 原因: 硬件固定,CPU复位后PC指向0x00000000
  • 特点: 不可修改,厂商固化代码
OCRAM (0x00900000)
  • 原因: 内部高速RAM,无需DDR初始化即可使用
  • 用途: 启动早期阶段,DDR未初始化前的代码执行
Kernel Image (0x80080000)
  • 原因:
    • 避开DDR起始地址,防止被覆盖
    • 512KB偏移给系统保留空间
    • 方便内核重定位和解压
U-Boot (0x87800000)
  • 原因:
    • 位于DDR高地址区域,避免与内核冲突
    • 120MB偏移确保足够的内核空间
    • 8MB空间满足U-Boot所有功能需求

4.2 组件间距离设计

4.3 异常向量表地址原因

0x87800020选择依据:
  1. 硬件要求: ARM异常向量必须32字节对齐
  1. 性能考虑: 位于DDR中,访问速度快
  1. 安全隔离: 远离内核和用户数据
  1. 调试便利: 固定地址便于开发调试
  1. 兼容性: 符合ARM AAPCS调用约定

4.4 布局优势

  1. 启动效率: OCRAM→DDR平滑过渡
  1. 内存保护: 各组件间充足间隔,防止覆盖
  1. 扩展性: 为内核和应用预留充足空间
  1. 调试友好: 固定地址便于问题定位
  1. 安全性: 关键代码位于高地址,不易被意外修改
这种布局设计充分考虑了IMX6ULL的硬件特性、启动流程需求和系统稳定性要求。
 
 

IMX6ULL BootROM数据区域详细布局 (0x0091C000-0x0091FFFF)

1. BootROM数据区域总体划分 (16KB)

起始地址
结束地址
容量
内容
详细说明
0x0091C000
0x0091C3FF
1KB
系统初始栈
BootROM运行时栈空间
0x0091C400
0x0091C7FF
1KB
全局数据区
BootROM全局变量和状态
0x0091C800
0x0091CBFF
1KB
启动参数区
启动配置和选择参数
0x0091CC00
0x0091CFFF
1KB
硬件配置缓存
硬件初始化状态缓存
0x0091D000
0x0091D3FF
1KB
启动设备信息
启动设备相关数据
0x0091D400
0x0091D7FF
1KB
时钟配置数据
PLL和时钟设置
0x0091D800
0x0091DFFF
2KB
临时缓冲区
数据读取和处理缓冲
0x0091E000
0x0091E7FF
2KB
安全启动数据
HAB相关安全验证数据
0x0091E800
0x0091EFFF
2KB
调试和诊断
错误码、日志信息
0x0091F000
0x0091F7FF
2KB
启动镜像头
解析的启动镜像信息
0x0091F800
0x0091FFFF
2KB
ROM API数据
ROM API函数工作区域
 
0x0091fb00 = 0x0091fa00 + 0x100(GD_SIZE)
 
 

2. 各区域详细结构

2.1 系统初始栈 (0x0091C000-0x0091C3FF, 1KB)

2.2 全局数据区 (0x0091C400-0x0091C7FF, 1KB)

偏移
地址
大小
内容
说明
+0x00
0x0091C400
4B
boot_mode
启动模式标识
+0x04
0x0091C404
4B
boot_device
启动设备ID
+0x08
0x0091C408
4B
boot_instance
启动设备实例号
+0x0C
0x0091C40C
4B
boot_cfg
启动配置字
+0x10
0x0091C410
16B
cpu_id
CPU标识信息
+0x20
0x0091C420
4B
silicon_rev
芯片版本号
+0x24
0x0091C424
4B
rom_version
ROM版本信息
+0x28
0x0091C428
8B
boot_start_time
启动时间戳
+0x30
0x0091C430
64B
otp_config
OTP熔丝配置
+0x70
0x0091C470
144B
预留区域
未来扩展使用

2.3 启动参数区 (0x0091C800-0x0091CBFF, 1KB)

2.4 硬件配置缓存 (0x0091CC00-0x0091CFFF, 1KB)

地址
内容
说明
0x0091CC00-0x0091CC3F
DDR配置
DDR初始化参数缓存
0x0091CC40-0x0091CC7F
时钟树状态
各时钟域配置状态
0x0091CC80-0x0091CCBF
电源管理
PMIC和电源域状态
0x0091CCC0-0x0091CCFF
IO复用配置
管脚复用设置
0x0091CD00-0x0091CD3F
中断控制器
GIC初始化状态
0x0091CD40-0x0091CFFF
其他硬件状态
外设初始化状态

2.5 启动设备信息 (0x0091D000-0x0091D3FF, 1KB)

2.6 时钟配置数据 (0x0091D400-0x0091D7FF, 1KB)

偏移
内容
说明
+0x000
ARM PLL配置
CPU主频设置
+0x040
系统PLL配置
系统时钟PLL
+0x080
USB PLL配置
USB时钟PLL
+0x0C0
音频PLL配置
音频相关时钟
+0x100
视频PLL配置
显示相关时钟
+0x140
时钟分频器
各模块时钟分频
+0x180
时钟门控
时钟使能控制
+0x1C0
时钟选择器
时钟源选择

3. 关键地址定义

4. 使用场景和访问模式

4.1 启动流程中的使用

  1. BootROM启动: 使用栈空间执行初始化
  1. 参数解析: 读取启动配置参数
  1. 硬件初始化: 缓存硬件状态
  1. 设备检测: 存储启动设备信息
  1. 镜像加载: 使用缓冲区加载下一级程序

4.2 数据传递

  • 给SPL传递: 通过全局数据区传递启动信息
  • 给U-Boot传递: 部分关键参数保持到U-Boot阶段
  • 调试信息: 错误码和状态信息供调试使用
这种详细的内存布局设计确保了BootROM能够高效、安全地完成系统初始化任务。
 
 
配置验证
 
上一篇
Vim 编辑器使用指南
下一篇
Buildroot根文件系统的构建

Comments
Loading...