まるまるこふこふ

数々の次元が崩壊し、全ての生命が塵と化すのを見てきた。私ほどの闇の心の持ち主でも、そこには何の喜びも無かった。

Mac で xv6 を動かす

導入

xv6UNIX 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 で書かれているので 現在の我々にも読みやすい。

ロスコンパイラの準備

Macx86_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

そして gccコンパイル&インストール

$ 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

Makefileqemu 用に修正

-# 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