构建XEN on ARM开发环境

为了学习了解嵌入式虚拟化的技术,记录一下自己折腾的经历以及搭建验证开发环境的坑。


  • Target Platform: Rock960c
  • ARCH: arm64
  • Linux Kernel: linux-4.19.114

交叉编译工具

1
2
3
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz
mkdir toolchains
tar -xJf aarch64-linux-gnu/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz -C toolchains
  • 修改环境变量PATH,使工具方便使用

    1
    vim ~/.bashrc
  • 在文件末尾添加如下内容

    1
    export PATH=$PATH:/path/to/toolchains/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu/bin

    注意:根据实际情况,确保路径设置正确

  • 验证

    1
    aarch64-linux-gnu-gcc -v

    在终端会输出aarch64-linux-gnu-gcc的配置及版本信息

配置和编译XEN

下载xen-4.13.0源代码

1
2
git clone https://github.com/chasinglulu/xen.git -b rock960c-xen
cd xen

在上面的分支内我已经为Rock960C开发板支持了earlyprintk功能,方便后面我通过输出进行调试和分析。下面给你了使能earlyprinkt功能的补丁:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
commit 4c0e2f50c9114510c04ec42aeaffff9f15f51807
Author: chasinglulu <wangkartx@gmail.com>
Date: Sat Apr 18 20:18:57 2020 +0800

support earlyprintk for RK3399 SoC

diff --git a/xen/arch/arm/Rules.mk b/xen/arch/arm/Rules.mk
index 3d9a0ed..e989e9c 100644
--- a/xen/arch/arm/Rules.mk
+++ b/xen/arch/arm/Rules.mk
@@ -47,6 +47,7 @@ EARLY_PRINTK_vexpress := pl011,0x1c090000
EARLY_PRINTK_xgene-mcdivitt := 8250,0x1c021000,2
EARLY_PRINTK_xgene-storm := 8250,0x1c020000,2
EARLY_PRINTK_zynqmp := cadence,0xff000000
+EARLY_PRINTK_rk3399 := 8250,0xff1a0000,2

ifneq ($(EARLY_PRINTK_$(CONFIG_EARLY_PRINTK)),)
EARLY_PRINTK_CFG := $(subst $(comma), ,$(EARLY_PRINTK_$(CONFIG_EARLY_PRINTK)))

配置Hypervisor

1
2
cd xen
make menuconfig CROSS_COMPILE=aarch64-linux-gnu- XEN_TARGET_ARCH=arm64

enable_debugging_option

图1 启用debugging选项

编译Hypervisor

1
2
cd ../
make dist-xen CROSS_COMPILE=aarch64-linux-gnu- XEN_TARGET_ARCH=arm64 debug=y CONFIG_EARLY_PRINTK=rk3399

利用mkimage工具制作uboot能够启动加载的Image

1
mkimage -A arm64 -T kernel -a 0x02000000 -e 0x02000000 -C none -d ./xen/xen xen-4.13.0-uImage

至此,我们已经完成Xen的配置与编译,等下面的内核和文件系统编译生成后,我们就能够进行不断重复的调试验证过程。

构建dom0 kernel

获取内核源代码

1
2
3
4
git clone https://github.com/chasinglulu/linux.git -b longterm-4.19
cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- xen_dom0_rock960c_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8

运行调试

Bootloader

ARM64 Xen在被Bootload启动引导时必须要以EL2模式执行。Rock960C开发板默认携带的u-boot已经能友好地启动XEN,而且uboot也不是本文的重点,因此不再详细说明uboot的编译构建。如果要的话,使用Rockchip提供的rockchip-linux/u-boot github更新u-boot,构建方法参考rockchip-linux/u-boot github README

参考

Xen ARM with Virtualization Extensions/Ibox3399
Xen ARM with Virtualization Extensions