前言
由於下學期要上計算機結構的課程,所以趁著開課之前來複習一下 OS。這次看的課程是 UNC Operating System Implementation,基本上這課程也是引用 MIT 知名的 JOS 實作,再加上清楚明瞭的 Slides,光是一堂課就能有蠻多地收穫。
這次先來記錄一下實作 Lab1 所遇到的一些問題和環境建立過程。不得不說這課程的環境建置說明沒有很清楚,所以浪費了一些時間在配置正確環境和編譯器。
環境建立
Host: MacPro macOS 10.15.6
Tools
- VSCode
- Vagrant
- VirtualBox
- Ubuntu 16.04 64 bit
- GNU binutils:2.19
- GNU gcc:4.1.2
- GNU GDB 7.7.1 (要下載 source code 並且修改檔案)
- MIT版 Qemu
https://github.com/geofft/qemu.git -b 6.828-1.7.0
Vagrant Configuration
1config.vm.box = "ubuntu/xenial64"
2 config.vm.provider "virtualbox" do |vb|
3 vb.customize ["modifyvm", :id, "--nested-hw-virt", "on"]
4 end
5end
環境配置是在 VM 中跑 Qemu + KVM ,因此在設定 configuration 時,要將 VritualBox 的 nested-hw-virt
開啟。
Ubuntu 版本我是採用 16.04 64 bit
,主要是這個版本在編譯時不會有太多問題,我曾經使用 14.0.4 版本,但是在啟動 Qemu + KVM 時會出現 KVM entry error,而更新的版本 18.04 等會出現各種編譯錯誤和 boot block 過大問題,在百般嘗試之下後,認為 16.04 64 bit 相對穩定。
編譯編譯器(?)
在進入 VM 之後,就開始下載需要的 GNU source code 並且進行編譯。
如果在課程文件,會發現 script 都是直接在 source code 底下 configuration 接著編譯,但不推薦這樣的做法,因為有可能會出現編譯錯誤。所以最好還是新建一個 folder ,然後在新的 folder 下 configuration,可以參考 Installing i386-elf-gcc on MacOS X 的 script 方式。
- binutils
1../binutils-2.19/configure --target=i386-jos-elf --disable-nls --disable-multilib --disable-werror
- gcc
1../gcc-4.1.2/configure --target=i386-jos-elf --disable-nls --without-headers \
2 --with-newlib --disable-threads --disable-shared \
3 --disable-libmudflap --disable-libssp --disable-werror --disable-multilib
- gdb
下載 source code 之後,需要修改 gdb/remote.c
file 的內容,才能正確地處理轉換到 long mode (64bit) 的問題。詳細修改內容請參考 patch
1../gdb-7.7.1/configure --target=x86_64-linux-gnu \
2 --program-prefix=x86_64-jos-elf- --enable-targets=all --disable-werror
我的 script 和課程文件寫的有些不同,主要是我的主機不是 amd64 ,會需要 --enable-targets
。
- MIT qemu
在編譯前,先下載需要的 libs
1sudo apt-get install -y zlib1g-dev libpixman-1-dev \
2 pkg-config libglib2.0-dev libsdl1.2-dev
接著編譯
1./configure --target-list="i386-softmmu x86_64-softmmu"
VSCode remote-SSH
編譯好工具之後,接著設定 VSCode,這樣就可以直接在 host 上編寫 code。
首先要取得 private key 位置和 port
1vagrant ssh-config
然後把 private key 位置設定在 remote-ssh configuration 裡面,這樣 VSCode 就可以連進去 VM 中。
1Host 127.0.0.1
2 Port <port>
3 HostName 127.0.0.1
4 IdentityFile <path>
5 User vagrant
這樣整個環境就算搭建完成了,目前使用到現在,不論是跑 qemu 或是 gdb breakpoint 都沒有太大問題。