【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

i8086インタプリタでMINIXカーネルをビルド

先日、i8086インタプリタMINIXのカーネルがビルドできるようになりました。

手順を説明します。

動作環境

i8086インタプリタはMSYSとNetBSD/amd64で動作確認しています。

インストール

インタプリタをビルドしてインストールします。

【注】MSYSではgmakeではなくmakeを使ってください。sudoは不要です。

$ hg clone https://bitbucket.org/7shi/i8086tools
$ cd i8086tools
$ gmake
$ sudo gmake install

MINIX 2.0.4のユーザーランドとソースを準備します。

以下のファイルをダウンロードしてください。

/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上でビルドしたカーネルと一致しています。