在這個課程中你將使用兩套工具:一個是 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 有點慢並且靈活性欠佳,但它免費!
虛擬化平台安裝完成後,下載一個你選擇的 Linux 發行版的引導磁碟映象。
這將下載一個命名類似於 ubuntu-10.04.1-desktop-i386.iso
的檔案。啟動你的虛擬化平台並建立一個新(32 位)的虛擬機器。使用下載的 Ubuntu 映象作為一個引導磁碟;安裝過程在不同的虛擬機器上有所不同,但都很簡單。就像上面一樣輸入 objdump -i
,去驗證你的工具是否已安裝。你將在虛擬機器中完成你的工作。
你需要花一些時間來設定,但是比起一個虛擬機器來說,它的效能要稍好一些,並且讓你工作在你熟悉的環境中(Unix/MacOS)。對於 MacOS 命令,你可以快進到文章的末尾部分去看。
通過將下列行新增到 conf/env.mk
中去使用你自己的工具鏈:
GCCPREFIX=
我們假設你將工具鏈安裝到了 /usr/local
中。你將需要大量的空間(大約 1 GB)去編譯工具。如果你空間不足,在它的 make install
步驟之後刪除它們的目錄。
下載下列包:
(你可能也在使用這些包的最新版本。)解包並構建。安裝到 /usr/local
中,它是我們建議的。要安裝到不同的目錄,如 $PFX
,注意相應修改。如果有問題,可以看下面。
export PATH=$PFX/bin:$PATHexport LD_LIBRARY_PATH=$PFX/lib:$LD_LIBRARY_PATHtar xjf gmp-5.0.2.tar.bz2cd gmp-5.0.2./configure --prefix=$PFXmakemake install # This step may require privilege (sudo make install)cd ..tar xjf mpfr-3.1.2.tar.bz2cd mpfr-3.1.2./configure --prefix=$PFX --with-gmp=$PFXmakemake install # This step may require privilege (sudo make install)cd ..tar xzf mpc-0.9.tar.gzcd mpc-0.9./configure --prefix=$PFX --with-gmp=$PFX --with-mpfr=$PFXmakemake install # This step may require privilege (sudo make install)cd ..tar xjf binutils-2.21.1.tar.bz2cd binutils-2.21.1./configure --prefix=$PFX --target=i386-jos-elf --disable-werrormakemake 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.bz2cd gcc-4.6.4mkdir build # GCC will not compile correctly unless you build in a separate directorycd 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=missingmake all-gccmake install-gcc # This step may require privilege (sudo make install-gcc)make all-target-libgccmake 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-elftar xjf gdb-7.3.1.tar.bz2cd gdb-7.3.1./configure --prefix=$PFX --target=i386-jos-elf --program-prefix=i386-jos-elf- \ --disable-werrormake allmake 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:$PATHexport LD_LIBRARY_PATH=$HOME/lib:$LD_LIBRARY_PATH
在你的 ~/.bashrc
檔案中輸入這些行,以便於你登入後不需要每次都輸入它們。
Q:我構建失敗了,錯誤資訊是 “library not found”。
A:你需要去設定你的 LD_LIBRARY_PATH
。環境變數必須包含 PREFIX/lib
目錄(例如 /usr/local/lib
)。
首先從 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 是一個現代化的、並且速度非常快的 PC 模擬器。QEMU 的 2.3.0 版本是設定在 Athena 上的 6.828 中的 x86 機器儲存中的(add -f 6.828
)。
不幸的是,QEMU 的偵錯功能雖然很強大,但是有點不成熟,因此我們強烈建議你使用我們打過 6.828 修補程式的版本,而不是發行版自帶的版本。這個安裝在 Athena 上的 QEMU 版本已經打過修補程式了。構建你自己的、打 6.828 修補程式的 QEMU 版本的過程如下:
git clone https://github.com/mit-pdos/6.828-qemu.git qemu
。PFX
)./configure --disable-kvm --disable-werror [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
。./configure --disable-kvm --disable-werror --disable-sdl [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
。prefix
引數指定安裝 QEMU 的位置;如果不指定,將預設安裝 QEMU 到 /usr/local
目錄中。target-list
引數將簡單地簡化 QEMU 所支援的架構。make && make install
。