爆速エミュレーターQEMUで行こう!

QEMUに関する本が技術評論社から出版されます。著者はMYCOMジャーナルのWindows XPスマートチューニングなどで有名な阿久津良和さんです。発売日は、6月13日のようです。実は、阿久津さんから本を献本していただきました。どうもありがとうございました。
本の内容は、エミュレーターについてはあまり経験がないという人が、気軽に試してみるのに最適なものになっています。さまざまなOSが取り上げられていて、その導入の仕方から使い方まで網羅されています。Windows系では、Windows 98SE、 Windows 3.1、 Windows 95、 Windows Me、 Windows 2000、 Windows XP、Linux系では、Fedora Core 5、ホビー/AV系では、Be OS、 AROS、 Menuet OS、組み込み系では、DR-DOS、 QNX、、個人作成系では、Mona OS、 NWSOS、 OSASK、 ReactOS、が取り上げられています。
いろいろなOSをインストールしたり、試してみるのって楽しいです。この機会に是非、トライしてみてはいかがでしょうか。

gdbでのマルチスレッドのデバッグ

RedHatのサイトより。gdbでマルチスレッドのプログラムをブレークポイントで止めたときは、すべてのスレッドが止まるって。シングルステップさせたときは、他のスレッドはどこで止まるかわからないんだって。
だから、他のスレッドのブレークポイントに引っかかるとそっちで止まるんだって。
ホストOSのスケジューラをロックできるOSもあって、
(gdb) set scheduler-locking on
で、他のスレッドを実行させないこともできるそうだけど、Windowsは当然できないよね。
(gdb) info threads
で、スレッドの表示。
(gdb) thread threadno
で、threadnoに番号を入れるとスレッドの切り替え。
(gdb) break linespec thread threadno
で、linespecにソースの行番号、threadnoに番号を入れると、そのスレッドがソースの位置に来たときに止まるんだって。
Windowsで、_beginthreadexを使ってスレッドを作ると、なかなかinfo threadsに表示されないです。すぐには実行されないようです。
WaitForSingleObjectで終了待ちをするとやっとスレッドが開始されたりしています。
ところが、本質的にスレッドはプログラム中のどこでスイッチしてもいいわけで。スレッドを複数作ってみると、実行の順序が反対になったりします。

MinGWのマルチスレッド

-mthreadsオプションを加えないといけないみたい。mingwm10.dllが使われるんだって。
-mthreadsを使うと、_MTというマクロがdefineされた状態になって、getc,putcなどがインライン関数でなくてライブラリにあるものが使われるようになる。
コンパイルとリンクを別々にやるときは、コンパイル時に-D_MTをつけないといけないか。
その他にも、ヘッダーのgthreadかな、の中にも書いてあるけどわけわからなかったり。
Cのプログラムを作って、依存関係を調べてみると、mingwm10.dllは必要なかった。C++のプログラムの場合は、リンクしたライブラリがDLLを必要とするようです。

OS自作入門21日目&22日目

OSを守るという話と、C言語でアプリケーションを作るという話。
特権レベルを切り替えるとOSの保護ができますというわけ。ソフトウェア割り込みでも、特権レベルの切り替えが起こればスタックの切り替えも起こるのでした。
コンソールタスクのままアプリケーションをその延長上で動かしているという感じなので、タスクの切り替えが起こっていない気がする。
TSSに必要なEIPなどを設定して、別タスクとして起動したほうが自然な気もしますけどね。
Cのプログラムでmainが終わると終了するようになっているのは、ライブラリがapi_endのような終了処理をやっているからだよね。
アプリケーションとOSがつながった気がした。
今は、アプリケーションとOSを両方作っているからあまり気にならないけど、別々に作った場合、どこまでOSが面倒を見るのかって使い勝手の点で大切なんだろうな。