WindowsとコマンドプロンプトでUnix-xv6をビルドする方法

WindowsとコマンドプロンプトでUnix-xv6をビルドする方法
宇野博士

●はじめに

1975年にベル研究所がUnix Version 6（Sixth Edition Unixとも呼ばれます）をリリースしました。これはカリフォルニア大学バークレー校をはじめとする大学で広く教育ツールとして活用されました。今回ビルドするUnix-xv6は、ANSI Cでマルチプロセッサx86に移植されたUnix Version 6で、現在もマサチューセッツ工科大学などの大学で教育ツールとして活用されています。

「Windows10とコマンドプロンプト（cmd.exe）でxv6をビルドして動作させた。」これが、わたしのやり遂げたことです。Linuxでビルドするのではなく、Windwos10＋WSLの環境、Windwos10＋CygwinやMSYS環境でビルドするのでもなく、Windows10とコマンドプロンプトの環境でビルドしました。

わざわざ苦労してなぜWindowsでビルドしたのか。今振り返ってみて次のように感じています。Linuxでのビルドは、例えれば大阪から東京までを飛行機で行くようなものです。1時間もあれば目的地に到着します。ビルドが完了し、目標が達成され、それで終わってしまいます。大阪と東京の間にある名所の事などはまったく知る余地もありません。Windowsでのビルドは、東海道五十三次を歩いて旅するような感じでした。約2週間かかりましたが、様々なツールに触れ、次々と問題に遭遇し、そのたびに少し知識を得て自分がスキルアップした気分になり、問題が解決すると幸せを感じ、そしてついにxv6がプロンプトを表示してくれたときには本当に感動しました。そして、やっと動いてくれたxv6にも愛着が生まれていました。この2週間はわくわくしながら推理小説を読んでいる、アドベンチャーゲームに没頭している、そんな感じでした。わざわざ遠回りをしてWindowsでビルドすることで私はとても得をしたような気がしています。

どのような旅だったのか、ここで少しご紹介しましょう。「xv6のソースファイルをダウンロードして、makeコマンドを実行する。」Linuxではこれだけでxv6のビルドが完了します。そして「QEMUをインストールして、make qemuとコマンドをたたく。」これでxv6が走ります。一方、Windows10でmakeコマンドを実行するとエラーが多発します。エラーの原因を調べてすべて解決しなければなりません。makeコマンドのエラー、Cコンパイラのエラー、その他のコマンドのエラーを1つ1つ消して行きました。私はプログラムの素人ですので知らないことばかりで、進捗は亀のような遅さでした。makeコマンドでは、Makefileに記述されている内容を理解することからはじめました。具体的にはMakefileの記述方法に加えて、Makefileで使用しているgcc、ld、objcopy、dd、qemu、gdbなどのツールの動作とそのオプションの意味を調べました。当たり前ですが、これらのツールのWindows10版のプログラムも探して入手しました。Makefileに記載されているコマンドを実際にコマンドプロンプトに入力し、その出力結果から自分の理解が正しいことを確認しながら、一歩一歩進んで行きました。

大きな問題の1つに、「Linux版とWindows版でツールの仕様や動作が異なっている」がありました。特にgcc（ld）の差異は致命的でした。UNIXやLinuxでは、オブジェクトファイル（object file）や実行ファイル（executable file）にELFフォーマット（Executable and Linking Format）を採用しています。xv6はUNIXなので、xv6のビルド時にはコンパイラにkernelやinitなどのユーザープログラムをELFフォーマットで出力させる必要があります。Linux版のgcc（ld）はデフォルトでELFフォーマットで出力します。一方でWindowsはPE形式（Potable Executable）を採用しています。当然ですが、Windows版のgcc（ld）はプログラムをPE形式で出力します。問題は、Windows版のgccではいかなるオプションを指定してもELFフォーマットで出力できなかったのです。さて、この問題を解決した方法については本文で詳しくご説明します。
数日間の格闘の後、一応コンパイルが通るようになりました。次の課題はデバッグです。Makefileの記述を見ていると、xv6自体はQEMUというPCエミュレーター上で動作させます。そして、デバッグはこのQEMUとデバッガのgdbを連動させて行うようです。Makefileの記述をコピペしてWindowsでコマンドをたたいてみました。しかし、QEMUとgdbは連動しません。またもや、QEMUとgdbのマニュアルを検索して動作とオプションの理解を深めました。いろいろと実験した結果、ようやく1つのコマンドプロンプトでQEMUを実行し、別のコマンドプロンプトでgdbを実行して、これらをtelnet接続することによって連動させることができました。

旅の様子はこんな感じです。ここまでの工程で東海道の浜松あたりに来れた感じでしょうか。こんな旅でしたが、私はやってみてよかった。諦めずに最後まで歩き切って本当によかったと思います。もし、挑戦したい人がおられたら全力で応援したいと思いました。私の旅の記録が誰かの役にたつかもしれない。この思いからこの本が生まれました。

●各フォルダーの説明

Tools:
	ビルドに使用する自作ツールのCソースファイル、Makefileが含まれています。
win_xv6:
	Windows用に作成されたxv6のソースファイルが含まれています。
xv6:
	xv6をビルドする作業ディレクトリです。xv6の全ソースファイルをここにコピーします。

●必要なソフトウェア

1)xv6のソースコード
https://github.com/mit-pdos/xv6-public
上記URLのページからxv6-public-master.zipをダウンロードします。
ダウンロードしたxv6の全ファイルを、ディレクトリxv6にコピーします。

2) MinGW
MinGWの入手先
https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/
上記URLのページからmingw-get-setup.exeをダウンロードします。
私は、C:\MinGWにインストールしました。

3) BusyBox
BusyBoxの入手先
http://frippery.org/busybox/
上記URLのページからbusybox.exeまたはbusybox64.exeをダウンロードします。32ビットWindowsをお使いの方はbusybox.exeをダウンロードしてください。
ダウンロードしたbusybox.exeをToolsフォルダーに移動します。

4) QEMU
QEMUの入手先
https://www.qemu.org/download/#windows
上記URLのページから32-bitまたは64-bit Windows用のインストーラーをダウンロードします。32ビットWindowsをお使いの方は32-bit版をダウンロードしてください。
私は64-bit版のqemu-w64-setup-20210825.exeをダウンロードしました。
私は、C:\Program Files\qemuのフォルダーにインストールしました。

●環境設定
下記の例のように、
MinGW\bin;
Tools\;
qemu;
をPATHに設定します。

@echo off
echo Setting up environment for xv6 build...
set PATH=C:\MinGW\bin;%PATH%
set PATH=C:\Users\uno\Desktop\Min\Tools\;%PATH%
set PATH=C:\Program Files\qemu;%PATH%
cd /D C:\Users\uno\Desktop\Min\xv6

●ビルド方法
1) ダウンロードしたxv6の全ファイルを、ディレクトリxv6にコピーします。

2) win_xv6の全ソースファイルを、ディレクトリxv6に上書きします。

3) xv6のディレクトリで、L2W.bat を実行します。
このバッチコマンドは、ソースファイルをWindows用に自動的に修正します。

4) Toolsのディレクトリを、ダウンロードします。
xv6のディレクトリで、mktools.bat を実行します。このバッチコマンドは、
Toolsに含まれるツールを自動的に作成します。

5) ビルド作業します。
make
make qemu

この２つのコマンドで、xv6が起動します。

●参考資料

ソースコードは下記URLからダウンロードできます。

https://github.com/mirokuuno/xv6-windows/blob/main/README.md

書籍はamazonから入手できます。




以上