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

MINIX

インタプリタの動作確認

前回、インタプリタを複数のCPUやOSに対応させる過程を書きました。 インタプリタのクラス設計 実際に動かしてみます。 $ file write-minix write-v6 write-8086v6 write-minix: Linux-8086 impure executable write-v6: PDP-11 executable write-8086v6: DO…

インタプリタのクラス設計

自作インタプリタを少しずつ進化させて、複数のCPUやOSをサポートできるようになりました。クラス設計で試行錯誤した過程を残しておきます。 https://bitbucket.org/7shi/i8086tools ※ 文中の図はインラインSVGで描いています。(ソース)

ACKメモ

8086(16bitのx86)をサポートするコンパイラとしてACKが使えるようになりました。 The Amsterdam Compiler Kit ACK自体の移植ではなく、MINIX用のバイナリを8086インタプリタ上で動かします。使用方法は以下を参照してください。 i8086インタプリタでMINIX…

i8086とPDP-11のインタプリタを統合

i8086インタプリタにPDP-11インタプリタを統合しました。1つのプログラムでMINIX 2とUNIX V6の両方のバイナリを動かせます。 https://bitbucket.org/7shi/i8086tools UNIX V6のccを動かしてカーネルがビルドできることを確認しました。 https://twitter.com/…

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

先日、i8086インタプリタでMINIXのカーネルがビルドできるようになりました。 i8086のインタプリタでMINIXのコマンドを動かす 手順を説明します。

MINIXのexitシステムコールを追う

前回、アセンブラからシステムコールを呼ぶ例を示しました。 i8086のインタプリタでMINIXのコマンドを動かす 通常はC言語からlibc経由で呼び出します。UNIX V6とMINIX 2.0.4でlibcからexitシステムコールが呼び出されるまでを追ってみます。

i8086のインタプリタでMINIXのコマンドを動かす

i8086の逆アセンブラに引き続きインタプリタを実装して、MINIXのカーネルがビルドできるようになりました。 http://twitter.com/7shi/status/349237003193307136 OSごと動かすエミュレータではなく、ユーザープロセスのみをホスティングするインタプリタとし…

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で動きました。 http://github.com/7shi/minix-tools/tree/20100227 ソースをインポートしてビルドしただけではパケットが壊れてすぐに落ちました。原因はbuf.hの以下のマクロでした。 #define ptr2acc_data(/* acc_t * */ a) (b…

フォルダ整理

VC++でMINIXのバイナリをビルドするためのソースツリーがごちゃごちゃして来たので、MINIXから持って来たソースをlib, servers, drivers, commandsにフォルダ分けして整理しました。 http://github.com/7shi/minix-tools/tree/20100226 今後カーネルに必要な…

shとmake

VC++でshとmakeをビルドしてMINIXで動かせるようになりました。yaccやlexを用意するのが面倒だったため、生成したソースを流用しています。 http://github.com/7shi/minix-tools/tree/20100225 shとmakeを入れ替えて、xzのconfigure(長いシェルスクリプト)…

pushf/popf

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

転送・実行スクリプト

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

libc

VC++のMINIXクロス開発でlibcをサポートしました。 http://github.com/7shi/minix-tools/tree/20100222 id:n7shi:20100209ではシステムコールを直接呼んでいましたが、libcをサポートしたことで以下のような普通のCプログラムが動きます。 #include <stdio.h> int mai</stdio.h>…

exit

VC++でexit()に必要な関数だけlibcから持って来て、動くようになりました。 http://github.com/7shi/minix-tools/tree/20100219 #include <stdlib.h> int errno; void start() { __exit(42); } CRTがないため、単発の関数をエントリポイントにしています。</stdlib.h>

開発

VC++でビルドしたPEバイナリをa.outに変換してMINIXで動作しました。VC++内でバイナリ変換まで行うようにまとめました。 http://github.com/7shi/minix-tools/tree/20100208 MINIX用バイナリを生成するための設定は以下の通りです。

3.1.6リリース

