uboot
启动流程启动概况F 阶段 → 重定位 → R 阶段 → 主循环。F:board_init_f(): fflash/早期栈在sarmddr这时候可能没启用bss不可用。R:board_init_r()Rram重定位后跑在ddr,此时完整 C 环境。详细流程阶段一汇编入口 start.sCPU 复位后执行的第一段 U-Boot 代码Mask ROM / SPL 加载到这里后从此运行这阶段CPU已经启动了。阶段二C 运行时 crtXX.S执行_main大致流程如下board_init_f_alloc_reserve设置栈指针 sp、分配 gdboard_init_f()早期 C 初始化relocate_code()完整 U-Boot搬到 DDRc_runtime_cpu_setup()重定位后刷新异常向量基址board_init_r()C 初始化。阶段三早期初始化 board_init_f.cvoid board_init_f(ulong boot_flags) { gd-flags boot_flags; if (initcall_run_list(init_sequence_f)) hang(); }主要是init一个函数表init_sequence_f大致流程如下arch_cpu_init架构级 CPU 初始化 mach_cpu_init SoC 级初始化Rockchip → rk3562.cinitf_dm驱动模型早期初始化 timer_init 定时器 env_init环境变量框架serial_init/console_init_f串口、早期控制台dram_init初始化 DDR关键setup_dest_addr计算重定位目标地址reserve_*系列 为 U-Boot、malloc、FDT、栈等保留内存setup_reloc设置重定位参数 。注1和2是板级的钩子U-Boot 通用框架声明了一些__weak空函数可被平台覆盖Rockchip 在自己的.c里再写同名函数链接时覆盖 weak 默认实现dram_init 成功之后才有足够内存做代码重定位和后续工作完整 U-Boot 里常只是 填gd-ram_sizeDDR 训练多在 SPL / rkbin / 厂商 loader不是到这里才第一次“点亮 DDR”第一次常在阶段一里面。阶段四后期初始化 board_init_r.cvoid board_init_r(gd_t *new_gd, ulong dest_addr) { if (initcall_run_list(init_sequence_r)) hang(); hang(); /* 正常不应到达 */ }同样是init函数表init_sequence_r大致流程如下initr_malloc堆内存initr_of_live设备树initr_dm 驱动模型完整初始化board_init板级芯片片选等initr_mmc/initr_nand 存储eMMC/NANDconsole_init_r完整控制台initr_net以太网若启用board_late_init板级晚期 Rockchip logo、启动模式等。初始化结束后进入run_main_loop:static int run_main_loop(void) { for (;;) main_loop(); /* 永不返回除非 autoboot 失败后 retry */ return 0; }console_init_f和console_init_r一个flash阶段只可以printf打印一个ram阶段搭完整控制台框架可多设备、跟 env 绑定。阶段五主循环与命令行main.cvoid main_loop(void) { cli_init(); run_preboot_environment_command(); /* 若有 preboot 环境变量 */ s bootdelay_process(); /* 读 bootdelay、bootcmd */ autoboot_command(s); /* 自动执行 bootcmd */ cli_loop(); /* ★ 命令行停在这里 */ panic(No CLI available); }自动启动 autoboot.cvoid autoboot_command(const char *s) { if (stored_bootdelay ! -1 s !abortboot(stored_bootdelay)) { run_command_list(s, -1, 0); /* 执行 bootcmd */ } }此处可以打断boot进入命令行打断bootcmd进入cli命令行。命令行停在哪cli_loop() → cli.c └─ cli_simple_loop() → cli_simple.c └─ cli_readline() → cli_readline.c └─ getc() ★ 阻塞等待串口输入readline出现 提示符阶段六启动 Linuxbootcmd的个性化启动linux根据实际需求进行修改。通用总结可复用的中段各厂商大体一样完整 U-Boot 入口start.S→ C 运行时 →board_init_f→ 重定位 →board_init_r→main_loop→bootdelay/abortboot→ 执行bootcmd之前。个性化两端start.S之前BootROM / TPL / SPL / MiniLoader以及 RK 的 DDR 二进制、部分平台的 ATF 等把 U-Boot 送到可执行地址。bootcmd及之后从哪取内核分区 / 文件路径、镜像格式boot.img/zImagedtb / FIT、用哪条启动命令落到 Linux。RK3562-SP-EVM的个性化两端通用start.s之前的前导链Mask ROM —— 固化小引导芯片内部固化的一小段程序上电复位后 CPU 第一个跑它。MiniLoaderAll.bin —— DDR 训练 SPL 合体第一次启动DDR把ddr变成主存后将控制权限给SPL。SPL-小uboot有自己的通用uboot 框架主要是认出启动方式读出FIT解析FIT把相关解析文件放到对应地址。要求SPL要懂内存懂FIT体积必须小。通用bootcmd后的linux内核引导启动流程main_loop() → autoboot_command() → run_command_list(boot_android mmc 0; ...) → do_boot_android() → android_bootloader_boot_flow() ├─ 读 misc 分区 → 判断 normal/recovery/fastboot ├─ android_image_load_by_partname(boot) ├─ 组装 bootargs └─ android_bootloader_boot_kernel() → do_bootm_states() → 跳转到 Linux entry不再返回android_bootloader_boot_flow流程int android_bootloader_boot_flow(struct blk_desc *dev_desc, unsigned long load_address) { /* 1. 读 misc确定启动模式 */ mode android_bootloader_load_and_clear_mode(...); /* 2. 从 boot/recovery 分区加载 boot.img */ android_image_load_by_partname(dev_desc, boot_partname, load_address); /* 3. 组装 command line写入 bootargs 环境变量 */ command_line android_assemble_cmdline(...); env_update(bootargs, command_line); /* 4. 启动内核 */ android_bootloader_boot_kernel(load_address); }android_bootloader_boot_kernel流程调用do_bootm_states完成如下内容解析 Android boot.img 或 FITif (!ret (states BOOTM_STATE_FINDOS)) ret bootm_find_os(cmdtp, flag, argc, argv);//解析boot.img if (!ret (states BOOTM_STATE_FINDOTHER)) ret bootm_find_other(cmdtp, flag, argc, argv);//找dtb等加载 kernel、dtb、ramdisk 到指定内存if (!ret (states BOOTM_STATE_LOADOS)) { ulong load_end; iflag bootm_disable_interrupts(); ret bootm_load_os(images, load_end, 0); //加载kernel if (ret 0) lmb_reserve(images-lmb, images-os.load, (load_end - images-os.load)); else if (ret ret ! BOOTM_ERR_OVERLAP) goto err; else if (ret BOOTM_ERR_OVERLAP) ret 0; }关闭 U-Boot 设备跳转到内核入口。if (!ret (states BOOTM_STATE_OS_GO)) ret boot_selected_os(argc, argv, BOOTM_STATE_OS_GO, images, boot_fn); 后续调用链 BOOTM_STATE_OS_GO: boot_selected_os(..., OS_GO, boot_fn) // bootm_os.c └─ boot_fn(OS_GO, ...) → do_bootm_linux() └─ boot_jump_linux() //跳转内核正点原子IMX6ULL通用start.s之前的前导链BootROM芯片厂商出厂的固化程序按DSD表去写寄存器配置时钟DDR等类比rk3562-evm的MaskROM的DDR训练。通用bootcmd后的linux内核引导board_init_r → run_main_loop → main_loop() 【common/main.c】 → bootdelay_process() 【common/autoboot.c】取出 bootcmd → autoboot_command(bootcmd) 【common/autoboot.c】 → run_command_list(bootcmd) 【common/cli.c】 │ bootcmd CONFIG_BOOTCOMMAND【include/configs/mx6ullevk.h】 ├─ run findfdt 定 fdt_file 名字 ├─ mmc dev / mmc rescan 【cmd/mmc.c】 ├─ run loadimage 【mx6ullevk.h】 │ └─ fatload mmc ... zImage │ → zImage 进内存 loadaddr │ 【cmd/fat.c → fs/fs.c】 │ └─ run mmcboot 【mx6ullevk.h】 ├─ run mmcargs │ └─ setenv bootargs串口 / root... ├─ run loadfdt │ └─ fatload mmc ... dtb │ → dtb 进内存 fdt_addr │ 【cmd/fat.c → fs/fs.c】 └─ bootz ${loadaddr} - ${fdt_addr} → do_bootz() 【cmd/bootm.c】类似rk3562的挂内核 ├─ bootz_start() │ └─ 认 zImage记下内核 / dtb 地址 └─ do_bootm_states(OS_PREP | OS_GO) → do_bootm_linux() 【bootm.c】 ├─ boot_prep_linux() │ └─ 准备 bootargs / dtb └─ boot_jump_linux() └─ kernel_entry()bootcmd的执行表mx6ullevk.h#define CONFIG_BOOTCOMMAND \ run findfdt; \ mmc dev ${mmcdev}; \ mmc dev ${mmcdev}; if mmc rescan; then \ if run loadbootscript; then \ run bootscript; \ else \ if run loadimage; then \ /*加载内核zlmage*/ run mmcboot; \ /*加载设备树*/ else run netboot; \ fi; \ fi; \ else run netboot; fi #endif

