TC2(Total Compute 2022)是Arm推出的高性能计算平台参考设计,采用多核Cortex-A/X系列处理器架构,广泛应用于边缘计算和嵌入式场景。OpenEuler Embedded作为开源嵌入式Linux发行版,其技术价值主要体现在三个方面:首先,通过内核模块化裁剪(如EXT2/EXT3文件系统动态加载)实现最小5MB的内存占用;其次,提供Yocto/OE构建系统支持,可定制化程度高;最后,内置实时性补丁和安全性增强模块,适合工业级应用。
在硬件适配层面,TC2平台的特殊性在于其混合计算架构——既包含应用处理器集群(如Cortex-A520),又集成实时协处理器(如Cortex-M85)。这种异构设计对嵌入式系统提出两个核心要求:一是需要支持多级启动流程(BL1→BL2→BL33),二是要处理不同异常级别(EL3/EL2/EL1)的安全隔离。OpenEuler Embedded通过TF-A引导适配和virtio设备驱动,完美匹配这些需求。
实测在Ubuntu 22.04 LTS环境下最稳定,需安装以下关键组件:
bash复制sudo apt-get install -y python3 python3-pip docker.io git-lfs
sudo systemctl enable docker --now
sudo usermod -aG docker $USER # 当前用户加入docker组
newgrp docker # 立即生效组权限
特别注意:docker.sock权限问题会导致后续oebuild失败,若遇到权限错误可临时执行:
sudo chmod 777 /var/run/docker.sock
Arm官方GNU工具链的13.2版本与OpenEuler Embedded兼容性最佳:
bash复制wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf arm-gnu-toolchain-*.tar.xz -C /opt
echo 'export PATH=/opt/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH' >> ~/.bashrc
验证工具链有效性:
bash复制aarch64-none-linux-gnu-gcc --version
# 应输出类似:aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 13.2.Rel1 (Build arm-13.7)) 13.2.1 20231009
oebuild是OpenEuler Embedded的专用构建工具,基于Yocto深度定制。初始化时建议选择国内镜像加速:
bash复制pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple
pip install oebuild -U
mkdir -p ~/oe_workspace && cd ~/oe_workspace
oebuild init --mirror=gitee # 使用Gitee镜像仓库
oebuild update
初始化完成后,目录结构如下:
code复制oe_workspace/
├── build/ # 构建目录
├── src/ # 源码仓库
│ ├── openeuler/ # 元仓库
│ └── yocto-meta-openeuler/
└── .oebuild/ # 配置缓存
OpenEuler Embedded 6.6内核的默认配置需针对TC2平台做三项关键修改:
diff复制# 启用EXT2/EXT3作为根文件系统
-CONFIG_EXT2_FS=n
+CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y
CONFIG_VALIDATE_FS_PARSER=y # 增强文件系统安全性校验
bash复制make menuconfig # 交互式配置
# 确保以下选项启用:
# - Device Drivers → Virtio drivers → Virtio block device
# - Kernel Features → ARM Virtualization → Support for ARM Virtualization Extensions
bash复制export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-
make openeuler_defconfig
make -j$(nproc) Image # 生成内核镜像
编译产物路径:arch/arm64/boot/Image,建议保留此文件用于后续FVP部署。
通过oebuild生成QEMU镜像作为基础:
bash复制cd ~/oe_workspace
oebuild generate -p qemu-aarch64 -d build_arm64
cd build/build_arm64
oebuild bitbake openeuler-image
构建成功后会生成关键文件:
code复制output/[timestamp]/
├── openeuler-image-qemu-aarch64-*.rootfs.cpio.gz # 根文件系统
└── deploy-rpms/ # RPM软件包
TC2平台需要EXT3格式的磁盘镜像,转换步骤如下:
bash复制mkdir -p ~/tc2_rootfs && cd ~/tc2_rootfs
gzip -d openeuler-image-qemu-aarch64-*.rootfs.cpio.gz
cpio -idm < *.rootfs.cpio
bash复制# 修改主机名标识
echo "tc2-fvp" > etc/hostname
sed -i 's/qemu-aarch64/tc2-fvp/g' etc/hosts
# 关闭SSH服务(TC2初始环境可能无网络)
chmod -x etc/init.d/sshd
bash复制dd if=/dev/zero of=openeuler_fs.img bs=1M count=1024
mkfs.ext3 -F openeuler_fs.img
mkdir -p /mnt/tc2_rootfs
mount -o loop openeuler_fs.img /mnt/tc2_rootfs
cp -a ~/tc2_rootfs/* /mnt/tc2_rootfs/
umount /mnt/tc2_rootfs
经验提示:镜像大小建议≥1GB,否则可能因inode不足导致部署失败。可通过
dumpe2fs openeuler_fs.img | grep "Inode count"验证。
TC2通过U-Boot传递内核参数,关键修改点在fvp.cfg:
diff复制- CONFIG_BOOTARGS="... root=/dev/mmcblk0p1"
+ CONFIG_BOOTARGS="console=ttyAMA0 root=/dev/vda1 rw nokaslr"
- CONFIG_BOOTDELAY=1
+ CONFIG_BOOTDELAY=0 # 快速启动
参数说明:
root=/dev/vda1:对应virtio-blk设备映射nokaslr:禁用地址随机化,方便内核调试console=ttyAMA0:指定串口输出设备Arm Fixed Virtual Platform (FVP) 是TC2的官方仿真器,启动命令示例:
bash复制./run_model.sh -m /path/to/FVP_TC2 \
-d openeuler \
--data $WORKSPACE/Image@0x80000 \
-C board.virtioblockdevice.image_path=openeuler_fs.img
成功启动后,串口会输出如下时序日志:
code复制[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] Linux version 6.6.0 (oe-user@oe-host) (aarch64-none-linux-gnu-gcc...)
[ 0.000000] Machine model: FVP_TC2
[ 0.000000] virtio_blk virtio0: [vda] 2097152 512-byte logical blocks (1.07 GB/1.00 GiB)
[ 1.234567] EXT3-fs (vda1): mounted filesystem with ordered data mode
原因:通常因设备树或启动参数不匹配导致
解决方案:
bash复制printenv bootargs
bash复制load virtio 0:1 $kernel_addr_r Image
booti $kernel_addr_r - $fdt_addr_r
现象:内核报错"VFS: Unable to mount root fs"
排查步骤:
bash复制file openeuler_fs.img # 应显示"Linux rev 1.0 ext3 filesystem data"
bash复制zcat /proc/config.gz | grep EXT3
解决方法:启用TAP网络设备
bash复制sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
./run_model.sh ... -n tap0
通过GDB调试内核时,需注意TC2的多级异常层级:
bash复制# EL2级别调试(MMU关闭)
add-symbol-file vmlinux EL2N:0x800078200000
# EL1级别调试(MMU启用)
add-symbol-file vmlinux EL1N:0
bash复制make menuconfig
# 选择 Kernel Features → Kernel compression mode → LZMA
bash复制echo 1 > /sys/devices/system/cpu/cpu*/cpuidle/state*/disable
在OpenEuler Embedded上开发TC2专属应用时,推荐使用SDK工具链:
bash复制oebuild bitbake -c populate_sdk openeuler-image
./tmp/deploy/sdk/openeuler-glibc-x86_64-openeuler-image-aarch64-toolchain-*.sh
官方资源:
开发工具:
社区支持:
通过本指南的全流程实践,开发者可掌握从源码构建到平台部署的完整技能栈。在实际项目中,建议结合具体应用场景对文件系统进行深度定制(如添加实时性补丁或安全模块),充分发挥TC2硬件与OpenEuler Embedded的技术优势。