对于初次接触Arm架构的开发者来说,搭建一个完整的Linux开发环境可能会遇到不少挑战。以Armv8-A Base Platform FVP(Fixed Virtual Platform)为例,这是Arm官方提供的虚拟化开发平台,能够模拟基于Cortex-A57/A53的big.LITTLE架构。下面我将分享从零开始的环境搭建经验。
首先需要获取Arm Platforms交付件(Deliverables),这是Arm提供的预配置开发套件。最新版本可以通过Arm开发者网站获取,包含以下核心组件:
安装依赖包时特别需要注意版本兼容性。在Ubuntu 20.04 LTS上,以下命令可以安装所有必需依赖:
bash复制sudo apt-get install libncurses5-dev gcc-aarch64-linux-gnu \
device-tree-compiler flex bison libssl-dev
提示:建议使用LTS版本的系统作为开发主机,避免因工具链版本问题导致编译失败。我在实际项目中曾因使用非LTS系统导致dtc工具版本不兼容,浪费了大量排查时间。
Arm Platforms采用workspace的概念管理项目,初始化命令如下:
bash复制./arm-platforms-scripts/init_workspace.sh \
--platform fvp \
--type mobile_bb \
--kernel latest-armlt
这个命令会创建如下目录结构:
code复制workspace/
├── build-scripts/ # 构建脚本
├── linux/ # 内核源码
├── tools/ # 工具链
└── fvp-latest-busybox-uboot/ # 输出目录
在Arm平台上,硬件资源配置通过设备树(Device Tree)描述。以禁用Cortex-A53集群为例,需要修改fvp-base-revc.dts文件:
dts复制cpus {
#address-cells = <2>;
#size-cells = <0>;
cpu0: cpu@0 {
compatible = "arm,cortex-a57";
device_type = "cpu";
reg = <0x0 0x0>;
enable-method = "spin-table";
cpu-release-addr = <0x0 0x8000fff8>;
};
...
};
删除或注释掉cluster1及其关联的cpu节点(通常为cpu2-cpu5)
编译设备树:
bash复制dtc -I dts -O dtb -o fvp-base-revc.dtb fvp-base-revc.dts
验证修改效果:
bash复制ls /sys/devices/system/cpu
# 应只显示cpu0和cpu1(对应Cortex-A57)
传统kernel.org内核通过.config文件管理配置,而Arm Platforms采用更灵活的片段化配置(Configuration Fragments)机制。这种设计允许针对不同平台组合配置选项,其工作原理如下图所示:
code复制[基础配置] --+
+--> [合并工具] --> 最终.config
[平台配置] --+
bash复制cd <workspace>
./build-scripts/build-all.sh all
这个步骤会生成平台特定的源码目录,位于linux/out/fvp/mobile_bb/,其中包含合并后的.config文件。
进入平台特定目录进行配置:
bash复制cd linux/out/fvp/mobile_bb/
make ARCH=arm64 menuconfig
例如要启用KVM虚拟化支持:
Virtualization菜单Kernel-based Virtual Machine (KVM) supportbash复制make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
bash复制cd <workspace>
./build-scripts/build-all.sh package
重要经验:绝对不要直接运行
build-linux.sh package,这会导致自定义配置被覆盖。我在第一次尝试时犯了这个错误,导致所有修改丢失。
运行时检查内核配置:
bash复制zcat /proc/config.gz | grep CONFIG_KVM
对于模块化配置的选项,还可以检查:
bash复制lsmod | grep kvm
modinfo kvm
在Armv8架构上启用KVM需要满足以下条件:
内核配置:
CONFIG_KVM=yCONFIG_KVM_ARM_HOST=yCONFIG_VIRTUALIZATION=y硬件特性检查:
bash复制# 检查虚拟化扩展支持
cat /proc/cpuinfo | grep Features | grep hypervisor
bash复制modprobe kvm
modprobe kvm_arm
为Arm平台编译支持KVM的QEMU:
bash复制git clone git://git.qemu.org/qemu.git
cd qemu
mkdir build && cd build
../configure \
--target-list=aarch64-softmmu \
--enable-kvm \
--enable-fdt \
--static \
--audio-drv-list="" \
--disable-werror
make -j$(nproc)
常见问题处理:
memfd_create错误,修改util/memfd.c:c复制// 将函数名改为临时名称
static int tmp_memfd_create(const char *name, unsigned int flags)
{
...
}
准备启动镜像:
bash复制# 创建空白磁盘镜像
qemu-img create -f qcow2 guestfs.qcow2 8G
# 启动虚拟机(需提前准备好内核和initrd)
./qemu-system-aarch64 \
-machine virt,gic-version=3 \
-cpu host \
-enable-kvm \
-m 2048 \
-kernel Image \
-initrd ramdisk.img \
-drive if=none,file=guestfs.qcow2,id=hd \
-device virtio-blk-device,drive=hd \
-nographic \
-append "console=ttyAMA0 root=/dev/vda1 rw"
性能优化建议:
-cpu host暴露所有主机CPU特性-mem-prealloc选项bash复制-smp 4 \
-device virtio-net-device,netdev=net0 \
-netdev user,id=net0
现象:内核panic提示Unable to handle kernel NULL pointer dereference
fdtdump工具验证dtb文件compatible属性与驱动匹配现象:KVM启动失败
bash复制# 确认KVM设备存在
ls /dev/kvm
# 检查内核日志
dmesg | grep kvm
# 验证CPU虚拟化支持
cat /sys/module/kvm_arm/parameters/init_successful
bash复制# 设置CPU性能模式
echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 关闭地址空间随机化(开发环境)
echo 0 > /proc/sys/kernel/randomize_va_space
bash复制# 提高透明大页使用率
echo always > /sys/kernel/mm/transparent_hugepage/enabled
# 调整swappiness
echo 10 > /proc/sys/vm/swappiness
bash复制# 启用TSO/GSO
ethtool -K eth0 tso on gso on
# 调整网络缓冲区
sysctl -w net.core.rmem_max=4194304
sysctl -w net.core.wmem_max=4194304
对于需要深度定制内核的开发者,我建议:
git quilt管理补丁集bash复制git checkout -b kvm-optimization
# 进行修改...
git commit -a -m "优化KVM中断处理"
git format-patch HEAD~1
bash复制make -C tools/testing/selftests TARGETS=kvm install
bash复制#!/bin/bash
for i in {1..100}; do
./kvm_unit_test
if [ $? -ne 0 ]; then
echo "测试失败于第$i次迭代"
exit 1
fi
done
bash复制perf stat -e cycles,instructions,cache-misses ./test_program
perf record -g -- ./test_program
perf report
bash复制perf stat -e armv8_pmuv3_0/br_mis_pred/,\
armv8_pmuv3_0/l1d_cache_refill/ ./test_program
通过这套开发环境的实战搭建,我深刻体会到Arm平台的灵活性。特别是在处理big.LITTLE架构调度问题时,需要特别注意CPU拓扑结构的正确配置。建议开发者在修改设备树后,务必通过/sys/devices/system/cpu/下的文件验证实际生效的CPU配置。