Lguest メモ
Linux に実装されている Lguest の簡単な調査
対象 Linux バージョン: v3.9-rc4-247-g46a1f21 46a1f21a679abaaeae6db9969963dc998c9f1c1c
ハイパーバイザーコール
arch/x86/include/asm/lguest_hcall.h に定義あり
呼び出しには割り込み番号 LGUEST_TRAP_ENTRY (0x1F) のソフトウェア割り込みを使用
drivers/lguest/hypercalls.c に呼び出される側の実装、do_hypercalls を経て、do_hcall が実際の処理
drivers/lguest/core.c の run_guest において cpu->hcall を見て do_hypercalls の呼び出し
run_guest は drivers/lguest/x86/core.c の lguest_arch_handle_trap も呼び出しており、ここで LGUEST_TRAP_ENTRY の時は cpu->hcall に情報の書き込み
切り替え処理
drivers/lguest/x86/core.c の lguest_arch_run_guest が run_guest_once を呼び出し
run_guest_once は *lguest_entry を lcall で呼び出し
ゲスト側起動時の処理
arch/x86/lguest/boot.c
lguest_init で、pv_cpu_ops の設定など
pv_cpu_ops によって呼び出される関数の実装
arch/x86/lguest/i386_head.S
arch/x86/kernel/head_32.S の中で、boot_params に含まれる hardware_subarch (Lguest では 1) を元に、lguest_entry へジャンプ
lguest_entry では、ハイパーバイザーコールでページテーブルなどを初期設定して lguest_init へジャンプ