操作系统—xv6内核环境配置

文章目录

  • xv6内核环境配置
    • 1.开发环境的准备
      • (1).如果日常用Linux
      • (2).Windows的回合
        • #1.两个常见方法
        • #2.wsl的一点安装细节
        • #3.记得升级成wsl-2
      • (3).如果你是macOS
        • #1.一些起因
        • #2.最乐的一集
        • #3.Homebrew的配置
        • #4.mac用户的特权
    • 2.先换apt源
    • 3.安装xv6的依赖
    • 4.克隆RISC-V GNU 编译器工具链
    • 5.编译RISC-V GNU 编译器工具链
    • 5.安装QEMU-5.1.0
    • 6.克隆xv6内核代码,编译,QEMU启动
    • 7.GDB远程调试xv6(仅限WSL)

xv6内核环境配置

  这学期的操作系统实验课我们采用了MIT的xv6-riscv内核,所以要配置对应的qemu环境以及一套可用的RISC-V的编译工具链,理论上讲,是有一点点困难的,这里我总结了一下配置的方法,可能会对你有一点帮助

1.开发环境的准备

(1).如果日常用Linux

  如果你已经日常使用Linux了,那直接跳到3,直接安装依赖然后克隆仓库安装即可,我想你都有这能力了,大概率也不需要看这一篇博客了

(2).Windows的回合

#1.两个常见方法

  大部分情况实际上则是大家使用的是Windows,并且很大一部分人用的是Windows 10/11,你当然可以直接采用经典的VMware Workstation Pro/Oracle VirtualBox安装Ubuntu-23.10虚拟机的流程即可,但对于Windows 10/11,这里更加推荐你使用Windows Subsytem for Linux(WSL),这是微软从Windows 10的某一次大更新之后开始为Windows准备的Linux子系统,它基本上能以一个应用的形式存在于你的Windows当中,在WSL下配置xv6内核会非常方便

#2.wsl的一点安装细节

  这里我就不细讲WSL的安装方法了,主要是几个步骤:在控制面板的程序与功能中,点击左侧的启用或关闭 Windows 功能,在Hyper-V,Windows 虚拟机监控程序平台,适用于 Linux 的 Windows 子系统以及虚拟机平台前打钩(这一步中如果你用的是家庭版系统可能没有Hyper-V选项,不过这并不重要),然后点击确定,Windows 会帮你完成这些功能的添加,之后需要重启一次机器
在这里插入图片描述

  机器重启后,打开尘封已久的Microsoft Store,在搜索栏搜索Ubuntu,你应该能看到好几个结果,这里推荐选择Ubuntu 22.04.3 LTS,能出现在Microsoft Store里的Ubuntu一般都是LTS也就是长期支持版本,怎么说也相对是比较稳定的
在这里插入图片描述

  安装完成后直接启动,这一步可能会出现非常多的问题,你需要自行上网查阅资料解决,有几个常见的问题,比如需要你去BIOS中开启虚拟化的,这个就在开机时按住某个按键(自己搜搜看电脑型号对应的按键是什么),然后找到类似SVM Mode或者虚拟化之类的选项,将它启用即可

#3.记得升级成wsl-2

  现在安装的WSL一般已经是WSL-2了,为了后续的操作,我也推荐你把WSL升级为WSL-2,如果是手动升级的,你还需要在powershell里使用wsl --set-version指令进行已安装的发行版的wsl版本更换,这里也不再赘述

(3).如果你是macOS

#1.一些起因

  最近我也整了一台mac,因为mac现在全系转向arm,其实有很多事情是做不了的,这也的确是一个麻烦的问题,然后昨天我去查阅了一下MIT 6.S081也就是xv6这个内核对应的课程Operating System Engineering的课程网站,我发现课程提供的的配置教程中竟然也提供了macOS的安装方法

#2.最乐的一集

  最戏剧化的一幕来了,我本来以为macOS也要走后面章节中那些麻烦的git clone以及make的流程,没想到用homebrew几行代码就解决了,配置好代理的情况下只要五分钟,你就可以直接make qemu启动xv6了,所以macOS非常适合完成xv6的环境配置

  顺便提一嘴,homebrew是一个类似于debian下的apt,centos下的yum以及最近出现的windows下的winget的包管理器,很多软件包你都可以用过homebrew快速安装,常用的指令如下:

