零、前言
环境配置方面已经在上一节说过了,见清华大学操作系统rCore实验-第零章-Lab环境搭建。本节开始,我们新创建一个项目,并一步一个脚印写出rcore操作系统。
一、创建新项目neos
我们使用cargo创建项目neos,输入cargo new neos --bin
,可以通过tree neos
看看这个项目的结构:
可以进入该文件目录,输入cargo run
直接运行,也可以cat /neos/src/main.rs
查看初始的源码:
因为使用qemu时需要一个引导加载程序(bootloader),这里我们使用预编译好的rustsbi-qemu.bin
,这个文件需要另外下载安装。
输入git clone https://gitee.com/rcore-os/rCore-Tutorial-v3.git
然后用mv
命令,将其中的bootloader移入我们的neos项目中。
二、配置执行环境
1、切换riscv目标平台
我们输入rustc --version --verbose
,查看该项目默认运行的目标平台:
可以看到新项目的执行默认基于Linux,CPU架构是x86_64,CPU厂商是unknown(不清楚),运行时库是GNU libc(封装 Linux 系统调用,提供 POSIX 接口为主的函数库)。
rCore基于RISC-V64内核,我们需要将rCore的CPU架构从x86_64转换成RISC-V。
我们可以输入rustc --print target-list | grep riscv
,查看Rust 编译器支持哪些基于 RISC-V 的目标平台:
我们选择riscv64gc-unknown-none-elf
作为新项目的目标平台,其中riscv64gc是CPU架构,unknown是CPU厂商,none为空内核,elf为不带有运行时库并可以生成ELF格式的文件。这说明我们完全只基于riscv64gc编写操作系统,其余一切都是精简的空壳子,是一个裸机平台。
我们输入cargo run --target riscv64gc-unknown-none-elf
,将该项目以riscv64gc-unknown-none-elf
为目标平台运行:
可以看到出现了几个error,Rust没有针对该裸机平台的标准库-std,但是Rust有一个核心库-core,它是标准库-std的阉割版,虽然功能不丰富,但是不需要任何操作系统支持,并且也具备一部分的核心机制。