FASTBOOT 异构 RAMDISK
在快启流程中,除了启动 BOOT、KERNEL 阶段的性能优化,还有启动到内核中 ROOTFS 加载速度提升。
SDK 支持异构 RAMDISK 模式,相较于传统快启 RAMDISK 模式,异构 RAMDISK 通过异构系统,加速 RAMDISK 的读取和解压启动。并且保证系统的独立与并行。
传统快启 RAMDISK 的加载流程如下
- BOOT 初始化 FLASH,加载内核和 RAMDISK
- 加载后将 FLASH 驱动,DMA 参数保存到预留内存,跳转进入内核
- Linux 在初始化阶段,启动一个内核线程使用 BOOT 阶段预留的 RAMDISK 压缩的地址,开始解压,使用硬件或软件解压
- 解压后启动 RAMDISK 中的应用程序,执行应用

传统快启 RAMDISK 的缺点也 很明显,需要内核参与,需要预留内存给 RAMDISK 使用,RAMDISK 需要打包在一起,OTA 更新 KERNEL 的时候也需要 OTA RAMDISK。
异构 RAMDISK 通过最大化系统资源,在 BOOT 阶段就启动双核系统,单独使用一个核心操作 FLASH 进行 RAMDISK 的读取解压操作,此时内核无需调度解压读取,当 RAMDISK 解压完成的同时通知内核可以挂载 RAMDISK,此时直接启动 RAMDISK 中的应用程序。
其优点如下:
- 无需魔改内核,增加解压线程
- 复用内核 RAMDISK 流程,对于内核来说与主线标准 RAMDISK 无差异
- RAMDISK 可以放到分区上,支持直接
dd命令 OTA 更新 RAMDISK - SDK 配置简单,SDK 支持自动打包 RAMDISK,支持 Quick Config 一键切换

异构 RAMDISK 功能配置
Linux 端相关配置
设备树预留内存配置
首先设备树需要配置 RAMDISK 的预留内存,与标准配置无异
linux,initrd-start = <0x47800000>;
linux,initrd-end = <0x48000000>;
预留内存的大小需要参考 RAMDISK 的大小,一般布局如下:
举个例子,RAMDISK 的大小是 6M,经过 LZ4 压缩后的大小是 2M,所以这里需要配置总共 8M 内存
- RAMDISK 解压后的数据:
0x47800000~0x47e00000 - RAMDISK 压缩后的数据:
0x47e00000~0x48000000 - 设备树预留内存的配置:
0x47800000~0x48000000
这部分内存在内核加载完成 RAMDISK 后会释放,所以不需要担心这部分内存有浪费或者无法被使用到
如果系统使用多媒体内存池,建议将 RAMDISK 的地址安排到多媒体内存池之前,多媒体内存池是从内存末尾申请的,如果内存末尾配置了 RAMDISK,则会导致多媒体内存池占用在内存中部,造成内存碎片化。一般建议可释放的内存连续排布,释放后可以改善内存碎片化的情况。
如下图,多媒体内存池占用了 32M 的内存,则按照之前的排布修改如下
- RAMDISK 解压后的数据:
0x45800000~0x45e00000 - RAMDISK 压缩后的数据:
0x45e00000~0x46000000 - 设备树预留内存的配置:
0x45800000~0x46000000

设备树驱动配置
对于使用 RAMDISK 的情况,一般来说存储控制器驱动加载就可以延后了,因为存储控制器驱动比较占用启动时间,需要通讯识别等操作。所以推荐对于系统存储的控制器节点配置为 deferred-device,例如这里将 SPIF 控制器配置为 deferred-device

内核选项配置
内核还需要配置启用 RAMDISK 功能
CONFIG_BLK_DEV_INITRD
配置位于
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

由于不需要内核解压 RAMDISK,所以下面的 RAMDISK 压缩配置可以全部取消。
# CONFIG_RD_GZIP is not set
# CONFIG_RD_BZIP2 is not set
# CONFIG_RD_LZMA is not set
# CONFIG_RD_XZ is not set
# CONFIG_RD_LZO is not set
# CONFIG_RD_LZ4 is not set
# CONFIG_RD_ZSTD is not set
配置异构 RAMDISK 内核服务模块
CONFIG_AW_PARALLEL_RAMDISK=y
CONFIG_AW_RAMDISK_DELAYINIT_RPROC_NAME="6010000.e907_rproc"
内核配置选项是
General setup --->
[*] Parallel decompress ramdisk
(6010000.e907_rproc) Ramdisk Delay Init Rproc Name

备注
这里的 Ramdisk Delay Init Rproc Name 配置的名字是异构核心的名字,可以在系统启动后运行
ls /dev/rpmsg_ctrl*

这里的 e907_rproc@06010000 就是异构核心的名字,填入的时候需要改一下格式,改为 6010000.e907_rproc 即可
如果不方便启动系统看配置,可以检查内核设备树 bsp/configs/linux-6.6-xuantie/sun252iw1p1.dtsi

:::
RTOS 端功能配置
异构 RAMDISK 的主要操作基本上在 RTOS 端,所以 RTOS 端的配置需要更加注意。
配置 RTOS 存储驱动
SPI NOR 存储驱动配置
Drivers Options --->
soc related device drivers --->
AW Flash Drivers --->
[*] Tina Flash Read
Select Storage Type (SPINOR) --->
[*] Flash Wait for Flag
(0) Flash Wait RTC Data Index
(2) Flash Wait RTC Data Bit
(4064) Flash GPT Offset
(128) Flash Boot Package Offset
存储配置驱动项如下:
CONFIG_DRIVERS_AW_FLASH_READ=y
CONFIG_DRIVERS_AW_FLASH_READ_SPINOR=y
# CONFIG_DRIVERS_AW_FLASH_READ_EMMC is not set
# CONFIG_DRIVERS_AW_FLASH_READ_SPINAND is not set
CONFIG_DRIVERS_AW_FLASH_WAIT_FLASH=y
CONFIG_DRIVERS_AW_FLASH_WAIT_FLASH_WAIT_INDEX=0
CONFIG_DRIVERS_AW_FLASH_WAIT_FLASH_WAIT_BIT=2
# CONFIG_DRIVERS_AW_FLASH_WRITE is not set
CONFIG_DRIVERS_AW_FLASH_GPT_OFFSET=4064
CONFIG_DRIVERS_AW_FLASH_BOOTPKG_OFFSET=128
# CONFIG_DRIVERS_AW_FLASH_DEBUG is not set
# CONFIG_DRIVERS_AW_FLASH_USE_HWLOCK is not set

- 选择
CONFIG_DRIVERS_AW_FLASH_READ驱动 - 配置使用的 FLASH 类型,这里选择 SPI NOR
- 配置
[*] Flash Wait for Flag,设置 FLASH 的等待标志,这里按默认即可 - 配置 FLASH 的 GPT OFFSET,配置需要与 FLASH MAP 一致,需要找到
uboot-board.dts中的flash_map参考下图配置即可
