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

MINIX 2.0.4をVMにインストール

MINIX 2.0.4をVMにインストールする方法について、調べたことや参考URLを残しておきます。

通常の手順では配布ファイルからフロッピーディスクのイメージを作ってインストールします。手間が掛かるため、今回はインストール済みディスクイメージを使います。

続きを読む

MINIX 2事始め

16bitのx86コードに触れたくなりました。そこでMINIX 2に目を付けました。

MINIX 2は16bitと32bitの両方に対応しています。16bitの方は80286のプロテクトモードを使用しているためリアルモードではありません。カーネルではなくユーザープログラムの動きを追いたいので、ユーザーだけを見ている限りはリアルモードとの違いは少ないのではないかと予想しています。詳しいことは触りながら調べてみる予定です。

続きを読む

inet

VC++でビルドしたinetがMINIXで動きました。

ソースをインポートしてビルドしただけではパケットが壊れてすぐに落ちました。原因はbuf.hの以下のマクロでした。

#define ptr2acc_data(/* acc_t * */ a) (bf_temporary_acc=(a), \
  (&bf_temporary_acc->acc_buffer->buf_data_p[bf_temporary_acc-> \
    acc_offset]))
続きを読む

フォルダ整理

VC++MINIXのバイナリをビルドするためのソースツリーがごちゃごちゃして来たので、MINIXから持って来たソースをlib, servers, drivers, commandsにフォルダ分けして整理しました。

今後カーネルに必要なサーバやドライバを追加して、ブートイメージの作成を目指します。

shとmake

VC++でshとmakeをビルドしてMINIXで動かせるようになりました。yaccやlexを用意するのが面倒だったため、生成したソースを流用しています。

shとmakeを入れ替えて、xzのconfigure(長いシェルスクリプト)とmake、カーネルのビルド(make image)が出来ることを確認しました。多分、今の枠組みでも大抵のコマンドは動きそうです。

pushf/popf

VC++でビルドしたバイナリをMINIXで動かしていて、strchr()で落ちることに気付きました。strchr()は組み込み関数として特別扱いされているため、C言語で記述してもVC++が受け付けてくれません。オプションで組み込み関数を無効にしてもダメです(VC++2005まではできていたらしいです)。ACK(MINIXコンパイラ)用のアセンブリを手動でMASMに変換して使用していました。

よく見ると32bitコードなのにpushf/popfを使用しています。ACKではサフィックスのルールがMASMとは異なっているようです。これらをpushfd/popfdにしたところ、問題なく動くようになりました。

転送・実行スクリプト

VC++MINIX用のバイナリを開発すると、動作確認が面倒です。ホスト(開発マシン)にInterixでFTPサーバを立てて(/etc/inetd.confでftpの行をコメントアウト)、ゲスト(MINIX)からアクセスして実行する手抜きスクリプトを書いてみました。

#!/bin/sh
HOSTURL=ftp://xxx.xxx.xxx.xxx/pub/minix-tools/MINIX\ Release
rm -f $1
wget --passive-ftp $HOSTURL/$1
chmod 755 $1
./$1

getrun testのようにするとホストからtestをダウンロードして実行します。ホストのVC++と連動するわけではありませんが、シェルのヒストリ機能で[↑][Enter]とするだけなので割と簡単です。