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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM