マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

x86エミュレータ

PANIC!

よくあることだが、あるOSでエラーに突入。エミュレート失敗でございます

HDDのエミュレートが必要になったので

この本の購入を決意したATA(IDE)/ATAPIの徹底研究―組み込み機器でも重要になった外部記憶装置とのインターフェース規格 (TECH Iシリーズ)作者: インターフェース編集部出版社/メーカー: CQ出版発売日: 2010/08メディア: 単行本 クリック: 1回この商品を含む…

キーイベント

キーイベント実装例。現在引数は無いが、そのうちキーコードとキーの状態を渡そうかと思っている。以下のコードで何らかのキーが押されたときに、画面にBと表示するようにしている。0x400000に関数のアドレスをセットしておけば、キーが押されたときに登録し…

C言語でもOK

C言語でプログラム書いて、minivm上で実行できた。以下のソースコードをhello.cとして保存して、下記のようにコマンドをうち、できあがったhello.binを読みこませることで、画面上にAと出力された gcc hello.c -m32 -c -nostdlib -o hello.obj objcopy -I el…

MiniVM計画進行中

現在、ブラウザで動くMiniVMを作成中で、以下のコードをアセンブルすればCanvasにAと表示されるようにした。C言語でも書けると思う。あとはアップローダでも用意してみようかな [BITS 32] MOV EAX, 0x100000 MOV BYTE [EAX], 'A' loop: JMP loop

ブラウザで動くminivm計画

今、ブラウザで動くminivmを作っている。PC/AT互換ではなく、独自のシステムを持っている。Cやアセンブラで作ったバイナリを動かすことが目的で、HTML5のCanvas上にCやアセンブリでアクセスできるようにする。VRAMを叩くとCanvasにアクセスする仕組みを作る…

今日はここまで進んだ

結局バグの原因はプロテクトモードに入ったのに、リアルモードなアクセスをしている命令があったからだった。メモリへのアクセスはほとんど共通のアクセス方法を取っていたのだが1つの命令だけ何故か違う方法でアクセスしていて、そこにバグがあったとさ。…

さて、どうしたものか

自作エミュレータでMona OS 0.1.5を実行しようとしたがうまくいかなかった。原因はエミュレータのバグなのでOSにエミュレータをデバッグするためのコードをOS側に埋め込もうとしたが、g++のバージョンの違いにより、Monaをコンパイルできなくて苦戦中。デバ…

ブラウザ上でMona 0.1.1をエミュレート

滅茶苦茶エミュレータが遅いけど、ブラウザでMona 0.1.1が動きます。色が手抜きで青い部分まで白くなってしまってるのと、文字の表示位置がbochsと一致してないのを除けば、ほぼエミュレートできているに違いないです。HTML5のCanvasが表示できるブラウザで…

FDCのエミュレート & ページング

デバイスのエミュレートはなかなかめんどくさい。キーボードやタイマはそれほどでもないかもしれないが、FDCになるとめんどくささがでてくる。inやoutが何度もでてくるので大変だ。でもこれぐらい乗り越えられないとエミュレータなんて作っていけないと思う…

メモリ容量の表示の問題解決

レジスタの値をゼロ拡張する命令で32bitOperandのときは、8bitから32bitに拡張しないといけなかったのに、16bitにしか拡張しなかったのが問題だったようだ。32bitOperandのときはサイズが変わる命令には注意してきたつもりだったが、注意が足りなかったようだ

Androidでも動作確認

Mona 0.0.8を乗せたWeb版のx86エミュレータの動作をAndroid端末のHTC Desireで確認した。表示されるまでしばらく待つことになるが、それでもしっかり表示される。GWTのTouchStartHandlerとTouchEndHandlerを追加して、KeyHandlerの代わりになるようにしたの…

ページング!

今までオペコード0F 20と0F 22をCR0用の命令にしてしまっていたがこれは間違いだった。ModR/MでCR0〜CR4を指定するものだったらしい。これからページング対応していかなければならないのでCR0とCR3を使い分ける必要がある。今エミュレートしているMona 0.1.1…

Mona 0.0.8のエミュレート ほぼ完成?

