Intel VT-xを使ってみた(経過)

Intel VT-xを利用して基礎的なVMMを書いてみた日記。アセンブラの話題でも、Windowsの話題でもないのでカテゴリ選択が非常に微妙(笑)

02/27

久しぶりにVT勉強してみる気になってきたから、vmxcpuを読んだり弄ったりしはじめている。

02/28

なんどやってもUNEXPECTED_KERNEL_MODE_TRAPで死んでしまう。おかしいと思い、配布されたままのvmxcpuを実行するがやはり同じ。Windows 7で実行させていたのが悪かったのかもしれない(そういえば、Vistaでは動かしていたが、7では動かしていなかった)。Vistaをインストールして検証してみることにする。

03/01

やはりVistaならvmxcpuは動く。原因は分からないが、今はそういうレベルではないので、動かすことが肝要。しかし、vmxcpuもデバッガでアタッチしていると、デバッガに例外が届かないままでデバッギがハングしてしまう。もしかしてVMX oeprationモード中にデバッガへ連絡しようとするとハングするっぽい? 結構厳しいぜ、それ。


再度リファクタリングXenのソースが非常に美しくて参考になるがGPLが鬱陶(ry

03/02

VMMEntryPoint(VMCSの0x00006c16)のコードはレジスタの状態に配慮する必要があるのでかなりアセンブラになってしまうなぁ、と思いXenのソース(このへん)を眺めていると美しいこと美しいこと。

03/03

VMMハンドラではvmresumeやvmoff -> jmpするまえにレジスタを動作のエミュレーション結果に変更しないといけないので、どうしてもアセンブラ色が出てしまうが、Xenのソースを参考にしつつコーディング中。

03/07

よし、元本のvmxcpuと同等の機能性、安定性になった。要するにすべてのコードを咀嚼しながら書き直しているわけで、それがひと段落した感じ。デバッガでの接続も、必ずしもだめというわけでは無さそう。理解を完璧にするために徐々に解説記事を書いていくことにしよう。

03/08

CR0/CR4の読み取り結果を偽造、書き込みを検出できるようにした。ほぼ安定といえる状態になっているので、CPUIDをカーネル空間で1億回まわす(シングルプロセッサかつDISPATCH_LEVELかつ割り込み禁止状態)コードを使って性能のテストなどをしてみたところ、チェックビルドで17倍、フリービルドで13倍もの時間がかかるようになることが分かった。

CPUID x100000000 Sec
Native 12
Emulate Check Build 186
Emulate Free Build 161


OSEEEEEEEE!!! 実用を考えていないので、性能なんて二の次、三の次でどうでもよいのだけど、この数値には結構驚いた。まあでも、どうでもいい。より細部の理解を進めていきたい。

03/11

すでにコードはひと段落しているので、ドキュメントを読んでいる。vmxcpuのテキストドキュメントも和訳している。そういえばなんでPAEが有効だと機能しないようにしているのだろう?

03/14

ドキュメントを読みつつ微修正中。まだ先になるけど、マルチプロセッサ対応も可能そう。以下はメモ。


論理プロセッサ数が1の場合。

アフィニティ(KeSetSystemAffinityThread)
機能しない
IQRLをDPC_LEVELまで上げる
スレッドの切り替えが行われなくなる
CLIする
プロセッサへの割り込みが行われなくなる
Gain Exclusivity
機能しない

論理プロセッサが2以上の場合。

アフィニティ(KeSetSystemAffinityThread)
実行する論理プロセッサを変更・制限
IQRLをDPC_LEVELまで上げる
当該プロセッサでのスレッドの切り替えが行われなくなる
CLIする
当該プロセッサへの割り込みが行われなくなる。時間が長すぎるとCLOCK_WATCHDOG_TIMEOUTで死ぬ
Gain Exclusivity
ほかのすべてのプロセッサをスピンロック


KeSetSystemAffinityThreadを使って変わるのはKeGetCurrentProcessorNumberだったのか。KeQueryActiveProcessorsだと思ってた orz  同期的かつPASSIVE_LEVELでいいならKeSetSystemAffinityThreadを順繰りに実行すればいいだけの話なんだね。

03/16

マルチプロセッサ対応中。なぜか死んでしまうので、じっくり精査が必要か。

03/17

きた マルチプロセッサ対応きた! これでかつる!! というわけで、ロード・アンロードまで含めて動作するようになりました。うれしいので記念にデモの撮影などもしてしまう。むはー。

03/18

ソースにコメントを付けつつ脳みその整理中。vmxcpuと同じようにPAE有効時は使えないようにしてたけど、ためしに動作させてみたら、なにやら動いてしまったぞ? うーん? 確かにマニュアルには、PAEだから何か配慮しないといけない、といった記述は(今のところ)見ていないのだけど、これはどうなんだろう。