type
date
slug
category
icon
password
关于本项目 — [野火]嵌入式Linux镜像构建与部署——基于LubanCat-i.MX6ULL开发板 文档
关于本项目 — [野火]嵌入式Linux镜像构建与部署——基于LubanCat-i.MX6ULL开发板 文档
EBF6ULL Pro/Mini开发板是野火电子基于NXP i.MX 6ULL系列处理器设计的一款低功耗单板电脑, 工业级主频最高可达 792MHz, 提供完整的SDK驱动开发包、核心板封装库,底板应用参考设计原理图, 可帮助客户大大缩减产品的开发时间,加快产品上市。 配套的系统支持Debian、Ubuntu系统,支持python、Qt等组件。
u-boot完全分析与移植_哔哩哔哩_bilibili
u-boot完全分析与移植_哔哩哔哩_bilibili
u-boot完全分析与移植共计33条视频,包括:000_百问网所有课程_链接与学习路线、01_什么人什么时候学习u-boot_教程介绍、02.1_U-boot的功能等,UP主更多精彩视频,请关注UP账号。
基于百问网的IMX6ULL或STM32MP157开发板,完全分析u-boot,并且移植一个新版本的u-boot
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选择依据:
- 硬件要求: ARM异常向量必须32字节对齐
- 性能考虑: 位于DDR中,访问速度快
- 安全隔离: 远离内核和用户数据
- 调试便利: 固定地址便于开发调试
- 兼容性: 符合ARM AAPCS调用约定
4.4 布局优势
- 启动效率: OCRAM→DDR平滑过渡
- 内存保护: 各组件间充足间隔,防止覆盖
- 扩展性: 为内核和应用预留充足空间
- 调试友好: 固定地址便于问题定位
- 安全性: 关键代码位于高地址,不易被意外修改
这种布局设计充分考虑了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 启动流程中的使用
- BootROM启动: 使用栈空间执行初始化
- 参数解析: 读取启动配置参数
- 硬件初始化: 缓存硬件状态
- 设备检测: 存储启动设备信息
- 镜像加载: 使用缓冲区加载下一级程序
4.2 数据传递
- 给SPL传递: 通过全局数据区传递启动信息
- 给U-Boot传递: 部分关键参数保持到U-Boot阶段
- 调试信息: 错误码和状态信息供调试使用
这种详细的内存布局设计确保了BootROM能够高效、安全地完成系统初始化任务。
配置验证
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/uboot_startup_source_code_analysis
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!