这是chaos的双页表版本(开发中),开发的初衷是探索单页表与双页表的区别,同时我们也会在此基础上尝试新的架构。
开发日志发布在队员的个人博客上:
- 参赛队名: chaos
- 参赛学校:北京科技大学
- 队伍成员:
注意:以下所有指令皆在项目根目录下执行
若是第一次编译 chaos,需要运行 make env
来配置 cargo 编译环境。
运行 make all
来编译项目,可在根目录获得操作系统以及 SBI 的二进制文件。
运行 make run
来编译项目并且启动 QEMU 运行内核。
推荐开发环境为 x86_64 架构 Ubuntu 22.04 LTS,其他平台的开发稳定性不作保证。
推荐使用 vscode + rust-analyzer 插件进行开发。
首先安装 Rust:
curl https://sh.rustup.rs -sSf | sh
安装过程中全程选择默认选项即可。
可以将 Rust 的包管理器 cargo 的源替换成中科大源。打开或新建 ~/.cargo/config.toml
文件,添加以下内容:
[source.crates-io]
replace-with = 'ustc'
[source.ustc]
registry = "sparse+https://mirrors.ustc.edu.cn/crates.io-index/"
然后编译安装 QEMU 7.0.0:
# 切换到 home 目录
cd ~
# 安装编译所需的依赖包
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 git tmux python3 ninja-build
# 下载源码包
# 如果下载速度过慢可以使用我们提供的百度网盘链接:https://pan.baidu.com/s/1z-iWIPjxjxbdFS2Qf-NKxQ
# 提取码 8woe
wget https://download.qemu.org/qemu-7.0.0.tar.xz
# 解压
tar xvJf qemu-7.0.0.tar.xz
# 编译安装并配置 RISC-V 支持
cd qemu-7.0.0
./configure --target-list=riscv64-softmmu,riscv64-linux-user
make -j$(nproc)
将编译得到的以下三个目录添加到 PATH
中:
export PATH="$HOME/qemu-7.0.0/build/:$PATH"
export PATH="$HOME/qemu-7.0.0/build/riscv64-softmmu:$PATH"
export PATH="$HOME/qemu-7.0.0/build/riscv64-linux-user:$PATH"
也可将其移至其他地方存放,只要能放在 PATH
中即可。
重启终端,确认 QEMU 版本:
qemu-system-riscv64 --version
qemu-riscv64 --version
如果正确识别指令并输出版本为 7.0.0
,即说明 QEMU 安装正确。
在根目录下新建文件 .vscode/settings.json
,添加以下内容:
{
// Prevent "can't find crate for `test`" error on no_std
// Ref: https://github.com/rust-lang/vscode-rust/issues/729
"rust-analyzer.cargo.target": "riscv64gc-unknown-none-elf",
"rust-analyzer.checkOnSave.allTargets": false,
// "rust-analyzer.cargo.features": [
// "board_qemu"
// ]
}
重新加载 rust-analyzer 即可。
chaos 通过将初始进程的 elf 文件链接到内核镜像中,从而在系统启动之后运行。链接脚本位于 os/src/link_initproc.S
。
脚本默认将 user/target/riscv64gc-unknown-none-elf/release/initproc
链接到内核中作为初始进程。通过修改 .incbin
来链接不同的应用程序作为初始进程。链接的文件必须要是 elf 格式文件。