Mais conteúdo relacionado Semelhante a An idea of bios emulation on b hy ve (20) Mais de Takuya ASADA (20) An idea of bios emulation on b hy ve4. KVM上でのBIOSコール
int 13h ソフト割込(INT命令)
CPUが割込ベクタを読む
BIOS上のハンドラを実行
SeaBIOSがHWへIO
IO Trap
を実行
QEMU HW
Guest Emulation
QEMUが必要なHWエ
HyperVisor ミュレーションを実施
5. SeaBIOSをBHyVeに
載せりゃええやん
• 提案しました
• 却下されました
• GPLだからです
• ( ゚∀゚)o彡゚BSDL! ( ゚∀゚)o彡゚BSDL!
7. BIOSコールをHyperVisorで
エミュレーションする
Guest ソフト割込(INT命令)
割り込み Trap
HyperVisor BHyVe BIOS Emulation
• ソフト割り込みをTrapしてHyperVisor側
でBIOSエミュレーションを実行すれば
よい?
8. Intel VTでソフト割り込みを
Trapすると…
• 全てのソフト割り込みがTrapされる
• 多くのOSがシステムコールにソフト割
り込みを使うが、それはゲストOSで処
理して欲しいのでTrapしたくない
9. ソフト割り込みの中から
BIOSコールだけを抽出
• CPUのモードがリアルモードか仮想8086モードになっ
た時にソフト割り込みの全Trapを有効化、プロテクト
モードになった時に無効化
→BIOSエミュレーションとCPUモードのステート管理
を行う
• この場合でも、リアルモードを用いるOSではシステム
コールでTrapがかかってしまう
• 面倒くさそう
11. 軽快なBIOSコール
エミュレーションの提案
ソフト割込(INT命令)
CPUが割込ベクタを読む
擬似BIOS上のハンドラを実行
擬似BIOSが
VMCALL命令を発行 VMCALL Trap
(ハイパーコール)
BHyVe BIOS
Guest Emulation
BHyVeが必要なBIOSコールエ
HyperVisor ミュレーションを実施
12. 擬似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 /* 割り込みから復帰 */
14. まとめ
• VM床ぶち抜き術はこんなところでも使えて
非常に有用な技術です
• あなたのお持ちのVT対応パソコンも早く床
をぶち抜きたくてうずうずしています、期待
に応えてあげましょう
• Google Summer of Code 2012 proposal:
http://bit.ly/bhyvebios
16. 何で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コール(ソフトウェア割り込みにより実現)
17. BIOSコールの仕組み
③IO命令でHWへアクセス
highmem
FFFF:000F
ROM BIOS FFFF:0000
F000:0000
②割込ベクタが指してるアドレス VGAとか色々
へジャンプ! A000:0000
lowmem
0000:0400
①割込ハンドラのアドレスを取得 割り込みベクタ
0000:0000
18. KVM上でのBIOSコール
③IO命令をKVMでtrap、
QEMUでエミュレーション
highmem
FFFF:000F
SeaBIOS FFFF:0000
F000:0000
②割込ベクタが指してるアドレス VGAとか色々
へジャンプ! A000:0000
lowmem
0000:0400
①割込ハンドラのアドレスを取得 割り込みベクタ
0000:0000
Notas do Editor \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n