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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive