2. Kria硬件架构与启动链路
Kria SOM(System-on-Module)的核心是一颗Zynq UltraScale+ MPSoC。理解Kria平台工程,第一步不是写代码,而是把芯片内部的处理系统(PS)与可编程逻辑(PL)划分、各处理器核的职责,以及从上电到Linux内核的完整启动链路看清楚。只有建立了这张"硬件地图",后续的固件烧录、启动模式配置、设备树修改才有明确的落点。
PS与PL:一颗芯片里的两个世界
Zynq UltraScale+ MPSoC把处理系统(Processing System,PS)和可编程逻辑(Programmable Logic,PL)集成在同一硅片上。PS是"固定"的硬核部分,包含应用处理单元(APU)、实时处理单元(RPU)、平台管理单元(PMU)、内存控制器、外设控制器等;PL则是可用HDL或HLS描述的FPGA逻辑资源,包括可编程逻辑单元、DSP切片、Block RAM以及大量可编程IO。
两者并非彼此孤立。PS与PL之间通过AXI接口互联:PS可作为AXI主设备访问PL中的IP寄存器,PL也可作为主设备通过AXI HP/HPC端口直接读写DDR。这种双向通路是Kria上"软件控制硬件加速器"的物理基础。在Kria KV260等载板上,PL侧通常承载视觉流水线、AI推理加速器或自定义接口,而PS侧运行Ubuntu/Linux,负责调度、网络、存储与上层应用。
Cortex-A53与Cortex-R5F:分工明确的四加二
APU内部是四核Arm Cortex-A53,主频可达1.5GHz,支持64位、带MMU和NEON,是运行Linux应用处理器(APU)的主力。RPU则是双核Cortex-R5F,主频约600MHz,支持锁步(lockstep)或分离模式,具备确定性中断响应,适合实时控制、安全监控和低延迟任务。
在典型Kria Linux系统中,A53承担Linux内核、根文件系统、用户态服务;R5F往往运行裸机或RTOS固件,处理电机控制、传感器采集、安全关断等对时序敏感的工作。PMU是一个独立的微控制器,负责电源域、时钟和复位管理,并在启动早期参与固件加载。三者通过片上互联与共享内存协作,而不是简单地"谁替代谁"。
启动链路:BootROM → FSBL → U-Boot → Linux
Zynq MPSoC的启动是分阶段接力的。上电复位后,首先执行的是片内固化的BootROM。BootROM代码不可修改,它根据启动模式引脚(MODE[3:0])决定从哪个介质读取第一阶段引导程序。BootROM只做最少的事:配置基本时钟、读取启动头、把FSBL镜像搬入片上内存(OCM),然后跳转执行。
FSBL(First Stage Boot Loader)是用户可定制的第一阶段引导程序,通常由Vitis或PetaLinux工具生成。它承担关键初始化:配置DDR控制器、建立时钟树、加载PL比特流(bitstream)、根据分区表把U-Boot和PMU固件搬入DDR。FSBL执行完毕后跳转到U-Boot。
U-Boot是功能完整的引导加载器,负责加载Linux内核镜像(Image或fitImage)、设备树(DTB)和初始RAM盘,并向内核传递启动参数(bootargs)。在Kria上,U-Boot还负责从QSPI、eMMC或SD读取这些镜像。内核启动后初始化驱动、挂载根文件系统,最终由init进程拉起用户空间服务。
启动模式选择与拨码配置
Kria SOM通过MODE[3:0]引脚决定启动介质。以KV260为例,载板上通常有拨码开关或配置电阻。常见模式编码如下(具体以对应SOM的硬件手册为准):
| MODE[3:0] | 启动介质 | 典型用途 |
|---|---|---|
| 0000 | JTAG | 调试、裸机下载 |
| 0010 | QSPI | 默认固件启动 |
| 0101 | SD | 开发调试、快速迭代 |
| 0110 | eMMC | 量产部署 |
实际配置时,先确认载板拨码开关的ON方向对应逻辑1还是0,再按上表设置。例如要让KV260从SD卡启动,需将MODE[3:0]设为0101。若拨码与预期不符,BootROM会尝试从错误介质读取,表现为串口无输出或反复复位。此时应核对硬件手册中的拨码定义,而不是盲目修改软件。
启动介质的选择策略
QSPI容量小但可靠,适合存放FSBL、U-Boot和恢复镜像;eMMC容量大、读写快,适合量产时存放完整系统;SD卡可插拔,适合开发阶段频繁更换镜像。工程实践中常见做法是:QSPI存放"引导固件+恢复系统",eMMC或SD存放"主系统"。这样即使主系统损坏,也能通过QSPI恢复。
在PetaLinux或Kria Ubuntu中,启动镜像通常打包为BOOT.BIN(含FSBL、PMU固件、U-Boot、bitstream)和image.ub(含内核、DTB、rootfs)。BOOT.BIN写入QSPI或eMMC的引导分区,image.ub写入对应介质的数据分区。理解这一分区关系,才能在启动失败时快速定位是引导固件问题还是内核/根文件系统问题。