7. 升级系统组件

为了保证系统的稳定运行,在修复已知BUG或添加新功能后,我们会及时发布系统镜像更新包。

然而,用户在使用板卡一段时间后,往往已经对系统进行了个性化修改,不希望完全重新烧录整套镜像; 同时,也有部分用户希望基于SDK对某些模块进行自定义开发,而不想重新编译整个系统。

在这种情况下,用户可以选择单独升级系统的部分组件, 以实现功能更新、问题修复或定制化扩展,而无需破坏原有系统环境,从而更灵活地维护与优化系统。

整个系统镜像按分区表进行划分,可以分为4部分。

  • boot分区

  • env分区

  • kernel分区

  • rootfs分区

我们可以对这四个分区进行单独更新升级

分区烧录的方法可以参考镜像烧录章节,以下是对各分区的详细介绍和判断是否需要升级的方法

7.1. 镜像更新日志示例

针对官方镜像,可以查看镜像更新日志对应的更新内容判断当前板卡运行的系统是否要更新

../../_images/update00.png

7.2. boot分区

包含前级loader(GSL)和次级loader(u-boot)。其中GSL中包含起始阶段的寄存器配置参数,包括DDR参数和引脚复用配置。 u-boot则负责进一步初始化外设硬件,提供一些高级功能并启动Linux内核。

一般情况下boot分区由于功能简单、只在板卡启动时运行一次,很少对boot的代码进行修改。又因为烧录boot分区需要使用串口烧录,步骤繁琐,所以很少需要更新boot分区。

那么在什么情况下需要更新boot分区呢?

  • 用户在自行编译SDK时,如果修改了U-Boot表格、GSL驱动代码、U-Boot源码或配置文件,则需要重新编译生成boot_image.bin并重新烧录,以确保改动生效。

  • 在官方发布新版系统镜像时,可先查看 镜像更新说明 。例如,在示例更新日志中显示,20251010 版本的镜像在 boot 分区中新增了一项功能支持。 若通过串口查看启动日志发现当前板卡中U-Boot的编译日期为20250928,早于镜像更新日期,说明当前系统未包含此功能更新,此时应烧录boot分区进行升级。

../../_images/update01.png

7.3. env分区

保存u-boot使用的环境变量。其中最重要的是bootcmd和bootargs,bootcmd是u-boot启动Linux内核的命令,bootargs是传给Linux内核的启动参数。

  • 用户在自行编译SDK时,如果修改了osdrv/tools/pc/uboot_env/env_text目录下的环境变量源文件,则需要重新编译生成对应存储类型的env.bin并重新烧录,以确保改动生效。

  • 在官方发布新版系统镜像时,可先查看 镜像更新说明 。例如,在示例更新日志中显示,20251010版本的镜像在env分区中新增一个变量,修改一个变量。

    可以通过串口,在板卡上电时按住空格键来登录到u-boot的命令行中,用printenv查看当前环境变量。如果不包含镜像更新说明中的修改, 则可以重新烧录env镜像或者手动使用setenv命令修改,并使用saveenv命令保存修改。

../../_images/update02.png
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 打印当前环境变量
printenv

# 设置一个原本没有的变量=新增变量
setenv num 1

# 设置一个原本就有的变量=修改变量(中间有空格的变量要用"")
setenv bootargs "mem=500M console=ttyAMA0,115200 clk_ignore_unused rw rootwait root=/dev/mmcblk0p4 rootfstype=ext4 blkdevparts=mmcblk0:512K(boot),512K(env),11M(kernel),-(rootfs.ext4)"

# 设置一个原本就有的变量的值为空=删除变量
setenv num

# 保存变量
saveenv

7.4. kernel分区

kernel分区中保存了Linux内核镜像,在系统启动时,U-Boot从kernel分区读取并加载Linux内核镜像到内存指定位置,然后跳转至内核入口地址执行。 随后,系统进入由Linux内核主导的运行阶段,内核作为核心组件负责硬件资源管理与上层软件的交互。

  • 用户在自行编译SDK时,如果修改了open_source/linux目录下的源码文件,则需要重新编译生成对内核镜像uImage_ss928v100并重新烧录,以确保改动生效。

  • 在官方发布新版系统镜像时,可先查看 镜像更新说明 。例如,在示例更新日志中显示,20251010版本的镜像在内核中有3条修改信息。 可以通过登录终端,使用uname -a命令查看当前板卡中内核的编译日期为20251014,晚于镜像更新日期,说明当前内核已包含此功能更新,则可以不用更新kernel分区。

../../_images/update03.png

需要注意的是,仅更新内核分区镜像,不会更新被编译为模块(ko)的驱动文件,这些模块文件在编译时会打包进根文件系统镜像中。如果修改的内容涉及到内核模块,请一并更新根文件系统。

7.5. rootfs分区

rootfs分区中保存了系统的根文件系统,它包含了Linux运行所需的基本目录结构、系统库、驱动模块以及用户空间程序。 在内核启动完成后,系统会将rootfs挂载为根目录,从而提供运行环境,使用户空间的服务与应用程序能够正常启动和运行。

rootfs分区中的部分内容依赖于特定内核版本,如果更新rootfs分区,建议一并更新kernel分区。

如果要单独更新rootfs分区中的某个文件或程序,则可以使用U盘复制、网络传输登方式,新增或覆盖原有的文件。