NXP优化Linux的启动时间

S32G Linux fast boot application doc - NXP Community

1、默认 BSP Linux 内核的启动时间分析和优化方向

使用秒表测试  启动时间,测试方法如下:
 uboot 使用秒表多次测试取平均值。
 内核看时间戳。
 从按 Reset 重启,到打印 shell 提示。
 基于 eMMC 测试(先用 sdcard 启动测试,然后再做一个整个的*.sdcard 镜像拷贝到 eMMC
上测试)。
 最终测试从打印 u-boot…到启动到 shell 提示符,可以录像,然后通过录像来算出正确的启
动时间

 

 

2、UBoot 的优化
Uboot 的优化方向包括缩小 Uboot 的尺寸大小,减少功能,去掉调试信息,使用 MMC read
的方法来读取内核和 DTB。

2.1 缩小 Uboot 的 DTS 尺寸
Uboot 中的 DTS 包含关系是:Uboot 中仅考虑保留调试串口与启动用的 usdhc 接口外设驱动,去除掉其它 的外设驱动,则编译生成的新的 DTB 大小由原来的
2.2 缩小 Uboot 的尺寸
总原则是去除掉不需要的驱动,命令与其它信息,具体参考 u-boot/.config:
结合 DTS 中移除掉的驱动,最终编译生成的 u-boot.bin(含 DTB)由原来的 793559B 减少到:

2.3 去掉等待 3S 输入时间
串口中停下 uboot:
=> pri
bootdelay=3
=> setenv bootdelay '0'
=> env save
Saving Environment to MMC... Writing to MMC(0)... OK

2.4 配合内核修改的 Uboot 参数
 Bootcmd 简化

所以实际上是读了两次内核,一次是在 if run loadimage 中调用的,另一次是在 run

mmcboot 调用的,重复了。所以最终可以简化为:
=> setenv bootcmd 'run mmcboot'
=> env save
Saving Environment to MMC... Writing to MMC(0)... OK
去掉了扫描 mmc: mmc rescan 和另外一次读内核时间。

 设置根文件系统类型。
=> setenv mmcroot '/dev/mmcblk0p2 rootwait rootfstype=ext3 rw'
=> env sav
 去掉 earlycon。
=> setenv bootargs 'console=ttyLF0,115200 root=/dev/ram rw'
=> env save
=> setenv mmcargs 'setenv bootargs console=${console},${baudrate} root=${mmcroot} nohz=off coherent_pool=64M'
=> env save

2.5 关闭串口调试信息
2.6 MMC read 的方法来读取内核和 DTB
(未来版本尝试)。

3 Kernal 的优化
Kernal 的优化方向包括缩小 Kernal 的尺寸大小,减少功能,去掉调试信息,目前仅考虑
调试 Uart,pfe 与 eMMC 等外部驱动。Kernel 启动过程由于有 timestamp 的功能,可以直观的查看
启动的主要时间消耗在那儿,以及优化后的效果。
3.1 DTB 中去掉不用的驱动和代码
Kernel 中的 DTS 包含关系是: Uboot 中仅考虑保留调试串口,pfe 与启动用的 usdhc 接口
外设驱动,及芯片自有的驱动,去除掉其它的外设驱动。
编译生成的新的 DTB 大小由原来的
3.2 内核中去掉不用的平台与驱动及相关代码
make menuconfig:
Device Drivers
将不使用的驱动全部去掉,本文只保留了芯片内部驱动和调试 UART, PFE,启动的 uSHDC
驱动。
去掉的驱动包括 PCI,MTD,NVME,SCSI, Ethernet/PHY Driver 只保留 FSL,SSD, Keyboards,
TTY, /dev/mem, I2C, SPI, HID, USB, Industrail I/O, PWM。
Block dvices, Userspace I/O, virtio drivers,extcon,nvmem。
Virtual terminal,ARM AMBA serial port
编译生成的新的 Image 大小由原来的:
内核启动时间变成:
[ 2.233262] 000: random: fast init done
驱动剩余还有:
root@ardb2:/dev# ls
autofs console fccu fuse hwrng log mmcblk0p2 pts rtc0 stdin tty0 zero
block cpu_dma_latency fd gpiochip0 initctl mmcblk0 mtab random shm stdout ttyLF0
char disk full gpiochip1 kmsg mmcblk0p1 null rtc stderr tty urandom
3.3 内核中去掉不用功能,缩小内核大小
 Filesystem 只保留 ext3/4,vfat,sysfs,/proc, tmpfs
 Kernel hacking 功能 中能去掉的都去掉
 Networking support:去掉 can, wireless
 Power management Options 去掉 debug
 General Setupconfigure standard kernel feature(expert users)去掉
[] Load all symbols for debugging/ksymoops
详细的内容请参考内核.config
内核进一步减小到:
内核进一步减小到:
ll arch/arm64/boot/Image
-rwxrwxr-x 1 nxa08200 nxa08200 6746120 Apr 12 15:46 arch/arm64/boot/Image*
Uboot 读取的时间减少为:
6746120 bytes read in 313 ms (20.6 MiB/s)
15850 bytes read in 14 ms (1.1 MiB/s)
内核启动时间变为:
[ 1.821612] 003: Run /sbin/init as init process
3.4 去掉 initramfs 支持
Make menuconfig
General Setup 
[ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
内核启动时间变为:
[ 0.379503] 003: Run /sbin/init as init process
3.5 关闭调试信息
3.6 提前 eMMC 驱动加载时间
(将来版本测试)
3.7 将 Kernel 与 DTB 打包在一起
(将来版本测试)
4 Rootfs+应用程序的优化
Rootfs+应用程序的优化方向包括缩小 rootfs 的尺寸大小(缩小 rootfs 可以缩小 rootfs 分区
大小,从来减少 ext3/4 文件系统的初始化时间),减少功能。默认 BSP 是使用 udev 来加载驱动的,
可以换成 mdev 或 devfs,或手工创建设备节点。
5 最终全部启动时间比较
将启动时的串口 log 录像,然后用 Potplayer(完美解码)打开,在主菜单->播放->AB 区段播
放,设置起点为打印:U-Boot 2020.04-dirty (Apr 12 2021 - 12:40:03 +0800)这一帧,设置终点
为:打印 s32grdb2 login: 这一帧。然后进入“编辑 AB 区段循环”窗口,就可以看到 AB 区段
的精确延时
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值