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基础上进行内核开发和扩展。
更新于 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
) 后即可使用。
已有 182 条评论
添加新评论
- 上一篇: 关于博客
- 下一篇: MIT6.828 — Lab1 Unix Utilities
有关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);
最近中科院软件所做了RISC-V Toolchains的国内镜像。https://mp.weixin.qq.com/s/q7aAJLfHJ6JFw_8dhHD97Q
请问各位:我在安装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
#
#
#
[...]本文链接:https://zhayujie.com/mit6828-env.html[...]
可以 成功安装完成 感谢大佬们(可以结合博主、BASARANOMO、rezeros一起看
感觉用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的版本我都搞不明白了。卡了好几天了都。
建议搞一台云服务器来弄
有没有老哥在做实验的过程中遇到过测试程序无法执行的问题
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
$
好像是因为多打了一个空格..我也遇到过
我发现喔蠢了,这个测试程序不应该进入到Xv6时shell运行的,它应该是在根目录下运行的,也就是Xv6所在的这个文档。^^
xv6 kernel is booting
hart 1 starting
hart 2 starting
init: starting sh
$
$ su
exec su failed
$ reboot -f
exec reboot failed
$
大家有没有遇见像我这样的呢?
这样是正常的,xv6是没有su和reboot指令的
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能用? 新版本硬盘占用太大,
安装一个低版本的gawk试试看,我是MacOS 10.13.4 版本的,gawk版本是4.2.1。
按下载的话是输入./configure --prefix=/usr --libexecdir=/usr/lib
make
后面还要输什么吗?
brew安装指定版本gawk:
第一种方法: brew search gawk,看下有哪些版本, 执行 brew install gawk@4.2.1 安装
第二种方法:试试 brew install http://raw.githubusercontent.com/Homebrew/homebrew-core/ce228f42f3fbf15d3ae3945287fd33437e47033b/Formula/gawk.rb
如果还不行就加下我吧
在网站上下载了后
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中
虽然没用上
果然知道指令会方便很多 谢谢
可以网上搜一下给brew设置国内源。你现在是在编译toolchain 还是qemu?是哪个版本的
qemu 4.1
参考这篇https://www.cnblogs.com/RDaneelOlivaw/p/6820723.html
编译了一下 还是缺东西
glib-2.40 gthread-2.0 is required to compile QEMU
正在下载中
问下brew 怎么配置翻墙? 网上下的心累,
好的,一般Permission denied是权限不够,加个sudo就好了
嗯嗯
编译qemu 4.1时 跳出ERROR: pkg-config binary 'pkg-config' not found
用了apt-get install -y pkg-config
但mac不是这条指令 应该怎么装?
找到了安装历史版本的命令 但是输入后信息量有点大 初学者一时没看出
输入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 [...]?
有两个问题想请教下您:
1. 我默认的交叉编译工具链是i386-elf-xxx,能正常编译运行,也可以gdb 调试,但有个问题是,调试kernel 中的汇编源码时断点无法触达,比如在entry.S 的entry 标记处下断点,显示断点设置成功,但continue 后没断住。bootasm.S 都能断成功,不理解为什么。
2. 以为上面问题是工具链的原因,于是又编译了riscv-gnu-toolchain 工具链,直接编译报错。
问题解决了吗,按理说直接gdb单步调试就能进入entry.S的。如果还没解决可以加我下一起看看
还没,我加你下微信啦
***
*** 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是在博主的网盘下载的
喔喔关于路径适配的问题 toolchain中再重新适配一下即可
请问一下最后是在哪重新适配解决的? 我也遇到了这个问题
哦哦没事了,我从头跑了一遍解决了可以跑起来了,谢谢博主!
vim ~/.bash_profile #打开配置文件
export PATH="$PATH:/usr/local/opt/riscv-gnu-toolchain/bin" #末尾添加此行
source ~/.bash_profile #使配置生效
可能我的这个每次开启需要使它的toolchain路径生效
请问一下博主,对于新手来说,Mac M1有什么好的编译方案
主要是对qemu打上补丁以兼容M1,详细过程可以参考下方评论,比如这条 https://zhayujie.com/mit6828-env.html#comment-187
我走到了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'
好像是文件夹访问权限的一些问题,请问楼主知道怎么弄么?
谢谢!
是configure还是make时报的错?在前面加sudo后执行试试看
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 步 处理之后 用楼主提供的链接去编译,然后继续走。基本没啥问题。
博主你好,我在进行gdb调试的时候,按您所说先启动make qemu-gdb,在启动riscv64的那个,但是在riscv中执行命令都会说 the program is not being run,这是为什么呢?
这个解决了,是权限问题chmod +x riscv64-unknown-elf-gdb
第二个问题是在调试的时候终端1无法输出信息
Python Exception Installation error: gdb._execute_
unwinders function is missing:
是我草率了,这正是pdtbl第一个task。。。
非常感谢,我用qemu 5.1.0的版本没有问题
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$
找不到解决办法了
你的toolchain版本是多少?如果太高了可以换成9.2的试试
(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
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工具链的时候遇到如下错误,看了下评论区但还是没解决
工具链的问题解决了https://blog.csdn.net/poena/article/details/118400196
qemu也显示版本了,但是最后make qemu 的时候一直卡住,进不去shell
您好,我根据您给的这个博客试过了,我这边还是报错,请问您怎么解决的呀
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
你的qemu版本是多少,是不是因为版本太高不兼容导致的。参考这个评论https://zhayujie.com/mit6828-env.html#comment-186
我先是用的楼主你的百度网盘,但是安装失败,报了很多错(类似于代码错误),然后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的
如果实在没办法可以考虑把工具链换成9.2版本的试试
解决了,还是qemu在m1下有问题,要打布丁,下面评论老哥的github连接有效
https://github.com/ReZeroS/mit6.828-note/issues/3
你好,请问一下这个问题是怎么解决的,麻烦可以私下联系一下 吗
可以问一下博主m1可以支持s081的qemu环境配置吗?
可以的,评论中有成功案例
我已经成功安装,但是无法使用gdb进行调试
请问具体报什么错呢?也可以看本文末尾,直接下载编译后gdb使用试试
使用risc v里的gdb是可以调试的,但是m1系统是无自带的gdb,这里非常感谢博主以及评论!
可以的,用riscv64-unknown-elf-gdb就好
直接编译我还没试成功,m1好像只有lldb,而没有gdb,我也查了很久,太难了
感谢
博主你好,我在编译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
可以先发下你当前的环境信息 (比如是什么cpu架构,操作系统的版本和位数,toolchain的版本等)。
然后考虑以下几个问题:
1. 你的toolchain安装路径是多少? 如果是从根目录开始 (/riscv-gnu-toolchain),确认下是否有权限,可以换个路径重新编译一次试试
2. toolchain的安装路径下是否存在中文,如果有的话改成英文试试
如果还不行可以加下我一起看看。
我的CPU版本是x64,操作系统是ubuntu16.04,64位。toolchain是用的你提供的百度网盘链接下载的,我直接把文件拖到了虚拟机里面。刚刚把安装路径换到了home目录下还是报了同样的错误。
把 make 改成 make linux 再编译一次试试
解决了,我仔细看了以下我的报错信息,发现了一行warning:'makeinfo' is missing on your system.然后我去百度,安装了对应的依赖库,这个问题就解决了。后来又陆陆续续出现了很多类似的错误,但是通过安装对应的依赖库后就都解决了。
2021/8/8日更新,macos Catalina安装的血泪教训,首先如果你直接brew install riscv-tools失败的话,先试试安装xcode 12.4,安装成功后先把brew 的下载和编译缓存给清了,再次安装,就可以了。
博主你好,在之前的回答里面看到我的qemu的版本过高导致了这个make qemu卡住的问题。我在mac中uninstall了qemu然后在官网上下载了5.1.0的源码configure和make完了之后再make qemu为什么会显示make: qemu-system-riscv64: No such file or directory?
1. 首先确认下qemu是不是成功安装了,需要找到qemu-system-riscv64这个可执行文件(默认路径在/usr/local/bin下)
2. 然后看看这个安装路径是不是配置为环境变量了(执行 echo $PATH 可以查看),如果路径不存在需要配置 (比如在~/.bash_profile文件中添加)
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这个文件。
已解决。 原因是brew安装的qemu没有删除干净,手动删除/usr/local/bin 下的文件并重新编译源码后成功运行。
博主你好,我编译完 riscv-gnu-toolchain 以及添加好环境变量后,执行 riscv64-unknown-elf-gcc -v 显示 command not found,请问有遇到吗?
可以进入你的安装目录确认一下是否编译成功,看看有没有 riscv64-*-elf-gcc 类似的文件,可能操作系统不同文件名字会有些差异,如果还不能解决可以加我联系方式
谢谢博主,解决了,是我 source 没生效。但是现在在 xv6 目录下进行 make 的时候一直卡住。
参考这个: https://zhayujie.com/mit6828-env.html#comment-186
已解决,谢谢博主!!!
博主你好,昨天我顺利进入 xv6 的 shell 之后,写了 sleep 的代码,然后重新执行了 make qemu,进入之后无法执行我的 sleep 程序,显示 exec sleep failed。然后我在shell里执行 ./grade-lab-util sleep 也显示 exec ./grade-lab-util failed,请问这是什么原因?
是不是没有在Makefile的UPROGS中追加一行$U/_sleep\,这个在lab的说明中有提到。 lab1可以参考: https://zhayujie.com/mit6828-lab-util.html
我看他确实没有给我生成 sleep.o 文件
非常感谢分享!去年就一直想做这个lab,一直没编译成功riskv-tool-chain和qemu。这几天看了这篇文章终于编译好了全部东西,成功进入xv6的shell!!!
课程还是很不错的,我正在做2020版本的,后面有问题欢迎留言 :)
博主你好,请问这是怎么回事?
在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`
请问你的qemu是什么版本的,可能是因为qemu版本过高导致的不兼容问题,可以参考这条评论: https://zhayujie.com/mit6828-env.html#comment-186
感谢!已经解决了,是这个问题
想问博主的gdb可以用layout命令吗?这边提示说没有该命令:“Undefined command: "layout". Try "help".”像这种怎么解决
我也遇到这个问题,用的是ubuntu20.04系统x84平台,编译过程没有出现错误。
https://www.bilibili.com/video/BV1Qi4y1o7tN?spm_id_from=333.999.0.0
好的,感谢,视频里面是安装gdb-multiarch,环境我其实都已经装好了,主要是gdb-multiarch无法单步进入ecall指令,我看mit视频使用的riscv64-unknown-elf-gdb却可以,所以我想自己下载源码编译,才有了以上问题。我重新把riscv-tool-chain编译并安装了一遍,layout命令还是无法使用,但目前可以正常进入ecall调试,可视化差点,能正常使用。
我的能使用layout命令,你可以用文末的地址下载8.3版本的gdb试试看
谢谢博主,我这是ubuntu,和mac的文件不能通用,我再找找是啥问题吧
或者你有qq吗,想私下交流下
3282383639
你好,请问你的问题现在解决了嘛?我在centos也是遇到这个问题
卸载重装。。。
谢谢你的回复!能不能说一下是哪里添加参数之类的?
什么参数,不就是要把博主给的gdb包删了,然后重新安装一遍吗
你好博主,请问在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版本的
解决了,要重新编译
在toolchain编译之前,要修改riscv-gun-toolchain/riscv-gdb/readline/rltty.c和riscv-gun-toolchain/riscv-gdb/readline/terminal.c文件,分别加入#include
#include 啥啊,大佬,我也遇到这个问题了
需要 #include 什么头文件吗,好像后面的文字丢失了
两个文件均加入 #include
不知道为什么include后面的文字丢失了
sys/ioctl.h 头文件是这个,两边加尖括号就行
收到,多谢。尖括号里的内容应该是被过滤掉了,我后面修复下~
重新编译了下还是有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
是在编译哪个部分的时候报错了,各个软件分别都是什么版本呢?
toolchain 编译出现的问题,但最后可以运行qemu,最后在gdb时command not found: riscv64-unknown-elf-gdb
是不是因为toolchain编译的问题呀
toolchain中的gdb编译失败了,可能是版本与系统不兼容,你可以下载我编译好的gdb直接使用,我在原文末尾添加了链接。
呃…好像还是有小问题,按照最后步骤做了,可是显示
permission denied: riscv64-unknown-elf-gdb
用 chmod +x riscv64-unknown-elf-gdb 设置了执行权限后应该就可以了,不过你已经编译成功了就更好了。
sudo就是
command not found: riscv64-unknown-elf-gdb
sudo riscv64-unknown-elf-gdb 试试
非常感谢
博主你好,我是在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,等了好久都没进到系统里,不知道博主遇到过这种情况吗?感谢!
你好,我也遇到了这个问题。请问同学解决了么?
回复一下同学,问题解决了。qemu的版本太新,有兼容性问题。删掉之后,手动下载编译5.1.0成功解决。
参考官方文档 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。
能直接 rm qemu* 吗
我的qemu版本是6.0.0,riscv64-unknown-elf-gcc版本是10.2.0。我的平台是mac os,big sur 11.4。那我想办法降低一下qemu版本。
假如是m1的话,可以参考之前的评论中相同的情况。以及这个issue:https://github.com/ReZeroS/mit6.828-note/issues/3
不是m1,是49年入国军的intel。
intel或许区别只在于不用打补丁?我之前用10.2的工具链也遇到难解决的错误,qemu6.0不知道怎么才能编译成功。换成9.2和5.1才好了,或许你可以试试安这个版本的。
同遇到了
参考官方文档 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。
没有遇到过呢,"关于"里有联系方式,我可以帮你看下具体是什么问题
博主你好,我在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
突然看到之前有人问过了,我去尝试一下这个方案。
好的,你先试一下,成功了可以分享下~
我遇到的问题是qemu无法找到m1适合的版本。brew 安装只能安6.0.0的版本,安装后的包也无法像方案中的打补丁。riscv工具链可以编译成功,版本号为9.2.0。请问怎么安装5.1的版本呢
你可以下载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 同学的评论。
在参考rezeros同学的评论后尝试了很多次终于装好了。虽然中间出现了一些小的很繁琐的问题,但主要思路就是如他所说。感谢博主和rezeros同学,以及BASARANOMO同学。
很棒的 Mac M1 + riscv-toolchain-9.2 + qemu-5.1-patch 的搭建方案,感谢分享!
简要的总结:
主要步骤参照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工具链,编译的漫长(一个晚上都未编完)以及对之后运行在此环境中性能的考虑都使此方案作废。
我在变异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
这里应该是只有gdb模块没有编译成功(估计和环境有关),xv6能够正常编译并且运行的话就不影响实验,需要用到gdb的话我可以发给你编译后的产物使用
博主你好,我是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
怎么解决?
这个问题没有在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。
噢噢,看来可能是因为我用的gitee没有clone所有文件。我目前想跟着2020的课程做,按你的教程配置实验环境可以吗?
我觉得环境是一样的,你可以试试,有结果了期待分享。
博主你好,经测试,mojave上应该可以正常运行实验环境,剩下的我做实验的时候再看缺不缺东西~
好的,感谢分享:)
大佬你好,我在完成安装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
,请问有什么解决办法吗
看报错应该是toolchain中安装的汇编器有一些问题,在汇编entry.S文件时报错了。可以提供下更多信息,比如操作系统的类型和版本,各个工具的版本等。也可以加下我联系方式交流。
感谢大佬,问题已经成功解决。这个问题是编译器的问题,在没发现博主的文章之前,我在GitHub上下载了那个最新的riscv-gnu-toolchain,但是由于git的原因,可能没有下载完全就在文件夹里执行make命令了,最终得到一个不可用的riscv64-unknown-elf-gcc-10.2.0的版本,才导致一直出错。
后来下载博主的9.2版本的riscv-gnu-toolchain之后,将默认的riscv64-unknown-elf-gcc版本指向9.2版本问题就能解决了。
大佬,想问下mac m1环境配置理论上可以支持么?
理论上是可以的。你可以试试,结果可以贴在这大家一起讨论
shit, 忘了谢谢博主了,感谢博主的文章,谢谢博主回复觉得可以我才打算试试,十分感谢
哇,可以了,折腾了两三天,打算放弃了都,竟然可以了,开心
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 能帮上需要的老铁。
才看到回复,能成功运行起来就好,感谢你的详细分享!
先安的工具链
现在的结果:
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一样
您好,向您请教一下,kernel正常启动了,但是没有办法退出啊 ctrl + a或者ctrl + x都不行,是不是哪里出问题了呢, 测试的qemu-version 以及riscv64--version都没有问题
按ctrl-a x可以退出 (注意ctrl+A要一起按,在松开之后按一下X)
谢谢您,我昨天搞定了,不过还是谢谢您,我重装了两次,还专门下载了工具链,重装,费劲死了,官网这个地方写的是一点不详细啊。
hah不客气,我回复迟了
感谢作者分享 ! 自己查了半天都没解决跟着您的文章重新配了一遍就成功了。
不客气,有问题随时交流
你好,请问最后在实验目录中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
这几行是什么问题
前面的步骤都对
make grade显示exec ./grade-lab-util failed
前面的报错我没有太理解,你可以加下我交流。 make grade的问题你可以看看下一篇文章,我当时的解决方法是 "将gradelib.py的325行改为self.sock.connect(("127.0.0.1", port))",可能对你有帮助。
解决了,忘记sudo了,万分感谢上面的教程
按照改了,可是老是运行失败。。
您好,我在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
查了半天实在搞不定,麻烦您帮忙解答一下,非常感谢
刚刚解决了,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
虽然不知道什么意思
根据这句报错: "dyld: Library not loaded: /usr/local/opt/isl/lib/libisl.21.dylib",可以看出是找到libisl这个动态库。 install_name_tool -change命令的作用是修改动态库的路径,将原来的 libisl.21.dylib 改为 libisl.dylib,这样就可以在编译时找到。
非常感谢,同样遇到了这个问题,动态库链接问题!
你好,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 并替换到本地, 重试编译后成功。
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
大佬,这个错误是啥原因呀,卡在这里好久了
请问用的是什么操作系统,是虚拟机吗,以及toolchain的版本是什么?
从你发的日志来看并没有报错,建议多等一会 (大概需要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自动加的!!!
请问怎么解决这个问题呢?
Hi, 请问你是怎么解决这个问题的?
可以,找到原因就好
你好,请问编译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打开文件并在末尾添加一行,具体细节我已经在原文中补充 :)
感谢作者♥️,按照作者的步骤来是没有问题的。
不客气,后面会持续更新,有问题欢迎交流。
期待后续更新。
感谢关注