相关新闻

Next.js开发效率瓶颈与TanStack Start解决方案

Next.js开发效率瓶颈与TanStack Start解决方案

1. 项目背景:Next.js开发效率瓶颈的突围去年接手一个电商后台重构项目时,团队最初选择了Next.js作为技术栈。前两周的体验堪称完美——自动路由、开箱即用的SSR支持、丰富的插件生态。但当我们进入高频迭代阶段后,问题开始集中爆发&#xff1…

2026/7/17 3:39:30 阅读更多 →
Codex使用心得:最新的codeex马扁局就是发很多高端网页

Codex使用心得:最新的codeex马扁局就是发很多高端网页

![Codex使用心得:最新的codeex骗局就是发很多高端网页,然后说这是他们用cod) 这类素材值得看,不是因为它在讲“AI 编程有多强”,而是刚好戳中了很多人最近最容易踩的坑:把漂亮网页截图,当成了 Codex 或 AI…

2026/7/17 3:37:29 阅读更多 →
MODMAP:面向工业3D质检的原生多视角异常检测框架

MODMAP:面向工业3D质检的原生多视角异常检测框架

1. 这不是又一个“加个Transformer”的工业检测方案最近在整理CVPR2026新录用论文时,MODMAP这篇标题里带“SOTA”二字的工业质检工作,让我在凌晨三点改完第三版产线缺陷识别模型后,把咖啡杯重重放在桌上——不是因为兴奋,而是因为…

