Caffeinated 6.828:使用的工具

Csail.mit發表於2018-11-15

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。你也需要修改你的 PATHLD_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 版本的過程如下:

  1. 克隆 IAP 6.828 QEMU 的 git 倉庫:git clone https://github.com/mit-pdos/6.828-qemu.git qemu
  2. 在 Linux 上,你或許需要安裝幾個庫。我們成功地在 Debian/Ubuntu 16.04 上構建 6.828 版的 QEMU 需要安裝下列的庫:libsdl1.2-dev、libtool-bin、libglib2.0-dev、libz-dev 和 libpixman-1-dev。
  3. 配置原始碼(方括號中是可選引數;用你自己的真實路徑替換 PFX
    1. Linux:./configure --disable-kvm --disable-werror [--prefix=PFX] [--target-list="i386-softmmu x86_64-softmmu"]
    2. 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 所支援的架構。
  4. 執行 make && make install

via: https://pdos.csail.mit.edu/6.828/2018/tools.html

作者:csail.mit 選題:lujun9972 譯者:qhwdw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章