An idea of bios emulation on b hy ve
-
Upload
takuya-asada -
Category
Documents
-
view
822 -
download
0
Transcript of An idea of bios emulation on b hy ve
軽快なBHyVe@syuu1228
BHyVeの現状• 独自ローダからFreeBSDカーネルをゲストOSとしてロード&ブート出来るだけ
• BIOS無いからブートローダが動かない!→ディスクイメージから任意のOSを起動出来ない!
BIOSコールの仕組みソフト割込(INT命令)
CPUが割込ベクタを読む
BIOS上のハンドラを実行
IO
ハードウェア
int 13h
KVM上でのBIOSコールソフト割込(INT命令)
CPUが割込ベクタを読む
BIOS上のハンドラを実行
QEMU HW Emulation
IO TrapSeaBIOSがHWへIO
を実行
QEMUが必要なHWエミュレーションを実施HyperVisor
Guest
int 13h
SeaBIOSをBHyVeに載せりゃええやん
• 提案しました
• 却下されました
• GPLだからです
• ( ゚∀゚)o彡゚BSDL! ( ゚∀゚)o彡゚BSDL!
でもBSDLでBIOSコールをエミュレートするソフトはあるよ• doscmdとか(FreeBSD上で動作)
• 仮想8086モードでDOSプログラムを走らせ、BIOSコールやDOS APIなどのソフト割り込みをtrap、エミュレート
• 32bit実装だし移植するならHyperVisor側に入れた方が楽
BIOSコールをHyperVisorでエミュレーションする
ソフト割込(INT命令)
BHyVe BIOS Emulation
割り込み Trap
• ソフト割り込みをTrapしてHyperVisor側でBIOSエミュレーションを実行すればよい?
HyperVisor
Guest
Intel VTでソフト割り込みをTrapすると…
• 全てのソフト割り込みがTrapされる
• 多くのOSがシステムコールにソフト割り込みを使うが、それはゲストOSで処理して欲しいのでTrapしたくない
ソフト割り込みの中からBIOSコールだけを抽出
• CPUのモードがリアルモードか仮想8086モードになった時にソフト割り込みの全Trapを有効化、プロテクトモードになった時に無効化→BIOSエミュレーションとCPUモードのステート管理を行う
• この場合でも、リアルモードを用いるOSではシステムコールでTrapがかかってしまう
•面倒くさそう
ついにこの本を役立てる時が来たか(ゴゴゴゴゴゴ…
軽快なBIOSコールエミュレーションの提案
ソフト割込(INT命令)
CPUが割込ベクタを読む
擬似BIOS上のハンドラを実行
BHyVe BIOS Emulation
VMCALL Trap
擬似BIOSがVMCALL命令を発行(ハイパーコール)
BHyVeが必要なBIOSコールエミュレーションを実施HyperVisor
Guest
擬似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 /* 割り込みから復帰 */
軽快なBIOSコールエミュレーションでは…
• 意図しないTrapを発生させない
• 発生させない為に努力をする必要もない
• シンプル
まとめ• VM床ぶち抜き術はこんなところでも使えて非常に有用な技術です
• あなたのお持ちのVT対応パソコンも早く床をぶち抜きたくてうずうずしています、期待に応えてあげましょう
• Google Summer of Code 2012 proposal:http://bit.ly/bhyvebios
何で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コール(ソフトウェア割り込みにより実現)
BIOSコールの仕組み
①割込ハンドラのアドレスを取得
②割込ベクタが指してるアドレスへジャンプ!
割り込みベクタ
lowmem
VGAとか色々
ROM BIOS
highmem
0000:0000
0000:0400
A000:0000
F000:0000FFFF:0000FFFF:000F
③IO命令でHWへアクセス
KVM上でのBIOSコール
①割込ハンドラのアドレスを取得 割り込みベクタ
lowmem
VGAとか色々
SeaBIOS
highmem
0000:0000
0000:0400
A000:0000
F000:0000FFFF:0000FFFF:000F
③IO命令をKVMでtrap、QEMUでエミュレーション
②割込ベクタが指してるアドレスへジャンプ!