环境配置

WSL2

WSL2配置

1.勾选适用于Linux的Windows子系统重启

打开“控制面板”->点击”程序“->在“程序和功能”中->点击“启用或关闭 Windows 功能”-> 选中“适用于 Linux 的 Windows 子系统”->选择”立即重新启动“;

2.启用虚拟机功能

安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能才能使用此功能。

以管理员身份打开 PowerShell 并运行:

点击“开始”->搜索“Power shell”->右键“Power shell”->已管理员方式运行

1
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

此处最好重启一下不然后续启动arch Linux时会报错error: 0x8004032d(null)

如何没有安装 PowerShell 建议直接从 Microsoft Store 中搜索并下载

3.下载Linux内核更新包

官网下载最新的Linux内核更新包并安装

管理员身份打开PowerShell:

1
2
3
> wsl.exe --update
正在检查更新。
已安装最新版本的适用于 Linux 的 Windows 子系统。

这里如果安装进度一直为0.0%可以试下开启科学上网;

4.将WSL2设置为默认版本

打开 PowerShell运行以下命令,将 WSL 2 设置为默认版本:

1
2
3
> wsl --set-default-version 2
有关与 WSL 2 关键区别的信息,请访问 https://aka.ms/wsl2
操作成功完成。

5.安装所选的Linux分发

打开 Microsoft Store,并选择你偏好的 Linux 分发版。(我这里使用的是arch Linux)

首次启动新安装的 Linux 分发版时,将打开一个控制台窗口,系统会要求你等待一分钟或两分钟,以便文件解压缩并存储到电脑上。

然后,需要为新的 Linux 分发版创建用户帐户和密码

1
2
3
4
5
Installing,this may take a few minutes...
Iainstallation successful!
Please create a default UNIX user account, The username does not needor to match your windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:

这里要关掉科学上网,不然Microsoft Store可能会打不开;

6.查看当前环境的wsl版本和对应子系统

1
2
3
4
// 在Windows终端中键入
> wsl -l -v
NAME STATE VERSION
* Arch Running 2

7.注销安装的Linux子系统账户

1
> wsl --unregister Arch

(名称要与wsl -l -v 命令中NAME一致)

8.删除安装的Linux子系统

系统 -> 应用 -> 安装的应用 删除Arch WSL。

换源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo pacman -Syyu // 防止软件库更新导致某些功能无法使用
sudo pacman -S neovim
sudo nvim /etc/pacman.conf 尾部添加

[archlinuxcn]
SigLevel = Never
Server = https://mirrors.ustc.edu.cn/$repo/$arch

顺便开启
[multilib]
Include = /etc/pacman.d/mirrorlist

sudo pacman -Syyu
sudo pacman -S yay

C/Rust环境配置

1.更新/同步arch Linux内核

1
sudo pacman -Syyu

这里cmd中需要管理员模式启动(WSL2中不要开梯子)

2.C开发环境配置

1
sudo pacman -S git base-devel riscv64-linux-gnu-binutils riscv64-linux-gnu-gcc riscv64-linux-gnu-gdb qemu-emulators-full riscv64-elf-gdb

3.Rust开发环境配置

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

测试是否安装成功:

1
2
3
4
$ cargo --version // 如果cargo无效则重新打开终端进入Linux即可
cargo 1.77.1 (e52e36006 2024-03-26)
$ rustc --version
rustc 1.77.1 (7cf61ebde 2024-03-27)

切换 nightly 版本,并设置为 rustc 的缺省版本:

1
2
3
4
$ rustup install nightly
$ rustup default nightly
$ rustc --version
rustc 1.79.0-nightly (385fa9d84 2024-04-04)

安装一些Rust相关的软件包:

1
2
3
4
$ rustup target add riscv64gc-unknown-none-elf
$ cargo install cargo-binutils
$ rustup component add llvm-tools-preview
$ rustup component add rust-src

Qemu模拟器

安装

1
sudo pacman -S qemu

三个选择:

1
1)qemu-base   2)qemu-desktop   3)qemu-full

第一个提示中提示中选择3,第二个提示默认1即可。

