[What]Linux内核调试之启动过程

参考链接:

  1. https://elinux.org/Boot-up_Time_Reduction_Howto
  2. https://elinux.org/images/6/64/Chris-simmonds-boot-time-elce-2017_0.pdf
  3. https://elinux.org/images/7/70/Opdenacker-boot-time-ELC-2014.pdf

通过串口打印以及进行终端捕捉能够比较深入的了解Linux在启动过程中各个步骤所花费的时间。

准备

按照以下步骤即可:

  • 在bootargs 中加入字符串
#1. 所有级别信息都打印
#2. 使能早期打印
#3. 打印初始化调用细节以及消耗时间(在确定初始化调用时间后需要去掉此项,避免此部分调试信息加大开机时间)
loglevel=8 earlyprintk initcall_debug
grabserial -v -d /dev/ttyUSB0 -e 60 -t -m "Booting Linux on physical CPU*"

提高开机速度

在了解到各个部分的开机时间后,有下面这些通用的方法可以提高Linux的开机速度。

关闭不用的模块

  • 准备工作做好后,确认以下配置已经打开:
    • CONFIG_PRINTK_TIME
    • CONFIG_KALLSYMS
  • 重启系统后,将输出保存到文件并上传至PC
    • dmesg > boot.log
  • 使用 bootgraph 查看初始化组件的占用时间
    • linux/scripts/bootgraph.pl boot.log > boot.svg
  • 最后主要优化:
    • 查看哪些模块是自己不需要的,然后关闭它们。
    • 查看启动文件系统的时间,关掉文件系统中无用的配置
    • 将相对耗时的模块初始化尽量放在开机以后再加载。

注意: 倘若dmesg显示信息不完整,那是打印缓存设置得太小的缘故,需要增大缓存

获取编译的详细文件大小

yocto提供了 scripts/tiny/ksize.py ,在编译根目录下运行即可列出编译后的文件大小。

bootargs 设置

取消不必要的串口输出

printk的发送会比较占用时间,所以可以取消一些不重要的输出:

  • 在menuconfig中取消 earlyprintk 宏,并且在 bootargs 中也取消此字符串
  • 在 bootargs 中取消 loglevel=8 字符串,用 quiet 代替。
    • quiet 会让 kernel 设置为只有警告以上的信息才会打印(loglevel=4)

指定延迟校准值

内核在每次启动的时候会校准延迟,比如 :

Calibrating delay loop... 1332.01 BogoMIPS(lpj=6660096)

这个过程会消耗几百毫秒的时间,所以可以在bootargs中加上以下字符串,以跳过自动校准阶段:

lpj=6660096

简化文件系统的初始化脚本

对于busybox而言,其使用的是sysvinit方式,其初始化方式在其文件 /etc/inittab 中有所描述, 可以根据此文件的描述先找出其所有的初始化脚本,然后看看哪些是可以取消的,哪些是可以延后的。

Last Updated 2019-03-14 Thu 07:47.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)