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,因项目而异。
来源:CSDN
作者:ShuChengsong
链接:https://blog.csdn.net/ShuChengsong/article/details/103264698