Mona OS 0.0.8を一部の機能を除き、ほぼエミュレートできました。FirefoxやChormeなどのHTML5のCanvasが使えるブラウザで下記のページに行き、少し待つといろいろ表示されます。Hit any key to start [Process]と表示されたら何かキーを押してください(Tabと…

ついにここまで来た!

ついにここまで来た!残された課題はメモリ容量と特権レベル変更時の割り込みスタックとIRET命令、そして右上のMONAの文字をカラフルにすることか。そしてVendor IDをd-kami CPUにした。今まで表示されなかった原因はJNLE命令の実装にミスがあったことが原因…

タイマ割り込み実装

まだ割り込み自体が中途半端だったりするが、タイマ割り込みを実装した。以前から気になっていたprintfででてくる命令にバグがあるらしく、表示ができていない部分がいくつかある。Mona 0.0.8を動かすためのほとんどの機能は実装済みなので、これからはバグ…

割り込み実装...しかし!

割り込みを実装して、さぁキーボード割り込みだ!と思ったらダミーハンドラに飛んでしまったようだ。キーボード割り込みが起こったらIDTの0x21番目のディスクリプタにあるSelector設定してOffsetに飛べばいいんだよな?何か自信がなくなってきた解決しました…

途中経過

途中経過をアップしました。ページを開いた瞬間に若干止まるのと、下の画面になるまで少し時間がかかります。そして現時点では入力を受け付けません。HTML5のCanvasを表示できるブラウザで見てください http://d-emulator.appspot.com/

CPUID...あれ?

CPUIDがNGになってる。どこで判断してるんだろう?まだCPUID命令は来てないみたいだし解決しました。EFLAGSのようです...そしてEFLAGS以外のミスが響いてました

Vendor IDが...メモリ容量が...

Vendor IDが何故か表示できない。そしてメモリ容量が酷いことになっている...。どうしたものか

今日はここまで進んだ

MonaOS 0.0.8で使ってる16色のカラーコードがわからないので別の色で表示しているが、ここまで進んだ。ただし、PICの設定に関しては手抜きである。最近エミュレータ作りに没頭しているので、そろそろゲーム作りに戻りたい

まだ先は長い

MonaOS 0.0.8のカーネルに突入し、最初の描画が終わった。しかし、この後はPICの設定やIDTの設定が待ち受けている。そして、タイマ割り込みやキーボード割り込みに対応する必要があるっぽい。最後の仕上げはマルチタスク、これはOSの仕事だが特権レベルの切…

うまく描画できた

16bit中の上位8bitが描画用のbitmaskだったのに、間違えて下位8bitを描画用のbitmaskにしていたため、一部しか描画できてなかったようだ。結構アホだった

MonaOS 0.0.8の描画方法がよくわからない

上がBochs、下が自作x86エミュレータの結果。描画に失敗している。今の所、どうすればいいのか不明解決しました: http://d.hatena.ne.jp/d-kami/20111120/1321739111

今はMonaOS 0.0.8を動かしたい

どんどんバージョンを上げていくつもりだが、今はMonaOS0.0.8を動かすことに力を入れる。それで現在secondbootに突入した模様。bochsと実行結果が違うが、これは0x7C00に入る前の話っぽい。0x7C00から始めてるこのエミュレータだと0が画面に並ぶようだ。それ…

最初から作り直して

x86エミュレータを最初から作りなおして今日96命令(実行していないものも含む)を再実装した。MonaOSの0.0.8を読み込み、最初のメッセージを表示するところまで行った。175命令実行したところまで行き停止。今のところbochsとレジスタの値も一致している。行…

作り直しを決める

今、開発中のバグだらけのx86エミュレータに限界を感じ始めたため、新たに作り直すことに決めた。2回目の作り直しとなるが、前回は3000行程度だったが、今回は7000行を捨てることとなった。しばらくはMonaOSのバージョンの小さいのから読み込んでいこうと思…

MonaOS 0.0.5を読み込ませてみた

MonaOS 0.0.5を自作x86エミュレータに読み込ませたところ、何かのダンプをひたすら続けている。一体何をするOSなのかわかってないので何が正しいのかわからない

いろんなエラーがあるんだな

Malloc Errorとでるようになった。メモリの確保でミスってるのかな?まぁ、エミュレータからは何をやってるかは把握できないので、どの分岐でミスったか探すのみ。早くLinuxを起動できるようになりたい。32bitモードに入ってからが長い...

Uncompressing Linux...

Invalid Compressed FormatやCRC Errorなどに悩まされていたが、なんとか先に進めた。原因はJA命令の分岐の条件を間違えていたことだった。さらに命令長までミスってるという情けなさ。まぁ、直せたからいいだろう。そして、ある程度進んだところで止まった…