大家好我们是触觉智能。很多粉丝朋友和客户在调RK板子时看不懂board init f/r本文把U-Boot两阶段初始化拆开:先内存规划后设备初始化重定位地址从DRAM顶端逐层向下算希望对大家有帮助。前言问题场景U‑Boot Proper的初始化分为两个阶段——board_init_f在低地址执行的早期初始化和board_init_r重定位后在高地址执行的后期初始化。这两个阶段被重定位分隔职责完全不同。本文通过完整时序图和每个initcall的解析深入展示两个阶段的工作细节。U‑Boot从低地址启动到最终停在命令行中间经历了一个复杂的两阶段初始化过程。看到board_init_f和board_init_r这两个函数名常常不清楚它们各自做了什么、为什么需要拆成两个阶段、以及重定位在中间扮演了什么角色。更关键的是RK3576的重定位地址是如何通initcall序列从DRAM顶端逐步向下挖计算出来的本文基于触觉智能Purple Pi OH2RK3576开发板演示逐函数拆解initcall序列用完整时序图还原从 DRAM 顶端“向下挖”的内存分配过程直至U-Boot重定位完成、进入命令行。两阶段总览board_init_f阶段详解board_init_f的核心是一个initcall序列定义在common/board_f.c。每个函数按顺序执行主要是预留内存空间和计算重定位地址。init_sequence_f 关键函数说明函数职责执行后setup_fdt检查/准备设备树设置gd-fdt_blobsetup_dest_addr计算DRAM大小确定末端地址设置gd-ram_size, gd-relocaddr初值reserve_round_4k4KB对齐gd-relocaddr向下对齐reserve_mmu为MMU页表预留空间gd-relocaddr向下移动页表大小reserve_video为显示framebuffer预留gd-relocaddr向下移动显存大小reserve_trace为trace缓冲区预留gd-relocaddr向下移动reserve_uboot★为U‑Boot自身预留空间gd-relocaddr减去monitor长度reserve_malloc为malloc堆预留gd-malloc_base确定reserve_board为板级数据预留board_before /board_after钩子reserve_global_data为gd结构预留gd-new_gd确定reserve_fdt为设备树预留新位置gd-fdt_size, fdt_relocreserve_stacks栈空间预留gd-start_addr_spsetup_reloc★最终确定gd-relocaddrrelocation就绪serial_init串口初始化print信息可用console_init_f控制台早期初始化标准输出初内存分配顺序从DRAM末端向下分配DRAM末端┌──────────────────────────┐ ← gd-ram_top│MMU页表 │ reserve_mmu├──────────────────────────┤│Videoframebuffer │ reserve_video├──────────────────────────┤│Tracebuffer │ reserve_trace├──────────────────────────┤│ U‑Boot自身 (重定位后) │ ← reserve_uboot → gd-relocaddr├──────────────────────────┤│ malloc堆 (CFG_MALLOC_LEN)│ reserve_malloc → gd-malloc_base├──────────────────────────┤│ 板级数据 (board_info) │ reserve_board├──────────────────────────┤│GD(globaldata) │ ← reserve_global_data → gd-new_gd├──────────────────────────┤│ 设备树 (FDT) │ reserve_fdt├──────────────────────────┤│ 栈 (向下增长) │ ← reserve_stacks → gd-start_addr_sp└──────────────────────────┘重定位分隔符relocate_code()在arch/arm/lib/relocate.SARM架构中实现ENTRY(relocate_code)// r0 sp (新栈地址)// r1 new_gd (新全局数据地址)// r2 relocaddr (目标地址)// 1. 复制自身ldr r1, __image_copy_startldr r2, __image_copy_endmemcpy(r0, r1, r2 - r1)// 2. 修复.rel.dyn重定位表ldr r2, __rel_dyn_startldr r3, __rel_dyn_endfix_relocations:// 3. 跳转到新地址ldr r0, board_init_r// 已经过relocation fixbx r0ENDPROC(relocate_code)board_init_r阶段详解重定位后board_init_r在common/board_r.c中执行initcall序列的核心是初始化所有设备和服务。init_sequence_r关键函数两阶段职责对比维度board_init_fboard_init_r执行地址低地址(0x40200000)高地址(DRAM末端)核心任务内存规划重定位准备完整设备初始化命令行DRAM信息使用中完全就绪驱动模型未初始化完整初始化设备树检查/预留空间扫描所有节点并绑定驱动环境变量无加载并可用网络无完整TCP/IP文件系统无ext4/FAT就绪命令行无交互式shell结束状态调用relocate_code永不返回进入main_loopPurple Pi OH2开发板是触觉智能RK3576核心板SOM7609系列配套的评估开发板搭载4核A724核A53M0多核异构处理器主频2.2GHz集成6Tops算力 NPU轻松应对AI推理、边缘计算与轻量级AI端侧学习。配套完善SDK、丰富资料与Demo有助于项目前期快速开发验证。