An idea of bios emulation on b hy ve

18
軽快なBHyVe @syuu1228

Transcript of An idea of bios emulation on b hy ve

Page 1: An idea of bios emulation on b hy ve

軽快なBHyVe@syuu1228

Page 2: An idea of bios emulation on b hy ve

BHyVeの現状• 独自ローダからFreeBSDカーネルをゲストOSとしてロード&ブート出来るだけ

• BIOS無いからブートローダが動かない!→ディスクイメージから任意のOSを起動出来ない!

Page 3: An idea of bios emulation on b hy ve

BIOSコールの仕組みソフト割込(INT命令)

CPUが割込ベクタを読む

BIOS上のハンドラを実行

IO

ハードウェア

int 13h

Page 4: An idea of bios emulation on b hy ve

KVM上でのBIOSコールソフト割込(INT命令)

CPUが割込ベクタを読む

BIOS上のハンドラを実行

QEMU HW Emulation

IO TrapSeaBIOSがHWへIO

を実行

QEMUが必要なHWエミュレーションを実施HyperVisor

Guest

int 13h

Page 5: An idea of bios emulation on b hy ve

SeaBIOSをBHyVeに載せりゃええやん

• 提案しました

• 却下されました

• GPLだからです

• ( ゚∀゚)o彡゚BSDL! ( ゚∀゚)o彡゚BSDL!

Page 6: An idea of bios emulation on b hy ve

でもBSDLでBIOSコールをエミュレートするソフトはあるよ• doscmdとか(FreeBSD上で動作)

• 仮想8086モードでDOSプログラムを走らせ、BIOSコールやDOS APIなどのソフト割り込みをtrap、エミュレート

• 32bit実装だし移植するならHyperVisor側に入れた方が楽

Page 7: An idea of bios emulation on b hy ve

BIOSコールをHyperVisorでエミュレーションする

ソフト割込(INT命令)

BHyVe BIOS Emulation

割り込み Trap

• ソフト割り込みをTrapしてHyperVisor側でBIOSエミュレーションを実行すればよい?

HyperVisor

Guest

Page 8: An idea of bios emulation on b hy ve

Intel VTでソフト割り込みをTrapすると…

• 全てのソフト割り込みがTrapされる

• 多くのOSがシステムコールにソフト割り込みを使うが、それはゲストOSで処理して欲しいのでTrapしたくない

Page 9: An idea of bios emulation on b hy ve

ソフト割り込みの中からBIOSコールだけを抽出

• CPUのモードがリアルモードか仮想8086モードになった時にソフト割り込みの全Trapを有効化、プロテクトモードになった時に無効化→BIOSエミュレーションとCPUモードのステート管理を行う

• この場合でも、リアルモードを用いるOSではシステムコールでTrapがかかってしまう

•面倒くさそう

Page 10: An idea of bios emulation on b hy ve

ついにこの本を役立てる時が来たか(ゴゴゴゴゴゴ…

Page 11: An idea of bios emulation on b hy ve

軽快なBIOSコールエミュレーションの提案

ソフト割込(INT命令)

CPUが割込ベクタを読む

擬似BIOS上のハンドラを実行

BHyVe BIOS Emulation

VMCALL Trap

擬似BIOSがVMCALL命令を発行(ハイパーコール)

BHyVeが必要なBIOSコールエミュレーションを実施HyperVisor

Guest

Page 12: An idea of bios emulation on b hy ve

擬似BIOS上のハンドラ実行イメージ

push dx /* dxを退避 */

 push cx /* cxを退避 */

 xor dx, dx /* dx = 0 (0番のvmcallはBIOSコール) */

 mov cx, 13h /* cx = 13h (int 13hである事を通知) */

 vmcall /* HyperVisorへVMExit、BIOSエミュレーション */

 pop cx /* cxを復帰 */

 pop dx /* dxを復帰 */

 iret /* 割り込みから復帰 */

Page 13: An idea of bios emulation on b hy ve

軽快なBIOSコールエミュレーションでは…

• 意図しないTrapを発生させない

• 発生させない為に努力をする必要もない

• シンプル

Page 14: An idea of bios emulation on b hy ve

まとめ• VM床ぶち抜き術はこんなところでも使えて非常に有用な技術です

• あなたのお持ちのVT対応パソコンも早く床をぶち抜きたくてうずうずしています、期待に応えてあげましょう

• Google Summer of Code 2012 proposal:http://bit.ly/bhyvebios

Page 15: An idea of bios emulation on b hy ve
Page 16: An idea of bios emulation on b hy ve

何でBIOS無いとブートローダ動かんの

• GRUBの例

/*

* BIOS call "INT 0x13 Function 0x42" to read sectors from disk into memory

* Call with %ah = 0x42

* %dl = drive number

* %ds:%si = segment:offset of disk address packet

* Return:

* %al = 0x0 on success; err code on failure

*/

movb $0x42, %ah

int $0x13

  ↑BIOSコール(ソフトウェア割り込みにより実現)

Page 17: An idea of bios emulation on b hy ve

BIOSコールの仕組み

①割込ハンドラのアドレスを取得

②割込ベクタが指してるアドレスへジャンプ!

割り込みベクタ

lowmem

VGAとか色々

ROM BIOS

highmem

0000:0000

0000:0400

A000:0000

F000:0000FFFF:0000FFFF:000F

③IO命令でHWへアクセス

Page 18: An idea of bios emulation on b hy ve

KVM上でのBIOSコール

①割込ハンドラのアドレスを取得 割り込みベクタ

lowmem

VGAとか色々

SeaBIOS

highmem

0000:0000

0000:0400

A000:0000

F000:0000FFFF:0000FFFF:000F

③IO命令をKVMでtrap、QEMUでエミュレーション

②割込ベクタが指してるアドレスへジャンプ!