Skip to content

Commit 6e21eab

Browse files
authored
feat: support Kylin OS, and adapt to the latest compiler (#56)
1 parent 95c488c commit 6e21eab

8 files changed

Lines changed: 499 additions & 334 deletions

File tree

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
/site
1212

1313
### Rust ###
14-
**/esp
14+
**/esp*
1515
**/target
1616
**/Cargo.lock

docs/labs/0x01/tasks.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ unsafe {
182182
最后,你需要检验是否成功加载了内核:
183183

184184
- 使用 `make build DBG_INFO=true``python ysos.py build -p debug` 编译内核,确保编译时开启了调试信息。
185-
- 使用 `make debug``python ysos.py launch -d` 启动 QEMU 并进入调试模式,这时候 QEMU 将会等待 GDB 的连接。
185+
- 使用 `make debug``python ysos.py launch -d` 启动 QEMU 并进入调试模式,这时候 QEMU 将会等待 GDB 的连接。使用 Kylin OS 这样的系统作为开发环境时,可能会遇到 QEMU 报错 `Unknown protocol 'fat'`,请使用 python 脚本运行和调试内核,并在执行脚本的指令中添加参数 `--vvfat_disabled`,例如:`python ysos.py launch -d --vvfat_disabled`,详情请参考 [QEMU 使用参考](../../wiki/qemu.md)
186186
- 在另一个终端中,使用 `gdb -q` 命令进入 GDB 调试环境。
187187

188188
!!! note "使用 `.gdbinit` 方便你的调试过程"

docs/wiki/linux.md

Lines changed: 118 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,31 @@ Linux 是一个开源的类 Unix 操作系统内核,它是一个典型的多
66

77
本次操作系统实验的最终目标也是实现一个能够和用户进行命令行交互的操作系统,因此建议你多尝试使用命令行来完成实验。
88

9+
环境的准备工作主要包括:
10+
- 安装 Linux 系统
11+
- 需要安装和配置开发环境 (工具链)
12+
- Make: 构建脚本
13+
- Python: 构建脚本
14+
- QEMU: 提供虚拟硬件运行我们编写的 OS
15+
- gdb: 调试工具
16+
- gcc: Rust 开发环境的前置条件
17+
- Rust 开发环境及工具链
18+
- 检查工具版本,测试能否正常构建和调试
19+
20+
!!! tip "如果如下内容不足以让你完全配置好开发环境,可以参考 THU Rust 课程的 [环境配置](https://lab.cs.tsinghua.edu.cn/rust/environment/)"
21+
922
## 安装 Linux 系统
1023

11-
Linux 有许多发行版,这里出于环境一致性考虑,推荐使用 Ubuntu 24.04。
24+
Linux 有许多发行版,这里出于环境一致性考虑,推荐使用 Ubuntu 24.04**麒麟 Linux Advanced Server V11(Kylin OS)**
1225

1326
其他发行版(如 Debian,Arch,Kali)也可以满足实验需求,但**请注意内核版本、QEMU 版本都不应低于本次实验的参考标准**
1427

28+
!!! info "Kylin OS"
29+
30+
Kylin OS (银河麒麟高级服务器操作系统) 最初由国防科技大学主导研发,在中国 Linux 市场保持多年占有率第一名,广泛用于国内政府、企业和高校服务器环境,本实验对其提供完整支持。
31+
32+
麒麟 Linux Advanced Server V11 既支持 x86-64,也支持 **aarch64(ARM64)** 架构。对于 aarch64 平台的麒麟 OS,通过 `qemu-system-x86_64` 进行**跨架构模拟**,即可运行本实验构建的 x86-64 操作系统镜像。
33+
1534
### 使用 WSL2
1635

1736
对于 Windows 10/11 的用户来说,可以使用 WSL(Windows Subsystem Linux)来安装 Linux 系统,WSL 意为面向 Windows 的 Linux 子系统,微软为其提供了很多特性方便我们使用,我们可以在 Windows 上运行 Linux 程序。
@@ -47,91 +66,143 @@ wsl --install -d Ubuntu
4766

4867
你可以使用任何你喜欢的发行版,但请注意内核版本、QEMU 版本都不应低于实验的参考标准。
4968

50-
## 安装项目开发环境
51-
52-
在正确安装 Linux 系统后,需要安装和配置开发环境,包括 gcc, make, python, qemu 等。
69+
## 使用系统包管理器安装依赖
5370

54-
为了保障 Linux 软件源的正常、快速访问,请参考 [Ubuntu 软件仓库镜像使用帮助](https://help.mirrors.cernet.edu.cn/ubuntu/) 提供的文档进行软件源更换。
71+
=== "Kylin OS"
5572

56-
!!! note "校内镜像源"
73+
麒麟 OS 使用基于 RPM 体系的 `yum` / `dnf` 作为包管理器,二者本质上都是 `dnf-3` 的软链接,所以选择用哪一个没有区别,但更推荐使用现代化的 `dnf` 而不是为了兼容旧版本所保留的 `yum`。
5774

58-
我们还提供有**仅供校内、不确保一定可用**的内网镜像源:[Matrix 软件源镜像服务](https://mirrors.matrix.moe)
75+
```bash
76+
# 更新软件包缓存
77+
sudo dnf makecache
78+
79+
# 安装或更新
80+
sudo dnf install -y \
81+
gcc \
82+
gdb \
83+
make \
84+
mtools \
85+
python \
86+
qemu-system-x86_64
87+
```
5988

60-
请注意,使用上述镜像站会让你享受到更好的下载速度,但你同时也需要**承担不可用时带来的风险,并具有自主更换到其他镜像站的能力**。
89+
=== "Ubuntu"
6190

62-
1. 使用以下命令更新 apt 源并进行软件升级:
91+
Ubuntu 属于 Debian 系,使用 `apt` 作为包管理器。为了保障软件源的正常、快速访问,请参考 [Ubuntu 软件仓库镜像使用帮助](https://help.mirrors.cernet.edu.cn/ubuntu/) 提供的文档进行软件源更换。使用 [中山大学开源软件镜像加速服务](https://mirror.sysu.edu.cn) 可以在校内享受到更好的下载速度。
6392

6493
```bash
94+
# 更新 apt 源
6595
sudo apt update && sudo apt upgrade
96+
97+
# 安装或更新
98+
sudo apt install -y \
99+
build-essential \
100+
gdb \
101+
qemu-system-x86
66102
```
67103

68-
2. 安装 qemu 等工具:
104+
在安装完成后,请使用如下命令,确保你的相关软件包**不低于**如下标准:
105+
106+
=== "Kylin OS v11 (Swan25)"
107+
108+
这里使用 Kylin Linux Advanced Server V11 (Swan25) x86-64 提供参考值。
69109

70110
```bash
71-
sudo apt install qemu-system-x86 build-essential gdb
111+
$ qemu-system-x86_64 --version
112+
QEMU emulator version 8.2.0 (qemu-8.2.0-27.p11.ky11)
113+
114+
$ gcc --version
115+
gcc (GCC) 12.3.1 (kylin 12.3.1-62.p03.ky11)
116+
117+
$ gdb --version
118+
GNU gdb (GDB) KylinOS 14.1-2.p03.ky11
72119
```
73120

74-
3. 安装 rustup:
75-
76-
!!! note "rustup 安装过程中存在一些可配置选项,请按照默认选项进行安装。"
121+
=== "Ubuntu 24.04"
77122

78123
```bash
79-
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
80-
source "$HOME/.cargo/env"
124+
$ qemu-system-x86_64 --version
125+
QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.4)
126+
127+
$ gcc --version
128+
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0
129+
130+
$ gdb --version
131+
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
81132
```
82133

83-
!!! tip "如果遇到了网络问题,请参考 [rsproxy.cn](https://rsproxy.cn/) 进行配置。"
134+
=== "Ubuntu 22.04"
84135

85-
4. 按照仓库中的 `rust-toolchain` 文件,安装对应的 Rust 工具链。
136+
```bash
137+
$ qemu-system-x86_64 --version
138+
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.15)
86139

87-
!!! tip "第一次在拥有 `rust-toolchain.toml` 文件的目录下运行 `cargo` 命令时,Rustup 会自动安装对应的工具链。"
140+
$ gcc --version
141+
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
88142

89-
在安装完成后,请使用如下命令,确保你的相关软件包**不低于**如下标准:
143+
$ gdb --version
144+
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
145+
```
90146

91-
对于 Ubuntu 24.04:
147+
!!! warning "已知问题:aarch64 上的 GDB 调试"
92148

93-
```bash
94-
$ rustc --version
95-
rustc 1.92.0 (ded5c06cf 2025-12-08)
149+
在 aarch64 平台上,`gdb` 无法直接调试 x86-64 程序。如需调试,需要安装 `gdb-multiarch`:
96150

97-
$ rustc +nightly --version
98-
rustc 1.94.0-nightly (1107bbac4 2025-12-26)
151+
```bash
152+
# dnf 安装
153+
sudo dnf install gdb-multiarch
99154

100-
$ qemu-system-x86_64 --version
101-
QEMU emulator version 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.4)
155+
# apt 安装
156+
sudo apt install gdb-multiarch
102157

103-
$ gcc --version
104-
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0
158+
# 使用
159+
gdb-multiarch target/x86_64-unknown-uefi/debug/...
160+
```
105161

106-
$ gdb --version
107-
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
108-
```
162+
参考 [实验调试指南](./debug.md) 使用 QEMU 的 GDB stub 进行远程调试。
109163

110-
对于 Ubuntu 22.04:
164+
## 安装 Rust 开发环境与工具链
111165

112-
```bash
113-
$ rustc --version
114-
rustc 1.92.0 (ded5c06cf 2025-12-08)
166+
1. 安装 rustup:
115167

116-
$ rustc +nightly --version
117-
rustc 1.94.0-nightly (1107bbac4 2025-12-26)
168+
!!! note "rustup 安装过程中存在一些可配置选项,请按照默认选项进行安装。"
118169

119-
$ qemu-system-x86_64 --version
120-
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.15)
170+
```bash
171+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
172+
source "$HOME/.cargo/env"
173+
```
121174

122-
$ gcc --version
123-
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
175+
!!! tip "如果遇到了网络问题,请参考 [rsproxy.cn](https://rsproxy.cn/) 进行配置。"
124176

125-
$ gdb --version
126-
GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
127-
```
177+
2. 按照仓库中的 `rust-toolchain` 文件,安装对应的 Rust 工具链。
128178

129-
!!! tip "如果上述内容不足以让你完全配置好开发环境,可以参考 THU Rust 课程的 [环境配置](https://lab.cs.tsinghua.edu.cn/rust/environment/)"
179+
!!! tip "第一次在拥有 `rust-toolchain.toml` 文件的目录下运行 `cargo` 命令时,Rustup 会自动安装对应的工具链。"
180+
181+
3. 检查编译器版本**不低于**如下标准:
182+
183+
```bash
184+
$ rustc --version
185+
rustc 1.93.1 (01f6ddf75 2026-02-11)
186+
187+
$ rustc +nightly --version
188+
rustc 1.96.0-nightly (38c0de8dc 2026-02-28)
189+
```
130190

131191
## 验证工作
132192

133193
在安装完成之后,你应该能正常使用 `make``python` 命令,并用它们来运行项目的编译、运行脚本。
134194

195+
```bash
196+
cd src/0x00
197+
python3 ysos.py build # 或 make build
198+
```
199+
200+
!!! success "预期成功输出"
201+
202+
如果能够看到 `cargo build` 的编译输出,并在 `esp/` 目录下生成 `.efi` 文件,说明环境配置成功。
203+
204+
更完整地验证能否编译、运行、调试内核将在[实验一:操作系统的启动](../labs/0x01/tasks.md)中展开。
205+
135206
## 参考资料
136207

137208
你可以通过下面的一些链接来对命令行的使用进行学习,也可以把它们作为参考文档随用随取:

docs/wiki/qemu.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,24 @@ $ qemu-system-x86_64 -bios ./ovmf.fd -net none \
1111

1212
其中 `-bios` 指定了 UEFI 的固件,`-net none` 指定了网络设备,`-m` 指定了内存大小,`-drive` 指定了硬盘,`-nographic` 指定了不使用图形界面,转而将串口 IO 重定向到标准输入输出。
1313

14+
`-drive` 所指定的 `format=raw,file=fat:rw:./esp` 让虚拟机把宿主机上的一个普通**目录** `./esp` 伪装成一个 FAT 格式的虚拟硬盘挂载上去。这一技术被称为 vvfat (Virtual FAT)。使用 Kylin OS 这样的系统作为开发环境时,可能会遇到 QEMU 报错 `Unknown protocol 'fat'`,这是因为 Kylin OS 这样重视安全性的环境的 QEMU 不支持 vvfat 这一存在安全隐患的功能,不能挂载目录而只能挂载常规镜像文件。本实验提供的 Python 脚本 `ysos.py` 支持自动化从 `esp` 目录构建镜像文件 `esp.img` 用于运行和调试内核,需要在执行脚本的指令中添加参数 `--vvfat_disabled`,例如:
15+
16+
```sh
17+
$ python ysos.py launch --vvfat_disabled
18+
```
19+
20+
上述运行脚本的指令所做的事情等价于:
21+
22+
```sh
23+
$ dd if=/dev/zero of=esp.img bs=1M count=64
24+
$ mformat -i esp.img -t 64 -h 32 -s 64 ::
25+
$ mcopy -i esp.img -s ./esp/* ::/
26+
$ qemu-system-x86_64 -bios ./ovmf.fd -net none \
27+
-m 96M -drive format=raw,file=esp.img -nographic
28+
```
29+
30+
其中 `mformat``mcopy` 可以通过包管理器安装 `mtools` 获取。
31+
1432
为了退出 QEMU,可以使用 <kbd>Ctrl</kbd> + <kbd>A</kbd> 后输入 <kbd>X</kbd> 退出。
1533

1634
在调试时,可以使用 `-s` 参数来启动 GDB 调试服务,是 `-gdb tcp:1234` 的简写,并使用 `-S` 参数来暂停 CPU 的执行,等待 GDB 连接。

0 commit comments

Comments
 (0)