Unix V6 互換 OS xv6 をMac OS X El Capitan(v10.11)で動かす

El Capitan (v10.11) にアップデートして、コンパイル出来なくなったので、内容を改定しました。

Unix v6 は 故 John Lions 氏の著名なソースコード・コメンタリーが有ります。自分はこの本の存在を昔から知ってましたが、Unix著作権が有り、公開されず、ずっと歯がゆい状態でしたが、ついに公開可能になり、コメンタリーが本として出版され、それがアスキー出版から翻訳され出てました。

イメージ 1
Lions’ Commentary on UNIX (Ascii books) 単行本 – 1998/7

これだけだと理解が難しいと、さらに解説本まで出てます。
イメージ 2
はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ

UNIXはもともと DEC社のPDP-11上に実装されて, C も古代の Pre K&R で書かれていて、今の時代適用できないとUNIX V6 は 現代風Xv6 へと、さらに進化します\(^o^)/

*ちなみに自分は PDP-11 でプログラムして仕事してまして、とても懐かしいです。OSはRSX-11M でした。このOSは マイクロソフト社で Windows NT を開発したデイビッド・カトラーが開発してます。

xv6 けっこう以前から話題になってた様なのですが、今更知りました。

xv6(x86 version 6)は、MITマサチューセッツ工科大学Operating Systems Engineering (6.828)という講義の教材として使うために、UNIX V6ANSI Cに書換え、x86に移植したOS

でこれを動かす環境を Mac OS X El Capitan (OS X v10.11) の上で動作する環境構築を行いました。

https://gist.github.com/gburd/3789004 こちらのサイトの通り実行しました。

1. Install Xcode. After installing Xcode install the Command Line Tools from the Downloads section of Xcode's preferences. I've installed Xcode Version 4.5 (4G182).
*** 最新の Xcode 6.1 がインストールされてます。

2. Install Homebrew
$ brew doctor <- 何かおまじないが必要(^_^;)

3. Install pre-requisites for building xv6 bash 

$ brew install glib gmp mpfr pkgconfig 
$ brew install libmpc --use-llvm 
$ brew install qemu --use-gcc 
*** 以上3個は問題なくインストール完了(^o^)

4. Install GNU binutils 
$ cd /tmp 
$ tar -xvzf binutils-2.22.tar.gz 
$ ./configure --target=i386-jos-elf --disable-nls --disable-werror --prefix=/opt/gnu 
*** --disable-werror を入れないとエラーで止まっちゃいます(^_^;)
$ make 
$ sudo make install

5. Install GCC 4.5.1 via Homebrew bash 

$ cd /tmp 
$ tar -xjvf gcc-core-4.5.1.tar.bz2
$ cd gcc-4.5.1/
$ mkdir build <--- ビルド用のディレクトリを作るところが大事
$ cd build/
 $ ../configure --target=i386-jos-elf --disable-nls --without-headers --with-newlib --disable-threads --disable-shared --disable-libmudflap --disable-libssp --with-system-zlib --disable-lto --with-gmp=/usr/local --enable-languages=c --prefix=/opt/gnu 
$ LDFLAGS=-L/usr/lib make 
$ sudo make install 

6. Install and build xv6 with GCC

$ git clone git://github.com/mit-pdos/xv6-public.git
$ cd xv6-public
patch < makefilePatch.diff <-- 何かエラーっぽいのが出ますが無視(^_^;)
$ make qemu-nox
*** これでいきなり動きます。

エミュレータの終了は Ctrl-a x です。

xv6 make ファイルのパッチが必要でこれを当てて下さい。
ファイル名 : makefilePatch.diff

diff --git a/Makefile b/Makefile
index 33bfb0a..af625c8 100644
--- a/Makefile
+++ b/Makefile
@@ -29,10 +29,10 @@ OBJS = \
        vm.o\
 
 # Cross-compiling (e.g., on Mac OS X)
-#TOOLPREFIX = i386-jos-elf-
+TOOLPREFIX = /opt/gnu/i386-jos-elf/bin/
 
 # Using native tools (e.g., on X86 Linux)
-#TOOLPREFIX = 
+#TOOLPREFIX =
 
 # Try to infer the correct TOOLPREFIX if not set
 ifndef TOOLPREFIX
@@ -51,7 +51,7 @@ TOOLPREFIX := $(shell if i386-jos-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/d
 endif
 
 # If the makefile can't find QEMU, specify its path here
-#QEMU
+QEMU = qemu-system-i386
 
 # Try to infer the correct QEMU
 ifndef QEMU
@@ -67,8 +67,8 @@ QEMU = $(shell if which qemu > /dev/null; \
        echo "***" 1>&2; exit 1)
 endif
 
-CC = $(TOOLPREFIX)gcc
-AS = $(TOOLPREFIX)gas
+CC = /opt/gnu/bin/i386-jos-elf-gcc
+AS = $(TOOLPREFIX)as
 LD = $(TOOLPREFIX)ld
 OBJCOPY = $(TOOLPREFIX)objcopy
 OBJDUMP = $(TOOLPREFIX)objdump


以上で2日ほど試行錯誤しましたが、 Mac OS X El Capitan(v10.11) 上で動く Xv6 が出来ました。

あとは、Xv6 のサイト (Xv6, a simple Unix-like teaching operating system)や 関連の話題ググると日本語情報を含めて沢山の情報が出てきますので、Unix OS の勉強になります。

* Xv6 は ラズパイに移植されたり、仮想記憶を付け加える事もされているそうです。