本文是《从零到一:把一块 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:二传手
通用开源引导程序,干三件事:
- 读取设备树(DTS,第 5 篇主角)——硬件的说明书
- 读取内核镜像,跳转过去
- 顺带支持烧写模式(板子插电脑刷系统就靠它)、显示开机 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 全记录》
- Ubuntu 24.04 编译 OpenHarmony 6.1:我踩过的 11 个坑
- 我把一块跑 Android 11 的开发板,换成了 OpenHarmony
- 零基础拆解:一块 RK3568 开发板里有什么
- 按下电源后发生了什么?嵌入式开机全流程
- 给 Linux 内核写一份"硬件说明书":设备树 DTS 入门
- 设备树翻译实战:把 Android 4.19 的 DTS 搬到 OpenHarmony 6.6
- OpenHarmony HDF 驱动框架入门:屏幕驱动"参数化"改造
- 从零写一个 OpenHarmony 触摸驱动:TW3106 移植实录
- 一块板子如何兼容 4 种触摸芯片和 3 种 4G 模组?
- 移植全景复盘:从 0 到可烧写镜像,我做了什么