Mac で xv6 を動かす
導入
xv6 は UNIX V6 を元に MIT の人が作ったOSで、UNIX V6 と同じく、1万行程度のコードでOSを実現している。 ANSI Cかつ x86 プロセッサ上で動く。 MIT の教材にもなっていて、講義で使われているテキストもダウンロードできる。
情報系の大学に通わないで、オペレーティング・システムの仕組みについて学ぶことは結構敷居が高いように思える。 昔は「30日でできる! OS自作入門」みたいな分厚い本を読むしかなくて、 最近だと「はじめてのOSコードリーディング」みたいな本で学ぶことはできるようになった。
ただ、「はじめてのOSコードリーディング」はUNIX V6 のコードを読む本で、 UNIX V6 は古いC構文かつPDP-11上でしか動かないのでまだ敷居が高い。
xv6 は x86 アーキテクチャ上で動き、ANSI C で書かれているので 現在の我々にも読みやすい。
クロスコンパイラの準備
Mac は x86_64 アーキテクチャなので、 x86 の xv6 をソースから コンパイルするにはクロスコンパイラが必要。
よって i386-jos-elf toolchain を準備する。
まず GMP/MPFR/MPC の3つをインストールする。 ソースからコンパイルしてもいいが、Mac なら brew install で楽にインストールできる。
$ brew install gmp $ brew install mpfr $ brew install mpc
binutils を用意する
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.25.tar.gz $ tar xvf binutils-2.25.tar.gz $ mkdir build-binutil $ cd build-binutil $ ../binutils-2.25/configure --disable-nls --target=i386-jos-elf --disable-werror --prefix=/usr/local/ $ make all $ make install
$ wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.9.2/gcc-4.9.2.tar.gz $ tar xvf gcc-4.9.2.tar.gz $ mkdir build-gcc $ cd build-gcc $ ../gcc-4.9.2/configure --with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-mpfr-include=/usr/local/include --with-mpfr-lib=/usr/local/lib --target=i386-jos-elf --disable-werror --enable-languages=c --without-headers --prefix=/usr/local/bin/ --disable-nls $ make all-gcc $ make install-gcc
qemu のインストール
qemu は CPU エミュレータ。x86_64 上で x86 をレミュレートしないといけないので必要
$ brew install qemu
xv6 のダウンロード
git clone git@github.com:mit-pdos/xv6-public.git
-# TOOLPREFIX = i386-jos-elf +TOOLPREFIX = i386-jos-elf- -# QEMU = qemu-system-i386 +QEMU = qemu-system-i386
xv6 をビルドして実行
$ cd xv6 $ make $ make qemu-nox
qemu は Ctrl+a x で終了できる。
最後に
ここまであれこれソースビルドしておいてアレだけど、 実はだいたい全部 homebrew で揃えられる。
32bit 版 xv6 を Yosemite で動かす
http://attonblog.blogspot.jp/2015/04/32bit-xv6-yosemite.html
brew install homebrew/versions/gcc49 brew install qemu brew tap altkatz/gcc_cross_compilers brew install i386-elf-gcc i386-elf-binutils