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

2010-02-01から1ヶ月間の記事一覧

JPC

JPCというJavaで書かれたx86 PCエミュレータの存在を知りました。 http://javapc.sourceforge.net/ id:n7shi:20100221で取り上げたsanosのサイトを見ていて、アプレットで起動するデモを見付けたのがきっかけです。 Running sanos in a browser (非常に重い…

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>…

Sanos

VC++が出力したコードをMINIXで動かそうとして、64bit整数型の剰余(a % b)を計算する部分で__aulldvrmというシンボルを使用していたためリンクエラーになりました。32bitのx86では64bitを計算する命令がないため、コンパイラが出力するコードでは計算用の…

exit

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

MASMでシンボルをエクスポート

MASMでシンボルをエクスポートする方法として、PROC〜ENDPの方法がよく紹介されます。インポートしたシンボルにジャンプする例です。 .386 .MODEL FLAT .CODE EXTERN proc0:NEAR proc1 PROC jmp proc0 proc1 ENDP END 他のアセンブラから変換しようとするとE…

開発

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…

githubにpushしたcommitの取り消し

githubにpushしてからcommitが間違っていたことに気付きました。以下のようにすると取り消すことができます。【注意】commitだけでなく変更も失われます。ローカルのソースツリーは残された最後のcommitに戻されます。変更を保存したい場合は使わないでくだ…

クロス開発環境構築

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でもやってみようと思い、インラインアセンブラでシステムコールを呼ぶコードを書いてみました。 …