确认 QEMU 的版本:

1
2
3
4
5
6
$ qemu-system-riscv64 --version
QEMU emulator version 9.0.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers
$ qemu-riscv64 --version
qemu-riscv64 version 9.0.0
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers

运行

获取代码:

1
2
3
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3
$ git checkout ch1

在Qemu模拟的计算机上运行: (第一次可能会有些很慢)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ cd os
$ LOG=TRACE make run

(rustup target list | grep "riscv64gc-unknown-none-elf (installed)") || rustup target add riscv64gc-unknown-none-elf
riscv64gc-unknown-none-elf (installed)
cargo install cargo-binutils
Updating crates.io index
Ignored package `cargo-binutils v0.3.6` is already installed, use --force to override
rustup component add rust-src
info: component 'rust-src' is up to date
rustup component add llvm-tools-preview
info: component 'llvm-tools' for target 'x86_64-unknown-linux-gnu' is up to date
Platform: qemu
Finished release [optimized + debuginfo] target(s) in 0.00s
[rustsbi] RustSBI version 0.3.1, adapting to RISC-V SBI v1.0.0
.______ __ __ _______.___________. _______..______ __
| _ \ | | | | / | | / || _ \ | |
| |_) | | | | | | (----`---| |----`| (----`| |_) || |
| / | | | | \ \ | | \ \ | _ < | |
| |\ \----.| `--' |.----) | | | .----) | | |_) || |
| _| `._____| \______/ |_______/ |__| |_______/ |______/ |__|
[rustsbi] Implementation : RustSBI-QEMU Version 0.2.0-alpha.2
[rustsbi] Platform Name : riscv-virtio,qemu
[rustsbi] Platform SMP : 1
[rustsbi] Platform Memory : 0x80000000..0x88000000
[rustsbi] Boot HART : 0
[rustsbi] Device Tree Region : 0x87e00000..0x87e010f6
[rustsbi] Firmware Address : 0x80000000
[rustsbi] Supervisor Address : 0x80200000
[rustsbi] pmp01: 0x00000000..0x80000000 (-wr)
[rustsbi] pmp02: 0x80000000..0x80200000 (---)
[rustsbi] pmp03: 0x80200000..0x88000000 (xwr)
[rustsbi] pmp04: 0x88000000..0x00000000 (-wr)
[kernel] Hello, world!
[TRACE] [kernel] .text [0x80200000, 0x80202000)
[DEBUG] [kernel] .rodata [0x80202000, 0x80203000)
[ INFO] [kernel] .data [0x80203000, 0x80204000)
[ WARN] [kernel] boot_stack top=bottom=0x80214000, lower_bound=0x80204000
[ERROR] [kernel] .bss [0x80214000, 0x80215000)

报错

1.当你在wsl2环境下运行code命令时报错-bash: code: command not found时:

  • 在vscode中安装Remote Development扩展包。
  • 设置Windows下环境变量D:\tools\IDE\VSCode\VSCode\bin(一定要到bin下)

Ubuntu

C/Rust环境配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// C开发环境
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu

// Rust开发环境
$ curl https://sh.rustup.rs -sSf | sh

// 安装 rustc 的 nightly 版本,并把该版本设置为 rustc 的缺省版本。
$ rustup install nightly
$ rustup default nightly

// 安装一些Rust相关的软件包
$ rustup target add riscv64gc-unknown-none-elf
$ cargo install cargo-binutils
$ rustup component add llvm-tools-preview
$ rustup component add rust-src

QEMU模拟器

1
2
3
4
5
6
7
8
9
# 安装编译所需的依赖包
$ sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
gawk build-essential bison flex texinfo gperf libtool patchutils bc \
zlib1g-dev libexpat-dev pkg-config libglib2.0-dev libpixman-1-dev libsdl2-dev libslirp-dev \
git tmux python3 python3-pip ninja-build

# 下载Qemu
$ sudo apt-get install qemu-system
$ sudo apt-get install qemu-user

运行

1
2
3
4
5
6
7
8
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3
$ git checkout ch1

$ cd os
$ LOG=TRACE make run