brew search 软件包名        // 查询软件包
brew install 软件包名       // 安装软件包
brew uninstall 软件包名     // 卸载软件包

  这个软件比你想的可能会多一点,在apt下我们一般也就装一些基本插件,但是brew里面我们甚至可以安装有图形界面的mac版bilibili,你只需要:

brew install bilibili

  这样就安装完毕了,非常优雅,macOS用户后面就可以直接采用brew完成环境的配置

#3.Homebrew的配置

  其实刚刚的配置手册中已经有了macOS连带配置homebrew的流程了,但是通过这个方式安装的homebrew还需要手动换源,之前我看到有博客制作了一些能够自动安装并切换国内源的脚本,我自己也是使用这个的,因此你可以参考这篇博客来完成Homebrew的安装:Homebrew国内如何自动安装(国内地址)(Mac & Linux)

#4.mac用户的特权

  到这儿我相信你的Homebrew已经装好了,接下来你只需要在你的终端里输入:

xcode-select --install

  这一行代码用于安装macOS下的开发者工具,然后用brew安装git(后续需要下载仓库代码):

brew install git

  之后就可以三条指令安装RISC-V的编译器工具链了:

brew tap riscv/riscv
brew install riscv-tools
PATH=$PATH:/usr/local/opt/riscv-gnu-toolchain/bin

  前面两行代码负责安装riscv-tools,最后一行则是把它加入到环境变量中,需要注意的是,第三行的路径可能会因为芯片而产生差异,在x86-64的环境下,homebrew的安装目录默认并不在/usr/local/opt下,你需要把第三行代码修改为真实安装的目录

  接下来安装一下QEMU:

brew install qemu

  好了,结束了,接下来你可以直接跳到6了,后面的编译之类的工作不需要做了,遥遥领先

2.先换apt源

  如果是全新安装的Ubuntu,需要首先更换apt源,否则后续所有的apt-get install操作都会非常慢,这里推荐更换清华源(来自清华大学TUNA协会),进入之后点击开源软件镜像站,向下翻找到ubuntu,点击右边的问号:

在这里插入图片描述

  进入之后你能看到对应于Ubuntu-22.04 LTS的一串代码:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiversedeb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

  这固然很好,但是这上面没有对最新的Ubuntu-23.10 (mantic)进行适配,如果你选择的是Ubuntu-22.04及之前的版本,可以直接在上面点选更换,否则如果是23.10,就把上面所有的jammy更换为mantic:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-backports main restricted universe multiversedeb http://security.ubuntu.com/ubuntu/ mantic-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ mantic-security main restricted universe multiverse# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ mantic-proposed main restricted universe multiverse

  这时候在你的Linux终端里输入:

cd /etc/apt
sudo mv sources.list sources.list.b
sudo vim sources.list // 如果提示不存在vim,那就换用下面这一条
// 或者,上下两条二选一
sudo vi sources.list

  进入之后首先按i,当左下角显示INSERT的时候,把上面的代码复制粘贴进去,然后按下Esc键,之后输入 :wq(这个冒号也要输入!)这样就可以保存并退出vim/vi了,然后接下来在命令行中输入:

sudo apt-get update

  等更新完了之后,就可以完成后续的操作了。如果你用的是arm版的ubuntu,请在刚刚进入镜像站的那个地方找到ubuntu-ports,点击旁边的问号,arm版的ubuntu需要使用ubuntu-ports源而不是ubuntu源(不过,官网的arm版ubuntu是没有图形界面的,我觉得你要是自己能装,你也不需要我告诉你应该干什么了)

3.安装xv6的依赖

  最重要的是mpc, mpfr和gmp,这三个是gcc的依赖,没有的话会在后续的编译步骤中报错

sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu
sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev

4.克隆RISC-V GNU 编译器工具链

  GitHub不加速是没有办法直接git clone滴~这里用gitee的riscv-gnu-toolchain进行一个镜像站的拉取(可能还是需要使用科学上网,所以这里推荐使用WSL-2),这个方法来自riscv-gnu-toolchain 下载编译 及 xv6 os编译试运行这篇博客,效率还是很不错的

