Skip to content

Commit 6c45c9b

Browse files
committed
add a1000.md
1 parent e069f1f commit 6c45c9b

File tree

4 files changed

+370
-0
lines changed

4 files changed

+370
-0
lines changed

docs/quickstart/a1000.md

Lines changed: 370 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,370 @@
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+
![仓库目录](./imgs_a1000/image.png)
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+
![配置内核](./imgs_a1000/img-1.png)
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+
![编译过程](./imgs_a1000/img-2.png)
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+
- 建议在串口监控下观察启动过程,确认系统正常启动
302 KB
Loading
426 KB
Loading
308 KB
Loading

0 commit comments

Comments
 (0)