秋招的時候,作業系統的八股文背了不少,但是仍然是缺乏動手實踐的經歷。對作業系統如何工作,使用者程式如何執行,與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
學習資源:
-
課程講義:https://pdos.csail.mit.edu/6.828/2020/xv6/book-riscv-rev1.pdf
-
schedule:https://pdos.csail.mit.edu/6.828/2020/schedule.html
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