git clone https://gitee.com/mirrors/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git clone --recursive https://gitee.com/mirrors/qemu.git
git clone --recursive https://gitee.com/mirrors/riscv-newlib.git
git clone --recursive https://gitee.com/mirrors/riscv-binutils-gdb.git
git clone --recursive https://gitee.com/mirrors/riscv-dejagnu.git
git clone --recursive https://gitee.com/mirrors/riscv-glibc.git
// riscv-gcc 超过1G,会clone出错,这里设置拉取最近一次提交的版本
git clone --depth 1 https://gitee.com/mirrors/riscv-gcc.git

  如果不幸,在git clone过程中多次失败然后中断,你需要删除已经被git clone创建的目录,使用如下命令进行删除

rm -rf 文件夹路径

严重警告:rm -rf是一个非常危险的指令,在敲下回车之前一定要仔细检查你输入的路径是否正确,例如在克隆qemu仓库的时候出错,你应该输入rm -rf qemu,这样就好了,不要加上多余的内容

5.编译RISC-V GNU 编译器工具链

  上述克隆仓库后,需要进行编译

// 首先确定自己在~/riscv-gnu-toolchain目录下
mkdir riscv-gdb riscv-binutils
cd riscv-binutils-gdb
cp -a * ../riscv-gdb
cp -a * ../riscv-binutils

  在确保~/riscv-gnu-toolchain/riscv-gdb和riscv-binutils两个文件夹中确实有了文件之后,接下来进行编译操作:

cd ~/riscv-gnu-toolchain
./configure --prefix=/usr/local
sudo make -j4 // 这里的数字意思是用4线程编译,如果你的机器核比较多,可以开更多,比如我是make -j16

  编译需要等待非常长的时间,期间你的CPU占用率可能会飙升到全核100%,内存占用率也可能会瞬间提高,请务必在编译命令开始前关闭一些不必要的程序,例如浏览器等

5.安装QEMU-5.1.0

  xv6内核的允许需要用到QEMU,所以这里需要安装QEMU:

wget https://download.qemu.org/qemu-5.1.0.tar.xz

  以防万一,直接安装几个QEMU对应的依赖:

sudo apt-get install pkg-config libglib2.0-dev libpixman-1-dev

  解压,进入目录,配置,编译,安装,这一步的时间比较长,请耐心等待

tar xf qemu-5.1.0.tar.xz
cd qemu-5.1.0
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list="riscv64-softmmu"
make -j4 // 多线程更快
sudo make install // 写入/usr/local目录需要sudo权限 

  结束之后,因为编译的目标目录都在/usr/local下,因此可以直接在bash下用两个–version来测试是否安装成功:

riscv64-unknown-elf-gcc --version
qemu-system-riscv64 --version

  这里出现两个正常打印出的版本信息,就是安装成功了

6.克隆xv6内核代码,编译,QEMU启动

  我们的实验在我们的一个仓库上运行,如果你需要跟着MIT的课程完成xv6内核的实验,请从git://g.csail.mit.edu/xv6-labs-2021 这个链接克隆代码,这里介绍的是我们用到的仓库。在Gitee注册账户之后,在Ubuntu环境下使用下面的代码设置全局的用户名和邮箱:

git config --global user.email "you@example.com" // 替换为你Gitee账户的邮箱
git config --global user.name "Your Name"        // 替换为你Gitee账户的名字

  然后把实验用xv6内核的代码克隆下来

git clone https://gitee.com/greenhandzpx/xv6-oslab23-hitsz.git
// 如果你跟着MIT课程的实验,就把上面的链接换成git://g.csail.mit.edu/xv6-labs-2021

  然后进入文件夹,切换到util分支,然后用make构建内核,使用qemu启动:

cd xv6-oslab23-hitsz
git checkout util // 这一行用于切换分支
make qemu // 这一行使用Makefile文件的qemu标签构建内核

  上述操作全部完成之后,可以看到这样的结果:
在这里插入图片描述

  此时输入ls可以查看所有已经内置于xv6内核中的程序,如cat等基本程序,此时可以用cat README查看xv6内核的README文档

7.GDB远程调试xv6(仅限WSL)

  WSL(Windows Subsytem for Linux)在远程连接方面具有得天独厚的优势,我们在命令行输入:

echo "set auto-load safe-path /" >>  ~/.gdbinit
expr $(id -u) % 5000 + 25000 // 这一步获取GDB端口号,要记住,一般是26000
cd xv6-oslab23-hitsz
code .

  这时候可以直接召唤出本机的VS Code,并且此时这个窗口中已经连接上了WSL的主机,此时我们需要下载Remote-SSH,C/C++,Chinese以及Native Debug等插件,结束后,在VS Code里召唤出终端(左上角点击终端→新建终端,在下面的终端中点击加号→WSL窗口),此时你应该确保当前路径在xv6-oslab23-hitsz当中

  然后此时点击VSCode左边的运行和调试,点击创建launch.json,把这个复制进去:

