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