FLYING

/* TODO: 気の利いた説明を書く */

Cygwinでxv6を実行する

下準備編

既にCygwinを使っていた人も専用の環境として新規にCygwinをインストールした方がいいかもね。
結構バージョンの組み合わせによっても動く動かないがあるみたい。

Cygwinをインストールする

下記のパッケージを選択してインストール:

各種ソースコードをDLして展開する

DLするソースコードのバージョンと展開先の対応:

binutils-2.21.1a.tar.bz2
/path_to_cygwin/usr/src/binutils-2.21.1
gcc-core-4.5.3.tar.bz2
/path_to_cygwin/usr/src/gcc-4.5.3
gdb-6.8a.tar.bz2
/path_to_cygwin/usr/src/gdb-6.8

Cygwinをインストールしたディレクトリをルートとして,/usr/srcの下にまとめて展開する。
それぞれのアーカイブは下記のサイトからDLする。

GCCのビルドに必要なソースコードをDLして展開する

DLするソースコードのバージョンと展開先の対応:

gmp-5.0.2.tar.bz2
/path_to_cygwin/usr/src/gcc-4.5.3/gmp
mpc-0.9.tar.gz
/path_to_cygwin/usr/src/gcc-4.5.3/mpc
mpfr-3.1.0.tar.bz2
/path_to_cygwin/usr/src/gcc-4.5.3/mpfr

先ほどと同様にDLして展開する。

Cygwinbinutilsをビルドする
# cd /usr/src/binutils-2.21.1
# ./configure --target=i386-jos-elf --disable-nls
# make
# make install

記事最下部の追記部分を参照すると幸せになれるかもしれない。

CygwinGCCをビルドする
# mkdir /usr/src/build-gcc
# cd /usr/src/build-gcc
# ../gcc-4.5.3/configure --target=i386-jos-elf --disable-nls \
    --without-headers --disable-shared --without-newlib \
    --disable-threads --disable-libmudflap --disable-libssp \
    --with-mpfr-include=/usr/src/gcc-4.5.3/mpfr/src \
    --with-mpfr-lib=/usr/src/build-gcc/mpfr/src/.libs
# make all-gcc
# make install-gcc
# make all-target-libgcc
# make install-target-libgcc

GCCのビルドには非常に時間が掛かるので,しばらく放置する。

CygwinGDBをビルドする
# cd /usr/src/gdb-6.8
# ./configure --target=i386-jos-elf --program-prefix=i386-jos-elf- --disable-werror
# make
# make install

GCCほどではないものの,こちらもビルドに時間が掛かる。

導入編

QEMU for Windowsを導入

上記のサイトから最新のバイナリをDLし,任意のディレクトリに展開する。
展開したディレクトリには,CygwinからPATHを通す。

$ export PATH="$PATH:/cygdrive/c/qemu-0.13.0-windows" # これは一例

毎回これをやるのは面倒なので,.bashrcにでも書いておく。

xv6を導入

大元のサイトからgitでcloneしてもいいし,上記のサイトからtar.gzをDLして展開してもよい。
任意のディレクトリに展開した後,Cygwinでそのディレクトリに移動してmakeする。

$ cd ~/xv6
$ make
$ make qemu

QEMUの起動時にコケるが,ここまででディスクイメージは作成されている。
次のようにコマンドを実行すればxv6がQEMU上で起動するはず。

$ qemu -hdb fs.img xv6.img -smp 2 -m 512

make qemuで素早く実行したい人は,適宜Makefileを書き換えればよい。

追記(2012-02-11)

Windows 7 Ultimate 64bit(ビルド7601: Service Pack 1),Cygwin 1.7.9(0.237/5/3)の環境下で実行しているので,それ以外の環境でうまく実行できるかどうかはわかりません。

ただ,Cygwin 1.7.10でbinutilsをビルドしようとするとlibiberty/pex-unix.cでビルドエラーが出るみたいなので,その場合は/usr/include/cygwin/process.hを/usr/include以下にコピーして,以下のようにビルドをやり直してください。

# cd /usr/src/binutils-2.21.1
# make distclean
# ./configure --target=i386-jos-elf --disable-nls
# make
# make install

罠多すぎワロタ。