本文介绍搭建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基础上进行内核开发和扩展。

更新于 2022.01.16:这个环境搭建教程同样适用于6.S081 Fall 2020或者更高版本,唯一不同是xv6源码需要选择对应版本。实验代码可以参考我的Github

环境搭建

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

已有 182 条评论

  1. kazuki kazuki

    有关m系列芯片编译riscv0-gnu-toolchain的链接问题、隐式定义等我发表了一个Stack Overflow
    https://stackoverflow.com/questions/78900889/compiling-riscv-gnu-toolchain-on-a-computer-with-an-arm-based-apple-m3-chip-give

    相关错误可参考:
    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/__locale:811:1:
    error: declaration conflicts with target of using declaration already in scope
    iscntrl(_CharT __c, const locale& __loc)
    ---
    /Development/riscv-gnu-toolchain/riscv-gdb/readline/rltty.c:759:3: error: call to undeclared function 'ioctl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    ioctl (fildes, TIOCSTOP, 0);

  2. 孤云 孤云

    最近中科院软件所做了RISC-V Toolchains的国内镜像。https://mp.weixin.qq.com/s/q7aAJLfHJ6JFw_8dhHD97Q

    1. Chain Chain

      请问各位:我在安装toolchain,的第二步配置环境变量那输入source ~/.bash_profile后 一直报错
      这是我输入vim ~/.bash_profile后打开的bash文件:
      >>> conda initialize >>>
      # !! Contents within this block are managed by 'conda init' !!
      __conda_setup=“$('/Users/lulin/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)”
      if [ $? -eq 0 ]; then
      eval "$__conda_setup"
      else
      if [ -f "/Users/lulin/opt/anaconda3/etc/profile.d/conda.sh" ]; then
      . "/Users/lulin/opt/anaconda3/etc/profile.d/conda.sh"
      else
      export PATH="/Users/lulin/opt/anaconda3/bin:$PATH"
      fi
      fi
      unset __conda_setup
      #

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

  4. 地瓜番薯烤红薯 地瓜番薯烤红薯

    可以 成功安装完成 感谢大佬们(可以结合博主、BASARANOMO、rezeros一起看

  5. tmr tmr

    感觉用M1 chip 真的好麻烦啊, 我一开始尝试用本地安装可是卡死在Package 'gcc-multilib' has no installation candidate。 后来用virtual machine的话tool box里很多都还不兼容m1. 现在选了parallels 但是依旧卡在parallels@ubuntu-linux-20-04-desktop:~/6.828/lab$ sudo 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 GCCPREFIX
    *** environment variable to that prefix and run 'make' again.
    *** To turn off this error, run 'gmake GCCPREFIX= ...'.
    ***
    gcc: error: unrecognized command line option ‘-m32’
    + as kern/entry.S
    gcc: error: unrecognized command line option ‘-m32’
    make: *** [kern/Makefrag:56: obj/kern/entry.o] Error 1
    我觉得可能还是少32位library但是还是跟本地mac一样找不到内个
    arallels@ubuntu-linux-20-04-desktop:~/6.828/lab$ sudo apt-get install gcc-multilib
    [sudo] password for parallels:
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    Package gcc-multilib is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package 'gcc-multilib' has no installation candidate

    大家有什么办法么, 我也不想非得弄riscv了 2018的版本我都搞不明白了。卡了好几天了都。

    1. zyj zyj

      建议搞一台云服务器来弄

  6. Harry Harry

    有没有老哥在做实验的过程中遇到过测试程序无法执行的问题

    harrylee@MacBook-Pro xv6-labs-2021 % 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

    xv6 kernel is booting

    hart 2 starting
    hart 1 starting
    init: starting sh
    $ ./grade-lab-syscall trace
    exec ./grade-lab-syscall failed
    $

    1. yClever yClever

      好像是因为多打了一个空格..我也遇到过

      1. Harry Harry

        我发现喔蠢了,这个测试程序不应该进入到Xv6时shell运行的,它应该是在根目录下运行的,也就是Xv6所在的这个文档。^^

        1. jin jin

          xv6 kernel is booting

          hart 1 starting
          hart 2 starting
          init: starting sh
          $

          $ su
          exec su failed

          $ reboot -f
          exec reboot failed
          $
          大家有没有遇见像我这样的呢?

          1. zyj zyj

            这样是正常的,xv6是没有su和reboot指令的

  7. a77 a77

    os 10.14
    下载gawk显示
    ==> ./configure --prefix=/usr/local/Cellar/gawk/5.1.1 --without-libsigsegv-prefi
    ==> make
    ==> make check
    Last 15 lines from /Users/admin/Library/Logs/Homebrew/gawk/03.make:
    diff -u ${base}.ok $i ; \
    else \
    diff -u "."/${base}.ok $i ; \
    fi ; \
    fi ; \
    done | more
    ============== _nonfatal1 =============
    --- nonfatal1.ok 2019-08-28 18:54:15.000000000 +0000
    +++ _nonfatal1 2022-02-26 05:10:28.000000000 +0000
    @@ -1,2 +1 @@
    -gawk: nonfatal1.awk:4: warning: remote host and port information (1.2.3.4.5, 25) invalid
    1
    make[2]: *** [check] Error 1
    make[1]: *** [check-recursive] Error 1
    make: *** [check] Error 2

    Do not report this issue to Homebrew/brew or Homebrew/core!

    Error: You are using macOS 10.14.
    We (and Apple) do not provide support for this old version.
    You will encounter build failures with some formulae.
    Please create pull requests instead of asking for help on Homebrew's GitHub,
    Twitter or any other official channels. You are responsible for resolving
    any issues you experience while you are running this
    old version.

    Error: A newer Command Line Tools release is available.
    Update them from Software Update in System Preferences or run:
    softwareupdate --all --install --force

    If that doesn't show you any updates, run:
    sudo rm -rf /Library/Developer/CommandLineTools
    sudo xcode-select --install

    Alternatively, manually download them from:
    https://developer.apple.com/download/all/.
    You should download the Command Line Tools for Xcode 11.3.1.

    接着装了xcode还是不行

    是版本太旧了吗, 10.15能用? 新版本硬盘占用太大,

    1. zyj zyj

      安装一个低版本的gawk试试看,我是MacOS 10.13.4 版本的,gawk版本是4.2.1。

      1. a77 a77

        按下载的话是输入./configure --prefix=/usr --libexecdir=/usr/lib
        make
        后面还要输什么吗?

        1. zyj zyj

          brew安装指定版本gawk:
          第一种方法: brew search gawk,看下有哪些版本, 执行 brew install gawk@4.2.1 安装
          第二种方法:试试 brew install http://raw.githubusercontent.com/Homebrew/homebrew-core/ce228f42f3fbf15d3ae3945287fd33437e47033b/Formula/gawk.rb
          如果还不行就加下我吧

          1. a77 a77

            在网站上下载了后
            make install后
            跳出cp: /usr/bin/_inst.529_: Permission denied
            make[2]: *** [install-binPROGRAMS] Error 1
            make[1]: *** [install-am] Error 2
            make: *** [install-recursive] Error 1

            一顿胡搅蛮缠后总算弄好了

            正在make riscv中

            虽然没用上

            果然知道指令会方便很多 谢谢

            1. zyj zyj

              可以网上搜一下给brew设置国内源。你现在是在编译toolchain 还是qemu?是哪个版本的

              1. a77 a77

                qemu 4.1

            2. zyj zyj

              参考这篇https://www.cnblogs.com/RDaneelOlivaw/p/6820723.html

              1. a77 a77

                编译了一下 还是缺东西

                glib-2.40 gthread-2.0 is required to compile QEMU
                正在下载中

                问下brew 怎么配置翻墙? 网上下的心累,

            3. zyj zyj

              好的,一般Permission denied是权限不够,加个sudo就好了

              1. a77 a77

                嗯嗯
                编译qemu 4.1时 跳出ERROR: pkg-config binary 'pkg-config' not found

                用了apt-get install -y pkg-config

                但mac不是这条指令 应该怎么装?

      2. a77 a77

        找到了安装历史版本的命令 但是输入后信息量有点大 初学者一时没看出

        输入brew install --5.0.0-gnu-wak
        Usage: brew install [options] formula|cask [...]

        Install a formula or cask. Additional options specific to a formula may be
        appended to the command.

        Unless HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK is set, brew upgrade or brew
        reinstall will be run for outdated dependents and dependents with broken
        linkage, respectively.

        Unless HOMEBREW_NO_INSTALL_CLEANUP is set, brew cleanup will then be run for
        the installed formulae or, every 30 days, for all formulae.

        Unless HOMEBREW_NO_INSTALL_UPGRADE is set, brew install formula will
        upgrade formula if it is already installed but outdated.

        -d, --debug If brewing fails, open an interactive
        debugging session with access to IRB or a
        shell inside the temporary build directory.
        -f, --force Install formulae without checking for
        previously installed keg-only or non-migrated
        versions. When installing casks, overwrite
        existing files (binaries and symlinks are
        excluded, unless originally from the same
        cask).
        -v, --verbose Print the verification and postinstall steps.
        --formula, --formulae Treat all named arguments as formulae.
        --ignore-dependencies An unsupported Homebrew development flag to
        skip installing any dependencies of any kind.
        If the dependencies are not already present,
        the formula will have issues. If you're not
        developing Homebrew, consider adjusting your
        PATH rather than using this flag.
        --only-dependencies Install the dependencies with specified
        options but do not install the formula
        itself.
        --cc Attempt to compile using the specified
        compiler, which should be the name of the
        compiler's executable, e.g. gcc-7 for GCC
        7. In order to use LLVM's clang, specify
        llvm_clang. To use the Apple-provided
        clang, specify clang. This option will only
        accept compilers that are provided by
        Homebrew or bundled with macOS. Please do not
        file issues if you encounter errors while
        using this option.
        -s, --build-from-source Compile formula from source even if a
        bottle is provided. Dependencies will still
        be installed from bottles if they are
        available.
        --force-bottle Install from a bottle if it exists for the
        current or newest version of macOS, even if
        it would not normally be used for
        installation.
        --include-test Install testing dependencies required to run
        brew test formula.
        --HEAD If formula defines it, install the HEAD
        version, aka. main, trunk, unstable, master.
        --fetch-HEAD Fetch the upstream repository to detect if
        the HEAD installation of the formula is
        outdated. Otherwise, the repository's HEAD
        will only be checked for updates when a new
        stable or development version has been
        released.
        --keep-tmp Retain the temporary files created during
        installation.
        --build-bottle Prepare the formula for eventual bottling
        during installation, skipping any
        post-install steps.
        --bottle-arch Optimise bottles for the specified
        architecture rather than the oldest
        architecture supported by the version of
        macOS the bottles are built on.
        --display-times Print install times for each package at the
        end of the run.
        -i, --interactive Download and patch formula, then open a
        shell. This allows the user to run
        ./configure --help and otherwise determine
        how to turn the software package into a
        Homebrew package.
        -g, --git Create a Git repository, useful for creating
        patches to the software.
        --overwrite Delete files that already exist in the prefix
        while linking.
        --cask, --casks Treat all named arguments as casks.
        --[no-]binaries Disable/enable linking of helper executables
        (default: enabled).
        --require-sha Require all casks to have a checksum.
        --[no-]quarantine Disable/enable quarantining of downloads
        (default: enabled).
        --skip-cask-deps Skip installing cask dependencies.
        --appdir Target location for Applications (default:
        /Applications).
        --colorpickerdir Target location for Color Pickers (default:
        ~/Library/ColorPickers).
        --prefpanedir Target location for Preference Panes
        (default: ~/Library/PreferencePanes).
        --qlplugindir Target location for QuickLook Plugins
        (default: ~/Library/QuickLook).
        --mdimporterdir Target location for Spotlight Plugins
        (default: ~/Library/Spotlight).
        --dictionarydir Target location for Dictionaries (default:
        ~/Library/Dictionaries).
        --fontdir Target location for Fonts (default:
        ~/Library/Fonts).
        --servicedir Target location for Services (default:
        ~/Library/Services).
        --input-methoddir Target location for Input Methods (default:
        ~/Library/Input Methods).
        --internet-plugindir Target location for Internet Plugins
        (default: ~/Library/Internet Plug-Ins).
        --audio-unit-plugindir Target location for Audio Unit Plugins
        (default:
        ~/Library/Audio/Plug-Ins/Components).
        --vst-plugindir Target location for VST Plugins (default:
        ~/Library/Audio/Plug-Ins/VST).
        --vst3-plugindir Target location for VST3 Plugins (default:
        ~/Library/Audio/Plug-Ins/VST3).
        --screen-saverdir Target location for Screen Savers (default:
        ~/Library/Screen Savers).
        --language Comma-separated list of language codes to
        prefer for cask installation. The first
        matching language is used, otherwise it
        reverts to the cask's default language. The
        default value is the language of your system.
        -q, --quiet Make some output more quiet.
        -h, --help Show this message.
        Error: invalid option: --5.0.0-gnu-wak

        是填brew install [options] formula|cask [...]?

  8. bdp bdp

    有两个问题想请教下您:
    1. 我默认的交叉编译工具链是i386-elf-xxx,能正常编译运行,也可以gdb 调试,但有个问题是,调试kernel 中的汇编源码时断点无法触达,比如在entry.S 的entry 标记处下断点,显示断点设置成功,但continue 后没断住。bootasm.S 都能断成功,不理解为什么。
    2. 以为上面问题是工具链的原因,于是又编译了riscv-gnu-toolchain 工具链,直接编译报错。

    1. zyj zyj

      问题解决了吗,按理说直接gdb单步调试就能进入entry.S的。如果还没解决可以加我下一起看看

      1. bdp bdp

        还没,我加你下微信啦

  9. Harry Harry

    ***
    *** Error: Couldn't find an riscv64 version of GCC/binutils.
    *** To turn off this error, run 'gmake TOOLPREFIX= ...'.
    ***
    make: `kernel/kernel' is up to date.
    不知道老哥有没有碰到过这种情况,在xv6根目录下编译qemu,用到的toolchain是在博主的网盘下载的

    1. Harry Harry

      喔喔关于路径适配的问题 toolchain中再重新适配一下即可

      1. Frank Frank

        请问一下最后是在哪重新适配解决的? 我也遇到了这个问题

        1. Frank Frank

          哦哦没事了,我从头跑了一遍解决了可以跑起来了,谢谢博主!

        2. Harry Harry

          vim ~/.bash_profile #打开配置文件
          export PATH="$PATH:/usr/local/opt/riscv-gnu-toolchain/bin" #末尾添加此行
          source ~/.bash_profile #使配置生效

          可能我的这个每次开启需要使它的toolchain路径生效

  10. hello hello

    请问一下博主,对于新手来说,Mac M1有什么好的编译方案

    1. zyj zyj

      主要是对qemu打上补丁以兼容M1,详细过程可以参考下方评论,比如这条 https://zhayujie.com/mit6828-env.html#comment-187

  11. 小郑 小郑

    我走到了riscv tool chain安装的下面这个阶段,但是提示我 validation failed。
    ```
    ./configure --prefix=/usr/local/opt/riscv-gnu-toolchain #配置产物路径
    make #编译
    ```

    打印出的log如下:
    /usr/local/Homebrew/Library/Homebrew/utils/github/api.rb:304:in `raise_error': Validation Failed: [{"message"=>"The listed users and repositories cannot be searched either because the resources do not exist or you do not have permission to view them.", "resource"=>"Search", "field"=>"q", "code"=>"invalid"}] (GitHub::API::ValidationFailedError)
    from /usr/local/Homebrew/Library/Homebrew/utils/github/api.rb:234:in `open_rest'
    from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:166:in `search'
    from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:34:in `search_issues'
    from /usr/local/Homebrew/Library/Homebrew/utils/github.rb:67:in `issues_for_formula'
    from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:491:in `fetch_issues'
    from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:487:in `issues'
    from /usr/local/Homebrew/Library/Homebrew/exceptions.rb:541:in `dump'
    from /usr/local/Homebrew/Library/Homebrew/brew.rb:155:in `rescue in '
    from /usr/local/Homebrew/Library/Homebrew/brew.rb:143:in `'
    /usr/local/Homebrew/Library/Homebrew/formula.rb:2309:in `block in system': Failed executing: make (BuildError)
    from /usr/local/Homebrew/Library/Homebrew/formula.rb:2245:in `open'
    from /usr/local/Homebrew/Library/Homebrew/formula.rb:2245:in `system'
    from /usr/local/Homebrew/Library/Taps/riscv/homebrew-riscv/riscv-gnu-toolchain.rb:40:in `install'

    好像是文件夹访问权限的一些问题,请问楼主知道怎么弄么?
    谢谢!

    1. zyj zyj

      是configure还是make时报的错?在前面加sudo后执行试试看

  12. 三三哥 三三哥

    macOS Big Sur riscv-gnu-toolchain 编译通过, make qemu 也没问题,直接进入qemu 环境

    踩的坑:
    1、 开始是从官方网站git clone --recursive https://github.com/riscv/riscv-gnu-toolchain 源码,然后在拉下子模块(官方git 有介绍,具体地址就是楼主发的)。 好不容易clone 好了之后 make 编译始终卡在 riscv-gcc 编译这里,总是报 build-binutils-newlib/libiberty/libiberty.a 和相关的 xxx.a 库错误,实际猜测大概就是 ld 兼容原因,各种搜索没解决,最后用楼主提供的3G 的源码 编译通过,
    2、 brew list 如果存在 binutils 删掉 brew rm binutils,这样默认就用MACOS 的工具链 具体解释 https://github.com/bitcoin/bitcoin/issues/20825
    3、 第 2 步 处理之后 用楼主提供的链接去编译,然后继续走。基本没啥问题。

  13. lp lp

    博主你好,我在进行gdb调试的时候,按您所说先启动make qemu-gdb,在启动riscv64的那个,但是在riscv中执行命令都会说 the program is not being run,这是为什么呢?

    1. lp lp

      这个解决了,是权限问题chmod +x riscv64-unknown-elf-gdb
      第二个问题是在调试的时候终端1无法输出信息
      Python Exception Installation error: gdb._execute_
      unwinders function is missing:

      1. lp lp

        是我草率了,这正是pdtbl第一个task。。。

  14. xjl xjl

    非常感谢,我用qemu 5.1.0的版本没有问题

  15. flex flex

    macos环境 编译都通过 ,链接也正常,但是调试导入符号文件的时候 死活不成功
    (gdb) target remote localhost:25501
    Remote debugging using localhost:25501
    warning: No executable has been specified and target does not support
    determining executable automatically. Try using the "file" command.
    0x0000000000001000 in ?? ()
    => 0x0000000000001000: 97 02 00 00 auipc t0,0x0
    (gdb) file user/_ls
    Reading symbols from user/_ls...
    I'm sorry, Dave, I can't do that. Symbol format `elf64-littleriscv' unknown.
    Abort trap: 6
    lijundeMacBook-Pro:xv6-labs-2020 lijun$

    找不到解决办法了

    1. zyj zyj

      你的toolchain版本是多少?如果太高了可以换成9.2的试试

  16. flex flex

    (gdb) file kernel/kernel
    Reading symbols from kernel/kernel...
    I'm sorry, Dave, I can't do that. Symbol format `elf64-littleriscv' unknown.
    Abort trap: 6

  17. lp lp

    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
    make工具链的时候遇到如下错误,看了下评论区但还是没解决

    1. lp lp

      工具链的问题解决了https://blog.csdn.net/poena/article/details/118400196
      qemu也显示版本了,但是最后make qemu 的时候一直卡住,进不去shell

      1. 款冬 款冬

        您好,我根据您给的这个博客试过了,我这边还是报错,请问您怎么解决的呀

        ld: warning: ignoring duplicate libraries: '../libcpp/libcpp.a', '../libdecnumber/libdecnumber.a', 'libcommon.a'
        ld: Undefined symbols:
        _host_hooks, referenced from:
        c_common_no_more_pch() in c-pch.o
        gt_pch_save(__sFILE*) in libbackend.a[95](ggc-common.o)
        gt_pch_save(__sFILE*) in libbackend.a[95](ggc-common.o)
        gt_pch_restore(__sFILE*) in libbackend.a[95](ggc-common.o)
        toplev::main(int, char**) in libbackend.a[284](toplev.o)
        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

      2. zyj zyj

        你的qemu版本是多少,是不是因为版本太高不兼容导致的。参考这个评论https://zhayujie.com/mit6828-env.html#comment-186

        1. lp lp

          我先是用的楼主你的百度网盘,但是安装失败,报了很多错(类似于代码错误),然后brew下了qemu6,make qemu卡住用不了,最后去官网下了5,但还是报网盘版本一样的错:
          /Users/lengpi/Downloads/qemu-5.1.0-rc1/target/i386/hvf/x86.h:316:28: error: invalid output constraint '=a' in asm
          : "=a"(tsc) /* output to tsc variable */
          ^
          In file included from /Users/lengpi/Downloads/qemu-5.1.0-rc1/target/i386/hvf/hvf.c:57:
          /Users/lengpi/Downloads/qemu-5.1.0-rc1/target/i386/hvf/vmx.h:36:29: error: unknown type name 'hv_vcpuid_t'
          static inline uint64_t rreg(hv_vcpuid_t vcpu, hv_x86_reg_t reg)
          ^
          /Users/lengpi/Downloads/qemu-5.1.0-rc1/target/i386/hvf/vmx.h:36:47: error: unknown type name 'hv_x86_reg_t'
          static inline uint64_t rreg(hv_vcpuid_t vcpu, hv_x86_reg_t reg)
          工具链是11的

          1. zyj zyj

            如果实在没办法可以考虑把工具链换成9.2版本的试试

            1. lp lp

              解决了,还是qemu在m1下有问题,要打布丁,下面评论老哥的github连接有效
              https://github.com/ReZeroS/mit6.828-note/issues/3

              1. doris doris

                你好,请问一下这个问题是怎么解决的,麻烦可以私下联系一下 吗

  18. zjuchy zjuchy

    可以问一下博主m1可以支持s081的qemu环境配置吗?

    1. zyj zyj

      可以的,评论中有成功案例

      1. zjuchy zjuchy

        我已经成功安装,但是无法使用gdb进行调试

        1. zyj zyj

          请问具体报什么错呢?也可以看本文末尾,直接下载编译后gdb使用试试

          1. zjuchy zjuchy

            使用risc v里的gdb是可以调试的,但是m1系统是无自带的gdb,这里非常感谢博主以及评论!

            1. zyj zyj

              可以的,用riscv64-unknown-elf-gdb就好

          2. zjuchy zjuchy

            直接编译我还没试成功,m1好像只有lldb,而没有gdb,我也查了很久,太难了

      2. zjuchy zjuchy

        感谢

  19. terrorist terrorist

    博主你好,我在编译toolchain的过程中产生了如下错误,请问您知道怎么解决吗?

    Makefile:541: recipe for target 'bfd.info' failed
    make[4]: *** [bfd.info] Error 127
    make[4]: Leaving directory '/riscv-gnu-toolchain/build-binutils-newlib/bfd/doc'
    Makefile:1654: recipe for target 'info-recursive' failed
    make[3]: *** [info-recursive] Error 1
    make[3]: Leaving directory '/riscv-gnu-toolchain/build-binutils-newlib/bfd'
    Makefile:2747: recipe for target 'all-bfd' failed
    make[2]: *** [all-bfd] Error 2
    make[2]: Leaving directory '/riscv-gnu-toolchain/build-binutils-newlib'
    Makefile:851: recipe for target 'all' failed
    make[1]: *** [all] Error 2
    make[1]: Leaving directory '/riscv-gnu-toolchain/build-binutils-newlib'
    Makefile:388: recipe for target 'stamps/build-binutils-newlib' failed
    make: *** [stamps/build-binutils-newlib] Error 2

    1. zyj zyj

      可以先发下你当前的环境信息 (比如是什么cpu架构,操作系统的版本和位数,toolchain的版本等)。

      然后考虑以下几个问题:
      1. 你的toolchain安装路径是多少? 如果是从根目录开始 (/riscv-gnu-toolchain),确认下是否有权限,可以换个路径重新编译一次试试
      2. toolchain的安装路径下是否存在中文,如果有的话改成英文试试

      如果还不行可以加下我一起看看。

      1. terrorist terrorist

        我的CPU版本是x64,操作系统是ubuntu16.04,64位。toolchain是用的你提供的百度网盘链接下载的,我直接把文件拖到了虚拟机里面。刚刚把安装路径换到了home目录下还是报了同样的错误。

        1. zyj zyj

          把 make 改成 make linux 再编译一次试试

          1. terrorist terrorist

            解决了,我仔细看了以下我的报错信息,发现了一行warning:'makeinfo' is missing on your system.然后我去百度,安装了对应的依赖库,这个问题就解决了。后来又陆陆续续出现了很多类似的错误,但是通过安装对应的依赖库后就都解决了。

  20. GoodLuck GoodLuck

    2021/8/8日更新,macos Catalina安装的血泪教训,首先如果你直接brew install riscv-tools失败的话,先试试安装xcode 12.4,安装成功后先把brew 的下载和编译缓存给清了,再次安装,就可以了。

  21. sja sja

    博主你好,在之前的回答里面看到我的qemu的版本过高导致了这个make qemu卡住的问题。我在mac中uninstall了qemu然后在官网上下载了5.1.0的源码configure和make完了之后再make qemu为什么会显示make: qemu-system-riscv64: No such file or directory?

    1. zyj zyj

      1. 首先确认下qemu是不是成功安装了,需要找到qemu-system-riscv64这个可执行文件(默认路径在/usr/local/bin下)
      2. 然后看看这个安装路径是不是配置为环境变量了(执行 echo $PATH 可以查看),如果路径不存在需要配置 (比如在~/.bash_profile文件中添加)

      1. sja sja

        qemu安装的时候报了这个错误:
        install: /usr/local/bin/qemu-system-aarch64: No such file or directory
        make[1]: *** [install] Error 71
        make: *** [aarch64-softmmu/install] Error 2
        但我在/usr/local/bin里面找到了这个文件,而且也有qemu-system-riscv64这个文件。

        1. zyj zyj

          已解决。 原因是brew安装的qemu没有删除干净,手动删除/usr/local/bin 下的文件并重新编译源码后成功运行。

  22. zzp zzp

    博主你好,我编译完 riscv-gnu-toolchain 以及添加好环境变量后,执行 riscv64-unknown-elf-gcc -v 显示 command not found,请问有遇到吗?

    1. zyj zyj

      可以进入你的安装目录确认一下是否编译成功,看看有没有 riscv64-*-elf-gcc 类似的文件,可能操作系统不同文件名字会有些差异,如果还不能解决可以加我联系方式

      1. zzp zzp

        谢谢博主,解决了,是我 source 没生效。但是现在在 xv6 目录下进行 make 的时候一直卡住。

        1. zyj zyj

          参考这个: https://zhayujie.com/mit6828-env.html#comment-186

          1. zzp zzp

            已解决,谢谢博主!!!

            1. zzp zzp

              博主你好,昨天我顺利进入 xv6 的 shell 之后,写了 sleep 的代码,然后重新执行了 make qemu,进入之后无法执行我的 sleep 程序,显示 exec sleep failed。然后我在shell里执行 ./grade-lab-util sleep 也显示 exec ./grade-lab-util failed,请问这是什么原因?

              1. zyj zyj

                是不是没有在Makefile的UPROGS中追加一行$U/_sleep\,这个在lab的说明中有提到。 lab1可以参考: https://zhayujie.com/mit6828-lab-util.html

              2. zzp zzp

                我看他确实没有给我生成 sleep.o 文件

  23. serial serial

    非常感谢分享!去年就一直想做这个lab,一直没编译成功riskv-tool-chain和qemu。这几天看了这篇文章终于编译好了全部东西,成功进入xv6的shell!!!

    1. zyj zyj

      课程还是很不错的,我正在做2020版本的,后面有问题欢迎留言 :)

      1. juruo juruo

        博主你好,请问这是怎么回事?
        在make qemu的时候无法进入,提示
        `qemu-system-riscv64 -machine virt -bios none -kernel kernel/kernel -m 128M -smp 1 -nographic -drive file=fs.img,if=none,format=raw,id=x0 -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0`

        1. zyj zyj

          请问你的qemu是什么版本的,可能是因为qemu版本过高导致的不兼容问题,可以参考这条评论: https://zhayujie.com/mit6828-env.html#comment-186

          1. juruo juruo

            感谢!已经解决了,是这个问题

  24. 我是小靖仔 我是小靖仔

    想问博主的gdb可以用layout命令吗?这边提示说没有该命令:“Undefined command: "layout". Try "help".”像这种怎么解决

    1. 蓝

      我也遇到这个问题,用的是ubuntu20.04系统x84平台,编译过程没有出现错误。

      1. 我是小靖仔 我是小靖仔

        https://www.bilibili.com/video/BV1Qi4y1o7tN?spm_id_from=333.999.0.0

        1. 蓝

          好的,感谢,视频里面是安装gdb-multiarch,环境我其实都已经装好了,主要是gdb-multiarch无法单步进入ecall指令,我看mit视频使用的riscv64-unknown-elf-gdb却可以,所以我想自己下载源码编译,才有了以上问题。我重新把riscv-tool-chain编译并安装了一遍,layout命令还是无法使用,但目前可以正常进入ecall调试,可视化差点,能正常使用。

    2. zyj zyj

      我的能使用layout命令,你可以用文末的地址下载8.3版本的gdb试试看

      1. 我是小靖仔 我是小靖仔

        谢谢博主,我这是ubuntu,和mac的文件不能通用,我再找找是啥问题吧

        1. liudamu liudamu

          或者你有qq吗,想私下交流下

          1. 我是小靖仔 我是小靖仔

            3282383639

        2. liudamu liudamu

          你好,请问你的问题现在解决了嘛?我在centos也是遇到这个问题

          1. 我是小靖仔 我是小靖仔

            卸载重装。。。

            1. liudamu liudamu

              谢谢你的回复!能不能说一下是哪里添加参数之类的?

              1. 我是小靖仔 我是小靖仔

                什么参数,不就是要把博主给的gdb包删了,然后重新安装一遍吗

  25. 嘿嘿 嘿嘿

    你好博主,请问在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. 阿栋 阿栋

        #include 啥啊,大佬,我也遇到这个问题了

      2. zyj zyj

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

        1. panda panda

          两个文件均加入 #include

          1. panda panda


            不知道为什么include后面的文字丢失了

            1. panda panda

              sys/ioctl.h 头文件是这个,两边加尖括号就行

              1. zyj zyj

                收到,多谢。尖括号里的内容应该是被过滤掉了,我后面修复下~

    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. 嘿嘿 嘿嘿

              非常感谢

  26. 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. zzp zzp

          能直接 rm qemu* 吗

        2. 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

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

  27. 小白菜 小白菜

    博主你好,我在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工具链,编译的漫长(一个晚上都未编完)以及对之后运行在此环境中性能的考虑都使此方案作废。

  28. 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的话我可以发给你编译后的产物使用

  29. 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

              好的,感谢分享:)

  30. 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版本问题就能解决了。

  31. 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一样

  32. 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不客气,我回复迟了

  33. leaf leaf

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

    1. zyj zyj

      不客气,有问题随时交流

  34. 呜呜呜 呜呜呜

    你好,请问最后在实验目录中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. 呜呜呜 呜呜呜

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

  35. 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

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

  36. 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,帮你分析下具体的问题。

  37. whx whx

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

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

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

    1. whx whx

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

      1. alex alex

        请问怎么解决这个问题呢?

      2. zz zz

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

      3. zyj zyj

        可以,找到原因就好

  38. 小陈同学 小陈同学

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

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

  39. syl syl

    期待后续更新。

添加新评论