|
| 1 | +--- |
| 2 | +title: "A1000域控制器" |
| 3 | +sidebar_label: "A1000域控制器" |
| 4 | +--- |
| 5 | + |
| 6 | +# A1000域控制器 |
| 7 | + |
| 8 | +本文详细介绍 AxVisor + Linux 客户机在 A1000 域控制器上的构建、部署及运行! |
| 9 | + |
| 10 | +## 开发环境 |
| 11 | + |
| 12 | +本文中的构建及部署环境均采用 Ubuntu 22.04 作为开发环境。 |
| 13 | + |
| 14 | +## 构建 |
| 15 | + |
| 16 | +### 构建 Linux 客户机镜像 |
| 17 | + |
| 18 | +#### 获取 SDK |
| 19 | + |
| 20 | +``` bash |
| 21 | +git clone git@github.com:arceos-hypervisor/bst-a1000.git |
| 22 | +``` |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | +#### 构建过程 |
| 27 | + |
| 28 | +1. 进入项目目录并赋予内核文件夹执行权限: |
| 29 | + ```bash |
| 30 | + cd bst-al000 |
| 31 | + sudo chmod -R 755 ./kernel/ |
| 32 | + ``` |
| 33 | + |
| 34 | +2. 配置内核 |
| 35 | + |
| 36 | + 使用交叉编译工具链配置内核,根据需要选择 release 或 debug 版本: |
| 37 | + ```bash |
| 38 | + # Release 版本 |
| 39 | + make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build_bst \ |
| 40 | + bsta1000b_release_defconfig CC=aarch64-linux-gnu-gcc-9 |
| 41 | +
|
| 42 | + # 或 Debug 版本 |
| 43 | + make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build_bst \ |
| 44 | + bsta1000b_debug_defconfig CC=aarch64-linux-gnu-gcc-9 |
| 45 | + ``` |
| 46 | + |
| 47 | +  |
| 48 | + |
| 49 | +3. 编译内核 |
| 50 | + |
| 51 | + 执行多线程编译,加速构建过程: |
| 52 | + ```bash |
| 53 | + make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build_bst \ |
| 54 | + -j$(nproc) CC=aarch64-linux-gnu-gcc-9 |
| 55 | + ``` |
| 56 | + |
| 57 | + > 提示:`-j$(nproc)` 参数会自动使用所有可用的 CPU 核心进行并行编译 |
| 58 | + |
| 59 | +  |
| 60 | + |
| 61 | +4. 编译产物 |
| 62 | + |
| 63 | + 编译成功后,内核镜像文件位于: |
| 64 | + ``` |
| 65 | + build_bst/arch/arm64/boot/Image |
| 66 | + ``` |
| 67 | + |
| 68 | +## 构建 AxVisor 镜像 |
| 69 | + |
| 70 | +以下以 **A 核**为例演示构建过程,若使用 B 核,请相应调整配置文件和 DTB 文件。 |
| 71 | +### 步骤 1:编译客户机设备树 |
| 72 | + |
| 73 | +#### 1.1 准备设备树源文件 |
| 74 | + |
| 75 | +AxVisor 源码的 `configs/vms` 目录下提供了适用于 A1000 域控制器的设备树源文件: |
| 76 | + |
| 77 | +- **A 核**:`linux-aarch64-a1000-smp8-fada.dts` |
| 78 | +- **B 核**:`linux-aarch64-a1000-smp8-fadb.dts` |
| 79 | + |
| 80 | +#### 1.2 编译设备树 |
| 81 | + |
| 82 | +客户机设备树文件记录了传递给客户机的硬件设备信息(CPU、内存、外设等),这些信息**必须与客户机配置文件保持一致**。 |
| 83 | + |
| 84 | +使用 `dtc` 工具编译设备树: |
| 85 | +```bash |
| 86 | +# 编译 A 核设备树 |
| 87 | +cd configs/vms |
| 88 | +dtc -I dts -O dtb \ |
| 89 | + -o linux-aarch64-a1000-smp8-fada.dtb \ |
| 90 | + linux-aarch64-a1000-smp8-fada.dts |
| 91 | +``` |
| 92 | + |
| 93 | +> **提示**:若使用 B 核,请将文件名替换为 `linux-aarch64-a1000-smp8-fadb.dts`。 |
| 94 | + |
| 95 | +--- |
| 96 | + |
| 97 | +### 步骤 2:配置客户机参数 |
| 98 | + |
| 99 | +#### 2.1 选择配置文件 |
| 100 | + |
| 101 | +AxVisor 源码的 `configs/vms` 目录下提供了配置文件模板: |
| 102 | +``` |
| 103 | +configs/vms/linux-aarch64-a1000_smp8.toml |
| 104 | +``` |
| 105 | +
|
| 106 | +客户机配置文件记录了以下信息: |
| 107 | +- 客户机 ID 和基本信息 |
| 108 | +- 镜像及设备树的加载位置 |
| 109 | +- CPU 核心分配 |
| 110 | +- 内存大小 |
| 111 | +- 设备资源等等 |
| 112 | +
|
| 113 | +#### 2.2 选择镜像加载方式 |
| 114 | +
|
| 115 | +AxVisor 支持两种客户机镜像加载方式,根据使用场景选择合适的方式: |
| 116 | +
|
| 117 | +| 加载方式 | 配置参数 | 路径类型 | |
| 118 | +|---------|---------|---------| |
| 119 | +| 从文件系统加载 | `image_location = "fs"` | 域控制器文件系统中的绝对路径 | |
| 120 | +| 从内存加载 | `image_location = "memory"` | 本地构建环境中的绝对路径 | |
| 121 | +
|
| 122 | +#### 2.3 编辑配置文件 |
| 123 | +
|
| 124 | +打开配置文件 `configs/vms/linux-aarch64-a1000-smp8.toml`,根据选择的加载方式进行配置: |
| 125 | +
|
| 126 | +**方式一:从文件系统加载** |
| 127 | +```toml |
| 128 | +# 镜像加载方式 |
| 129 | +image_location = "fs" |
| 130 | +
|
| 131 | +# 内核镜像加载地址 |
| 132 | +kernel_load_addr = 0x1_ce80_0000 |
| 133 | +# 内核镜像在域控制器文件系统中的路径 |
| 134 | +kernel_path = "/guest/Image" |
| 135 | +
|
| 136 | +# 设备树加载地址 |
| 137 | +dtb_load_addr = 0x1_cef0_0000 |
| 138 | +# 设备树在域控制器文件系统中的路径 |
| 139 | +dtb_path = "/guest/linux-aarch64-a1000-smp8-fada.dtb" |
| 140 | +``` |
| 141 | + |
| 142 | +**配置说明:** |
| 143 | +- `kernel_path`:指向域控制器中部署的客户机内核镜像(对应前面编译的 `build_bst/arch/arm64/boot/Image`) |
| 144 | +- `dtb_path`:指向域控制器中部署的设备树文件(对应步骤 1 编译的 `.dtb` 文件) |
| 145 | + |
| 146 | +--- |
| 147 | + |
| 148 | +**方式二:从内存加载** |
| 149 | +```toml |
| 150 | +# 镜像加载方式 |
| 151 | +image_location = "memory" |
| 152 | + |
| 153 | +# 内核镜像加载地址 |
| 154 | +kernel_load_addr = 0x1_ce80_0000 |
| 155 | +# 内核镜像在本地构建环境中的路径 |
| 156 | +kernel_path = "./Image" |
| 157 | + |
| 158 | +# 设备树加载地址 |
| 159 | +dtb_load_addr = 0x1_cef0_0000 |
| 160 | +# 设备树在本地构建环境中的路径 |
| 161 | +dtb_path = "./configs/vms/linux-aarch64-a1000-smp8-fada.dtb" |
| 162 | +``` |
| 163 | + |
| 164 | +**配置说明:** |
| 165 | +- `kernel_path`:使用相对路径时,需将客户机内核镜像复制到 AxVisor 根目录 |
| 166 | +- `dtb_path`:指向本地编译生成的设备树文件 |
| 167 | +- 镜像将在编译时嵌入到 AxVisor 镜像中 |
| 168 | + |
| 169 | +> **重要提示:** |
| 170 | +> - 若使用 B 核,将 `dtb_path` 修改为 `linux-aarch64-a1000-smp8-fadb.dtb` |
| 171 | +> - 其他配置项(如 CPU、内存等)可根据需求修改,未修改的配置项将使用默认值 |
| 172 | +
|
| 173 | +--- |
| 174 | + |
| 175 | +### 步骤 3:编译 AxVisor 镜像 |
| 176 | + |
| 177 | +```bash |
| 178 | +./axvisor.sh build \ |
| 179 | + --plat aarch64-generic \ |
| 180 | + --arceos-args "LOG=off,SMP=8" \ |
| 181 | + --vmconfigs "configs/vms/linux-aarch64-a1000-smp8.toml" |
| 182 | +``` |
| 183 | + |
| 184 | +参数说明: |
| 185 | +- `--plat`:指定目标平台为 AArch64 通用平台 |
| 186 | +- `--arceos-args`:ArceOS 参数配置(日志级别、SMP 核心数等) |
| 187 | +- `--vmconfigs`:客户机配置文件路径 |
| 188 | + |
| 189 | +### 步骤 4:生成可烧写镜像 |
| 190 | + |
| 191 | +切换到 `bst-al000` 目录,编辑镜像配置文件 `tools/a1000b/bsta1000b-fada-arceos.its`,修改以下数据路径: |
| 192 | +```its |
| 193 | +images { |
| 194 | + kernel { |
| 195 | + description = "ArceOS for BST A1000B"; |
| 196 | + data = /incbin/("../../axvisor_aarch64-generic.bin"); |
| 197 | + ... |
| 198 | +fdt-fada { |
| 199 | + description = "bsta1000b-fada fdt"; |
| 200 | + data = /incbin/("/home/yanlien/Workspace/project_check/a1000/host/bsta1000b-fada.dtb"); |
| 201 | + ... |
| 202 | +fdt-fadb { |
| 203 | + description = "bsta1000b-fadb fdt"; |
| 204 | + data = /incbin/("/home/yanlien/Workspace/project_check/a1000/host/bsta1000b-fadb.dtb"); |
| 205 | + ... |
| 206 | +``` |
| 207 | + |
| 208 | +**路径配置说明** |
| 209 | + |
| 210 | +需要修改的 `data` 字段包括: |
| 211 | + |
| 212 | +1. **Axvisor 内核镜像路径** |
| 213 | +```its |
| 214 | + data = /incbin/("../../axvisor_aarch64-generic.bin"); |
| 215 | +``` |
| 216 | + - 指向 AxVisor 编译生成的二进制镜像文件 |
| 217 | + - 默认相对路径为 AxVisor 根目录下的 `axvisor_aarch64-generic.bin` |
| 218 | + |
| 219 | +2. **A 核设备树路径** |
| 220 | +```its |
| 221 | + data = /incbin/("path/to/bsta1000b-fada.dtb"); |
| 222 | +``` |
| 223 | + - 替换为 A 核 Host 设备树的实际路径 |
| 224 | + - 示例:`"/home/username/workspace/bst-al000/bsta1000b-fada.dtb"` |
| 225 | + |
| 226 | +3. **B 核设备树路径** |
| 227 | +```its |
| 228 | + data = /incbin/("path/to/bsta1000b-fadb.dtb"); |
| 229 | +``` |
| 230 | + - 替换为 B 核 Host 设备树的实际路径 |
| 231 | + - 示例:`"/home/username/workspace/bst-al000/bsta1000b-fadb.dtb"` |
| 232 | + |
| 233 | +> **重要提示:** |
| 234 | +> - 所有路径必须使用**绝对路径**或相对于 `bst-al000` 目录的相对路径 |
| 235 | +> - 确保所有文件路径真实存在,否则 `mkimage` 打包将失败 |
| 236 | +> - 路径中不能包含中文字符或特殊字符 |
| 237 | +
|
| 238 | +切换到bst-al000目录下,把bsta1000b-fada-arceos.its文件中的 |
| 239 | + |
| 240 | +修改完成后保存文件,即可进行下一步的镜像打包操作。 |
| 241 | + |
| 242 | +使用 `mkimage` 工具生成最终的可烧写镜像文件: |
| 243 | +```bash |
| 244 | +./tools/a1000b/mkimage \ |
| 245 | + -f ./tools/a1000b/bsta1000b-fada-arceos.its \ |
| 246 | + Image.itb |
| 247 | +``` |
| 248 | + |
| 249 | +编译成功后,将在当前目录生成 `Image.itb` 镜像文件。 |
| 250 | + |
| 251 | +--- |
| 252 | + |
| 253 | +## 部署 |
| 254 | + |
| 255 | +### 替换 Host 设备树 |
| 256 | + |
| 257 | +#### 1. 准备工作 |
| 258 | + |
| 259 | +- 使用串口调试线将域控制器与上位机连接 |
| 260 | +- 确保已安装并配置好 ADB 调试工具 |
| 261 | +- **建议使用 Linux 主机**进行操作 |
| 262 | + |
| 263 | +#### 2. 配置串口监控 |
| 264 | + |
| 265 | +使用 `picocom` 连接串口以监控设备输出: |
| 266 | +```bash |
| 267 | +picocom -b 115200 --imap lfcrlf /dev/ttyUSB0 |
| 268 | +``` |
| 269 | + |
| 270 | +> **重要**:若操作涉及不同的 CPU 核心(A 核/B 核),请切换至对应的串口: |
| 271 | +> - A 核 → 串口 0(`/dev/ttyUSB0`) |
| 272 | +> - B 核 → 串口 1(`/dev/ttyUSB1`) |
| 273 | +
|
| 274 | +#### 3. 挂载存储设备 |
| 275 | + |
| 276 | +进入设备的 Shell 环境并挂载启动分区: |
| 277 | +```bash |
| 278 | +adb shell |
| 279 | +mount /dev/mmcblk0p1 /mnt |
| 280 | +``` |
| 281 | + |
| 282 | +#### 4. 推送设备树文件 |
| 283 | + |
| 284 | +在上位机终端执行以下命令,将新的 Host 设备树文件推送至域控制器: |
| 285 | +```bash |
| 286 | +# 推送 A 核设备树 |
| 287 | +adb push bsta1000b-fada.dtb /mnt/bsta1000b-fada.dtb |
| 288 | + |
| 289 | +# 推送 B 核设备树 |
| 290 | +adb push bsta1000b-fadb.dtb /mnt/bsta1000b-fadb.dtb |
| 291 | +``` |
| 292 | + |
| 293 | +--- |
| 294 | + |
| 295 | +### 烧写 AxVisor 镜像 |
| 296 | + |
| 297 | +#### 1. 准备工作 |
| 298 | + |
| 299 | +确保已完成上一步的设备树替换,并准备好编译生成的 `Image.itb` 镜像文件。 |
| 300 | + |
| 301 | +#### 2. 配置串口监控 |
| 302 | + |
| 303 | +使用 `minicom` 连接对应的串口: |
| 304 | +```bash |
| 305 | +sudo minicom -D /dev/ttyUSB0 -b 115200 |
| 306 | +``` |
| 307 | + |
| 308 | +> **重要**:根据目标 CPU 核心选择正确的串口(A 核用 ttyUSB0,B 核用 ttyUSB1)。 |
| 309 | +
|
| 310 | +#### 3. 挂载存储设备 |
| 311 | + |
| 312 | +进入设备的 Shell 环境并挂载启动分区: |
| 313 | +```bash |
| 314 | +adb shell |
| 315 | +mount /dev/mmcblk0p1 /mnt |
| 316 | +``` |
| 317 | + |
| 318 | +#### 4. 推送镜像文件 |
| 319 | + |
| 320 | +在上位机终端执行以下命令,将新的内核镜像推送至域控制器: |
| 321 | +```bash |
| 322 | +adb push Image.itb /mnt/Image.itb |
| 323 | +``` |
| 324 | + |
| 325 | +#### 5. 重启设备 |
| 326 | + |
| 327 | +传输完成后,按以下步骤重启设备: |
| 328 | + |
| 329 | +1. **断电**:切断设备电源 |
| 330 | +2. **等待**:断电后等待 **4-5 秒** |
| 331 | +3. **上电**:重新接通电源启动设备 |
| 332 | + |
| 333 | +> **警告**:切勿立即重启,必须等待足够时间以确保写入操作完全完成。 |
| 334 | +
|
| 335 | +--- |
| 336 | + |
| 337 | +## 注意事项 |
| 338 | + |
| 339 | +### ⚠️ 内核替换失败恢复 |
| 340 | + |
| 341 | +若内核替换失败或烧写了不兼容的系统(如 ArceOS),可通过 U-Boot 恢复模式恢复: |
| 342 | + |
| 343 | +1. 设备上电启动时,**快速按下 `Ctrl + C`** 进入 U-Boot 命令行 |
| 344 | +2. 依次输入以下三条命令进入恢复模式: |
| 345 | +```bash |
| 346 | +setenv rollback 'ext4load mmc 0:2 0x85000000 /uEnv.txt;env import -t 0x85000000 $filesize;setenv boot_rollback 1;run bootcmd_cmd;reset;' |
| 347 | +saveenv |
| 348 | +run rollback |
| 349 | +``` |
| 350 | + |
| 351 | +3. 系统将回滚到上一个可用版本,完成后可重新烧写内核 |
| 352 | + |
| 353 | +### ⚠️ A 核与 B 核切换注意事项 |
| 354 | + |
| 355 | +黑芝麻 A1000 平台存在 **A 核**和 **B 核**两种不同的 SoC 核心,进行核心操作时请注意: |
| 356 | + |
| 357 | +| 目标核心 | ADB 连接端口 | 串口设备 | 设备树文件 | |
| 358 | +|---------|------------|---------|-----------| |
| 359 | +| A 核 | A 核对应的 ADB 端口 | `/dev/ttyUSB0` | `bsta1000b-fada.dtb` | |
| 360 | +| B 核 | B 核对应的 ADB 端口 | `/dev/ttyUSB1` | `bsta1000b-fadb.dtb` | |
| 361 | + |
| 362 | +**关键要点**: |
| 363 | +- 切换 ADB 端口时,必须**同步切换对应的串口**以正确显示输出 |
| 364 | +- 确保使用正确的设备树文件和配置文件 |
| 365 | + |
| 366 | +### ⚠️ 断电重启注意事项 |
| 367 | + |
| 368 | +- 断电后**必须等待 4-5 秒**再重新上电 |
| 369 | +- 过快重启可能因断电保护机制导致镜像替换失败 |
| 370 | +- 建议在串口监控下观察启动过程,确认系统正常启动 |
0 commit comments