MIT6.828准备 — risc-v和xv6环境搭建
本文介绍搭建Mit6.828/6.S081 fall2019实验环境的详细过程,包括riscv工具链、qemu和xv6,以MacOS下的实践为例,Linux系统同样可以参考。
介绍
只有了解底层原理才能写好上层应用,曾经几度想要系统地学习OS课程,尝试去看了《计算机操作系统》、《Operating Systems: Three Easy Pieces》、《UNIX环境高级编程》,均以半途而废告终。被大量的抽象概念所淹没,对操作系统如何工作,用户程序如何运行,与CPU等硬件如何交互等问题完全没有清晰的认识。所以这次选择了以动手实践为主的课程,直接对内核源码进行学习和扩展,一步步揭开OS的神秘面纱。
MIT6.828: Operating System Engineering 在2019版本更名为6.S081,针对本科生教学,难度也有所下降,适合0基础学习,所需的计算机知识和C语言语法也十分基础。MIT用于教学的系统是xv6,一个简化的类unix系统,CPU平台使用的是RISC-V,是一种精指令集架构(RISC)。
课程的学习直接跟着官网的schedule走就行,先看Lecture下提供的讲义和手册,然后完成相应的Lab,Lab共计10个,主要内容是在xv6基础上进行内核开发和扩展。
环境搭建
MacOS下需要事先准备好xcode和homebrew,我的系统版本是10.13.4,xcode版本是9.4。实验环境主要包括三个部分:
- RISC-V工具链: 包括一系列交叉编译的工具,用于把源码编译成机器码,如gcc,binutils,glibc等
- QEMU模拟器: 用于在我们机器上(X86)模拟RISC-V架构的CPU
- xv6源码: xv6操作系统源码
一、RISC-V toolchain
risc-v工具链安装是坑最多的一步,如果按照官网教程来安装,大概率会因为下载过慢而失败,即使我把命令行翻了墙效果也并不好。教程中的安装命令是brew install riscv-tools,但我发现riscv-tools由几个部分组成,我们其实只需要riscv-gnu-toolchain,源码下载方式如下:
git clone --recursive https://github.com/riscv/riscv-gnu-toolchain
riscv-gnu-toolchain源码有3个G大小,直接clone耗时太久。所以我将源码上传到了baidu网盘,提取码ui4j,供大家直接下载。
下载后在源码根目录进行编译,具体参考官方文档。编译大约需要30min:
./configure --prefix=/usr/local/opt/riscv-gnu-toolchain #配置产物路径
make #编译
更新(2020.11.07):在macOS catalina版本下进行./configure时提示缺少GNU的 awk 和 sed: configure: error: GNU awk not found
,手动安装即可: brew install gawk
以及 brew install gsed
。
安装完成后需配置环境变量,与上一步设置的安装路径一致。Mac下的环境配置文件是~/.bash_profile
(Linux下为~/.bashrc
或~/.profile
),使用编辑器 (如vim) 打开文件,在最后一行添加配置,操作如下:
vim ~/.bash_profile #打开配置文件
export PATH="$PATH:/usr/local/opt/riscv-gnu-toolchain/bin" #末尾添加此行
source ~/.bash_profile #使配置生效
此时在命令行输入riscv64-unknown-elf-gcc -v
,如果能显示版本信息则代表安装成功。
二、QEMU
下载qemu模拟处理器,我们编译生成的risc-v平台的机器码,需要通过模拟cpu执行。
1.一种方式是通过包管理工具直接安装,mac下使用的是homebrew,如果速度较慢可切换tsinghua源。
brew install qemu
我的OS X版本(high sierra)对应的qemu版本是3.1.0,在启动riscv-gdb远程调试qemu时会报错:Remote 'g' packet reply is too long (expected 264 bytes, got 520 bytes)
,而4.1.0版本的qemu则正常。不过暂时来看,该bug不会影响实验的进行。
2.另一种方式是从qemu官网下载指定版本的源码并编译:
wget https://download.qemu.org/qemu-4.1.0.tar.xz #下载后解压并进入目录
./configure #默认安装所有目标平台,产物路径为/usr/local/bin
make && make install #编译并安装
如果wget从官网下载较慢可以选择使用网盘(链接,提取码 h7ud)。
三、xv6
从github下载xv6源码
git clone git://github.com/mit-pdos/xv6-riscv-fall19.git
在项目目录下编译,如果能进入xv6的shell则表示实验环境已搭建成功,进入后可输入命令(如 ls)进行测试。
make
make qemu

