1. 全志Tina Linux启动流程概述
全志Tina Linux的启动流程可以概括为以下几个阶段:BROM → boot0 → (monitor/secure os) → uboot → kernel → rootfs → 应用程序。每个阶段都有特定的职责和优化空间:
- BROM:固化在芯片内部的只读存储器中,负责最基础的硬件初始化和加载boot0
- boot0:运行在SRAM中,主要初始化DRAM并加载uboot
- uboot:完成更复杂的硬件初始化,加载内核和设备树
- kernel:初始化系统核心功能,挂载根文件系统
- rootfs:包含系统服务和应用程序
实测在典型配置下(V853芯片+SPI NOR Flash),完整启动时间约3-5秒。通过系统化优化,可以压缩到1秒以内,提升用户体验并降低功耗。
2. boot0阶段优化实战
2.1 boot0执行流程分析
boot0作为启动链的第二阶段,主要执行以下关键操作:
_start: b reset // 跳转到复位处理 reset: mrs r0, cpsr // 设置CPU为SVC模式 bic r0, r0, #ARMV7_MODE_MASK orr r0, r0, #ARMV7_SVC_MODE msr cpsr_c, r0 bl clear_bss // 清理BSS段 bl cpu_init_s // CPU初始化(空函数) bl main // 跳转到主函数(boot0_main.c)在boot0_main.c中会完成:
- 串口初始化(可关闭)
- 按键检测(进入烧录模式)
- 时钟频率设置(关键优化点)
- DRAM初始化(闭源代码)
- 加载uboot到DRAM
2.2 关键优化措施
2.2.1 关闭调试输出
修改sys_config.fex中的debug_mode = 0可关闭boot0串口输出,实测可节省约50ms。需要注意:
- 部分早期输出无法通过该配置关闭
- 故障排查时需要临时开启
2.2.2 时钟频率优化
默认配置可能较保守,可通过调整PLL参数提升性能:
// arch/arm/cpu/armv7/sun8iw16p1/spl/clock_spl.c void set_pll(void) { // 原配置:CPU=408MHz, AXI=136MHz writel((0x0a001000), CCMU_PLL_CPUX_CTRL_REG); // 优化建议(需确认芯片支持): writel((0x0a801800), CCMU_PLL_CPUX_CTRL_REG); // CPU=600MHz, AXI=200MHz }注意:超频需确保电源设计和散热满足要求。
2.2.3 Flash读取加速
对于SPI NOR Flash方案:
- 启用4线模式(Quad SPI)
- 提升时钟频率至80MHz
- 使用DMA传输
实测效果:
| 优化项 | 读取时间(100KB) | 提升幅度 |
|---|---|---|
| 默认配置 | 112ms | - |
| 4线模式 | 31ms | 72% |
| 4线+80MHz | 18ms | 84% |
2.2.4 直接加载内核(高级技巧)
对于极致优化场景,可修改boot0直接加载内核,跳过uboot阶段:
void boot0_jmp_monitor(void) { unsigned int kernel_entry = 0x40008000; mmu_turn_off(); asm volatile("bx %0" : : "r" (kernel_entry)); }需同步修改:
- 内核设备树中添加内存信息
- 内核需包含必要的硬件驱动
- 失去uboot的灵活功能
3. U-Boot阶段深度调优
3.1 U-Boot启动流程剖析
U-Boot启动分为两个主要阶段:
- board_init_f:在原始位置执行的初始化
- 设置全局数据结构
- 初始化串口、定时器
- 内存布局规划
- board_init_r:重定位后的完整初始化
- 设备驱动加载
- 环境变量处理
- 启动命令执行
3.2 性能优化方案
3.2.1 时钟频率配置
通过uboot-board.dts调整CPU和总线频率:
clock { boot_clock = <600>; // CPU频率(MHz) axi_div = <3>; // AXI分频系数 ahb_div = <2>; // AHB分频系数 };3.2.2 存储设备优化
SPI NOR Flash配置:
spi-flash { spi-max-frequency = <80000000>; // 80MHz spi-tx-bus-width = <4>; // 4线模式 spi-rx-bus-width = <4>; // 4线模式 };eMMC优化:
mmc { max-frequency = <100000000>; // 100MHz bus-width = <8>; // 8位总线 cap-mmc-highspeed; };3.2.3 内核加载位置优化
确保内核加载地址与编译地址一致,避免重定位开销。修改env.cfg:
# 对于uImage格式 boot_normal=sunxi_flash read 40007fc0 ${boot_partition};bootm 40007fc0 # 对于boot.img格式 boot_normal=sunxi_flash read 40007800 ${boot_partition};bootm 400078003.2.4 功能裁剪
通过make menuconfig移除不需要的功能:
Device Drivers ---> [ ] Serial drivers # 关闭串口驱动 [ ] USB support # 关闭USB Boot options ---> [ ] Boot count limit [ ] Autoboot delay4. 内核与根文件系统优化
4.1 内核压缩方式对比
测试数据(V853@600MHz):
| 压缩方式 | 内核大小 | 解压时间 | 总启动时间 |
|---|---|---|---|
| GZIP | 1.9MB | 350ms | 790ms |
| LZO | 2.4MB | 230ms | 610ms |
| XZ | 1.5MB | 520ms | 920ms |
建议:平衡考虑存储空间和启动速度,通常选择LZO。
4.2 初始化调用优化
添加initcall_debug=1到内核命令行参数,分析初始化耗时:
[ 0.021772] initcall sunxi_pinctrl_init+0x0/0x44 returned 0 after 9765 usecs [ 0.067694] initcall param_sysfs_init+0x0/0x198 returned 0 after 29296 usecs针对耗时较长的初始化:
- 改为模块化加载
- 延迟初始化
- 并行初始化
4.3 根文件系统优化
裁剪方案:
- 使用Buildroot生成最小根文件系统
- 移除调试工具和文档
- 选择轻量级init系统(如busybox init)
挂载优化:
chosen { bootargs = "rootfstype=squashfs root=/dev/mtdblock3 ro"; };5. 系统级优化技巧
5.1 启动顺序并行化
通过修改init脚本实现服务并行启动:
#!/bin/sh # 并行启动网络和服务 ifup eth0 & /etc/init.d/sshd start & /etc/init.d/dbus start & # 等待必要服务完成 wait_for_service network5.2 预加载技术
使用readahead预加载常用文件:
# 生成访问记录 cat /proc/$(pidof your_app)/maps > /etc/preload.list # 启动时预加载 readahead /etc/preload.list5.3 实测优化效果
在V853开发板上的优化对比:
| 优化阶段 | 原始耗时 | 优化后 | 节省时间 |
|---|---|---|---|
| boot0 | 320ms | 110ms | 210ms |
| U-Boot | 580ms | 220ms | 360ms |
| 内核解压 | 350ms | 230ms | 120ms |
| 根文件系统挂载 | 420ms | 180ms | 240ms |
| 总计 | 1.67s | 0.74s | 0.93s |
这些优化需要根据具体硬件配置进行调整,建议每次修改后测量实际效果。通过组合应用上述技术,可以显著提升系统启动速度,特别适合需要快速响应的嵌入式场景。