ucore step by step
tutorial
tutorial
  • 欢迎来到ucore step-by-step的世界
  • lab0: 预备起
    • 溯源: ucore的历史
    • 概览: 指导书的结构
    • 开搞: 实验环境搭建
  • lab0.5: 比麻雀更小的麻雀(最小可执行内核)
    • 内存布局,OpenSBI,elf和bin
    • 链接脚本和入口点
    • "真正的"入口点
    • 从SBI到stdio
    • Just make it
    • 项目组成和执行流
  • lab1: 断, 都可以断
    • 掉进兔子洞(中断入口点)
    • 中断处理程序
    • 滴答滴答(时钟中断)
    • 项目组成和执行流
  • lab2: 物理内存和页表
    • 内核初始映射
    • 物理内存管理
    • 页面分配算法
    • 项目组成和执行流
  • lab3: 缺页异常和页面置换
    • 扫清外围
    • 使用多级页表
    • 页面置换机制
    • FIFO置换算法
    • 项目组成和执行流
  • lab4: 进程管理
    • 进程与线程
    • 相关数据结构
    • 进程模块初始化
    • 进程切换
    • 项目组成和执行流
  • lab5: 用户程序
    • 用户程序
    • system call!
    • 中断处理
    • 项目组成和执行流
  • lab6: 进程调度
    • 再次认识进程切换
    • 调度算法框架
    • 项目组成和执行流
  • lab7: 同步互斥
    • 同步互斥的基本概念
    • 信号量
    • 条件变量与管程
    • 项目组成和执行流
  • lab8: 文件系统
    • 文件系统抽象层VFS
    • 硬盘文件系统SFS
    • 设备即文件
    • 从zhong duan 到 zhong duan
    • 项目组成和执行流
  • 练习题
    • lab1
    • lab2
    • lab3
    • lab4
    • lab5
    • lab6
    • lab7
    • lab8
  • 附录
    • makefile
由 GitBook 提供支持
在本页
  • 编译器
  • 模拟器
  • 安装模拟器 Qemu
  • 使用 OpenSBI

这有帮助吗?

  1. lab0: 预备起

开搞: 实验环境搭建

上一页概览: 指导书的结构下一页lab0.5: 比麻雀更小的麻雀(最小可执行内核)

最后更新于5年前

这有帮助吗?

说了这么多,现在该动手了。Make your hands dirty!

如果你使用windows系统,推荐在windows subsystem for linux(WSL) 下进行开发。

方便起见,可以先在终端里设置一个叫做RISCV的环境变量(在bash命令里可以通过$RISCV使用),作为你安装所有和riscv有关的软件的路径。在/etc/profile里面写一行export RISCV=/your/path/to/riscv之类的东西就行。后面安装的各个项目最好也放在上面的的路径里面。

最小的软件开发环境需要:能够编译程序,能够运行程序。开发操作系统这样的系统软件也不例外。

编译器

问题在于:我们使用的计算机都是基于x86架构的。如何把程序编译到riscv64架构的汇编?这需要我们使用“目标语言为riscv64机器码的编译器”,在我们的电脑上进行交叉编译。

放心,这里不需要你自己写编译器。我们使用现有的riscv-gcc编译器即可。从 clone下来,然后在x86架构上编译riscv-gcc编译器为可执行的x86程序,就可以运行它,来把你的程序源代码编译成riscv架构的可执行文件了。这有点像绕口令,但只要有一点编译原理的基础就可以理解。不过,这个riscv-gcc仓库很大,而且自己编译工具链总是一件麻烦的事。

其实,没必要那么麻烦,我们大可以使用别人已经编译好的编译器的可执行文件,也就是所谓的预编译(prebuilt)工具链,下载下来,放在你喜欢的地方(比如之前定义的$RISCV),配好路径(把编译器的位置加到系统的PATH环境变量里),就能在终端使用了。我们推荐使用sifive公司提供的预编译工具链,进入 ,找到 “Prebuilt RISC‑V GCC Toolchain and Emulator”,下载“GNU Embedded Toolchain ”中适合你的操作系统的版本即可。(注意,如果你是wsl, 需要下载适合ubuntu版本的编译器)

配置好后,在终端输入riscv64-unknown-elf-gcc -v查看安装的gcc版本, 如果输出一大堆东西且最后一行有gcc version 某个数字.某个数字.某个数字,说明gcc配置成功,否则需要检查一下哪里做错了,比如环境变量PATH配置是否正确。一般需要把一个形如..../bin的目录加到PATH里。

模拟器

如何运行riscv64的代码?我们当然可以给大家每个人发一块riscv64架构处理器的开发板,再给大家一人一根JTAG线,让大家把程序烧写到上面去跑,然后各凭本事debug(手动狗头),但还是使用模拟器(emulator)更方便一些。模拟器也就是在x86架构的计算机上,通过软件模拟一个riscv64架构的硬件平台,从而能够运行riscv64的目标代码。

我们选择的是QEMU模拟器。它的优点在于,内置了一套OpenSBI固件的实现,可以简化我们的代码,也为了和rcore tutorial保持一致。

下面我们从抄写了一段qemu安装的教程。

安装模拟器 Qemu

如果你在使用 Linux (Ubuntu) ,需要到 Qemu 官方网站下载源码并自行编译,因为 Ubuntu 自带的软件包管理器 apt 中的 Qemu 的版本过低无法使用。参考命令如下:

$ wget https://download.qemu.org/qemu-4.1.1.tar.xz
$ tar xvJf qemu-4.1.1.tar.xz
$ cd qemu-4.1.1
$ ./configure --target-list=riscv32-softmmu,riscv64-softmmu
$ make -j
$ export PATH=$PWD/riscv32-softmmu:$PWD/riscv64-softmmu:$PATH

如果你在使用 macOS,只需要 Homebrew 一个命令即可:

$ brew install qemu

最后确认一下 Qemu 已经安装好,且版本在 4.1.0 以上:

$ qemu-system-riscv64 --version
QEMU emulator version 4.1.1
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

使用 OpenSBI

$ qemu-system-riscv64 \
  --machine virt \
  --nographic \
  --bios default

OpenSBI v0.4 (Jul  2 2019 11:53:53)
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name          : QEMU Virt Machine
Platform HART Features : RV64ACDFIMSU
Platform Max HARTs     : 8
Current Hart           : 0
Firmware Base          : 0x80000000
Firmware Size          : 112 KB
Runtime SBI Version    : 0.1

PMP0: 0x0000000080000000-0x000000008001ffff (A)
PMP1: 0x0000000000000000-0xffffffffffffffff (A,R,W,X)

可以看到我们已经在 qemu-system-riscv64 模拟的 virt machine 硬件上将 OpenSBI 这个固件 跑起来了。Qemu 可以使用 Ctrl+a 再按下 x 退出(注意要松开Ctrl再单独按x)。

如果无法正常使用 Qemu,可以尝试下面这个命令。

$ sudo sysctl vm.overcommit_memory=1

扩展

可查看。

新版 Qemu 中内置了 固件(firmware),它主要负责在操作系统运行前的硬件初始化和加载操作系统的功能。我们使用以下命令尝试运行一下:

如果对 OpenSBI 的内部实现感兴趣,可以看看。

https://github.com/riscv/riscv-gcc
https://www.sifive.com/boards
rCore tutorial
更详细的安装和使用命令
OpenSBI
RISCV OpenSBI Deep_Dive 介绍文档