4. 开发环境与交叉编译工具链搭建

在 Ryzen Embedded 平台上做实时 Linux 开发,第一步不是写代码,而是把“主机—工具链—BSP—目标板”这条链路搭通。Ryzen Embedded(如 V1000、V2000、R1000 系列)是 x86-64 架构,这一点与常见的 ARM 嵌入式开发有本质区别:交叉编译在严格意义上并非必需,因为主机与目标机同为 x86-64。但工程实践中我们仍然推荐使用与目标系统 ABI 一致的工具链,原因在于 glibc 版本、内核头文件、编译器优化选项和实时补丁的匹配问题。本节围绕 Ubuntu 主机配置、构建系统选择、AMD BSP 获取以及内核与根文件系统的交叉编译展开。

一、Ubuntu 主机环境准备

推荐使用 Ubuntu 22.04 LTS(Jammy)作为开发主机,其 glibc 2.35 与主流 Yocto 4.x 版本兼容良好。主机需要预留至少 120 GB 磁盘空间(Yocto 的 build 目录和 sstate 缓存增长很快),内存建议 16 GB 以上,编译内核时 8 GB 会频繁触发 swap。基础依赖安装如下:

sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential \
  chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
  iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
  pylint xterm zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

其中 chrpath、socat、cpio 是 Yocto 构建的硬性依赖,缺失会在 do_populate_sdk 阶段报错。locales 用于避免 bitbake 解析时的编码告警。若使用 Buildroot,依赖可精简为 build-essential git bc bison flex libssl-dev libncurses-dev 等。

二、Yocto 与 Buildroot 的选择

两者都能产出内核、根文件系统和 SDK,但定位不同。Buildroot 是“一次配置、一次编译”的轻量方案,配置项集中在一个 .config,适合功能固定、迭代不频繁的实时设备;Yocto 基于 BitBake 和 Layer 机制,支持增量构建、配方复用和 SDK 导出,适合需要长期维护、多硬件变体、要交付完整 SDK 给应用团队的项目。

对 Ryzen Embedded 实时项目,判断依据可以归纳为:若需要 PREEMPT_RT 补丁与内核版本长期锁定、需要为第三方提供 meta-toolchain、需要 OTA 升级框架(如 RAUC、SWUpdate),选 Yocto;若只是快速验证一块板子的实时性能、根文件系统小于 200 MB、团队没有 Yocto 经验,选 Buildroot 更划算。本节后续以 Yocto 为主线,因为 AMD 官方 BSP 主要以 Yocto Layer 形式发布。

Ryzen Embedded 实时 Linux 开发链路 Ubuntu 22.04 主机 gawk / chrpath / socat python3 / cpio / zstd 磁盘 ≥120GB · 内存 ≥16GB locale: en_US.UTF-8 构建系统选择 Yocto / BitBake + Layer Buildroot 单配置 增量构建 · SDK 导出 · 多变体 AMD BSP 获取 meta-amd / meta-ryzen linux-yocto-rt 内核配方 git clone · 版本锁定 内核编译产物 bzImage vmlinux (带符号) *.dtb / ACPI 表 根文件系统 core-image-rt.ext4 systemd / busybox 实时调优参数 SDK 工具链 x86_64-poky-linux-gcc sysroot / 环境脚本 应用交叉编译入口 Ryzen Embedded 目标板 UEFI 引导 → bzImage + initrd → 根文件系统挂载 验证:uname -a · cyclictest · cat /sys/kernel/realtime 迭代反馈

三、AMD Ryzen Embedded BSP 获取

AMD 官方通过 meta-amd 层提供对 Ryzen Embedded 的支持,通常托管在 AMD 的 Git 服务器或 GitHub 镜像上。获取流程是:先克隆 poky(Yocto 参考发行版),再克隆 meta-amd 和 meta-openembedded,最后用 bitbake-layers add-layer 注册。关键命令如下:

git clone -b kirkstone git://git.yoctoproject.org/poky.git
git clone -b kirkstone git://git.openembedded.org/meta-openembedded
git clone -b kirkstone https://github.com/amd/meta-amd.git
cd poky
source oe-init-build-env build-ryzen
bitbake-layers add-layer ../../meta-openembedded/meta-oe
bitbake-layers add-layer ../../meta-amd/meta-ryzen

BSP 层中真正决定实时能力的是内核配方。AMD BSP 通常提供 linux-yocto-rt 的 bbappend,将 SRC_URI 指向带 PREEMPT_RT 补丁的内核源码,并通过 KERNEL_FEATURES 启用 cfg/preempt-rt.scc。在 local.conf 中需要显式指定:

PREFERRED_PROVIDER_virtual/kernel = "linux-yocto-rt"
LINUX_KERNEL_TYPE = "preempt-rt"
MACHINE = "ryzen-v1000"
RT_KERNEL_VERSION = "5.15"

这里 MACHINE 必须与 BSP 层中实际存在的 conf/machine/*.conf 名称一致,写错会在解析阶段直接报 “No such machine”。

四、交叉编译内核与根文件系统

Yocto 的构建命令是 bitbake core-image-rt,它会依次完成内核配置、编译、根文件系统打包和镜像生成。首次构建在 16 核机器上约需 40~90 分钟,产物位于 tmp/deploy/images/ryzen-v1000/。若只想单独编译内核以快速验证实时补丁是否生效,可以:

bitbake virtual/kernel -c menuconfig   # 调整配置
bitbake virtual/kernel -c compile -f   # 强制重编
bitbake virtual/kernel -c deploy       # 部署到 deploy 目录

根文件系统方面,core-image-rt 已包含 rt-tests(含 cyclictest)、stress-ng 和实时调优脚本。若需要精简,可在 local.conf 中通过 IMAGE_INSTALL:remove 裁剪不需要的包,或用 core-image-minimal 加 rt-tests 自行组合。构建完成后,用 bitbake core-image-rt -c populate_sdk 导出 SDK,安装后执行 source environment-setup-x86_64-poky-linux 即可获得交叉编译环境。

Ryzen Embedded 是 x86-64,SDK 中的 x86_64-poky-linux-gcc 与主机原生 gcc 架构相同,但 sysroot 指向目标根文件系统,因此链接的 glibc 和库版本与目标板一致。应用开发应始终使用 SDK 中的编译器,而非主机 /usr/bin/gcc,否则可能因 glibc 版本差异导致目标板运行时报 “GLIBC_2.35 not found”。

五、验证与常见问题

镜像烧录到目标板后,先确认内核是否带实时补丁:uname -a 输出中应含 PREEMPT_RT;cat /sys/kernel/realtime 应返回 1。随后运行 cyclictest -m -p 80 -n -i 1000 -l 100000,观察最大延迟。在 Ryzen V1000 上,合理配置下最大延迟通常在 30~80 微秒量级,若超过 200 微秒,需检查 BIOS 中的 C-State、SMT 和电源管理设置。

常见问题包括:bitbake 报 chrpath 缺失(补装依赖);MACHINE 名称不匹配(核对 BSP 层 machine 配置);内核编译时 do_patch 失败(检查 RT 补丁版本与内核版本是否对应);目标板启动卡在 UEFI(确认 bzImage 与 initrd 路径、启动参数 root= 是否正确)。把这条链路走通,后续的实时调优和应用开发才有稳定的基础。