Emulin はフリーソフトウェアです。
Linux for IA-32 バイナリを実行するエミュレータです。
java で記述されています。
Emulin は GNU General Public License(GPL2)のもとで配布されています。
まだ本格的に使える段階ではありません。
実際に触ってみたいという人のために、実験的にリリースしています。
* 現在動作しているアプリケーション ( 詳細は FAQ を参照してください )
. gzip, tar, nkf, GNU の fileutils, shellutils, textutils, findutils, diffutils, inetutils の一部が動作しています。
. ash からほとんどの基本コマンドが動作するようになっています。
. jvim, less も使えるようになりました。(超遅いです。要PentiumII 500MHz以上 ^_^;)
. ネットワークアプリとして ftp,telnet が動作するようになりました。
. freewnn-1.10 の jserverが動作するようになりました。
* 現在動きかけているアプリケーション
gcc ( ld だけが動いていません。)
configure script ( なぜか途中で落ちます。)
* 現在取り掛かっている作業 ( 優先度順 )
1. Swing によるコンソールサポート ( 100% Pure Javaを狙いたい )
2. network 関連のシステムコールの完全なサポート ( samba,lpd を動かしたい )
3. bash の動作へ向けて 不足しているシステムコールのサポート
*. 細かいバグの修正は随時重要なものから直していく
まだ、他にも動作するプログラムがあるかもしれませんが確認していません。
最新バージョンでも以下のような制限があるため注意してください。
dynamicリンクされたバイナリをサポートしていません。 (staticリンクされたアプリケーションしか動作しません。) FPU命令をサポートしていません。 (浮動小数点ライブラリを使えば、実数を扱うアプリケーションも実行できます。)
emulin-0.2.13b.jar -- 11,Feb.2000 * RingBuffer.java を作成し、 SubProcess.java の構造をシンプルにした。 * バグ修正 : ストリームデータの到着順が入れ替わるバグを修正した。 -> ftp のログインが不安定な問題が解決した。 * バグ修正 : recvfrom( ) システムコールがセットするアドレス情報の sin_family のエンディアンが逆だった。 -> DNSの リゾルバが動作するようになった。 * バグ修正 : Segment.peekbs( ) で配列のインデックスがマイナスになり、Javaが落ちる。 * バグ修正 : 64bit リード関数 Memory.load64( )関数にアドレス指定バグがあった -> sed が動いた。 * バグ修正 : Windows 2000 で find -print をやると NullPointerAccess で止まるバグemulin-0.2.12b.jar -- 17,Jan.2000 * Signalの実装を行った。(Singal.java Siginfo.java) 追加 * NativeConsole から SIGINT シグナルを送信できるようにした。 * Process.java に psigによるシグナル受信チェックを組み込んだ。 * ネイティブコンソールでの動作時 Swing による Windowがでるようにした。(SIGINT送信用) * インストール後のセットアップの自動化を進めた。 setup, setup.bat * セットアップ用スイッチ -S 追加 ( bootスクリプト生成用 ) * インストールされるディレクトリ構成を変更した。( README参照のこと ) -> ネイティブコンソールから SIGINTを送信して、実行中のプロセスの中断ができるようになった。emulin-0.2.11b.jar -- 4,Dec.1999 * システムコール未サポートのエラーで、Emulinが落ちるのを修正した。 ( そのプロセスだけを exitするようにした。 ) * mount システムコールをサポートした。 * alarm システムコールをダミーサポートした。 * fchmod システムコールをダミーサポートした。 * readlink システムコールをダミーサポートした。 常に EINVAL(シンボリックリングでない)を返すようにした。 * sync システムコールをダミーサポートした。なにもせず常に 0 を返す。 * umount システムコールをサポートした。 * BUG修正: tarの実行で Emulin Error : Unsupported system call... id=[182] のエラーで落ちるバグを修正した。 (system call ID 164-190 までのシステムコールをなにもせずリターンするようにした。(Linux 2.0のソースはそうなっている)) -> local disk のマウントができるようになった。emulin-0.2.10b.jar -- 7,Nov.1999 * FILD int64 命令をダミー登録した。 * subprocess を finfo にぶらさげた。 一つのファイルディスクリプタにつき一つの入力監視用サブプロセスとした。 * subprocess で listenポートの監視をサポートした。 * listenしたポートは何度でも acceptできるようにした。(これがUNIXとしての正しいスペックである) * flockシステムコールをダミーサポートした。 * ftruncateシステムコールをダミーサポートした。 * wait4( ) システムコールのバグ修正 (status_p 引数が 0 の時、アドレス 0 に終了ステータスを書き込もうとしてSegVで落ちる。) * SubProcess : Socketからの先読みバッファのバッファフルチェックをいれた。 * SubProcess : 先読みのタイミングにWAITをいれないようにした。(sleepせず、最高速で回る。) * console.dll を emu_con.dll に変更した。(Windows 2000の console.dllとバッティングするため)emulin-0.2.9b.jar -- 20,Sep.1999 * fork( ) システムコールでプロセスのファイルテーブルの情報が正しくフォークされないバグを修正した。 * pause( ) システムコールをサポートした。 ( 無限にsleep するだけで、まだ signal を受け付けない ) * shutdown( )システムコールをダミーとした。 * accept( ) システムコールでオープンしたファイルがSTREAMではなく、DGRAMソケットになってしまうバグを修正した。 * gcj によるコンパイルが通るようにした。 ( 但し、gcjは Threadがサポートされていないようなので、正しく動作しなかった。)emulin-0.2.8b.jar -- 2,Sep.1999 * ネイティブコンソールの ioctl( )パラメータの c_iflagをサポートした。 (IGNCR,ICRNL,INLCRのみ) -> telnet : リモートのemacs内のシェルバッファが正しく動作するようになった。 ( DNSは引けない )emulin-0.2.7b.jar -- 25,Aug.1999 * read( ), write( ) システムコール : データグラムパケットの R/Wをサポートした。 * ネットワークのリード、コンソールからのリードを、スレッドにより先読みするようにした。 * recvfrom( ) システムコールのバグを修正した。( 受信パケットの ip アドレスが 常に 0.0.0.0 だった ) * select( ) システムコールのタイムアウト引数をサポートした。 -> telnet が 動作した。( DNS は引けない )emulin-0.2.6b.jar -- 7,Aug.1999 * socket( ) システムコールをサポートした。 * bind( ) システムコールをサポートした。 * accept( ) システムコールをサポートした。 * connect( ) システムコールをサポートした。 * listen( ) システムコールをサポートした。 * revc( ) システムコールをサポートした。 * send( ) システムコールをサポートした。 * recvfrom( ) システムコールをサポートした。 * sendto( ) システムコールをサポートした。 * select( ) システムコールをサポートした。 * ROR,ROL命令のバグを修正した。(1,2バイトオペランドに対して正しい動作ができていなかった。) * FLD命令をサポートした。 * FSTP命令をサポートした。 * FST命令をサポートした。 * BSF命令をサポートした。 * BSR命令をサポートした。 * FST命令をサポートした。 * FILD命令をサポートした。 * RET offset 命令が RET 命令になるバグを修正した。 * FCHS命令をサポートした。( ダミー ) * FXCH命令をサポートした。( ダミー ) -> ftp が 動作した。( DNS は引けない ) -> smbclient が動作した。 ( 但し Linux 上でしか動いていない。 Windows 上では動かない ) -> dl_open( ) が動作するようになり、シェアードライブラリの読み込み実行ができるようになった。emulin-0.2.5b.jar -- 29,May.1999 * getrlimit( ) システムコールをサポートした。 * dup2( ) システムコールをサポートした。 * dup( ) システムコールが常に 0 を返すバグを修正した。 * 名前無しパイプをリングバッファ状にした。 * kernel のメインループと内蔵 init のスレッド優先度を下げた。 * メモリフェッチに cache 機構を内蔵した。( パフォーマンスが約2倍になった ) * wait4( ) システムコールで、リターンステータスを正しく返さないバグを修正した。 * movsx 命令のバグを修正した。(転送元サイズの間違い) * movzx 命令のバグを修正した。(転送元サイズの間違い) * open( ) システムコールの O_TRANC 指定時のバグを修正した。 * Nativeコンソールを実装した。( Linux, Windows のみ ) * カレントワーキングディレクトリを プロセスごとに持つようにした。emulin-0.2.4b.jar -- 25,Apr.1999 * pipe システムコールをサポートした。 * getcwd( ) の戻り値が常に NULL となるバグを修正した。 ( /.. /. パスの扱いができていなかった ) * 書き込みファイルのオープンのバグを修正した。( 既にあるファイルは更新できないバグがあった。) * accessシステムコールのバグを修正した。 ( その結果,which コマンドが正しく動作しなかった。)emulin-0.2.3b.jar -- 11,Apr.1999 * fork システムコールをサポートした。 * wait4 システムコールをサポートした。 * execveシステムコールをサポートした。 * 内蔵型 initプロセス をサポートした。 * マルチタスクをサポートした( Javaのスレッド機能を使用した。 ) * デバッグ情報に、どのプロセスが出したものかがわかるようにタグを付けた。 * emulin.cnf の pid,gid,gid パラメータを無効にした。(意味が無くなった) * READMEの CLASSPATH設定方法 の間違いを直した。 ( -> Thanks to Kazuyuki SHUDO ! )emulin-0.2.2b.jar -- 4,Apr.1999 * lseekシステムコールが常に 0 を返すバグを修正した。 * mmapシステムコールのバグを修正した。(file をメモリにマップすると、NullPointerExeptionで落ちるバグ) * mmapシステムコール: 割り当てるアドレスの指定を無視するバグを修正した。 * cmpb,cmbw 命令のバグ修正した。(符号拡張していなかった) * stos,lods 命令のバグを修正した。(更新してはいけないレジスタを更新していた) * STDERR(fd=2)への出力をしようとするとNullPointerExceptionで落ちるバグを修正した。 * chdirシステムコールをサポートした。 * CPU の LEAVE命令をサポートした。emulin-0.2.1b.jar -- 7,Mar.1999 * ファイルアクセスを行うコードを FileAccess.javaにまとめた。 * Linux アプリケーションを別配布とした。 * 空のディレクトリを扱おうとすると、javaの例外エラーで止まるバグ修正(tarの誤動作で発覚した) * Windows での実行時に、内部でファイルセパレータを正しく変換できていなためファイルアクセスに失敗するバグを修正した。 * x86 命令デコーダのパフォーマンスを若干改善した。(実行速度が平均で約 25%アップした)emulin-0.20b.jar -- 2,Feb.1999 * 始めての GPL2 ライセンスでのリリース * 機能的には、emulin-0.11b と同じ。Copyright を追加し、リビルドした。emulin-0.11b.jar -- 1,Feb.1999 * 実験的にバイナリのみのリリース * ls, nkf, gzip, tar, GNU fileutils が動作した。 * emulin.cnf をサポートし、初期設定値を定義できるようにした。 * 仮想ファイルパスをサポートした。emulin-0.10b.jar -- 23,Jan.1999 * 実験的にバイナリのみのリリース * ls, nkf, gzip, tar, mkdir 程度が動作した。
現在のバージョンは、実験的リリースバージョンです。(バージョン番号の最後の 'b' はベータの意味です。) 配布条件等は付属ドキュメントを参照してください。 完全に無保証です。
- Emulin本体
- Emulin用Linuxアプリケーションパッケージ
- Basic Application Package 1.0.6 の README
- Etc and Library Package 1.0.1 の README
- Network Application Package 1.0.0 の README
- Server Application Package 1.0.0 の README
- Basic Application Package 1.0.6 jarファイル[約7.5 MB] ) -- current 7,Aug.1999
- Etc and Library Package 1.0.1 jarファイル[約1.5 MB] ) -- current 7,Nov.1999
- Network Application Package 1.0.0 jarファイル[約12 MB] ) -- current 7,Aug.1999
- Server Application Package 1.0.0 jarファイル[約4 MB] ) -- current 7,Nov.1999
僕の Computer Life は、常に Free Software に強く依存していました。
特に GNUツールに依存しており、PC-UNIXが有名になる以前から、
DOS上のGNUツールを使って、UNIXモガキを行っていました。
その後、PC-UNIXが使えるようになってモガくことは無くなりましたが、
いったん、UNIX環境から離れると、Windows 等でUNIXモガきを続けることになりました。
特に、MacOSを使うときには、いまだに、モガく方法さえも用意されていないのが現実です。
また、UNIXには優秀なサーバーソフトがたくさんあり、なんとか MacやWindows
で動いたらいいのにと思うことがたくさんありました。
そこで、なんとか UNIX用のソフトを簡単に他のプラットフォームで動かす
方法はないかと考えていました。
これは、凄いことになるぞと思いました。
JavaVMがいろんなプラットフォームに移植されれば、自分のComputing環境が
そのまま持って行けるのではないか...
Sunは、Javaで書けば、どこでも動くと豪語していました。Write Once, Run Anywhere。
僕にとっては理想の世界でした。
でも、Cで書かれたUNIX上のツールは持っていけないのでは意味がないのでした。
Cで書かれたプログラムをJavaバイトコードに落す方法はないのか。
Internet で調べてみると、そんなツールは見当たらりませんでした。
JavaからCへの変換プログラムははたくさんあったのですが...
gccのCPU依存部分を調べてみたけれど、そこにもJava対応コードは見当たりませんでした。
JavaVM を調べてみました。それによるとCコードを
Javaバイトコードにコンパイルするのは難しそうだという結論に達しました。
どうやら、メソッドコードの最大サイズが限られているようだし、もっとまずいことに
ポインタが扱えないようでした。
自分でできる範囲で、UNIXツールを Javaバイトコードに落す方法は?
Javaで記述した際に一番パフォーマンスが出るような 仮想 CPUを設計する gcc をその仮想CPU用に対応させる。
これは途方もないことに思えました。「そんなことはできない。」
「CPUを設計することなどできないし、gccをさわるのも大変だ。」
※ この時 UNIXツール群が、UNIX特有のシステムコールを使っていることについては深く考えていなかったなあ...
既存CPUのエミュレーションが一番可能性が高そうでした。
まずは、対象 CPU の選定から始めました。
実装が一番簡単なのは、多分 RICS CPU の DEC Alphaではないかと考えました。
調べてみると、命令セットはシンプルだし、アウトオブオーダー実行もないし、
これは簡単そうだということになりました。
MIPSの RISC CPUもシンプルですが、アウトオブオーダーがありエミュレーションが
複雑になるのではないかということで見送りました。
gccでのコンパイルを前提と考えていたため、gccで実績のあるCPUである必要がありました。
Linux のポーティング状況からみた gcc の実績 は、Alphaも MIPS も同じくらいでした。
※ このころ、エミュレーション対象の
プラットフォームは Linux がよいのではないかと考え始めていました。
DEC Alpha は Red Hat Linux 4.0 で安定したものがリリースされているため、
gcc の Alpha コード生成もかなりの信頼性があると判断できました。
Alpha のエミュレーションで行こうと決心した直後、
いちおう Intel CPU もチェックしておこうと思いました。
調べる前は、Intel CPUはアーキテクチャが複雑で汚いことで有名でしたし、
どうせやる気はありませんでした。
しかし、少し調べてみると UNIXのユーザーモードで必要な命令のみサポートする
のであれば、十分簡単であることが分かりました。(16ビットコードや特権命令は全くサポートしなくてよい)
また、IA-32でやるメリットが大変大きいことに気づきました。
そのなかでも、以下のメリットから目を背けることはできませんでした。
- デバッグがやりやすい。
自分の持っているマシンが Intel CPU搭載 の Linuxマシンなので、正しい動作が常に確認できる。- IA-32には、商用アプリケーションがある。
最終的には、オムロンの Wnn6 などの有用なサーバーが動かせる可能性がある。 (最近では、ジャストシステムのATOKサーバー等が対応されるという発表がありました。)
Javaで記述する以上、パフォーマンスが出ないというのは作るまえから明白でした。
最近のCPUの目覚しい高速化と、JavaのJITコンパイラの高速化
の状況から、希望的観測のもとに、深く考えないことにしました。
また、Java Press という雑誌で、JITコンパイラのベンチマークがあり、
Cで記述したアプリケーションと同じか、場合によっては
Cで記述した時より速いという結果があったため、少し可能性があるのではと考えました。
とりあえず、少し作ってみて手応えを調べてみようと考えました。
Elf バイナリのロード、CPUの基本的な命令をサポートしました。
片手間でありながら 約 2週間弱で、 nkf が動作するようになりました。
思っていたより簡単でした。
パフォーマンスは、Windows の JDK 1.1.7 で動作させてみると、なんとか使えるレベルかもしれないと思いました。
こうして、 Emulinの開発プロジェクトはスタートしました。
Linux がどのくらいの価値があるものなのか、改めて知りたいと考え
Linux Conference に参加しました。
Linux コミュニティーは活発であり、大変心強く思いました。
エミュレーション対象のプラットフォームとして、 Linux を選択したことは
正解だったと確信しました。
そして、僕の開発に対する意欲はより増幅されました。
1. Internet サーバー等が動作する。
apache, bind, ftpd, delegate などのインストールなどが簡単にでき、
動かせればいいなと思っています。
プラットフォームに依存しない、サーバーパッケージなどが作れれば
おもしろいと思います。
2. samba, nfs サーバー等が動作する。
最終的には、 samba のようなファイルサーバーが MacOS や BeOSで動作
すればいいなと思っています。(OSの安定性の問題がありますが)
現在、 MacOS と Windows 間のファイル共有などは、商用ソフトを買う以外
実現方法がないようです。
いつまで待っても、MacOS用の samba は誰も作られないようですし...
また、Windowsで Netatalk (IP版) が動作すれば、MacとWindows のファイル共有なんかも
簡単になるのではないかと思います。
※ これらは、 AppleShare IPを買えば実現できるようです。しかしソースが公開
されていません。それに、価格はいくらか知ってます? :-)
3. Linux アプリの構築ができるようになる。
shell環境は Cygnus社 の cygwin32 環境と同じレベルまでいければいいと思います。
( アプリケーションの configure & make ができるレベルまでいけるか? )
4. Jini のサービスを利用できるようになる。
プリンタ、Disk等 Jiniサービスを認識し、デバイスサポートを一本化できればシンプルだと思います。
5. 簡単インストール
バージョン 0.3.0 では、Zero G software のインストーラを使う予定です。
エミュレーション環境が安定した後は、インストールを簡単にする必要がありそうです。
1. init から動作し login を受け付け... というような完全な
Linux 環境を動かすことまでは考えていません。
そこまでやるのなら、本物のLinuxBoxを用意すれば?ということになると思います。
2. パフォーマンスのためのチューニング
Emulin のコードをバリバリにチューニングをすることはやりません。
あくまでコードは読みやすい状態を保つためです。
今後の HotSpot や gcj 、 ムーアの法則に期待するのみです。
※ 現在、CPUエミュレーションをやらないモードが実現できないかと考えています。
つまり Intel系マシンではコードをそのまま走らせるわけです。
もしくは、Plan9 のように、CPUサーバーをNative CPUのマシンで提供するなど。
多くは語らないようにしましょう。
実現できなかった時に悲しいですから。
1. Jini対応デバイスのなかに Linux アプリを解き放て
「今日は電子レンジのCPUパワーが開いているな... よしよし
rc5 のクラッキングプロセスは 電子レンジに移行してと...」
ほとんど SF に近い世界になりつつありますね ^_^;
2. セガ Dream Cast を Proxyserver に
Dream Cast には標準で、JV-Liteが入っているようです。
modemも標準でついているということは... delegate を使って...
CDを入れて電源をいれるだけで、DialUp proxyserver だ!
3. 携帯電話でunixサーバー
携帯電話のなかで、Sambaサーバーを動かし、いつでもWindowsと
携帯電話のアドレス帳を共有...
Emulinを開発するために参照している本です。
一般的にEmulator のように既にスペックが決まっているものを開発する時は、
なるべく多くの本を持っているほうが断然効率が上がります。
ぐっとこらえて、高価な本も買ってしまいましょう。
1. 80x86/80x87ファミリー・テクニカルハンドブック
Robert L.Hummel 著 槌田 浩一 訳
技術評論社
ISBN4-87408-588-1 C3055
5800円
Pentium系CPUのスペックについてはこれ一冊で十分です。
2. プログラミングLinux
Michael K.Johnson/Erik W.Troan 著 (株)クイック 訳
アスキー
ISBN4-7561-2044-X
5800円
Linuxアプリケーションのプログラミングについて書かれています。
Cライブラリを含むLinuxの動作や考え方を詳しく書いているので、
Kernelの解説書を読むよりも参考になることがあります。
3. オペレーティングシステム 第2版 設計と理論およびMINIXによる実装
A・S・タネンバウム + A・S・ウッドハル 著 千輝 順子 訳 今泉 貴史 監修
プレンティスホール出版
ISBN4-89471-047-1
8800円+税
アルゴリズム等が説明されており、OSの考え方が詳しくかかれています。
OSの勉強をするためには、よいかもしれません。
MINIXはLinux等のフルスペックUNIXに比べて、機能が少ないため、
どこまでが、UNIXの基本的な機能なのかを理解するのには最適です。
本の書き方としては、おおまかなことと細かいことがいっぺんに書かれて
いるため、知りたいことを探すのに苦労します。
勉強用としてはいいですが、OS設計のリファレンスとしては使いにくいです。
全ページ数のうち MINIXの全ソースが1/3を占めています。
4. UNIXカーネルの魔法 System V リリース4のアーキテクチャ
バーニー・グッドハート + ジェームス・コックス 著 櫻川 貴司 監訳
プレンティスホール出版
ISBN4-931356-04-4
6311円+税
上記MINIXの本に比べて、こちらはフルスペックのUNIX Kernelの解説書です。
もしこれだけを読んでいたら、いったい何から手をつけたらよいか
分からなくなったでしょう。しかし、自分の知りたいことを探す場合は
こちらの方が使いやすいです。
この本の内容をながめると、自分がいまなんと無謀なことをやろうと
しているんだろうと思うくらい規模が大きいです。
上記MINIXの本とこの本の2冊を交互に参照して、何をやるべきか/やらないべきか
を決定しています。
5. INSIDE LINUX
Randolph Bentson 著 槍山 正幸 監訳 (株)アイディ 訳
レーザー 5 出版
ISBN4-900813-21-4
3800円+税
Linuxの内部構造を解説しています。
UNIXを実装する際に参考にできるような、具体的な内容は
あまりかかれていません。
Linuxの進化が早いため、内容も古くなっています。
いまのところ、Linuxソースを読むための補助程度にしか訳に立っていません。
ちなみにこの本は、Linux Conference 98 の後 Free BSD ,Linux 懇親会の
ビンゴゲームで当たったものです。
6. JAVAクイックリファレンス
David Flanagan 著 日本サン・マイクロシステムズ(株) 監訳 永松 健司 訳
オライリー・ジャパン
ISBN4-900900-08-7
4017円
この本に書かれている APIはもう既に古いため参照していません。
言語のスペックについては、この本を参照します。
7. Java言語入門 アプレット、AWT、先進的機構
ローラ・リメイ + チャールズ・L・パーキンズ 著
プレンティスホール出版
ISBN4-88735-011-2 C3055
4800円
サンプルソースが多く、参考になります。
特にスレッドのあたりは参考になりました。
言語リファレンスとしてはあまり使えません。
8. Java Native Interface プログラミング
ロブ・ゴードン 著 林 秀幸 訳
プレンティスホール出版
ISBN4-89471-080-3 C3055
4500円
コンソールの実装でJNIを使った時に参照しました。
まだ最初の方しか読んでいません。
コンソールの実装は簡単過ぎたので、この本はいまのところ
手に余っています。
9. Perlプログラミング
Larry Wall and Randal L.Schwartz 著 近藤 嘉雪 訳
ソフトバング(株)
ISBN4-89052-384-7 C0055
4500円
超有名な本です。 Perl 4 の時の本なので、すこし古いです。
読み物としてもリファレンスとしても、これ一冊で十分です。
現在は Perl 5 対応の本が出版されています。
10. Linux 2.0 カーネルブック
R.Card/E.Dumas/F.Mevel 共著
(株)オーム社
ISBN4-274-07879-5 C3055
5300円
シグナルの実際の実装が知りたくて、買いました。
Linux内部の具体的な定数定義なども書かれているため、
エミュレータを作る程度なら、もうカーネルソースは読む必要が
なさそうです。