Windows XP x64

インストールしてみた。けど、なぜかネットワークのインストールのところで止まって次に行かないみたい。
ハードディスクは、3GB用意しました。
qemu-system-x86_64 -L ../pc-bios -hda winxp64.img -cdrom //./e: -boot d -m 256
しょうがないので、-net nic,model=rtl8139 -net user つけて途中からやり直してみると、今度はドライバーのインストールのところで止まる。
それで、もう一度 -net 付けずにトライしてみたら、インストールできた。
なんか、x64の画面を見ると感動。
設定を保存していますのところででものすごい時間がかかる。ハードディスクのアクセスが遅いのか、容量がたくさん必要なのか、メモリーがもっと必要なのかわからないけど。
とにかく時間がかかりました。止まっているように見えても、動いていると思いますので放っておきましょう。
ネットワークは、動いていないようなので、RTL8139をチェック。
そこで、-net nic,model=rtl8139 -net user 付けて起動してみると、デバイスの認識はしたみたい。ネットワークが使えるようになった。
x86_64 Fedora Core 4上で、Kqemuの64ビット版を使ってみた。すこし速くなって快適になります。-kernel-kqemuは使えないけど。i386で64bitが使えるともっといいのにね。
もう少し速いと、いいんですけど。

DVDドライブ

マルチブート用にAcronis OS Selectorを使っているのですが、デフラグしたらハードディスクから立ち上がらなくなってしまいました。CD-ROMも壊れていて、なす術がなく、新しいDVDドライブを買ってきました。BuffaloのDVSM-XL516FBなのですが、CD-ROMが回るとちょっと音がうるさくてがっくり。仕方ないけど。壊れたDVDドライブもGSA-4082Bなのですが、CD-ROMだけ読めないとい壊れ方で、マルチドライブも意外な欠点があるのね。
フリーのブートマネージャもあるのですが、以前パーティションが壊れたとき、System Selectorの復旧ツールが役になったことがあって、なるべく安い市販のツールを使うようにしているのでした。でも、デフラグで立ち上がらなくなるのもなー。
立ち消えになっていた、Windows XP x64のインストールやるぞー。

kqemu-1.3.0pre9

kqemu-1.3.0pre9.tar.gzが出ています。Windowsホストでも動くようで、Win2kとFC4のRescue CDは、動くのを確認しました。でも、FC3は起動途中で止まってしまいました。Redhat7.2も動きますが、とても遅いです。

爆速エミュレーター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が面倒を見るのかって使い勝手の点で大切なんだろうな。

OS自作入門19日目&20日目

アプリケーションとAPIの話でした。
ファイルを見つけると、メモリにロードしてセグメントを設定して実行してしまうという話。特権レベルが変わっていないせいか、ソースコードだけを見ているとOSとアプリケーションの区別がつかない気がした。
アプリケーションからOSの機能を呼び出すのは、ソフトウェア割り込みが一般的なんですかね。そういえばLinuxもint 0x80だし。その他、コールゲートというのがあるのは知っているけれど、他にはあるのかな。

仮想化やクラウドについて