启动时间优化,内核裁剪

假装没事ソ 提交于 2020-02-08 03:34:28

linux系统启动优化5个部分:

1,开机时钟时序优化;

2,Uboot优化;

3,Kernel优化;

4,Rootfs优化;

5,应用程序优化;

ROM Code :  NAND内固化好的一段代码,主要作用是初始化CPU、DDR等硬件。

U-Boot : 初始化串口、网口等硬件设备,并引导系统加载内核镜像到DDR中执行。

Kernel : 负责内核子系统初始化,挂载根文件系统,加载各模块的驱动程序。

Rootfs  : linux内核外围的一个应用环境。

Apps  : 包括图丁系统以及图丁系统下开发的所有应用程序。

1,ROM code基本动不了,涉及到硬件时序,修改的话可能影响系统稳定性。

2,Uboot优化:删除部分命令;禁止启动延迟;禁止内核镜像校验;修改内核镜像加载方式;优化U盘升级文件扫描时间

Uboot拥有较多命令: 如环境变量设置命令setenv、跳转至内存物理地址的命令bootm等等。 在非调试状态下,可以通过裁剪部分命令来加快uboot的启动速度。(实际上,想通过裁剪命令加快启动速度,就是扯淡)

启动过程用到的命令:     【bootcmd : mmc,run loadimage/mmcboot,bootm】     【loadimage : fatload】     【mmcboot : echo,run mmcargs,test,bootz】     【mmcargs : setenv】

可直接注释宏控禁止命令的编译,例如:禁止memory、ext4命令     //#define CONFIG_CMD_MEMORY     //#define CONFIG_CMD_EXT4;涉及到的文件:      include/configs/ark1680_arm.h      include/config_cmd_default.h

Uboot在拷贝内核镜像至DDR时,首先会对镜像文件进行校验,仅当读取到的 MAGIC值与程序匹配时才会进行内核跳转。 我们可以通过禁止校验的方式来节省该流程的耗时,涉及到的文件: ./arch/arm/lib/bootm.c        ./common/cmd_bootm.c

内核编译完成后,通常会生成多个镜像文件:

vmlinux: 未压缩的完整镜像,其他所有镜像文件都将依赖于它。

Image:经过objcopy处理了一些调试信息和功能的镜像,可直接运行。

zImage: 通过gzip对Image进行压缩的镜像,需解压后才能运行。

uImage: 在zImage前加上一个Uboot可识别的“头”,属于Uboot专属内核镜像。换言之Uboot一定可以加载uImage,但不一定能加载zImage

使用 CONFIG_CMD_BOOTZ 宏 可禁止 zImage的加载。

通常嵌入式设备都支持卡刷模式,系统上电后会进行U盘/sd 卡的检索,若未检索到特定文件或者检索时间超过指定时间就会正常启动。

3,内核裁剪:通过kmsg信息,判断耗时驱动进行适当的分析和裁剪;通过menuconfig进入可视化配置界面进行驱动的裁剪;参考文档《内核裁剪详细描述》的完整说明,进行对照裁剪。

可以将部分模块配置成 module ,insmod模式加载,这样内核启动的时候,不会对这些ko进行操作,节省启动时间。

内核启动时会将所有device注册至设备链表。 加载驱动程序时会遍历devices链表。一旦匹配到相同的driver.name,就会启动probe函数进行驱动的初始化。

当裁剪了驱动程序之后,尽量保证去掉设备树中设备信息。以防止其他驱动在轮询时多次轮询到未使用的设备,而影响开机时间。

去掉不必要的log信息,甚至直接屏蔽所有的log信息,可有效优化内核的启动时间。 内核打印信息通过等级分配,实现不同级别的log信息控制。可通过操作/proc/sys/kernel/printk节点或修改 ./kernel/printk.c源码来调整log输出。

4,rootfs优化:

内核启动时会挂载rootfs根文件系统。实践中对rootfs进行裁剪,不仅可以完成nand 空间的优化,还可以加快内核启动的速度。 Rootfs的常用裁剪方法:按文件大小,以先大后小的顺序进行裁剪。可使用du --max-depth=1 –lh命令对所有文件进行大小排序。 尽量先裁usr目录,再裁bin目录,最后裁剪lib库。主要为了保证不易出错。 不断进行刷机验证和测试,防止因误裁而导致系统异常。

5,因项目而异。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!