0
点赞
收藏
分享

微信扫一扫

NXP优化Linux的启动时间


​​S32G Linux fast boot application doc - NXP Community​​


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



使用秒表测试  启动时间,测试方法如下:


 uboot 使用秒表多次测试取平均值。


 内核看时间戳。


 从按 Reset 重启,到打印 shell 提示。


 基于 eMMC 测试(先用 sdcard 启动测试,然后再做一个整个的*.sdcard 镜像拷贝到 eMMC


上测试)。


 最终测试从打印 u-boot…到启动到 shell 提示符,可以录像,然后通过录像来算出正确的启


动时间


NXP优化Linux的启动时间_服务器

 

NXP优化Linux的启动时间_串口_02

 

NXP优化Linux的启动时间_串口_03


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 区段



的精确延时




举报

相关推荐

0 条评论