{"version": "0.2.0","configurations": [{"type": "gdb","request": "attach","name": "Attach to gdbserver","executable": "${workspaceRoot}/kernel/kernel","gdbpath": "gdb-multiarch","remote": true,            "target": "127.0.0.1:此前你得到的GDB端口号","cwd": "${workspaceRoot}","setupCommands": {"text": "source ${workspaceFolder}/.gdbinit"}}]
}

  然后在VSCode的kernel文件夹中找到main.c,在第11行加上断点,再打开xv6-oslab23-hitsz/.gdbinit文件,在target remote 127.0.0.1前面加上# 注释掉

  最后,按下F5/点击运行与调试的绿色三角,如果看到刚刚的断点已经成功命中,那么就成功了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498348.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker中hyperf项目配置虚拟域名

在学习hyperf框架时遇到一些问题,这里是直接用了docker环境 下载镜像运行容器 docker run --name hyperf -v /data/project:/data/project -p 9501:9501 -itd -w /data/project --privileged -u root --entrypoint /bin/sh 镜像ID配置docker-compose.yml version…

pytorch 图像数据集管理

目录 1.数据集的管理说明 2.数据集Dataset类说明 3.图像分类常用的类 ImageFolder 1.数据集的管理说明 pytorch使用Dataset来管理训练和测试数据集,前文说过 torchvision.datasets.MNIST 这些 torchvision.datasets里面的数据集都是继承Dataset而来&#xff0c…

【LeetCode:108. 将有序数组转换为二叉搜索树 + 二叉树+递归】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Node.js+Express后端,自定义接口

6分钟学会Express 后端 API 开发 Node.js 2020最新版_哔哩哔哩_bilibili 要使用Node.js和Express搭建一个简单的后台服务器,用于接收带有token的请求头,你可以按照以下步骤进行操作: 首先,确保你已经安装了Node.js和npm(Node.js的包管理器)。 创建一个新的项目文件夹并…

VUE3:统计分析页面布局+自适应页面参考

一、布局 <template><div class"container1"><div class"form white"><el-form :inline"true" :rules"rules" :model"queryParams" label-width"80px" ref"querParmRef"><e…

apache 模式、优化、功能 与 nginx优化、应用

一、I/O模型——Input/Output模型 1.同步/异步 A程序需要调用B程序的某一个功能&#xff0c;A发送一个请求需要B完成一个任务 同步&#xff1a;B不会主动去通知A是否完成需要A自己去问 异步&#xff1a;B会主动通知A是否完成 2.阻塞/非阻塞 A发送一个请求需要B完成一个任务 …

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

简单1步搞定 NET Framework 3.5 ,离线下载

https://download.csdn.net/download/m0_72735063/88889747?spm1001.2014.3001.5503

Redisson限流算法

引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.12.3</version> </dependency>建议版本使用3.15.5以上 使用 这边写了一个demo示例&#xff0c;定…

给MATLAB安装runtime插件

给MATLAB安装runtime插件&#xff0c;将MATLAB程序打包成exe文件方法 1.查看已安装的MATLAB是否有runtime插件。操作:在command窗口直接输入mcrinstaller。 如果如图上所示&#xff0c;那就是没有。(2019版本以后包括2019一般均没有) 2.下载MATLAB对应子版本的runtime。(很多…

测评ONLYOFFICE 8.0版本:办公利器再升级

测评ONLYOFFICE 8.0版本&#xff1a;办公利器再升级 前言注册使用升级功能速览全新外观设计wordexcelPPTPDF 协作功能强化更强大的功能复杂表单的填写 移动端优化结语 前言 随着科技的不断发展&#xff0c;办公软件在提升用户体验和工作效率方面扮演着越来越重要的角色。作为一…

王者荣耀,急于补齐内容短板

问十个人&#xff0c;有九个人知道《王者荣耀》&#xff1b;但如果再问十个知道《王者荣耀》的人&#xff0c;这款游戏到底讲了一个什么故事&#xff0c;每个角色又有怎样的背景&#xff0c;可能十个人都不知道。 整个新年档口&#xff0c;《王者荣耀》都很忙碌。 1月&#x…