测量启动时间
在优化之前,先建立基线测量。添加 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 符号
请使用板级特定的配置片段,而不是直接编辑
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 秒后超时,从而完全阻塞启动。请验证固件已正确部署:

