秋招的时候,操作系统的八股文背了不少,但是仍然是缺乏动手实践的经历。对操作系统如何工作,用户程序如何运行,与CPU等硬件如何交互等问题完全没有清晰的认识。

所以最近打算好好学习下操作系统的知识,选择了以动手实践为主的课程,直接对内核源码进行学习和扩展,一步步揭开OS的神秘面纱。

1. 简介

MIT 6.S081是著名的操作系统课程,理论与实践相结合的经典。通过实现部分内核功能来学习设计和实现操作系统。

6.S081 由课程和实验组成。课程的前半部分是介绍系统的各种概念和实现。后半部分是讲一些论文,比如 meldown,et3fs。

实验有 11 个,需要实现不同功能,比如 page table,network driver。

课程的学习打算直接跟着官网的schedule走,先看Lecture下提供的讲义和手册,然后完成相应的Lab,Lab共计11个,主要内容是在xv6基础上进行内核开发和扩展。

每个实验都有对应的知识点供你学习,学完理论知识后会有相应的练习,大多数都需要你手写代码。边学边做,学习效果更加高效。

顺便一提,6.S081 2020 的两位老师其中一位是 Robert Morris(RTM)。Robert Morris 写了历史上第一个蠕虫,还是 Y-Combinator 的 co-founder。

现在微内核概念这么火,鸿蒙就被宣传为微内核全场景OS,难道不想从原理上真正理解一下微内核OS吗? 而6.S081 这个课程就是引导我们实现了一个微内核操作系统。

我的实现环境:

  • qemu for riscv
  • gdb for riscv
  • gcc for riscv
  • binutils for riscv
  • Windows 10 + VMWare + Ubuntu 20.04

学习资源:

2. 安装ubuntu20.04

Ubuntu基本上是每半年更新一次,截至2021年7月30号,现在已经推出了20.0的版本了。

在第一次进行搭建环境时,使用的是18.0的版本,这个版本在安装环境的时候,需要自行安装、编译Riscv工具链,但是这个过程很耗时,容易出现错误。在被百般折磨之后,选择了在Ubuntu20.04上进行环境的搭建。省去了安装工具链的繁琐操作。

VMware下载链接:点击这里

Ubuntu下载链接:点击这里

3. 更换源

3.1 更换/etc/apt/sources.list文件里的源

安装好ubuntu20.04后,默认的软件更新源是国外的,在国内使用速度很慢,需要更换成国内的源,这样才能正常安装和更新软件。

3.2 备份源列表

Ubuntu配置的默认源并不是国内的服务器,下载更新软件都比较慢。首先备份源列表文件sources.list

# 首先备份源列表
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

3.3 打开sources.list文件修改

选择合适的源,替换原文件的内容,保存编辑好的文件, 我们选择的是中科大源。

# 打开sources.list文件
sudo gedit /etc/apt/sources.list

编辑/etc/apt/sources.list文件, 在文件最前面添加阿里云镜像源:

#中科大源
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse #添加阿里源
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse #添加清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse multiverse

3.4 刷新列表

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential

下载速度瞬间就起飞了。

4. 安装SSH

默认情况下,首次安装Ubuntu时,不允许通过SSH进行远程访问。

在Ubuntu上启用SSH非常简单。以root 用户或具有sudo特权的用户执行以下步骤:

使用打开终端Ctrl+Alt+T并安装openssh-server软件包:

sudo apt update
sudo apt install openssh-server

安装完成后,SSH服务将自动启动。可以通过键入以下命令来验证SSH是否正在运行:

sudo systemctl status ssh

输出显示该服务正在运行,并已启用以在系统引导时启动:

● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-08-15 07:13:19 PDT; 23s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 46470 (sshd)
Tasks: 1 (limit: 2275)
Memory: 1.3M
CGroup: /system.slice/ssh.service
└─46470 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

q返回到命令行提示符。

Ubuntu随附了一个名为UFW的防火墙配置工具。如果在系统上启用了防火墙,请确保打开SSH端口:

sudo ufw allow ssh

现在,就可以通过SSH连接到Ubuntu系统,推荐使用SecureCRT。

