测量启动时间
在优化之前先建立基线测量。添加 initcall_debug
将initcall_debug 添加到内核命令行。内核会为每个 initcall 打印带时间戳的条目及其耗时:
scripts/bootgraph.pl 生成启动时间线 SVG:
配置 printk.time
将printk.time=1 loglevel=4 添加到内核命令行。这会为每条 printk 消息附加微秒级时间戳,同时抑制信息类输出。在低速 UART 上,这可以将串行控制台开销降低 200–500 毫秒。
运行 systemd-analyze
在运行 systemd 的系统上,启动后运行以下命令,查看内核、initrd 和用户空间各阶段所花费的时间:启用异步探测
默认情况下,内核按顺序探测平台设备。在 Qualcomm SoC 上,单个子系统(如摄像头或显示)的探测链可能涉及数十个串行运行的依赖驱动。异步探测允许相互独立的驱动跨内核线程并行探测。启用 Kconfig
按驱动启用
驱动通过在driver 结构中设置 probe_type 来启用此特性:
通过内核命令行启用
使用 driver_async_probe 参数可以在不修改源代码的情况下强制任何驱动使用异步探测。多个驱动名称之间用逗号分隔。配置延迟探测超时
当驱动因依赖项尚不可用而返回 -EPROBE_DEFER 时,内核会重试探测。设置 deferred_probe_timeout(以秒为单位),可在设备始终无法就绪时发出警告并继续启动。禁用未使用的子系统
即使硬件不存在,未使用的内置驱动也会增加 initcall 开销。针对您的目标开发板检查以下 Kconfig 符号,并禁用物料清单(BOM)中未列出的所有驱动。 表:需要检查的影响启动时间的 Kconfig 符号
请使用特定于开发板的配置片段(fragment),而不是直接编辑
defconfig。在 Yocto 工作流中,向内核 bbappend 添加一个 .cfg 片段:
disable-unused.cfg 的示例内容:
优化 initramfs
initramfs 在根文件系统挂载之前被解压并执行。过大的 initramfs 会同时增加解压时间和存储 I/O 开销。选择快速的压缩算法
在 Cortex-A55 和 Cortex-A78 内核上,LZ4 的解压速度远快于 gzip,但生成的镜像略大:精简软件包集
编辑meta-qcom/recipes-kernel/images/initramfs-qcom-image.bb,移除早期启动阶段不需要的软件包。如果所有必需的驱动都是内置编译的(设置为 =y 而非 =m),则移除 initramfs-module-copy-modules。
通过在 Yocto 配置中进行以下设置,确保所有 initramfs 二进制文件都被去除符号信息(strip):
优化 Qualcomm remoteproc 固件加载
在 QCS6490、IQ-9075 及相关 SoC 上,aDSP、cDSP 和 WPSS 子系统在device_initcall 期间通过 qcom_q6v5_pas 驱动加载其固件。每个镜像在子系统启动前都要经过 TrustZone 认证。所有子系统的总加载时间可能超过两秒。
如果 /lib/firmware 中缺少任何固件文件,request_firmware() 调用会在每个子系统上超时 60 秒,从而完全阻塞启动。请验证固件已正确部署:

