本文介绍搭建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               

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

关于gdb (更新于:2021.6.6)

可以使用riscv-gnu-toolchain中的gdb工具对xv6代码进行调试,首先在xv6目录下开启两个终端:

  • 终端1执行 make qemu-gdb 即可启动gdb-server
  • 终端2执行 riscv64-unknown-elf-gdb 可进入gdb-client进行调试

以下是一些gdb的常用命令:

layout split        # 同时打开源码及汇编窗口
layout reg          # 打开寄存器窗口
layout asm          # 打开汇编窗口
next / nexti        # 单步到下一行 源代码 / 指令,不进入函数
step / stepi        # 单步到下一行 源代码 / 指令,进入函数
break (b)           # 设置断点,后面可接函数、行号、地址等
continue (c)        # 继续执行到下一个断点

注:调试内核程序时直接断点文件即可,如 break kernel/main.c:13,如果要调试用户程序,还需先导入符号文件,b比如调试ls.c

file user/_ls      # 导入_ls符号文件
break main         # 断点ls.c中的main函数
continue           # 继续执行

此时在终端1的xv6 shell中输入ls就可以断点到ls程序。

可能遇到的小问题:

1.我的OS X版本(high sierra) 对应的qemu版本是3.1.0,在启动riscv-gdb远程调试qemu时会报错:Remote 'g' packet reply is too long (expected 264 bytes, got 520 bytes)。将qemu更换为4.1.0版本后则解决该问题。

2.在编译riscv-gnu-toolchain时gdb模块编译失败,报错: make: *** [stamps/build-gdb-newlib] Error 2。该问题暂时不会影响xv6运行,如果需要gdb调试可以先下载编译好的 riscv64-unknown-elf-gdb (链接,提取码0zh4),版本是8.3.0。放入toolchain的安装目录(如/usr/local/opt/riscv-gnu-toolchain/bin) 下,增加执行权限 (chmod +x riscv64-unknown-elf-gdb) 后即可使用。

本文链接:https://zhayujie.com/mit6828-env.html

标签: mit6.828, os

