先日、i8086インタプリタでMINIXのカーネルがビルドできるようになりました。
手順を説明します。
インストール
インタプリタをビルドしてインストールします。
【注】MSYSではgmakeではなくmakeを使ってください。sudoは不要です。
$ hg clone https://bitbucket.org/7shi/i8086tools $ cd i8086tools $ gmake $ sudo gmake install
MINIX 2.0.4のユーザーランドとソースを準備します。
以下のファイルをダウンロードしてください。
- http://www.minix3.org/iso.previous/Intel-2.0.4/i86/USR.TAZ
- http://www.minix3.org/iso.previous/Intel-2.0.4/src/SYS.TAZ
/usr/local/minix2/usrに展開します。
$ mkdir -p /usr/local/minix2/usr $ sudo tar xvzf USR.TAZ -C /usr/local/minix2/usr $ sudo tar xvzf SYS.TAZ -C /usr/local/minix2/usr
これで準備完了です。
ハローワールド
簡単なプログラムをコンパイルして動作確認します。
hello.c
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello\n"); return 0; }
$ m2cc hello.c $ 7run a.out hello
出力されたファイルの種類を確認します。
$ file a.out a.out: Linux-8086 executable not stripped
OSの種類は判別できないようです。
カーネルのビルド
ユーザーランドに展開したソースをコピーしてビルドします。
$ cp -r /usr/local/minix2/usr/src/kernel . $ cd kernel $ m2path gmake u=/usr/local/minix2/usr AS='cc -c'
ビルド時間を計測したところ、ホストのWindows 8上のMSYSでは3分25秒でしたが、VMwareゲストのNetBSDでは1分54秒でした。どこで差が付いたのかは調べていません。
【追記】ニーモニックをstd::stringで保持して、毎回コピーが発生していたのが原因でした。std::stringを外したところMSYSとNetBSDともに1分前後に高速化し、若干MSYSの方が速くなりました。演算中心でOSの差が出るようなコードではないため、VMのオーバーヘッドの差が出たのではないかと思われます。std::stringで差が出たのはgccのバージョンが異なるため、libstdc++の実装も異なっているのが原因ではないかと思われます。
バイナリが正常に生成されているかCRCで確認します。
$ m2crc kernel 00407 62384 kernel
MINIX 2.0.4上でビルドしたカーネルと一致しています。