Caffeinated 6.828:使用的工具
在這個課程中你將使用兩套工具:一個是 x86 模擬器 QEMU,它用來執行你的核心;另一個是編譯器工具鏈,包括彙編器、連結器、C 編譯器,以及偵錯程式,它們用來編譯和測試你的核心。本文有你需要去下載和安裝你自己的副本相關資訊。本課程假定你熟悉所有出現的 Unix 命令的用法。
我們強烈推薦你使用一個 Debathena 機器去做你的實驗,比如 athena.dialup.mit.edu。如果你使用執行在 Linux 上的 MIT Athena 機器,那麼本課程所需要的所有軟體工具都在 6.828 的儲存中:只需要輸入 add -f 6.828
就可以訪問它們。
如果你不使用 Debathena 機器,我們建議你使用一臺 Linux 虛擬機器。如果是這樣,你可以在你的 Linux 虛擬機器上構建和安裝工具。我們將在下面介紹如何在 Linux 和 MacOS 計算上來構建和安裝工具。
在 Cygwin 的幫助下,在 Windows 中執行這個開發環境也是可行的。安裝 cygwin,並確保安裝了 flex 和 bison 包(它們在開發 header 軟體包分類下面)。
對於 6.828 中使用的工具中的有用的命令,請參考實驗工具指南。
編譯器工具鏈
“編譯器工具鏈“ 是一套程式,包括一個 C 編譯器、彙編器和連結器,使用它們來將程式碼轉換成可執行的二進位制檔案。你需要一個能夠生成在 32 位 Intel 架構(x86 架構)上執行的 ELF 二進位制格式程式的編譯器工具鏈。
測試你的編譯器工具鏈
現代的 Linux 和 BSD UNIX 發行版已經為 6.828 提供了一個合適的工具鏈。去測試你的發行版,可以輸入如下的命令:
% objdump -i
第二行應該是 elf32-i386
。
% gcc -m32 -print-libgcc-file-name
這個命令應該會輸出如 /usr/lib/gcc/i486-linux-gnu/version/libgcc.a
或 /usr/lib/gcc/x86_64-linux-gnu/version/32/libgcc.a
這樣的東西。
如果這些命令都執行成功,說明你的工具鏈都已安裝,你不需要去編譯你自己的工具鏈。
如果 gcc
命令失敗,你可能需要去安裝一個開發環境。在 Ubuntu Linux 上,輸入如下的命令:
% sudo apt-get install -y build-essential gdb
在 64 位的機器上,你可能需要去安裝一個 32 位的支援庫。連結失敗的表現是有一個類似於 “__udivdi3
not found” 和 “__muldi3
not found” 的錯誤資訊。在 Ubuntu Linux 上,輸入如下的命令去嘗試修復這個問題:
% sudo apt-get install gcc-multilib
使用一個虛擬機器
獲得一個相容的工具鏈的最容易的另外的方法是,在你的計算機上安裝一個現代的 Linux 發行版。使用虛擬化平臺,Linux 可以與你正常的計算環境和平共處。安裝一個 Linux 虛擬機器共有兩步。首先,去下載一個虛擬化平臺。
- VirtualBox(對 Mac、Linux、Windows 免費)— 下載地址
- VMware Player(對 Linux 和 Windows 免費,但要求註冊)
- VMware Fusion(可以從 IS&T 免費下載)。
VirtualBox 有點慢並且靈活性欠佳,但它免費!
虛擬化平臺安裝完成後,下載一個你選擇的 Linux 發行版的引導磁碟映象。
- 我們使用的是 Ubuntu 桌面版。
這將下載一個命名類似於 ubuntu-10.04.1-desktop-i386.iso
的檔案。啟動你的虛擬化平臺並建立一個新(32 位)的虛擬機器。使用下載的 Ubuntu 映象作為一個引導磁碟;安裝過程在不同的虛擬機器上有所不同,但都很簡單。就像上面一樣輸入 objdump -i
,去驗證你的工具是否已安裝。你將在虛擬機器中完成你的工作。
構建你自己的編譯器工具鏈
你需要花一些時間來設定,但是比起一個虛擬機器來說,它的效能要稍好一些,並且讓你工作在你熟悉的環境中(Unix/MacOS)。對於 MacOS 命令,你可以快進到文章的末尾部分去看。
Linux
透過將下列行新增到 conf/env.mk
中去使用你自己的工具鏈:
GCCPREFIX=
我們假設你將工具鏈安裝到了 /usr/local
中。你將需要大量的空間(大約 1 GB)去編譯工具。如果你空間不足,在它的 make install
步驟之後刪除它們的目錄。
下載下列包:
- ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
- https://www.mpfr.org/mpfr-3.1.2/mpfr-3.1.2.tar.bz2
- http://www.multiprecision.org/downloads/mpc-0.9.tar.gz
- http://ftpmirror.gnu.org/binutils/binutils-2.21.1.tar.bz2
- http://ftpmirror.gnu.org/gcc/gcc-4.6.4/gcc-core-4.6.4.tar.bz2
- http://ftpmirror.gnu.org/gdb/gdb-7.3.1.tar.bz2
(你可能也在使用這些包的最新版本。)解包並構建。安裝到 /usr/local
中,它是我們建議的。要安裝到不同的目錄,如 $PFX
,注意相應修改。如果有問題,可以看下面。
export PATH=$PFX/bin:$PATH
export LD_LIBRARY_PATH=$PFX/lib:$LD_LIBRARY_PATH
tar xjf gmp-5.0.2.tar.bz2
cd gmp-5.0.2
./configure --prefix=$PFX
make
make install # This step may require privilege (sudo make install)
cd ..
tar xjf mpfr-3.1.2.tar.bz2
cd mpfr-3.1.2
./configure --prefix=$PFX --with-gmp=$PFX
make
make install # This step may require privilege (sudo make install)
cd ..
tar xzf mpc-0.9.tar.gz
cd mpc-0.9
./configure --prefix=$PFX --with-gmp=$PFX --with-mpfr=$PFX
make
make install # This step may require privilege (sudo make install)
cd ..
tar xjf binutils-2.21.1.tar.bz2
cd binutils-2.21.1
./configure --prefix=$PFX --target=i386-jos-elf --disable-werror
make
make install # This step may require privilege (sudo make install)
cd ..
i386-jos-elf-objdump -i
# Should produce output like:
# BFD header file version (GNU Binutils) 2.21.1
# elf32-i386
# (header little endian, data little endian)
# i386...
tar xjf gcc-core-4.6.4.tar.bz2
cd gcc-4.6.4
mkdir build # GCC will not compile correctly unless you build in a separate directory
cd build
../configure --prefix=$PFX --with-gmp=$PFX --with-mpfr=$PFX --with-mpc=$PFX \
--target=i386-jos-elf --disable-werror \
--disable-libssp --disable-libmudflap --with-newlib \
--without-headers --enable-languages=c MAKEINFO=missing
make all-gcc
make install-gcc # This step may require privilege (sudo make install-gcc)
make all-target-libgcc
make install-target-libgcc # This step may require privilege (sudo make install-target-libgcc)
cd ../..
i386-jos-elf-gcc -v
# Should produce output like:
# Using built-in specs.
# COLLECT_GCC=i386-jos-elf-gcc
# COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i386-jos-elf/4.6.4/lto-wrapper
# Target: i386-jos-elf
tar xjf gdb-7.3.1.tar.bz2
cd gdb-7.3.1
./configure --prefix=$PFX --target=i386-jos-elf --program-prefix=i386-jos-elf- \
--disable-werror
make all
make install # This step may require privilege (sudo make install)
cd ..
Linux 排錯:
Q:我不能執行 make install
,因為我在這臺機器上沒有 root 許可權。
A:我們的指令假定你是安裝到了 /usr/local
目錄中。但是,在你的環境中可能並不是這樣做的。如果你僅能夠在你的家目錄中安裝程式碼。那麼在上面的命令中,使用 --prefix=$HOME
去替換 --prefix=/usr/local
。你也需要修改你的 PATH
和 LD_LIBRARY_PATH
環境變數,以通知你的 shell 這個工具的位置。例如:
export PATH=$HOME/bin:$PATH
export LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
在你的 ~/.bashrc
檔案中輸入這些行,以便於你登入後不需要每次都輸入它們。
Q:我構建失敗了,錯誤資訊是 “library not found”。
A:你需要去設定你的 LD_LIBRARY_PATH
。環境變數必須包含 PREFIX/lib
目錄(例如 /usr/local/lib
)。
MacOS
首先從 Mac OSX 上安裝開發工具開始:xcode-select --install
。
你可以從 homebrew 上安裝 qemu 的依賴,但是不能去安裝 qemu,因為我們需要安裝打了 6.828 補丁的 qemu。
brew install $(brew deps qemu)
gettext 工具並不能把它已安裝的二進位制檔案新增到路徑中,因此你需要去執行:
PATH=${PATH}:/usr/local/opt/gettext/bin make install
完成後,開始安裝 qemu。
QEMU 模擬器
QEMU 是一個現代化的、並且速度非常快的 PC 模擬器。QEMU 的 2.3.0 版本是設定在 Athena 上的 6.828 中的 x86 機器儲存中的(add -f 6.828
)。
不幸的是,QEMU 的除錯功能雖然很強大,但是有點不成熟,因此我們強烈建議你使用我們打過 6.828 補丁的版本,而不是發行版自帶的版本。這個安裝在 Athena 上的 QEMU 版本已經打過補丁了。構建你自己的、打 6.828 補丁的 QEMU 版本的過程如下:
- 克隆 IAP 6.828 QEMU 的 git 倉庫:
git clone https://github.com/mit-pdos/6.828-qemu.git qemu
。 - 在 Linux 上,你或許需要安裝幾個庫。我們成功地在 Debian/Ubuntu 16.04 上構建 6.828 版的 QEMU 需要安裝下列的庫:libsdl1.2-dev、libtool-bin、libglib2.0-dev、libz-dev 和 libpixman-1-dev。
- 配置原始碼(方括號中是可選引數;用你自己的真實路徑替換
PFX
)- Linux:
./configure --disable-kvm --disable-werror [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
。 - OS X:
./configure --disable-kvm --disable-werror --disable-sdl [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
。prefix
引數指定安裝 QEMU 的位置;如果不指定,將預設安裝 QEMU 到/usr/local
目錄中。target-list
引數將簡單地簡化 QEMU 所支援的架構。
- Linux:
- 執行
make && make install
。
via: https://pdos.csail.mit.edu/6.828/2018/tools.html
作者:csail.mit 選題:lujun9972 譯者:qhwdw 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- Caffeinated 6.828:實驗工具指南
- Caffeinated 6.828:實驗 1:PC 的引導過程
- Caffeinated 6.828:實驗 4:搶佔式多工處理
- Caffeinated 6.828:實驗 5:檔案系統、Spawn 和 Shell
- MIT6.828 Preemptive Multitasking(上)MIT
- MIT-6.828-JOS-lab6:Network DriverMIT
- mit6.828 實驗環境配置MIT
- mit6.828 - lab2筆記MIT筆記
- mit6.828 - lab1筆記MIT筆記
- MIT6.828 Lab3 User EnvironmentsMIT
- MIT6.828-LAB1 : PC啟動MIT
- MIT6.828 Lab4 Preemptive Multitasking(下)MIT
- dumpbin工具的使用
- doDBA工具的使用
- MIT-6.828-JOS-lab5:File system, Spawn and ShellMIT
- MIT6.828 La5 File system, Spawn and ShellMIT
- MIT6.828 Lab2 記憶體管理MIT記憶體
- mit6.828筆記 - lab5(下)- Spawn and ShellMIT筆記
- MIT6.S081/6.828 實驗1:Lab Unix UtilitiesMIT
- 高效的使用 Notepad++ 工具
- Oracle ASM AMDU工具的使用OracleASM
- Git 版本控制工具的使用Git
- AI工具的學習使用AI
- AIGC工具的使用測評AIGC
- certutil工具的使用介紹
- Linux NTP工具的基本使用Linux
- Windows XP debug工具的使用Windows
- Ecplise開發工具的使用
- 工具使用
- 系統防睡眠軟體:Caffeinated for Mac v2.0.4中文啟用版Mac
- Android除錯工具Genymotion的使用Android除錯
- JVM調優工具Arthas的使用JVM
- chrome開發者工具的使用Chrome
- java的數學工具淺使用Java
- # 有點用的工具使用tricks
- Django(56)Mixins工具集的使用Django
- 網路診斷工具的使用
- JEB工具的介紹及使用