【MIT6.S081/6.828】手把手教你搭建開發環境

嵌入式與Linux那些事發表於2021-09-03

秋招的時候,作業系統的八股文背了不少,但是仍然是缺乏動手實踐的經歷。對作業系統如何工作,使用者程式如何執行,與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

相關文章