1. MIPS架构U-Boot启动流程深度解析
在嵌入式系统开发中,U-Boot作为最常用的Bootloader之一,其启动流程对系统开发者至关重要。本文将基于MIPS架构,详细分析U-Boot从CPU上电到内核启动的全过程,特别针对Realtek RTL8197F-VG芯片的实现进行解读。
1.1 硬件平台与启动特性
RTL8197F-VG是一款集成MIPS 24Kc内核的SoC,主要应用于网络设备。其启动流程具有以下特点:
- 支持从SPI Flash和NAND Flash启动
- 采用两阶段启动设计(汇编阶段 + C语言阶段)
- 内置SRAM作为初始运行环境
- 支持DDR2/DDR3内存控制器自动配置
启动地址空间映射如下:
code复制物理地址 虚拟地址 用途
0x1FD00000 -> 0xBFD00000 ROM (非缓存)
0x1FE00000 -> 0xBFE00000 SRAM (非缓存)
0x1FD00000 -> 0x9FD00000 ROM (缓存)
0x1FE00000 -> 0x9FE00000 SRAM (缓存)
1.2 启动流程概览
完整启动流程可分为以下几个关键阶段:
- 上电复位:CPU从固定地址(0xBFC00000)开始执行
- 汇编阶段:start.S完成最基础的硬件初始化
- C语言阶段:start_c.c完成DRAM等外设初始化
- 镜像加载:将U-Boot从Flash拷贝到DRAM
- 内核启动:跳转到Linux内核入口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第一阶段:汇编启动代码分析
2.1 启动头文件解析
start.h定义了启动阶段的关键参数和宏:
c复制/* 启动地址配置 */
#ifdef CONFIG_NONO_COMPRESS
#define BOOT_ADDR 0xA0000000 // 非压缩镜像地址
#else
#define BOOT_ADDR 0x80100000 // 压缩镜像地址
#endif
/* 条件判断宏 */
#define IF_EQ(a,b,lab) or t6,zero,a;\
or t7,zero,b;\
beq t6,t7,lab;\
nop;
/* 内存测试模式 */
#define PATT0 0x5a0000a5
#define PATT1 0xA5A55A5A
#define PATT2 0x005AA500
/* 时钟管理寄存器 */
#define CLK_MANAGER 0xb8000010
#define DCR 0xb8001004
这些定义反映了几个关键设计选择:
- 支持压缩和非压缩两种镜像加载方式
- 使用特定模式字进行内存测试
- 通过硬件strap引脚配置DRAM类型
2.2 启动汇编代码(start.S)
2.2.1 基础初始化
mips复制__start:
j reset // 复位跳转
nop
nop
rese
