第4篇:按下电源后发生了什么?嵌入式开机全流程

2 阅读5分钟

本文是《从零到一:把一块 RK3568 开发板移植到 OpenHarmony 6.1 全记录》系列的第 4 篇。把一块开发板的开机过程讲成一场接力赛。零基础友好。

一个反常识的事实:你按下电源后,系统不是"啪"地一下就起来的,而是一场 5 棒接力赛。每一棒跑完,把交接棒交给下一棒。理解这个流程,你就理解了为什么"移植"要同时碰引导、内核、系统这么多层——因为每一层都要有人接棒。

一、开机 = 5 棒接力

按下电源
   ▼
┌─────────────┐  ① BootROM:芯片出厂焊死的引导,只做一件事——
│ ① BootROM   │  把下一棒(loader)从存储里读出来跑
└──────┬──────┘
       ▼
┌─────────────┐  ② Loader(MiniLoader):初始化内存等最基础硬件
│ ② Loader    │  (程序都要在内存里跑,内存没初始化,谁也别想动)
└──────┬──────┘
       ▼
┌─────────────┐  ③ U-Boot:"二传手",读设备树+内核,交给内核
│ ③ U-Boot    │
└──────┬──────┘
       ▼
┌─────────────┐  ④ Linux 内核:按设备树说明书接管全部硬件,
│ ④ Kernel    │  挂载系统分区,启动第一个用户程序 init
└──────┬──────┘
       ▼
┌─────────────┐  ⑤ init → 拉起 OpenHarmony 各种服务
│ ⑤ 系统服务   │  → 屏幕亮 → 触摸能点 → 桌面出现
└─────────────┘

二、每一棒细说

① BootROM:芯片里的"出厂引导"

焊死在芯片内部 ROM 里的第一段程序,不可修改(所以叫 ROM)。它只回答一个问题:"系统装在哪?"然后从 eMMC(或 SD/USB)里把 Loader 读进内存跑起来。

② MiniLoader:先把工作台搭好

内存(DDR)上电后是"乱"的,需要精确的时序配置才能稳定读写。2GB DDR4@1056MHz 不是上电就能用的。Loader 的第一要务就是初始化内存。

这就是为什么移植时"内存参数"是 P0 级(最高优先级)——内存起不来,后面全白搭。这块板的内存参数沿用了原厂验证过的配置,一个字没改。

③ U-Boot:二传手

通用开源引导程序,干三件事:

  1. 读取设备树(DTS,第 5 篇主角)——硬件的说明书
  2. 读取内核镜像,跳转过去
  3. 顺带支持烧写模式(板子插电脑刷系统就靠它)、显示开机 logo、读分区表

关键认知:本项目里 U-Boot 是瑞芯微预编译好的,移植时根本没动它——主芯片和内存没变,U-Boot 就能继续用。移植的精力要花在"变了的东西"上。

④ Linux 内核:接管硬件的大脑

内核拿到设备树说明书后,逐个初始化硬件(电源、存储、屏幕、网卡、USB...),每个硬件对应一个驱动(第 7、8 篇)。然后:

  • 挂载根文件系统(系统文件所在分区,在 eMMC 上)
  • 启动第一个用户态程序 init,交棒

内核开机时打印的一堆日志(dmesg),就是它初始化硬件的"工作汇报"——真机调试全靠这份汇报。

⑤ init 与系统服务:开门营业

init 按配置文件拉起各种系统服务:显示服务(屏幕亮)、输入服务(触摸能点)、网络服务、桌面应用……

Android 与 OpenHarmony 在这里分道扬镳:Android 的 init 拉起 Android 服务框架;OpenHarmony 拉起鸿蒙服务框架(HDF 设备管理等)。但④之前的底层,两者是同一套思想。

三、开机口令:内核交给 init 的那句"暗号"

第④棒交棒给第⑤棒时,要传一串"口令"(bootargs),告诉系统该怎么挂载分区、板子叫什么。这是真实项目里的一句话:

earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0
hardware=rk3568
root=PARTUUID=614e0000-0000
default_boot_device=fe310000.sdhci rw rootwait
ohos.required_mount.system=/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro...

拆开看:

片段含义
hardware=rk3568板子型号 → 系统据此加载板级启动配置
root=PARTUUID=614e0000-0000根文件系统在哪个分区(UUID 定位)
default_boot_device=fe310000.sdhci存储控制器地址
ohos.required_mount.system=...哪些分区必须挂载、挂到哪、什么格式

这句口令写在设备树的 chosen 节点里,是移植时必须逐字符写对的东西——写错一个 UUID,系统就找不到根文件系统,卡死在启动半路。

四、这个流程和"移植"的关系(重点)

对照整个移植工作:

接力棒移植时动了没?为什么
① BootROM没动(也动不了)芯片出厂焊死
② Loader没动原厂验证过,芯片内存没变
③ U-Boot没动同上,直接用预编译镜像
④ 内核主战场内核版本从 4.19 → 6.6,设备树说明书要适配新语法,驱动要适配(HDF),功能开关要重配
⑤ 系统服务第二战场服务框架完全换了,板级/产品目录、HDF 配置、参数文件按 OH 规矩重写

所以你会看到:移植的绝大多数改动,集中在"内核的说明书"和"系统的板级配置",而不是芯片或引导程序

写在最后

记住这张接力图,后面所有技术篇都能挂到对应的接力棒上:

  • 第 5、6 篇(设备树)→ 第④棒的"说明书"
  • 第 7、8 篇(HDF 驱动)→ 第④棒的"操作手册"
  • 第 10 篇(复盘)→ 全部 5 棒的完整清单

下一篇:给 Linux 内核写一份"硬件说明书"——设备树 DTS 入门。


📚 本系列文章导航

《从零到一:把一块 RK3568 开发板移植到 OpenHarmony 6.1 全记录》

  1. Ubuntu 24.04 编译 OpenHarmony 6.1:我踩过的 11 个坑
  2. 我把一块跑 Android 11 的开发板,换成了 OpenHarmony
  3. 零基础拆解:一块 RK3568 开发板里有什么
  4. 按下电源后发生了什么?嵌入式开机全流程
  5. 给 Linux 内核写一份"硬件说明书":设备树 DTS 入门
  6. 设备树翻译实战:把 Android 4.19 的 DTS 搬到 OpenHarmony 6.6
  7. OpenHarmony HDF 驱动框架入门:屏幕驱动"参数化"改造
  8. 从零写一个 OpenHarmony 触摸驱动:TW3106 移植实录
  9. 一块板子如何兼容 4 种触摸芯片和 3 种 4G 模组?
  10. 移植全景复盘:从 0 到可烧写镜像,我做了什么