FOSDEM 2010にあわせてMINIX 3.1.6がリリースされました。 ダウンロード id:n7shi:20100203のクロス開発環境の配布物を3.1.6に更新しておきました。Virtual PC 2007用のNICドライバが入っていますが、やや癖があるため説明します。

PEからa.outに変換して実行

a.outについて調べた結果、仕様的にはPEから変換が可能なようです。変換ツールを作ってみました。 http://github.com/7shi/pe2aout id:n7shi:20100207のコードをgcc(MinGW)でコンパイルして変換してみます。 % i686-mingw32-gcc -o exit.exe -masm=intel -s …

a.outの分析 (2)

id:n7shi:20100205に引き続いてa.outを分析します。アセンブリ版ではサイズ縮小のためセクションを削りましたが、セクションを確認するためC言語版を分析します。 int m[] = { 0, 1/*EXIT*/, 42, 0, 0, 0, 0, 0, 0 }; void start() { asm("mov eax, 0; mov e…

a.outの分析

id:n7shi:20100202でアセンブリ化したサンプルのダンプです。 00000000: 01 03 04 10 30 00 00 00-38 00 00 00 00 00 00 00 00000010: 00 00 00 00 00 00 00 00-38 00 50 00 00 00 00 00 00000020: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 0000003…

クロス開発環境構築

UNIX系OS上でMINIXのクロス開発環境を構築する方法です。ACKは後回しにして今回はgccだけです。MINIXはバイナリファイル形式としてa.outを使用しているため、binutilsやgccに独自のパッチを当てています。パッチ適用済みのソースはMinix Portsにまとめてあり…

libcなしでexit (2)

id:n7shi:20100201の続きです。インラインアセンブラをIntel形式にしてみました。 void start() { int m[] = { 0, 1/*EXIT*/, 42, 0, 0, 0, 0, 0, 0 }; asm("mov eax, 0; mov ecx, 3; int 0x21" :: "b"(m)); } # gcc -masm=intel -nostdinc -nostdlib exit.c…

libcなしでexit

結城浩先生のWikiにexitするだけのバイナリを削っていく記事の翻訳があります。 Linux で動く極小 ELF 実行ファイルをつくる怒涛のチュートリアル これをMINIXでもやってみようと思い、インラインアセンブラでシステムコールを呼ぶコードを書いてみました。 …

Virtual PCでネットワーク (3.1.5)

【追記】MINIX 3.1.6がリリースされました。VPCドライバが入っています。 ⇒ id:n7shi:20100208id:n7shi:20100130のドライバを3.1.5にバックポートして、簡単にインストールできるようにISOイメージを用意しました。 minix-3.1.5-tulip-20100131.iso Virtual …

Virtual PCでネットワーク (trunk)

【追記】MINIX 3.1.6がリリースされました。VPCドライバが入っています。 ⇒ id:n7shi:20100208MINIXのtrunkにはVirtual PCのNICドライバが追加されましたが、動作しなかったためパッチを作成しました。【追記】r6050で修正されました。 ⇒ Revision 6050: imp…

trunkのインストール

MINIXをリリースからtrunkに上げようとしてハマりました。/etcは自動マージできないため、ばっさり消してしまうと簡単でした。最低限、fstabは残しておきます。 cp /etc/fstab /tmp rm -rf /etc /usr/etc cd /usr/src/etc make install mv /tmp/fstab /etc c…

カーネルビルド時間 (Intel VT)

id:masami256:20100127のCore 2 Duo T9600 @ 2.80GHz+KVMの威力に圧倒されたので、Core 2 Quad Q9550 @ 2.83GHzでも計測してみました。 Virtual PC 2007 SP1 Intel VT有効 0:14.03 real 0:05.40 user 0:03.73 sys VMware Player 3.0.0 Intel VT有効 0:18.40 …

カーネルビルド時間

各種VMでMINIX 3.1.5を起動して、カーネルビルドの時間を計測しました。かなりスピード差があります。 Virtual PC 2007 SP1 AMD-V有効 0:27.90 real 0:12.51 user 0:10.06 sys 【追記】VirtualBox 3.0.12*1 AMD-V有効 0:57.61 real 0:15.73 user 0:36.71 sys…