跳到主要内容

A1000域控制器

本文详细介绍 AxVisor + Linux 客户机在 A1000 域控制器上的构建、部署及运行!

开发环境

本文中的构建及部署环境均采用 Ubuntu 22.04 作为开发环境。

获取源代码

  1. 创建工作目录
mkdir ~/a1000-project
cd ~/a1000-project
  1. 克隆必需仓库
# 克隆 AxVisor Hypervisor 源码
git clone https://github.com/arceos-hypervisor/axvisor.git

# 克隆 A1000 内核和工具源码
git clone https://github.com/arceos-hypervisor/bst-a1000.git
  1. 验证目录结构

执行成功后,目录结构应如下:

仓库目录

构建

构建 Linux 客户机镜像

客户机镜像是运行在 AxVisor Hypervisor 之上的 Linux 操作系统内核。

  1. 进入项目目录并赋予内核文件夹执行权限:

    cd ~/a1000-project/bst-a1000
    sudo chmod -R 755 ./kernel/
  2. 配置内核

    使用交叉编译工具链配置内核,根据需要选择 release 或 debug 版本:

    # Release 版本
    make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build_bst \
    bsta1000b_release_defconfig CC=aarch64-linux-gnu-gcc-9

    # 或 Debug 版本
    make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build_bst \
    bsta1000b_debug_defconfig CC=aarch64-linux-gnu-gcc-9

    配置内核

  3. 编译内核

    执行多线程编译,加速构建过程:

    make CROSS_COMPILE=aarch64-linux-gnu- \
    ARCH=arm64 \
    O=build_bst \
    -j$(nproc) \
    CC=aarch64-linux-gnu-gcc-9

    提示:-j$(nproc) 参数会自动使用所有可用的 CPU 核心进行并行编译

    编译过程

  4. 验证编译产物

    编译成功后,内核镜像文件位于:

    # 检查内核镜像是否生成
    ls -lh build_bst/arch/arm64/boot/Image

    # 查看镜像大小和时间戳
    file build_bst/arch/arm64/boot/Image

构建 AxVisor 镜像

以下以 A 核为例演示构建过程,若使用 B 核,请相应调整配置文件和 DTB 文件。\

步骤 1:编译客户机设备树

1.1 准备设备树源文件

AxVisor 源码的 configs/vms 目录下提供了适用于 A1000 域控制器的设备树源文件:

  • A 核linux-aarch64-a1000-smp8-fada.dts
  • B 核linux-aarch64-a1000-smp8-fadb.dts
1.2 编译设备树

客户机设备树文件记录了传递给客户机的硬件设备信息(CPU、内存、外设等),这些信息必须与客户机配置文件保持一致

使用 dtc 工具编译设备树:

# 编译 A 核设备树
cd ~/a1000-project/axvisor/configs/vms
dtc -I dts -O dtb \
-o linux-aarch64-a1000-smp8-fada.dtb \
linux-aarch64-a1000-smp8-fada.dts

提示:若使用 B 核,请将文件名替换为 linux-aarch64-a1000-smp8-fadb.dts


步骤 2:配置客户机参数

2.1 选择配置文件

AxVisor 源码的 configs/vms 目录下提供了配置文件模板:

configs/vms/linux-aarch64-a1000_smp8.toml

客户机配置文件记录了以下信息:

  • 客户机 ID 和基本信息
  • 镜像及设备树的加载位置
  • CPU 核心分配
  • 内存大小
  • 设备资源等等
2.2 选择镜像加载方式

AxVisor 支持两种客户机镜像加载方式,根据使用场景选择合适的方式:

加载方式配置参数路径类型
从文件系统加载image_location = "fs"域控制器文件系统中的绝对路径
从内存加载image_location = "memory"本地构建环境中的绝对路径
2.3 编辑配置文件

打开配置文件 configs/vms/linux-aarch64-a1000-smp8.toml,根据选择的加载方式进行配置:

方式一:从文件系统加载

# 镜像加载方式
image_location = "fs"