已有 78 条评论

  1. 嘿嘿 嘿嘿

    你好博主,请问在make阶段出现

    make[6]: *** [libc.a] Error 127
    make[5]: *** [all-recursive] Error 1
    make[4]: *** [all-recursive] Error 1
    make[3]: *** [all] Error 2
    make[2]: *** [all-target-newlib] Error 2
    make[1]: *** [all] Error 2
    make: *** [stamps/build-newlib] Error 2

    该如何解决,mac bigsur版本的

    1. 嘿嘿 嘿嘿

      解决了,要重新编译
      在toolchain编译之前,要修改riscv-gun-toolchain/riscv-gdb/readline/rltty.c和riscv-gun-toolchain/riscv-gdb/readline/terminal.c文件,分别加入#include

      1. zyj zyj

        需要 #include 什么头文件吗,好像后面的文字丢失了

    2. 嘿嘿 嘿嘿

      重新编译了下还是有3个error
      请问这该如何解决
      make[3]: *** [rltty.o] Error 1
      make[2]: *** [all-readline] Error 2
      make[1]: *** [all] Error 2
      make: *** [stamps/build-gdb-newlib] Error 2

      1. zyj zyj

        是在编译哪个部分的时候报错了,各个软件分别都是什么版本呢?

        1. 嘿嘿 嘿嘿

          toolchain 编译出现的问题,但最后可以运行qemu,最后在gdb时command not found: riscv64-unknown-elf-gdb
          是不是因为toolchain编译的问题呀

          1. zyj zyj

            toolchain中的gdb编译失败了,可能是版本与系统不兼容,你可以下载我编译好的gdb直接使用,我在原文末尾添加了链接。

            1. 嘿嘿 嘿嘿

              呃…好像还是有小问题,按照最后步骤做了,可是显示
              permission denied: riscv64-unknown-elf-gdb

              1. zyj zyj

                用 chmod +x riscv64-unknown-elf-gdb 设置了执行权限后应该就可以了,不过你已经编译成功了就更好了。

              2. 嘿嘿 嘿嘿

                sudo就是
                command not found: riscv64-unknown-elf-gdb

              3. zyj zyj

                sudo riscv64-unknown-elf-gdb 试试

            2. 嘿嘿 嘿嘿

              非常感谢

  2. zlb zlb

    博主你好,我是在Mac OS下按照文章中的流程一步步安装的,但现在卡在最后一步了,执行make qemu之后,终端一直显示qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0,等了好久都没进到系统里,不知道博主遇到过这种情况吗?感谢!

    1. LCC LCC

      你好,我也遇到了这个问题。请问同学解决了么?

      1. LCC LCC

        回复一下同学,问题解决了。qemu的版本太新,有兼容性问题。删掉之后,手动下载编译5.1.0成功解决。

      2. zyj zyj

        参考官方文档 https://pdos.csail.mit.edu/6.828/2020/tools.html 中 "qemu-system-misc fix"的这一段,应该是 qemu版本和 xv6-2020 不兼容导致的问题,如果是ubuntu下可以按照文档上说的 remove掉qemu-system-misc并安装旧版本来解决。
        你的qemu是哪个版本,我是源码编译的4.1.0版本,能够成功运行xv6-labs-2020。

        1. LCC LCC

          我的qemu版本是6.0.0,riscv64-unknown-elf-gcc版本是10.2.0。我的平台是mac os,big sur 11.4。那我想办法降低一下qemu版本。

          1. 小白菜 小白菜

            假如是m1的话,可以参考之前的评论中相同的情况。以及这个issue:https://github.com/ReZeroS/mit6.828-note/issues/3

            1. LCC LCC

              不是m1,是49年入国军的intel。

              1. 小白菜 小白菜

                intel或许区别只在于不用打补丁?我之前用10.2的工具链也遇到难解决的错误,qemu6.0不知道怎么才能编译成功。换成9.2和5.1才好了,或许你可以试试安这个版本的。

      3. saikei saikei

        同遇到了

        1. zyj zyj

          参考官方文档 https://pdos.csail.mit.edu/6.828/2020/tools.html 中 "qemu-system-misc fix"的这一段,应该是 qemu版本和 xv6-2020 不兼容导致的问题,如果是ubuntu下可以按照文档上说的 remove掉qemu-system-misc并安装旧版本来解决。
          你的qemu是哪个版本,我是源码编译的4.1.0版本,能够成功运行xv6-labs-2020。

    2. zyj zyj

      没有遇到过呢,"关于"里有联系方式,我可以帮你看下具体是什么问题

  3. 小白菜 小白菜

    博主你好,我在mac m1上编译工具链的时候出现了以下报错。安环境安了好久总找不到适合m1架构的方案。
    clang: warning: argument unused during compilation: '-no-pie' [-Wunused-command-line-argument]
    Undefined symbols for architecture arm64:
    "_host_hooks", referenced from:
    c_common_no_more_pch() in c-pch.o
    toplev::main(int, char**) in libbackend.a(toplev.o)
    gt_pch_save(__sFILE*) in libbackend.a(ggc-common.o)
    gt_pch_restore(__sFILE*) in libbackend.a(ggc-common.o)
    ld: symbol(s) not found for architecture arm64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[2]: *** [cc1] Error 1
    make[1]: *** [all-gcc] Error 2
    make: *** [stamps/build-gcc-newlib-stage1] Error 2

    1. 小白菜 小白菜

      突然看到之前有人问过了,我去尝试一下这个方案。

      1. zyj zyj

        好的,你先试一下,成功了可以分享下~

        1. 小白菜 小白菜

          我遇到的问题是qemu无法找到m1适合的版本。brew 安装只能安6.0.0的版本,安装后的包也无法像方案中的打补丁。riscv工具链可以编译成功,版本号为9.2.0。请问怎么安装5.1的版本呢

          1. zyj zyj

            你可以下载qemu的源码手动make,这样就可以指定版本 (上面文章内有说明): https://download.qemu.org/

            编译前应该需要打一下arm相关的patch,你可以google一下mac M1或者arm上怎么跑qemu,我简单搜了一些,你看看有没有帮助:
            https://gist.github.com/citruz/9896cd6fb63288ac95f81716756cb9aa
            https://arstechnica.com/civis/viewtopic.php?f=19&t=1473419

            还可以参考或者回复下 rezeros 同学的评论。

            1. 小白菜 小白菜

              在参考rezeros同学的评论后尝试了很多次终于装好了。虽然中间出现了一些小的很繁琐的问题,但主要思路就是如他所说。感谢博主和rezeros同学,以及BASARANOMO同学。

              1. zyj zyj

                很棒的 Mac M1 + riscv-toolchain-9.2 + qemu-5.1-patch 的搭建方案,感谢分享!

              2. 小白菜 小白菜

                简要的总结:
                主要步骤参照ReZeroS在stackoverflow的回答。在按这里的回答完成riscv-tool-chain 9.2的编译后,安qemu出现了三种情况的报错。
                第一种是版本问题导致的。qemu5.1,qemu6.0,qemu5.2,qemu4.1这几个版本我都试着安装过,只有qemu5.1在安装补丁后终于编译成功。(个人觉得riscv工具链和qemu还有版本兼容的问题)现在的用homebrew安装的版本只有6.0,而6.0不能编译成功(但我怀疑这是由于我没有make clean),所以想用5.1需要自己编译。
                第二种是arm架构和intel_x86架构导致的。我之前安装的版本是10.1的工具链和5.2的qemu,都是用rosseta转译的,后来在做实验调试的时候发现始终出现Symbol format `elf64-littleriscv' unknown以及python找不到gdb包等问题。该用成9.2后才未出现类似报错,并且可调试。
                第三种就是在安装过程中的环境变量(path设定参照以上即可)。
                除此之外,我遇到的一些小问题有:在本地环境无法运行后,我尝试在docker中的ubuntu环境安装,但即使解决网络问题安装了riscv工具链,编译的漫长(一个晚上都未编完)以及对之后运行在此环境中性能的考虑都使此方案作废。

  4. mwg mwg

    我在变异riscv-gnu-toolchain的时候报了这个错,但是好像编译成功了,riscv64-unknown-elf-gcc -v可以正常输出。make qemu 也能进入,楼主有遇到这个问题吗?

    gcc -c -DHAVE_CONFIG_H -I. -I/Volumes/case-sensitive/xv6/riscv-gnu-toolchain/riscv-gdb/readline -DRL_LIBRARY_VERSION='"6.2"' -g -O2 /Volumes/case-sensitive/xv6/riscv-gnu-toolchain/riscv-gdb/readline/rltty.c
    /Volumes/case-sensitive/xv6/riscv-gnu-toolchain/riscv-gdb/readline/rltty.c:83:7: error:
    implicit declaration of function 'ioctl' is invalid in C99
    [-Werror,-Wimplicit-function-declaration]
    if (ioctl (tty, TIOCGWINSZ, &w) == 0)
    ^
    /Volumes/case-sensitive/xv6/riscv-gnu-toolchain/riscv-gdb/readline/rltty.c:720:3: error:
    implicit declaration of function 'ioctl' is invalid in C99
    [-Werror,-Wimplicit-function-declaration]
    ioctl (fildes, TIOCSTART, 0);
    ^
    /Volumes/case-sensitive/xv6/riscv-gnu-toolchain/riscv-gdb/readline/rltty.c:759:3: error:
    implicit declaration of function 'ioctl' is invalid in C99
    [-Werror,-Wimplicit-function-declaration]
    ioctl (fildes, TIOCSTOP, 0);
    ^
    3 errors generated.
    make[3]: *** [rltty.o] Error 1
    make[2]: *** [all-readline] Error 2
    make[1]: *** [all] Error 2
    make: *** [stamps/build-gdb-newlib] Error 2

    1. zyj zyj

      这里应该是只有gdb模块没有编译成功(估计和环境有关),xv6能够正常编译并且运行的话就不影响实验,需要用到gdb的话我可以发给你编译后的产物使用

  5. coderhare coderhare

    博主你好,我是mojave下的系统,提示
    $ make
    cd /Users/wocaibujiaoquanmei/riscv-gnu-toolchain && \
    flock `git rev-parse --git-dir`/config git submodule init /Users/wocaibujiaoquanmei/riscv-gnu-toolchain/riscv-gcc/ && \
    flock `git rev-parse --git-dir`/config git submodule update /Users/wocaibujiaoquanmei/riscv-gnu-toolchain/riscv-gcc/
    /bin/sh: flock: command not found
    make: *** [/Users/wocaibujiaoquanmei/riscv-gnu-toolchain/riscv-gcc/.git] Error 127

    怎么解决?

    1. zyj zyj

      这个问题没有在macOS遇到过,因为OS X下是没有flock这个命令的。你的riscv-gnu-toolchain源码是在哪获取的,./configure执行的结果是什么?
      可以试试在make前执行下命令安装所需工具:brew install gawk gnu-sed gmp mpfr libmpc isl zlib expat
      还可以看下这个issue有没有帮助:https://github.com/riscv/riscv-gnu-toolchain/issues/866。

      1. coderhare coderhare

        噢噢,看来可能是因为我用的gitee没有clone所有文件。我目前想跟着2020的课程做,按你的教程配置实验环境可以吗?

        1. zyj zyj

          我觉得环境是一样的,你可以试试,有结果了期待分享。

          1. coderhare coderhare

            博主你好,经测试,mojave上应该可以正常运行实验环境,剩下的我做实验的时候再看缺不缺东西~

            1. zyj zyj

              好的,感谢分享:)

  6. aucker aucker

    大佬你好,我在完成安装riscv-gnu-toolchain和qemu之后,在xv6目录下执行qemu时一直在报错,信息为:
    riscv64-unknown-elf-gcc -c -o kernel/entry.o kernel/entry.S
    'rv64imafdc' is not a recognized processor for this target (ignoring processor)
    'rv64imafdc' is not a recognized processor for this target (ignoring processor)
    kernel/entry.S:6:15: error: unexpected token in '.section' directive
    .section .data
    ^
    kernel/entry.S:8:15: error: unexpected token in '.section' directive
    .section .text
    ^
    kernel/entry.S:10:15: error: unexpected token in '.section' directive
    .section .text
    ^
    kernel/entry.S:17:9: error: invalid instruction mnemonic 'la'
    la sp, stack0
    ^~
    kernel/entry.S:18:9: error: invalid instruction mnemonic 'li'
    li a0, 1024*4
    ^~
    kernel/entry.S:19:2: error: invalid instruction mnemonic 'csrr'
    csrr a1, mhartid
    ^~~~
    kernel/entry.S:20:9: error: invalid instruction mnemonic 'addi'
    addi a1, a1, 1
    ^~~~
    kernel/entry.S:21:9: error: unknown use of instruction mnemonic without a size suffix
    mul a0, a0, a1
    ^
    kernel/entry.S:22:9: error: unknown use of instruction mnemonic without a size suffix
    add sp, sp, a0
    ^
    kernel/entry.S:26:9: error: ambiguous instructions require an explicit suffix (could be 'jb', or 'jl')
    j junk
    ^
    make: *** [kernel/entry.o] Error 1
    ,请问有什么解决办法吗

    1. zyj zyj

      看报错应该是toolchain中安装的汇编器有一些问题,在汇编entry.S文件时报错了。可以提供下更多信息,比如操作系统的类型和版本,各个工具的版本等。也可以加下我联系方式交流。

      1. aucker aucker

        感谢大佬,问题已经成功解决。这个问题是编译器的问题,在没发现博主的文章之前,我在GitHub上下载了那个最新的riscv-gnu-toolchain,但是由于git的原因,可能没有下载完全就在文件夹里执行make命令了,最终得到一个不可用的riscv64-unknown-elf-gcc-10.2.0的版本,才导致一直出错。
        后来下载博主的9.2版本的riscv-gnu-toolchain之后,将默认的riscv64-unknown-elf-gcc版本指向9.2版本问题就能解决了。

  7. rezeros rezeros

    大佬,想问下mac m1环境配置理论上可以支持么?

    1. zyj zyj

      理论上是可以的。你可以试试,结果可以贴在这大家一起讨论

      1. shit, 忘了谢谢博主了,感谢博主的文章,谢谢博主回复觉得可以我才打算试试,十分感谢

      2. 哇,可以了,折腾了两三天,打算放弃了都,竟然可以了,开心
        Mac M1 确实可以跑起来

        以下是过程中遇到的坑,希望有人和我一样的能少踩点:

        使用的risc-v是用的博主文中提到的的百度云,如果你遇到了和我一样开会员也只有几百k的情况,建议你用手机下载,然后下载的时候长按住这个下载速度仍然几百k的文件夹,选择反馈-》网速过慢,连续重复反馈几次后速度会提到几MB左右,当然我也是瞎蒙的管用,不清楚和什么有关,只希望对你有用最好

        然后 risc-v 工具链的问题在上面的issue 1 和 issue 2中,如果遇到的问题和我差不多,基本google就能解决个差不多

        重点就是这个 qemu,老坑了,第一次报错就是 no arm for,我当场心态爆炸,然后遇到了一个不能分配动态内存的错误,我以为是mac os有啥内存保护机制,qemu 触碰了之类的,中途加了几个qemu啥的群没有得到具体有用的信息,因为好多玩这个模拟器的都是手机玩的,所以努力google try 了一把打补丁的,打了两个很重要的补丁,见issue3,打补丁的过程中乱尝试了很多,由于我自己连 make 之类的都不熟悉,mac os 也是第一次用,所以很多地方我命令都敲的很谨慎,怕乱了环境,即便如此还是被整蒙了,比如第一遍编译成功,后面却不行了,可能是因为中途不知道尝试什么方案的时候开启了Rosetta模式导致的。。虽然现在可以了,但是也感觉靠了不少运气,希望这 三个 issue 能帮上需要的老铁。

        1. zyj zyj

          才看到回复,能成功运行起来就好,感谢你的详细分享!

      3. rezeros rezeros

        先安的工具链

        现在的结果:

        https://github.com/ReZeroS/mit6.828-note/issues/1

        遇到的问题以及解决方案:
        https://github.com/ReZeroS/mit6.828-note/issues/2

        现在卡住的地方 make qemu:
        https://github.com/ReZeroS/mit6.828-note/issues/3

        这个qemu没太查明白,直感上像是个模拟器bug一样

  8. tao tao

    您好,向您请教一下,kernel正常启动了,但是没有办法退出啊 ctrl + a或者ctrl + x都不行,是不是哪里出问题了呢, 测试的qemu-version 以及riscv64--version都没有问题

    1. zyj zyj

      按ctrl-a x可以退出 (注意ctrl+A要一起按,在松开之后按一下X)

      1. tao tao

        谢谢您,我昨天搞定了,不过还是谢谢您,我重装了两次,还专门下载了工具链,重装,费劲死了,官网这个地方写的是一点不详细啊。

        1. zyj zyj

          hah不客气,我回复迟了

  9. leaf leaf

    感谢作者分享 ! 自己查了半天都没解决跟着您的文章重新配了一遍就成功了。

    1. zyj zyj

      不客气,有问题随时交流

  10. 呜呜呜 呜呜呜

    你好,请问最后在实验目录中make qemu时缺少riscv64-unknown-elf-gcc -c -o kernel/entry.o kernel/entry.S
    riscv64-unknown-elf-gcc -Wall -Werror -O -fno-omit-frame-pointer -ggdb -DSOL_UTIL -MD -mcmodel=medany -ffreestanding -fno-common -nostdlib -mno-relax -I. -fno-stack-protector -fno-pie -no-pie -c -o kernel/start.o kernel/start.c
    ...
    riscv64-unknown-elf-ld -z max-page-size=4096 -N -e main -Ttext 0 -o user/_zombie user/zombie.o user/ulib.o user/usys.o user/printf.o user/umalloc.o
    riscv64-unknown-elf-objdump -S user/_zombie > user/zombie.asm
    riscv64-unknown-elf-objdump -t user/_zombie | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > user/zombie.sym
    mkfs/mkfs fs.img README user/xargstest.sh user/_cat user/_echo user/_forktest user/_grep user/_init user/_kill user/_ln user/_ls user/_mkdir user/_rm user/_sh user/_stressfs user/_usertests user/_grind user/_wc user/_zombie
    nmeta 46 (boot, super, log blocks 30 inode blocks 13, bitmap blocks 1) blocks 954 total 1000
    但是只有qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 3 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0

    xv6 kernel is booting

    hart 2 starting
    hart 1 starting
    init: starting sh
    这几行是什么问题
    前面的步骤都对

    1. 呜呜呜 呜呜呜

      make grade显示exec ./grade-lab-util failed

      1. zyj zyj

        前面的报错我没有太理解,你可以加下我交流。 make grade的问题你可以看看下一篇文章,我当时的解决方法是 "将gradelib.py的325行改为self.sock.connect(("127.0.0.1", port))",可能对你有帮助。

        1. 呜呜呜 呜呜呜

          解决了,忘记sudo了,万分感谢上面的教程

        2. 呜呜呜 呜呜呜

          按照改了,可是老是运行失败。。

  11. gr gr

    您好,我在riscv-toolchain和qemu阶段都没有出错,但是在最后一步进入xv6-riscv-fall19目录后make失败,错误信息如下
    riscv64-unknown-elf-gcc -c -o kernel/entry.o kernel/entry.S
    dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.21.dylib
    Referenced from: /usr/local/opt/riscv-gnu-toolchain/libexec/gcc/riscv64-unknown-elf/9.2.0/cc1
    Reason: image not found
    riscv64-unknown-elf-gcc: internal compiler error: Abort trap: 6 signal terminated program cc1
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See for instructions.
    make: *** [kernel/entry.o] Error 4
    查了半天实在搞不定,麻烦您帮忙解答一下,非常感谢

    1. gr gr

      刚刚解决了,stackoverflow上看到了类似的问题,执行了一下下面这个命令
      install_name_tool -change '/usr/local/opt/isl/lib/libisl.21.dylib' /usr/local/opt/isl/lib/libisl.dylib /usr/local/opt/riscv-gnu-toolchain/libexec/gcc/riscv64-unknown-elf/9.2.0/cc1
      虽然不知道什么意思

      1. zyj zyj

        根据这句报错: "dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.21.dylib",可以看出是找到libisl这个动态库。 install_name_tool -change命令的作用是修改动态库的路径,将原来的 libisl.21.dylib 改为 libisl.dylib,这样就可以在编译时找到。

        1. Pengc Pengc

          非常感谢,同样遇到了这个问题,动态库链接问题!

  12. Jocelyn Jocelyn

    你好,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

    1. zyj zyj

      已解决。问题为在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 并替换到本地, 重试编译后成功。

      1. scott scott

        Makefile:4330: recipe for target 'configure-gcc' failed
        make[1]: *** [configure-gcc] Error 1
        make[1]: 离开目录“/mnt/d/Desktop/risc-v/riscv-gnu-toolchain/build/build-gcc-newlib-stage1”
        Makefile:517: recipe for target 'stamps/build-gcc-newlib-stage1' failed
        make: *** [stamps/build-gcc-newlib-stage1] Error 2

        大佬,这个错误是啥原因呀,卡在这里好久了

        1. zyj zyj

          请问用的是什么操作系统,是虚拟机吗,以及toolchain的版本是什么?

    2. zyj zyj

      从你发的日志来看并没有报错,建议多等一会 (大概需要30-40分钟,视机器而定)。 "Nothing to be done" 的提示是指部分产物已经编译生成了,你也可以先 make clean 然后重新 make 试试。 如果还不行可以加我下wx,帮你分析下具体的问题。

  13. whx whx

    我在最后的make阶段出现了问题

    riscv64-unknown-elf-gcc: error: unrecognized command-line option '-mmacosx-version-min=10.9'

    查了好久,没有解决,这是什么原因?makefile里也没找见关键字啊

    1. whx whx

      我找到原因了 是我的conda自动加的!!!

      1. zz zz

        Hi, 请问你是怎么解决这个问题的?

      2. zyj zyj

        可以,找到原因就好

  14. 小陈同学 小陈同学

    你好,请问编译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

    不知道该去配置什么东西,实在不知道怎么办了。
    十分感谢你看完了这个评论,如果能给予一些指导就更好了(/ω\)

    1. zyj zyj

      环境变量需要在系统配置文件中添加,你可以使用vim打开文件并在末尾添加一行,具体细节我已经在原文中补充 :)

      1. 小陈同学 小陈同学

        感谢作者♥️,按照作者的步骤来是没有问题的。

        1. zyj zyj

          不客气,后面会持续更新,有问题欢迎交流。

  15. syl syl

    期待后续更新。

添加新评论