已有 12 条评论
添加新评论
- 上一篇: 关于博客
- 下一篇: MIT6.828 — Lab1 Unix Utilities
你好,make一直不成功,最后出现的信息如下,到这就一直卡住了,试了好多次了,到这大概编译了不到十分钟的样子,请问大概是什么原因呢?实在搞不定,来请求解答QAQ
make[4]: Nothing to be done for `install'.
make[2]: Nothing to be done for `install-target'.
mkdir -p stamps/ && touch stamps/build-binutils-newlib
if test -f /Users/xielinlin/riscv-gnu-toolchain/riscv-gcc/contrib/download_prerequisites && test "true" = "true"; then cd /Users/xielinlin/riscv-gnu-toolchain/riscv-gcc && ./contrib/download_prerequisites; fi
已解决。问题为在riscv-gnu-toolchain编译时失败,报错:gmp-6.1.0.tar.bz2: FAILED shasum: WARNING: 1 computed checksum did NOT match. error: Cannot verify integrity of possibly corrupted file gmp-6.1.0.tar.bz2. make: *** [stamps/build-gcc-newlib-stage1] Error 1.
原因是 gmp 文件下载不完整,导致hash校验不通过。解决方法是手动下载后进行替换,地址为:https://gcc.gnu.org/pub/gcc/infrastructure,下载对应的 gmp-6.1.0.tar.bz2 并替换到本地, 重试编译后成功。
从你发的日志来看并没有报错,建议多等一会 (大概需要30-40分钟,视机器而定)。 "Nothing to be done" 的提示是指部分产物已经编译生成了,你也可以先 make clean 然后重新 make 试试。 如果还不行可以加我下wx,帮你分析下具体的问题。
我在最后的make阶段出现了问题
riscv64-unknown-elf-gcc: error: unrecognized command-line option '-mmacosx-version-min=10.9'
查了好久,没有解决,这是什么原因?makefile里也没找见关键字啊
我找到原因了 是我的conda自动加的!!!
可以,找到原因就好
你好,请问编译riscv-gnu-toolchain后,该如果配置环境变量呢?我这一步我不是太懂。上网搜了一下也没搞明白,最后我直接输入命令
export PATH="$PATH:/usr/local/opt/riscv-gnu-toolchain/bin"
然后输入
riscv64-unknown-elf-gcc -v
应该是成功的出现了版本信息
输出内容如下:
Using built-in specs.
COLLECT_GCC=riscv64-unknown-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/opt/riscv-gnu-toolchain/libexec/gcc/riscv64-unknown-elf/9.2.0/lto-wrapper
Target: riscv64-unknown-elf
Configured with: /Users/a1278132270/riscv-gnu-toolchain/riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/usr/local/opt/riscv-gnu-toolchain --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/usr/local/opt/riscv-gnu-toolchain/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-tm-clone-registry --src=.././riscv-gcc --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc --with-tune=rocket 'CFLAGS_FOR_TARGET=-Os -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os -mcmodel=medlow'
Thread model: single
gcc version 9.2.0 (GCC)
QEMU和xv6源码都已经准备好了。
但是在进入 xv6-public 后输入
make
没能编译成功。提示好像是说环境变量没有配置成功……
输出信息如下:
1278132270deMacBook-Air:xv6-public a1278132270$ make
***
*** Error: Couldn't find an i386-*-elf version of GCC/binutils.
*** Is the directory with i386-jos-elf-gcc in your PATH?
*** If your i386-*-elf toolchain is installed with a command
*** prefix other than 'i386-jos-elf-', set your TOOLPREFIX
*** environment variable to that prefix and run 'make' again.
*** To turn off this error, run 'gmake TOOLPREFIX= ...'.
***
ld: unknown option: -V
gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pic -O -nostdinc -I. -c bootmain.c
gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pic -nostdinc -I. -c bootasm.S
ld -m -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o
ld: warning: option -m is obsolete and being ignored
ld: unknown option: -N
make: *** [bootblock] Error 1
不知道该去配置什么东西,实在不知道怎么办了。
十分感谢你看完了这个评论,如果能给予一些指导就更好了(/ω\)
环境变量需要在系统配置文件中添加,你可以使用vim打开文件并在末尾添加一行,具体细节我已经在原文中补充 :)
感谢作者♥️,按照作者的步骤来是没有问题的。
不客气,后面会持续更新,有问题欢迎交流。
期待后续更新。
感谢关注