# 内核镜像加载地址
kernel_load_addr = 0x1_ce80_0000
# 内核镜像在域控制器文件系统中的路径
kernel_path = "/guest/Image"

# 设备树加载地址
dtb_load_addr = 0x1_cef0_0000
# 设备树在域控制器文件系统中的路径
dtb_path = "/guest/linux-aarch64-a1000-smp8-fada.dtb"

配置说明:

  • kernel_path:指向域控制器中部署的客户机内核镜像(对应前面编译的 build_bst/arch/arm64/boot/Image
  • dtb_path:指向域控制器中部署的设备树文件(对应步骤 1 编译的 .dtb 文件)

方式二:从内存加载

# 镜像加载方式
image_location = "memory"

# 内核镜像加载地址
kernel_load_addr = 0x1_ce80_0000
# 内核镜像在本地构建环境中的路径
kernel_path = "./Image"

# 设备树加载地址
dtb_load_addr = 0x1_cef0_0000
# 设备树在本地构建环境中的路径
dtb_path = "./configs/vms/linux-aarch64-a1000-smp8-fada.dtb"

配置说明:

  • kernel_path:使用相对路径时,需将客户机内核镜像复制到 AxVisor 根目录
  • dtb_path:指向本地编译生成的设备树文件
  • 镜像将在编译时嵌入到 AxVisor 镜像中

重要提示:

  • 若使用 B 核,将 dtb_path 修改为 linux-aarch64-a1000-smp8-fadb.dtb
  • 其他配置项(如 CPU、内存等)可根据需求修改,未修改的配置项将使用默认值

步骤 3:编译 AxVisor 镜像

cd ~/a1000-project/axvisor
./axvisor.sh build \
--plat aarch64-generic \
--arceos-args "LOG=off,SMP=8" \
--vmconfigs "configs/vms/linux-aarch64-a1000-smp8.toml"

参数说明:

  • --plat:指定目标平台为 AArch64 通用平台
  • --arceos-args:ArceOS 参数配置(日志级别、SMP 核心数等)
  • --vmconfigs:客户机配置文件路径

验证编译结果

ls -lh axvisor_aarch64-generic.bin

# 查看文件信息
file axvisor_aarch64-generic.bin

步骤 4:生成可烧写镜像

4.1 配置镜像描述文件 (ITS) ITS 文件 (Image Tree Source) 定义了如何将多个组件打包成一个可启动的 FIT 镜像。

cd ~/a1000-project/bst-a1000

# 编辑 A 核 ITS 配置文件
vim a1000b/bsta1000b-fada-arceos.its

4.2 修改文件路径 需要修改三个关键路径:

images {
kernel {
description = "ArceOS for BST A1000B";
data = /incbin/("../../../axvisor/axvisor_aarch64-generic.bin");
...

fdt-fada {
description = "bsta1000b-fada fdt";
data = /incbin/("../../bst_dt/bsta1000b-fada.dtb");
...

fdt-fadb {
description = "bsta1000b-fadb fdt";
data = /incbin/(../../bst_dt/bsta1000b-fadb.dtb");
...

路径配置说明

需要修改的 data 字段包括:

  1. Axvisor 内核镜像路径
   data = /incbin/("../../../axvisor/axvisor_aarch64-generic.bin");
  • 指向 AxVisor 编译生成的二进制镜像文件
  • 默认相对路径为 AxVisor 根目录下的 axvisor_aarch64-generic.bin
  1. A 核设备树路径
   data = /incbin/("../../bst_dt/bsta1000b-fada.dtb");
  • 替换为 A 核 Host 设备树的实际路径
  • 示例:"/home/username/workspace/bst-al000/bsta1000b-fada.dtb"
  1. B 核设备树路径
   data = /incbin/("../../bst_dt/bsta1000b-fadb.dtb");
  • 替换为 B 核 Host 设备树的实际路径
  • 示例:"/home/username/workspace/bst-al000/bsta1000b-fadb.dtb"

重要提示:

  • 所有路径必须使用绝对路径或相对于 bst-al000 目录的相对路径
  • 确保所有文件路径真实存在,否则 mkimage 打包将失败
  • 路径中不能包含中文字符或特殊字符

修改完成后保存文件,即可进行下一步的镜像打包操作。

使用 mkimage 工具生成最终的可烧写镜像文件:

cd ~/a1000-project/bst-a1000
./a1000b/mkimage \
-f ./a1000b/bsta1000b-fada-arceos.its \
Image.itb

编译成功后,将在当前目录生成 Image.itb 镜像文件。


部署

替换 Host 设备树

1. 准备工作

  • 使用串口调试线将域控制器与上位机连接
  • 确保已安装并配置好 ADB 调试工具
  • 建议使用 Linux 主机进行操作

2. 配置串口监控

使用 picocom 连接串口以监控设备输出:

picocom -b 115200 --imap lfcrlf /dev/ttyUSB0 

重要:若操作涉及不同的 CPU 核心(A 核/B 核),请切换至对应的串口:

  • A 核 → 串口 0(/dev/ttyUSB0
  • B 核 → 串口 1(/dev/ttyUSB1

3. 挂载存储设备

进入设备的 Shell 环境并挂载启动分区:

adb shell
mount /dev/mmcblk0p1 /mnt

4. 推送设备树文件

在上位机终端执行以下命令,将新的 Host 设备树文件推送至域控制器:

# 推送 A 核设备树
adb push ~/a1000-project/bst-a1000/bst_dt/bsta1000b-fada.dtb /mnt/bsta1000b-fada.dtb

# 推送 B 核设备树
adb push ~/a1000-project/bst-a1000/bst_dt/bsta1000b-fadb.dtb /mnt/bsta1000b-fadb.dtb

烧写 AxVisor 镜像

1. 准备工作

确保已完成上一步的设备树替换,并准备好编译生成的 Image.itb 镜像文件。

2. 配置串口监控

使用 minicom 连接对应的串口:

sudo minicom -D /dev/ttyUSB0 -b 115200

重要:根据目标 CPU 核心选择正确的串口(A 核用 ttyUSB0,B 核用 ttyUSB1)。

3. 挂载存储设备

进入设备的 Shell 环境并挂载启动分区:

adb shell
mount /dev/mmcblk0p1 /mnt

4. 推送镜像文件

在上位机终端执行以下命令,将新的内核镜像推送至域控制器:

adb push ~/a1000-project/bst-a1000/Image.itb /mnt/Image.itb

5. 重启设备

传输完成后,按以下步骤重启设备:

  1. 断电:切断设备电源
  2. 等待:断电后等待 4-5 秒
  3. 上电:重新接通电源启动设备

警告:切勿立即重启,必须等待足够时间以确保写入操作完全完成。


注意事项

⚠️ 内核替换失败恢复

若内核替换失败或烧写了不兼容的系统(如 ArceOS),可通过 U-Boot 恢复模式恢复:

  1. 设备上电启动时,快速按下 Ctrl + C 进入 U-Boot 命令行
  2. 依次输入以下三条命令进入恢复模式:
setenv rollback 'ext4load mmc 0:2 0x85000000 /uEnv.txt;env import -t 0x85000000 $filesize;setenv boot_rollback 1;run bootcmd_cmd;reset;'
saveenv
run rollback
  1. 系统将回滚到上一个可用版本,完成后可重新烧写内核

⚠️ A 核与 B 核切换注意事项

黑芝麻 A1000 平台存在 A 核B 核两种不同的 SoC 核心,进行核心操作时请注意:

目标核心ADB 连接端口串口设备设备树文件
A 核A 核对应的 ADB 端口/dev/ttyUSB0bsta1000b-fada.dtb
B 核B 核对应的 ADB 端口/dev/ttyUSB1bsta1000b-fadb.dtb

关键要点

  • 切换 ADB 端口时,必须同步切换对应的串口以正确显示输出
  • 确保使用正确的设备树文件和配置文件

⚠️ 断电重启注意事项

  • 断电后必须等待 4-5 秒再重新上电
  • 过快重启可能因断电保护机制导致镜像替换失败
  • 建议在串口监控下观察启动过程,确认系统正常启动