Linux中國

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 有點慢並且靈活性欠佳,但它免費!

虛擬化平台安裝完成後,下載一個你選擇的 Linux 發行版的引導磁碟鏡像。

這將下載一個命名類似於 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 步驟之後刪除它們的目錄。

下載下列包:

(你可能也在使用這些包的最新版本。)解包並構建。安裝到 /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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國