使用QEMU模拟器搭建rCore操作系统的实验环境,了解rCore的基本架构和启动流程。在此基础上,编写一个会产生异常的应用程序,并简要解释操作系统的处理结果。要求给出详细的配置过程、程序代码和运行时的截图。
由于下载源的服务器在国外,国内网络环境下载会非常慢,甚至会失败,所以需要先配置一下国内的镜像源。
由于写在一起会很多,这里单独写在了另一篇文章中:
详细配置教程链接Ubuntu中配置【Rust 镜像源】
# 更新包索引并安装基本工具
sudo apt update
sudo apt install -y git build-essential curl wget libssl-dev pkg-config
# 安装 QEMU
sudo apt install -y qemu-system-riscv64
# 验证 QEMU 版本,需要确保版本为7.0.0以上,否则之后会因为版本过低无法运行rCore,需要升级到7.0.0以上
qemu-system-riscv64 --version
# 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
source $HOME/.cargo/env
# 添加 RISC-V 目标支持
rustup target add riscv64gc-unknown-none-elf
# 安装 rust-src(用于 rCore 编译)
rustup component add rust-src --toolchain nightly
# 安装 cargo-binutils(用于生成二进制文件)
cargo install cargo-binutils
rustup component add llvm-tools-preview
方式一:
这里需要使用到版本控制工具 git ,请确保你的实验机器(Ubuntu虚拟机)中已经安装了git,并且已经配置完成(能与GitHub正常建立连接)。
注:博主自己在做实验的时候,使用https协议克隆仓库会失败,只能使用ssh协议克隆才能成功,所以建议读者也直接使用ssh协议进行克隆,而且这也是GitHub官方推荐的克隆方式。
由于写在一起会很多,这里单独写在了另一篇文章中,这里也附上Ubuntu中使用SSH协议克隆的教程链接:使用SSH协议克隆详细步骤
方式二:
如果读者之前没有接触过git,或者不是很熟悉,不想在这里折腾的话,你可以直接用自己的本地主机(你自己的电脑,而非虚拟机)先登录GitHub找到rCore的仓库(项目地址:https://github.com/rcore-os/rCore-Tutorial-v3),将压缩包下载下来(如下图所示),然后再从本地主机上传到你的虚拟机上,然后再进行解压缩,也能得到rCore的项目代码。
rCore 是一个基于 Rust 语言的教学操作系统,支持 RISC-V 架构。我们这里使用 rCore-Tutorial-v3:
# 克隆 rCore-Tutorial-v3 仓库
git clone [email protected]:rcore-os/rCore-Tutorial-v3.git
cd rCore-Tutorial-v3
rCore 使用 Rust 编写,编译需要指定目标架构为 RISC-V。
# 进入内核目录
cd os
# 编译内核
make build
# 运行 QEMU 模拟 rCore
make run
预期输出:
编译完成后,make run
会启动 QEMU,模拟 RISC-V 64 位架构。
终端将显示 rCore 启动日志,例如:
[kernel] Booting rCore...
Lilliputian
[kernel] Hello, world!
...
你将看到 rCore 的 shell 提示符,说明环境搭建成功。
运行 make run
后,确认 rCore 正常启动并进入用户 shell。尝试运行一些基本命令(如启动之后列出的程序 hello_world
、cat
)以验证环境正常。
rCore 是一个基于 Rust 语言的微内核操作系统,专为教学设计,支持 RISC-V 架构。它的主要模块包括:
rCore 的启动流程如下:
启动日志分析:
make run
时,观察日志中的关键步骤,例如:
[kernel] Initialize interrupt controller
[kernel] Setup virtual memory
[kernel] Mount filesystem
[kernel] Start init process
[user] Welcome to rCore shell
(仅供参考)编写一个简单的用户态 C 程序,尝试访问非法内存地址,触发段错误(Segmentation Fault),并观察 rCore 的处理结果。
在 rCore-Tutorial-v3/user/src/bin
目录下创建文件 segfault.c
:
#include
int main() {
// 尝试写入非法内存地址
int *ptr = (int *)0xdeadbeef;
*ptr = 42; // 触发段错误
printf("This line should not be reached.\n");
return 0;
}
riscv64-linux-gnu-gcc
),以手动编译C语言程序sudo apt install riscv64-linux-gnu-gcc
验证安装:
riscv64-linux-gnu-gcc --version
在 user/src/bin/ 下编译 segfault.c:
cd ~/rCore-Tutorial-v3/user/src/bin
riscv64-linux-gnu-gcc -static -march=rv64g -mabi=lp64d -o segfault segfault.c
说明:
转换为二进制格式:
使用 riscv64-linux-gnu-objcopy
将 ELF 文件转为二进制:
riscv64-linux-gnu-objcopy -O binary segfault segfault.bin
移动到目标目录
将 segfault 和 segfault.bin 移动到 编译输出目录:
mv segfault ~/rCore-Tutorial-v3/user/target/riscv64gc-unknown-none-elf/release/
mv segfault.bin ~/rCore-Tutorial-v3/user/target/riscv64gc-unknown-none-elf/release/
更新文件系统
返回 os 目录,重新打包文件系统:
cd ~/rCore-Tutorial-v3/os
make clean
make build
运行并测试 运行 rCore:
make run
预期输出:
触发异常。
rCore 检测到非法内存访问,终止程序并返回 shell。
输出类似于:
[kernel] Exception: Store/AMO access fault at 0xdeadbeef
[kernel] Process terminated
rCore 的异常处理流程如下:
0xdeadbeef
不在合法地址空间)。0xdeadbeef
和异常类型)。segfault
程序尝试写入非法地址,触发硬件异常。以下是关键命令的汇总:
# 安装依赖
sudo apt install -y qemu-system-riscv64 git build-essential curl
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add riscv64gc-unknown-none-elf
rustup component add rust-src --toolchain nightly
cargo install cargo-binutils
rustup component add llvm-tools-preview
# 克隆和编译 rCore
git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
cd rCore-Tutorial-v3
git checkout Book
cd os
make build
make run
# 运行 segfault 程序
# 在 rCore shell 中输入:
segfault
启动 rCore:
[kernel] Booting rCore...
[kernel] Initialize interrupt controller
[kernel] Setup virtual memory
[kernel] Mount filesystem
[kernel] Start init process
[user] Welcome to rCore shell
运行 segfault:
segfault
Attempting to access invalid memory...
[kernel] Exception: Store/AMO access fault at 0xdeadbeef
[kernel] Process terminated
在运行 make run
和 segfault
时,截取以下终端输出:
[kernel] Booting rCore...
到 [user] Welcome to rCore shell
的完整日志。segfault
命令的输入和异常终止的输出。截图工具:
gnome-screenshot
或 scrot
。scrot screenshot.png
保存和提交:
rcore_boot.png
和 segfault_output.png
。segfault.c
。常见问题:
qemu-system-riscv64
且版本 ≥ 5.0。rustc --version
和 cargo --version
确认安装成功。make build
的错误日志,可能缺少依赖或目标架构未设置。segfault.c
中的地址 0xdeadbeef
未被意外映射到合法内存。调试:
使用 make debug
启动 QEMU 并连接 GDB,检查异常时的寄存器状态。
示例 GDB 命令:
target remote :1234
info registers
backtrace
性能优化:
-smp 4
参数以使用多核。make QEMU_ARGS="-smp 4" run
通过以上步骤,已成功: