启动流程
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 01/31/2024 | |
1.1 | 06/07/2024 |
关键字说明¶
CM4:芯片额外搭载ARM Cortex-M4低功耗内核
VMM:virtual machine monitor,虚拟机监控器
WFE:wait for event,等待外部事件
cx:core x
TTFF:time to first frame,第一帧出流的时间
TTCL:time to console line,到 linux 命令行的时间
1. 概述¶
为了适应市场需求和满足广泛的应用新场景,sigmastar iford 系列芯片跟进前沿的硬件设计和软件技术,从芯片设计层面满足用户对安全性、实时性、低功耗、高性能的要求。
-
该系列芯片搭载双核ARM Cortex-A32内核,支持Trustzone,以确保关键资源(内存、中断、IP等)得到保护,不受潜在的安全风险侵害。
-
该系列芯片额外搭载ARM Cortex-M4低功耗内核,结合实际应用场景,由CM4处理和过滤事件,减少整机上电时长,满足需要省功耗、长续航的产品要求。
-
软件设计上提供secure boot支持,能够在系统启动过程中验证和加载经过认证的软件,从而有效地防止篡改flash软件和抄袭flash软件。
-
软件设计上引入VMM(virtual machine monitor)管理cpu和硬件资源,隐藏底层物理硬件,让多个操作系统(linux+freertos)可以透明地使用和共享硬件资源。
-
支持Sensor earlyinit,设备上电后以最快的速度初始化sensor和采集图像,不需要等到操作系统启动完就能够快速录制图像,满足需要快速抓图的产品要求。
Sigmastar提供的SDK开发包里包含多image defconfig,用户根据产品形态和方案需求选择一种合适的image配置即可。不同的image defconfig打包不同的功能镜像,对应的软件boot flow也不同,本文对常见的几种boot flow进行说明。
本文档所介绍的启动流程场景默认开启security boot同时包括OP-TEE、PM_RTOS和earlyinit fw(如果支持)。若用户当前场景没有开启trustzone、cm4 、earlyinit、signature&verify image 可自行忽略对应图示,流程图和结构框图的正确性不受影响。
如果需要了解nor/nand/emmc等存储分区的划分,以及nand启动过程跳bad block逻辑和跳备份分区逻辑。请参考文档《系统分区》。
如果需要了解boot flow过程中xz和ssz解压原理和过程,请参考文档《XZDEC使用参考》。
不同应用场景的image配置defconfig和编译命令,请参考文档《环境搭建》。
本文档默认sigmastar对启动流程的内存划分合理且不冲突,不对boot flow过程加载地址和运行地址进行额外说明。
2. image defconfig说明¶
SDK的image defconfig位于project/configs/defconfigs/目录下,以ipc-rtos_iford.spinand.glibc-11.1.0-ramdisk.ssc029a.512.bga12_ddr4_hyp_ptree_defconfig为例:
defconfig字段 | 说明 |
---|---|
product(产品) | ipc、ipc-rtos、usbcam |
boot medium(启动介质) | nor、spinand、emmc |
rootfs type(根文件系统类型) | ramfs、ramdisk、squashfs、ext4fs |
DDR size(DDR 大小) | |
package(芯片封装类型) | bag12、bag11、qfn128、qfn256 |
software feature(软件特征) | hyp、optee、cm4_demo、ptree、str |
3. 典型场景boot flow¶
根据armv8架构定义,系统的执行状态分为两个世界:用于运行可信任软件的secure world和运行不可信软件的non-secure world。同时又将32位处理器模式分成三种特权等级,分别为:PL0,PL1,PL2。
3.1. 场景一¶
该场景是ipc/usbcam product的boot flow:non-secure world只运行linux一个os,NS.PL2(hypervisor层)不需要运行VMM。
SMF(secure monitor firmware):在系统启动流程中负责完成对CPU monitor mode的初始化设定以及GIC的初始化设定。SMF并没有独立的分区,而是内嵌在IPL binary image里。
3.2. 场景二¶
该场景是ipc/usbcam product的boot flow且为了加快进入linux cmdline,rootfs类型为ramfs:non-secure world只运行linux一个os,NS.PL2(hypervisor层)不需要运行VMM,并且boot flow跳过uboot由IPL_CUST直接启动linux,减少上电后开进linux cmdline的时长。
3.3. 场景三¶
该场景是ipc-rtos product的boot flow:non-secure world PL2(hypervisor层)运行VMM,主要掌管interrupt和CPU调度,同一个core上运行 rtos + linux双系统时,rtos优先调度,空闲CPU再让出给linux使用。双系统场景同时具有rtos的轻量、快启动和Linux系统的通用可扩展特性。
Earlyinit fw的作用是:尽可能早的阶段设置sensor和VIF模块开始工作,boot flow过程中VIF output同步缓存sensor raw image data。直至non-secure world rtos启动后,rtos task创建video pipeline出视频流数据。VIF模块先将缓存的raw image传递给video pipeline,之后才是实时sensor采集raw image数据。
IPL_CUST加载VMM并从IPL_CUST跳转执行VMM过程,会从ENV里取出bootargs_hyp作为cmdline_tag传递给VMM。bootargs_hyp = vmm_size=0x00200000 vmm_limit_size=0x20000000 vm0_en=1 vm1_en=1 vm0_online_map=0x02 vm1_online_map=0x0F vm0_master=1 vm1_master=0 vm0_entry=0x3E308000。各字段含义如下:
-
vm0_en=1:使能VM0,目前在VMM里写死VM0启动rtos。
-
vm1_en=1:使能VM1,目前在VMM里写死VM1启动linux。
-
vm0_online_map=0x02:指定vm0运行在core1
-
vm1_online_map=0x0F:指定vm1运行在core0~1
-
vm0_master=1:vm0主要跑在core1
-
vm1_master=0:vm1主要跑在core0
-
vm0_entry=0x3E308000: vmm的入口地址如果不由vmm image header指定,则会根据vm0_entry指定。
VMM加载rtos并从VMM跳转执行rtos过程,会从ENV里取出bootargs_rtos作为cmdline_tag传递给rtos。bootargs_rtos = rtos_size=0x0100000 limit_dram_size=0x20000000 mma_base=0x28000000 mma_size=0x16300000 rtosrd_addr=0x3ED00000 rtosrd_size=0x120000 rtosts_addr=0x3EC00000 rtosts_size=0x800 rtos_master=1 loglevel=3。各字段含义如下:
-
rtos_size=0x0100000:指定rtos系统内存大小
-
limit_dram_size=0x40000000:指定rtos dram总大小配置
-
mma_base=0x28000000 mma_size=0x16300000:指定rtos使用的MMA起始地址和MMA大小
-
rtosrd_addr=0x3ED00000 rtosrd_size=0x120000 fs占用ddr的起始地址和大小
-
rtosts_addr=0x3EC00000 rtosts_size=0x800 存放rtos启动参数的struct tags占用ddr的起始地址和大小
-
loglevel=3:指定rtos os打印等级,打印等级取值范围[0,7],数值越大打印等级越高
3.4. 场景四¶
该场景是ipc-rtos product的boot flow,与场景三的差异在于,IPL根据GPIO状态发现电平为低即不运行earlyinit fw,并且IPL_CUST会去加载uboot image到ddr,最终跳转到uboot工作。由bootcmd的设置决定PL2要不要加载VMM,以及non-secure world加载哪些os。
例如uboot先完成加载rtos & linux & vmm,由vmm根据bootargs_hyp启动dualos:setenv bootcmd 'loados nand by_header MISC by_header; loados nand by_header RTOS by_header;bootm start{loados_addr};bootm loados;bootm prep; loados nand by_header RAMDISK by_header; loados nand by_header KERNEL by_header;bootm start;bootm loados;bootm prep; mtdparts add nand0 0x20000@0X00260000 VMM; loados nand by_header VMM by_header;dcache off;bootm${loados_addr} bypass_vm_load;'
3.5. 场景五¶
该场景是ipc-rtos product的boot flow(LH bootflow mode),与场景三(hyp bootflow mode)的差异在于:LH bootflow mode 没有vmm实现的hypervisor层,ns-world只能跑一个os,因此linux跑在ns-world PL1,rtos跑在s-world PL1,LH bootflow 没有optee。
此外,因启动流程中 Sensor Earlyinit 阶段的不同,还会分叉出两种流程:
流程1:
该流程 Sensor Earlyinit 会在 IPL 阶段就开始 bringup,并且 RTOS 不需要访问 flash。Core0 在 IPL_CUST load 完 RTOS,会将存放配置文件的 MISC 分区(分区名为MISC_RTOS)直接 load 到 ddr 上面(该做法又被称为 RAMFS),然后 core1 负责启动 rtos,core0 马上去 load linux 和 rootfs。
优点:可以让 TTFF/TTCL 速度做到极致
缺点:IPL CUST 没有 OS 相关接口,EarlyInit 的开发以及维护难度较大
流程2:
该流程 Sensor Earlyinit 会在 RTOS 阶段进行 bringup,并且 RTOS 会对 flash 进行访问。Core0 在 IPL_CUST load 完 RTOS 之后,会将core1 唤醒去 boot rtos,然后马上进入 wfe 状态。Core1 在 Rtos 运行过程阶段,确定 flash 使用完毕之后,释放 flash 的使用权并唤醒 core0。此时,core0 会接着处理 load linux 跟 rootfs 的流程。
优点:使用 RTOS 的接口进行开发以及维护,EarlyInit 的开发难度将大大降低
缺点:TTFF 以及TTCL 速度稍慢
注意:该流程对应的 IPL 带有配置 WAIT_RTOS_FLASH_ACCESS=y 以及 LOAD_RTOS_RAMFS=n,RTOS 也需要开启对应的 FLASH 配置以及CONFIG_RTOS_FLASH_ACCESS_DONE_WAKEUP 选项。