RK3588 启动优化与平台关联详解
源码路径:rk3588/kernel-6.1/init/main.c、init/initramfs.c、mm/memblock.c
内核版本:Linux 6.1(RK3588 / ARM64)
文档目录:linuxDoc/init/
目录
一、原理
Rockchip 在 通用 Linux 启动路径 上增加少量钩子,目标集中在:
- 可观测性:长
bootargs 完整打印
- 时延:Thunder Boot 下 推迟大块 memblock→buddy、硬件解压 initramfs
- 与 mm 协同:延迟释放在独立线程执行,不阻塞
kernel_init_freeable 关键路径上的 initcall/挂根
init/ 本身 不包含 clock、pinctrl、display 驱动;这些仍通过 initcall 在 drivers/ 注册。
二、实现方式
2.1 分段打印命令行(CONFIG_ARCH_ROCKCHIP)
1 2 3 4
| #ifdef CONFIG_ARCH_ROCKCHIP const char *s = saved_command_line; // pr_notice 首段后 pr_cont 循环输出 #endif
|
场景:DT chosen/bootargs 很长(多路摄像头、内存预留、调试开关)时,单次 printk 无法完整记录,影响现场分析。
2.2 延迟释放 memblock(CONFIG_ROCKCHIP_THUNDER_BOOT_DEFER_FREE_MEMBLOCK)
触发点(kernel_init_freeable,smp_init 之后):
1
| kthread_run(defer_free_memblock, NULL, "defer_mem");
|
实现(mm/memblock.c):
1 2 3 4 5 6
| int __init defer_free_memblock(void *unused) { for (i = 0; i < rk_dhpi_num; i++) nr_pages += rk_deferred_init_pages(zone, start_pfn, end_pfn); // __free_pages_memory、totalram_pages_add ... }
|
原理:引导期登记的部分物理页 不立即 全部交给 buddy,而在 defer_mem 线程 中批量 __free_pages_memory,使 start_kernel→userspace 关键路径上的 页分配初始化 更短。
与 linuxDoc/mm/01 中 Rockchip memblock 钩子同一特性链。
2.3 initramfs 硬件解压等待
1 2 3
| #if defined(CONFIG_ROCKCHIP_THUNDER_BOOT) && defined(CONFIG_ROCKCHIP_HW_DECOMPRESS) wait_initrd_hw_decom_done(); #endif
|
解压由 Rockchip 硬件引擎 完成时,CPU 侧 cpio 解析前必须同步,避免读到未完成缓冲区。
2.4 启动链总览(RK 钩子标注)
三、配置项对照
| Kconfig |
影响文件 |
ARCH_ROCKCHIP |
main.c cmdline 打印 |
ROCKCHIP_THUNDER_BOOT |
快启总开关(与 BSP 相关) |
ROCKCHIP_THUNDER_BOOT_DEFER_FREE_MEMBLOCK |
main.c + memblock.c |
ROCKCHIP_HW_DECOMPRESS |
initramfs.c + 驱动 |
具体是否启用以 RK3588 defconfig / 设备树 为准,不同产品(编解码盒、平板)可能只开子集。
四、与 SeagullYpcEncode 场景
| 关注点 |
说明 |
| 启动到编码服务 |
defer_mem 缩短内核态时间;用户态 systemd 启动 VPU/RGA 服务仍占主要时延 |
| 内存可见性 |
延迟释放期间 MemTotal 可能稍后增长;监控脚本勿在极早瞬间采内存 |
| 根文件系统 |
仍依赖 04 的 root= / initramfs |
| 安全启动 |
AVB/dm-verity 在 init 之前或 initramfs 完成;integrity_load_keys 在 kernel_init_freeable 末尾 |
五、调试与观测
1
| dmesg | grep -E 'defer_mem|defer_free|Kernel command line|initrd|populate_rootfs'
|
| 现象 |
方向 |
MemTotal 启动后跳变 |
查 defer_free_memblock 日志 |
| initramfs 损坏 |
关闭 HW decompress 对比软件解压 |
| cmdline 仍不全 |
检查串口工具缓冲,非内核问题 |
线程名:defer_mem(ps 仅在 userspace 后可见;此前用 dmesg)。
附录:关联文档