2026/7/17 3:35:28 阅读更多 →

最新新闻

基于Dify平台的智能客服系统优化实践

基于Dify平台的智能客服系统优化实践

1. 项目背景与核心目标去年接手一个教育类SaaS平台的智能客服模块改造项目时,客户明确提出了两个硬性指标:智能回复准确率需达85%以上,单次响应时间必须控制在3秒内。当时市面上常见的SaaS客服系统平均响应时间在5-8秒,这促使我们…

2026/7/17 4:38:12 阅读更多 →
Java实现PCI-DSS合规加密:从AES-GCM到KMS密钥管理的完整实践

Java实现PCI-DSS合规加密:从AES-GCM到KMS密钥管理的完整实践

1. 项目概述:当支付安全成为业务基石几年前,我参与过一个电商支付系统的重构项目,上线前卡在了安全审计环节。审计方指着我们数据库里那些“看起来像”加密的字段,问了一个直击灵魂的问题:“你们这个AES密钥是怎么管理…

2026/7/17 4:38:12 阅读更多 →
点云处理中阶 Registration(一):ICP配准原理 + PCL代码实战

点云处理中阶 Registration(一):ICP配准原理 + PCL代码实战

这篇文章从工程视角梳理 ICP 配准的核心思想、PCL 中的常用接口、完整代码示例以及参数调优要点。读完后你应该能独立跑通一个最基础的点云精配准流程,并知道它什么时候好用、什么时候容易失效。 1. 为什么点云配准这么重要 做点云处理时,我们经常会遇到这样几个问题: 多帧…

2026/7/17 4:38:12 阅读更多 →
Explain实战:从看懂执行计划到根治慢SQL

Explain实战:从看懂执行计划到根治慢SQL

Explain实战:从看懂执行计划到根治慢SQL 做数据库运维和后端开发的人,几乎都经历过那种线上紧急排障的惊魂时刻:凌晨两点的告警电话突然炸响,线上业务的响应时间从平时的几十毫秒直接跳到十几秒,DBA登上服务器一看&…

2026/7/17 4:36:12 阅读更多 →
Ansible 进阶预习:Handlers 处理器 + Templates 模板

Ansible 进阶预习:Handlers 处理器 + Templates 模板

文章目录 Ansible 进阶预习:Handlers 处理器 + Templates 模板 一、整体认知:为什么要学这两个特性? 二、Handlers 处理器 1. 核心概念 核心特性 解决的核心问题 2. 核心语法 (1)定义 Handlers (2)触发 Handlers (3)强制提前执行 3. 完整可运行示例(你的环境可直接执…

2026/7/17 4:36:12 阅读更多 →
Python实现智能PDF自动滚屏阅读器:基于内容识别的自适应滚动技术

Python实现智能PDF自动滚屏阅读器:基于内容识别的自适应滚动技术

你是不是也遇到过这样的场景:在阅读一份重要的技术文档或电子书时,双手被键盘鼠标占据,却需要频繁滚动页面?或者在学习在线课程时,想要保持页面自动滚动以便腾出手来做笔记?这种"阅读-操作"的割裂…

2026/7/17 4:36:12 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/17 3:22:28 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/17 3:01:28 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