Zephyr 在 NXP Layerscape LS1046A RDB 上的构建、启动与 SMP/Jailhouse 多核实战指南
Zephyr 在 NXP Layerscape LS1046A RDB 上的构建、启动与 SMP/Jailhouse 多核实战指南【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr本指南以 Zephyr 仓库中 NXP LS1046A 参考设计板LS1046ARDB的板级文档 boards/nxp/ls1046ardb/doc/index.rst 为核心系统讲解该板卡的硬件能力、Zephyr 板级支持包BSP结构、三种 CPU 核配置非 SMP、双核 SMP、四核 SMP的构建与 U-Boot 启动方法以及将 Zephyr 作为 Jailhouse inmate 单元运行的多核虚拟化实践。读完本文你将能够在 LS1046A RDB 上独立完成 Zephyr 镜像的构建、加载、多核调试与 Jailhouse 部署。板卡与处理器概览LS1046A RDBReference Design Board是 NXP 推出的高性能计算、评估与开发平台面向 Layerscape LS1046A 架构处理器设计针对 DDR4 内存与一整套高速 SerDes 端口进行了优化。Layerscape LS1046A 处理器集成四颗 64 位 Arm Cortex-A72 内核并带有包处理加速packet processing acceleration与高速外设。其宣称性能超过 32,000 CoreMarks搭配 10 Gb 以太网、PCIe Gen. 3、SATA 3.0、USB 3.0 与 QSPI 接口适用于企业级与运营商级的网络、存储、安全与工业应用场景。在 Zephyr 源码树中该板卡的标识符为ls1046ardbSoC 为ls1046a属于nxp,layerscape家族板级配置声明见 boards/nxp/ls1046ardb/board.ymlboard: name: ls1046ardb full_name: LS1046A RDB vendor: nxp socs: - name: ls1046a variants: - name: smp variants: - name: 4coresboard.yml清晰展示了本板卡的多变体组织结构基础形态为ls1046ardb单核非 SMP其下派生ls1046ardb/ls1046a/smp双核 SMP与ls1046ardb/ls1046a/smp/4cores四核 SMP两个变体。硬件特性清单LS1046A RDB 板卡支持以下硬件特性类别详细规格CPU四颗 32/64 位 Arm Cortex-A72V8 架构最高 1.6 GHz 内核主频内存8 GB DDR4 SDRAM存储SDHC 端口直连适配卡插槽板载 4 GB eMMC一颗 512 MB SLC NAND Flash1.8 V带 ECC两颗 64 MB 板载 QSPI NOR FlashCPLD8 位寄存器用于配置 mux/demux 选择USB两个 USB 3.0 控制器集成 PHY一个 Type A 主机口、一个 Micro-AB 的 OTG 口另有一个 USB 2.0 连接至 miniPCIe 插槽以太网Lane 2/Lane 3 支持 SGMII 1G PHY支持带 XFI retimer 的 SFP 模块支持 AQR106/107 10G PHYXFI/2.5G SGMIIPCIe 与 SATAMini PCIe x1Gen1/2/3、两块标准 PCIe x1Gen1/2/3、一个 SATA 3.0 连接器板级支持包结构与三套 CPU 变体LS1046A RDB 的 BSP 位于 boards/nxp/ls1046ardb核心文件包括设备树.dts非 SMP、SMP 双核、SMP 四核各一份defconfigls1046ardb_ls1046a_defconfig、ls1046ardb_ls1046a_smp_defconfig、ls1046ardb_ls1046a_smp_4cores_defconfig元数据.yaml声明板卡标识、架构、工具链与 RAM 大小。三份.yaml元数据声明了各自的形态ls1046ardb_ls1046a.yamlidentifier: ls1046ardb单 CPU 核NON-SMPls1046ardb_ls1046a_smp.yamlidentifier: ls1046ardb/ls1046a/smp运行于 Core2 与 Core3ls1046ardb_ls1046a_smp_4cores.yamlidentifier: ls1046ardb/ls1046a/smp/4cores运行于全部四个 CPU 核。三者均为arch: arm64、type: mcu、ram: 1024KB工具链支持zephyr与cross-compile。设备树如何限定 CPU 数量三个变体的 CPU 核数量通过设备树中的节点删除机制实现均以 dts/arm64/nxp/nxp_ls1046a.dtsi 为基础展开非 SMP 变体 ls1046ardb_ls1046a.dts 使用/delete-node/ cpu0; /delete-node/ cpu1; /delete-node/ cpu2;删除三个 CPU 节点仅保留单个 CPUSMP 双核变体 ls1046ardb_ls1046a_smp.dts 删除cpu0与cpu1保留 Core2 与 Core3SMP 四核变体 ls1046ardb_ls1046a_smp_4cores.dts 不做删除保留全部四个核。三个变体都统一将控制台绑定到 UARTchosen中zephyr,console与zephyr,shell-uart指向uart1波特率 115200。需要注意板级文档在Supported Features一节中说明板上有 uart1 与 uart2 两个串口并声明 Zephyr 使用 uart2 作为串口控制台而当前仓库中的设备树将zephyr,console指向uart1实际以源码中的控制台绑定为准串口接线时建议两个口都做确认。另外非 SMP 变体设备树中还通过/delete-node/ psci;移除了 PSCI 节点这与该变体不启用多核电源管理 ops 的配置相呼应。defconfig 的关键配置以四核 SMP 变体 ls1046ardb_ls1046a_smp_4cores_defconfig 为例平台层配置为CONFIG_ARM64_VA_BITS_40y CONFIG_ARM64_PA_BITS_40y CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC25000000 CONFIG_XIPn CONFIG_AARCH64_IMAGE_HEADERy CONFIG_MAX_THREAD_BYTES5 CONFIG_MAX_XLAT_TABLES10 CONFIG_SMPy CONFIG_MP_MAX_NUM_CPUS4 CONFIG_CACHE_MANAGEMENTy CONFIG_ARMV8_A_NSy CONFIG_PM_CPU_OPSy CONFIG_SERIALy CONFIG_UART_INTERRUPT_DRIVENy CONFIG_CONSOLEy CONFIG_UART_CONSOLEy要点解读CONFIG_SMPy与CONFIG_MP_MAX_NUM_CPUS4开启四核对称多处理双核变体 ls1046ardb_ls1046a_smp_defconfig 中该值为2CONFIG_PM_CPU_OPSy使能 CPU 电源管理 opsPSCI 支持CONFIG_XIPn表示不从 Flash 就地执行镜像加载到 DDR 后运行板卡无片内 XIP FlashSoC 级 Kconfig 中FLASH_SIZE与FLASH_BASE_ADDRESS均为 0见 soc/nxp/layerscape/ls1046a/Kconfig.defconfigCONFIG_AARCH64_IMAGE_HEADERy生成 AArch64 镜像头便于引导器识别系统时钟按 25 MHz 硬件周期配置CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC25000000这是板级时钟源决定的。非 SMP 变体 ls1046ardb_ls1046a_defconfig 则没有 SMP、PSCI、cache management 等相关项。构建与启动三种运行模式1. 非 SMP 模式单核使用synchronization示例构建单核镜像示例源码位于 samples/synchronizationwest build -b ls1046ardb samples/synchronization构建产物为zephyr.bin。在 U-Boot 控制台将镜像加载到 DDR 地址0xc0000000并跳转至 Core0 执行tftp c0000000 zephyr.bin; dcache off; dcache flush; icache flush; icache off; go 0xc0000000;也可以将 Zephyr 启动到其他任意 CPU 核例如在 Core3 上运行tftp c0000000 zephyr.bin; dcache off; dcache flush; icache flush; icache off; cpu 3 release 0xc0000000;控制台输出示例*** Booting Zephyr OS build zephyr-v2.5.0-1922-g3265b69d47e7 *** thread_a: Hello World from cpu 0 on nxp_ls1046ardb! thread_b: Hello World from cpu 0 on nxp_ls1046ardb! thread_a: Hello World from cpu 0 on nxp_ls1046ardb!2. SMP 模式四核Core0–Core3构建命令需要带上完整变体标识west build -b ls1046ardb/ls1046a/smp/4cores samples/synchronization同样通过 U-Boot 将镜像加载到0xc0000000并从 Core0 启动tftp c0000000 zephyr.bin; dcache off; dcache flush; icache flush; icache off; go 0xc0000000;启动时内核会依次唤醒次级核输出中可见各核的 MPID 信息*** Booting Zephyr OS build zephyr-v2.5.0-1922-g3265b69d47e7 *** Secondary CPU core 1 (MPID:0x1) is up Secondary CPU core 2 (MPID:0x2) is up Secondary CPU core 3 (MPID:0x3) is up thread_a: Hello World from cpu 0 on nxp_ls1046ardb! thread_b: Hello World from cpu 1 on nxp_ls1046ardb! thread_a: Hello World from cpu 0 on nxp_ls1046ardb!从输出可以看出synchronization示例的thread_b被调度到了 cpu 1Core1上运行直观验证了 SMP 调度在多核间的负载分布。3. SMP 模式双核Core2 与 Core3构建双核镜像west build -b ls1046ardb/ls1046a/smp samples/synchronization这一次让 U-Boot 将 Zephyr 释放到 Core2 上启动注意cpu 2 release与上文go的区别tftp c0000000 zephyr.bin; dcache off; dcache flush; icache flush; icache off; cpu 2 release 0xc0000000;控制台输出*** Booting Zephyr OS build zephyr-v2.5.0-1922-g3265b69d47e7 *** Secondary CPU core 1 (MPID:0x3) is up thread_a: Hello World from cpu 0 on nxp_ls1046ardb! thread_b: Hello World from cpu 1 on nxp_ls1046ardb! thread_a: Hello World from cpu 0 on nxp_ls1046ardb!双核变体在设备树中仅保留cpu2与cpu3两个节点因此即使 U-Boot 从 Core2 启动内核感知到的cpu 0即物理 Core2cpu 1即物理 Core3MPID 0x3与设备树限定完全吻合。无论哪种模式都建议在跳转前执行dcache off; dcache flush; icache flush; icache off确保缓存一致性并避免镜像中的脏数据干扰执行。在 Jailhouse inmate Cell 中运行 ZephyrLS1046A RDB 支持将 Zephyr 作为 Jailhouse hypervisor 的 inmate 单元运行。此时需要按以下原则配置 Jailhouse若使用 Zephyr 非 SMP 单核镜像inmate Cell 应配置为使用单个 Core若使用 Zephyr SMP 双核镜像inmate Cell 应配置为使用 Core2 与 Core3。操作步骤如下使用 root Cell 的设备树引导 root Cell Linux安装并加载 Jailhouse 内核模块modprobe jailhouse使能 Jailhouse创建并启动 Zephyr inmate 单元jailhouse enable ls1046a-rdb.cell jailhouse cell create ls1046a-rdb-inmate-demo.cell jailhouse cell load 1 zephyr.bin --address 0xc0000000 jailhouse cell start 1其中jailhouse enable接管硬件资源cell create依据ls1046a-rdb-inmate-demo.cell的资源配置划分出隔离的内存与设备域cell load 1将zephyr.bin装入 inmate 地址空间0xc0000000cell start 1启动该单元。Zephyr 侧需要与 Jailhouse 的 cell 配置保持地址、中断与外设映射一致才能在该隔离环境中正常运行。镜像加载方式FlashingZephyr 镜像可以存放在多种介质上由 U-Boot 统一加载到 DDR 地址0xc0000000再启动SD 卡通过 SDHC 适配卡插槽eMMC 亦可读取镜像QSPI NOR Flash从板载 QSPI NOR Flash 读取镜像网络通过 TFTP 从网络服务器下载镜像即上文tftp c0000000 zephyr.bin的方式。U-Boot 负责将存储介质中的zephyr.bin搬运到 DDR并配合go/cpu N release命令完成内核跳转。调试方法LS1046A RDB 板卡板载一个 JTAG 连接器可连接CodeWarrior TAP进行调试。典型调试流程为通过 JTAG 连接宿主机与目标板使用 CodeWarrior 的调试器加载zephyr.elf设置断点并单步跟踪内核启动与多核唤醒流程。多核调试时可结合上文控制台中的Secondary CPU core N (MPID:0xM) is up输出验证各核的启动时序与调度行为。参考与延伸阅读板卡官方资料NXP 的《Layerscape LS1046A Reference Design Board》产品页与《LS1046A Reference Manual》可在 NXP 官网检索获取用于深入了解 SerDes 配置、内存映射与 JTAG 细节板级支持包源码boards/nxp/ls1046ardb设备树、defconfig、元数据SoC 级支持soc/nxp/layerscape/ls1046a 与 soc/nxp/layerscape/Kconfig.socSOC_LS1046A定义与 SOC 家族选择示例程序samples/synchronization线程同步与多核调度演示板级文档通用页脚boards/common/board-footer.rst.inc。本文涉及的构建命令默认在 Linux 主机、已安装 Zephyr SDK 与 west 工具链的环境下执行zephyr.bin的运行地址0xc0000000与 U-Boot 的 tftp 加载地址需保持一致且跳转前务必完成缓存关闭/刷新操作这是 LS1046A RDB 上稳定启动 Zephyr 的关键前提。【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考