RK3588 Linux启动优化至亚秒级全链路剖析

说实话,以前玩RK3 5 8 8 的时候,我对亚秒启动有点着迷。
要知道,在嵌入式行业,如果启动慢到5 秒、1 0秒你可能不会注意到什么,但一旦延迟达到秒级,用户端就会爆炸。
RK3 5 8 8 芯片具有不错的性能,但在启动优化方面需要注意一些细节。

首先我说一个具体的场景。
之前我搭建过一个工业控制设备的系统。
客户要求启动时间不超过2 秒,因为设备需要在线并采集实时数据。
当时,单个Linux系统的启动时间需要两秒多,远远低于要求。
说实话,当时我很困惑,但后来我意识到问题全部出在U-Boot和内核初始化上。

在启动过程的六个阶段中,从BL1 切换到ATF所需的6 4 3 ms实际上并没有那么长。
主要原因是下一段需要压缩。
我来告诉你我当时是如何优化它的。
SPL和DDR的初始化以及TPL和SPL的集成是重点。
TP-Linux 代表此前在论坛上发帖称,合并后阶段切换的速度是原来的两倍。
当涉及 DDR 训练周期时,您需要根据主板的特定内存参数进行调整。
当时我们用的是DDR6 频率调整参数需要多次尝试,甚至相差5 0MHz也不行。

安全世界切换优化是ATF的一大亮点。
我以前也曾掉进过陷阱。
非安全世界启动参数与安全世界启动参数完全不同。
如果您保持安全世界设置不变,启动将立即冻结。
然后我绕过了 EL3 监控模式层并切换到程序集跳转,这将启动速度加快了约 3 00ms。
我们建议关闭日志级别。
生产板上的调试输出非常糟糕。
上次设备变砖是因为日志满了Flash。
这种经历确实很难解释。

U-Boot应根据您的实际需要进行调整。
让我们举个例子。
例如,如果您的主板不使用 USB,您只需删除 USB 驱动程序即可节省比您想象的更多空间。
我有一个项目要删除不必要的网络、USB 和 NAND。
U-Boot 映像小 2 -3 MB,启动速度更快。
至于图像传输,我使用DMA来移动图像,但速度并不比CPU复制快。
我这里没有附上照片,但是你可以在 RK 的官方文档中找到它。
有各种 U-Boot 模块的清晰颜色编码图。
哪一个是多余的一目了然。

从内核优化的角度来看,内核镜像中的LZ4 我们建议使用压缩。
解压速度非常快。
有一个测试。
对于相同大小的内核,LZ4 解压速度几乎是gzip的两倍。
当涉及到静态设备树时,动态分析真的很糟糕。
上次使用动态分析时,内核启动时间比静态分析慢了1 秒。
在用户空间,应该精简initramfs,如果可能的话,应该省略initramfs中安装的驱动和脚本。
我当时杀死了一半的 initramfs,启动速度快了几乎一秒。

对于双 AMP 系统,核心隔离是关键。
我们来说说一个实际案例。
之前的项目中,Linux关联的是core 0,实时系统关联的是core 3 结果我的实时系统运行Linux的时候就摇摇欲坠。
随后使用 Isolcpus 将实时系统核心与 Linux 分离,带来的好处是立竿见影的。
实测数据我记不太清了,不过Linux启动大约需要1 .5 -2 秒,实时系统大约需要1 .2 秒,所以已经足够了。

在调试方法方面,我建议使用 dmesg 来标记关键阶段,这样你就可以直接看到哪些部分慢。
我有一个项目,我使用逻辑分析仪来捕获 SOC 引脚信号。
事实证明,DDR的训练部分需要很长的时间。
然后我改用RK的专用DDR训练程序,速度快了2 00ms。
我们还使用 systemd-analyze 作为工具。
这非常方便,因为您可以准确地看到每个服务启动所需的时间。

最终,亚秒级启动需要优化整个链路,而不仅仅是改变几个参数。
请让我提个建议。
如果您在单个系统上工作,请坚持使用 U-Boot 和内核。
如果您使用双系统,请重点关注核心分离。
至于扩展方向,我最近在研究HS4 00模式,感觉还可以更快。

Linux系统清理:如何安全移除旧内核

是的,这就是问题所在。
删除旧内核并检查以前的版本。

RPM系统使用RPM-qa|grep内核,Debian使用dpkg-l|grep linux-image。

保留当前内核和至少一个旧版本,不要误删除。

检查内核文件,ls -l /boot/vmlinuz-,不要搞混各自的版本。

GRUB的默认内核可以设置,grubby --set-default /boot/vmlinuz-

要删除旧内核,请对 RPM 系统使用 yum Remove --old,对 Debian 使用 apt autoremove --purge。

更新 GRUB,对于 RPM 系统使用 grub2 -mkconfig -o /boot/grub2 /grub.cfg,对于 Debian 使用 update-grub。

重启验证,重启后查看uname -r。

注意备份和日志以避免出现问题。

linux Kbuild详解系列(4)-kbuild 框架概览

LinuxKbuild 核心。

编译过程:配置、编译、安装、调整。

文件:
顶级Makefile:全局情况控制。

Kconfig:配置选项。

Makefile/Kconfig 子文件夹:编译模块配置。

TopMake 文件:
控制编译过程的开始。

帮助选项:查看参数。

脚本目录:
Makefile.build/Makefile.lib:主脚本。

子文件夹:
Kconfig:模块配置。

Makefile:编译模块,提供目标。

创建文件:
vmlinux:内核映像。

System.map:符号表。

dtb:设备树。

启动文件。

学习资源:
内核源代码4 .1 4
官方文件。

博客。

练习练习。