4.1 SecureCRT 报错

安装了ubuntu20.04后,以前老版本的SecureCRT通过ssh连接后报错

Key exchange failed.
No compatible key exchange method. The server supports these methods: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256

4.2 解决方法

需要修改两个地方:

4.3 修改ssh_config

sudo vi /etc/ssh/ssh_config

打开这两行的注释

4.4 修改sshd_config

sudo vi /etc/ssh/sshd_config

加入下面的代码

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

4.5 重新启动服务并测试

重启sshd服务

sudo service sshd restart

重新连接即可。

5. 配置静态IP

因为安装的是虚拟机,要将其改为桥接模式。

接下来编辑文件:

sudo gedit /etc/netplan/01-network-manager-all.yaml

网络配置

# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
ens33: #配置的网卡名称,使用ifconfig -a查看得到
dhcp4: no #dhcp4关闭
addresses: [192.168.1.8/24] #设置本机IP及掩码
gateway4: 192.168.1.1 #设置网关
nameservers:
addresses: [223.5.5.5,223.6.6.6,166.111.8.28,166.111.8.29,202.141.162.123] #设置阿里云,中科大等的DNS

然后应用修改:

sudo netplan apply

6. 安装RISC-V交叉编译工具

risc-v工具链安装是坑最多的一步,如果你使用的是非20.04,大概率会安装失败。因为只有 ubuntu 20.04 下面才有对应的package的镜像源

sudo apt install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-riscv64-linux-gnu libglib2.0-dev libpixman-1-dev gcc-riscv64-unknown-elf

7. 安装QEMU

QEMU用于在我们机器上(X86)模拟RISC-V架构的CPU,编译生成的risc-v平台的机器码,需要通过模拟cpu执行。

wget https://download.qemu.org/qemu-5.1.0.tar.xz  /home/zhongyi/6S081
cd qemu-5.1.0
./configure --disable-kvm --disable-werror --prefix=/usr/local --target-list=riscv64-softmmu
make
sudo make install

8 测试

8. 1 下载xv6源码

从github下载xv6源码,切入源码的主目录,分支切换为util

git clone git://g.csail.mit.edu/xv6-labs-2020
cd xv6-labs-2020
git checkout util

在项目目录下编译,如果能进入xv6的shell,看到xv6 kernel is booting 则表示实验环境已搭建成功。

make
make qemu

按下ctrl+a松开后再按x退出qemu,这个很关键。

8.2 检查工具链

riscv64-unknown-elf-gcc --version

预期

riscv64-unknown-elf-gcc (GCC) 10.1.0
qemu-system-riscv64 --version

预期:

QEMU emulator version 5.1.0

8.3 检查调试工具

这里需要开启两个窗口,一个运行qemu,一个运行调试器gdb。

运行qemu的窗口执行make qemu-gdb后等待gdb的连接

make qemu-gdb
sed "s/:1234/:26000/" < .gdbinit.tmpl-riscv > .gdbinit
*** Now run 'gdb' in another window.
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 -S -gdb tcp::26000

另外一个窗口运行

gdb-multiarch -q kernel/kernel

如果看到如下内容,则基本上环境没有问题了。

Reading symbols from kernel/kernel...
The target architecture is set to "riscv:rv64".
0x0000000000001000 in ?? ()
(gdb)

如果是第一次运行,请根据提示先设置好.gdbinit

echo set auto-load safe-path / >> ~/.gdbinit

折腾了几天,到此为止,MIT 6.S081 环境搭建终于完成!下面就可以开心做实验了!

本文参考

https://pdos.csail.mit.edu/6.828/2020/tools.html

https://www.bilibili.com/video/BV11K4y127Qk

https://zhuanlan.zhihu.com/p/359384544

https://zhuanlan.zhihu.com/p/343655412

【MIT6.S081/6.828】手把手教你搭建开发环境的更多相关文章

  1. 从0系统学Android--1.2 手把手带你搭建开发环境

    要想进行程序开发,首先我们需要搭建开发环境,下面就开始搭建环境. 1.2.1 所需的工具 首先 Android 开发是基于 Java 的,因此你需要掌握简单的 Java 语法.会基础的 Java 语法 ...

  2. 手把手教你搭建 vue 环境

    第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安装1.2 如果本机已经安装node的运行换,请更新至最新的node 版本下载地址:https://nod ...

  3. 转载:手把手教你搭建 vue 环境

    以下内容转自: https://segmentfault.com/a/1190000008922234 第一步 node环境安装 1.1 如果本机没有安装node运行环境,请下载node 安装包进行安 ...

  4. 大数据江湖之即席查询与分析(下篇)--手把手教你搭建即席查询与分析Demo

    上篇小弟分享了几个“即席查询与分析”的典型案例,引起了不少共鸣,好多小伙伴迫不及待地追问我们:说好的“手把手教你搭建即席查询与分析Demo”啥时候能出?说到就得做到,差啥不能差人品,本篇只分享技术干货 ...

  5. 手把手教你搭建Pytest+Allure2.X环境详细教程,生成让你一见钟情的测试报告(非常详细,非常实用)

    简介 宏哥之前在做接口自动化的时候,用的测试报告是HTMLTestRunner,虽说自定义模板后能满足基本诉求,但是仍显得不够档次,高端,大气,遂想用其他优秀的report框架替换之.一次偶然的机会, ...

  6. 手把手教你搭建FastDFS集群(下)

    手把手教你搭建FastDFS集群(下) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...

  7. 手把手教你搭建FastDFS集群(中)

    手把手教你搭建FastDFS集群(中) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u0 ...

  8. 手把手教你搭建FastDFS集群(上)

    手把手教你搭建FastDFS集群(上) 本文链接:https://blog.csdn.net/u012453843/article/details/68957209        FastDFS是一个 ...

  9. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

随机推荐

  1. netcore一键nssm发布为windows服务

    AntDeploy 是我开发一款开源一键部署工具包 发布功能支持: docker容器一键部署 docker镜像一键发布 支持iis一键部署 windows服务一键部署 linux服务一键部署 支持增量 ...

  2. Capture One 21 Pro 14.0.2.36中文版安装教程

    Capture One 21 Pro 14.0.2.36 for windows是一款由丹麦PHASE ONE飞思公司推出的.非常专业强大的图像处理编辑工具. 下载 Capture One 21 Pr ...

  3. SQL SERVER Date列和Time列合并成一列处理报表数据

    问题原由: intouch项目中,利用intouch脚本来存储数据时,存入的时间格式为:date,time分开存储.在报表需求中,有需要利用查询两个时间段之间的数据. 问题解决: 1.直接写脚本(写出 ...

  4. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

  5. 电脑软件安装过程文档.BA

    MD 01-打印并阅读-电脑软件安装过程文档.BAT-即此批处理脚本文档MD 02-阅读-电脑软件安装经验教训文档.DOCX-MD 03-制作-杏雨梨云USB维护系统2019中秋版之国庆更新-可启动U ...

  6. 搭建SSM基础环境>基于idea

    目录 搭建SSM基础环境 创建一个Web项目 导入所需要的jar包 在项目目录下创建一个Resources文件夹并设置为类路径 在src目录下创建项目的初始文件夹目录 在resources文件夹下创建 ...

  7. DDD随谈

    前言 最近再次拜读了Eric的奠基之作[Domain-Driven Design –Tackling Complexity in the Heart of Software],还有Vernon的[In ...

  8. Java面向对象10——方法重写

    方法重写 static :  ​ ​ package oop.demon01.demon05; ​ public class Application {     public static void ...

  9. .Net Core+分布式配置中心(AgileConfig)

    GitHub上AgileConfig非常详细,以下只是本人学习过程的整理 一.介绍 1.参考地址 https://github.com/dotnetcore/AgileConfig https://w ...

  10. 前端人员必会工具-apipost两分钟上手(2分钟玩转apipost)

    本文通过简单介绍如何利用ApiPost调试接口和快速的生成接口文档,让您初步体验ApiPost的魅力! 1. API写完想要测试?试试模拟发送一次请求 新建接口,我想模拟发送请求如下 curl --l ...