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 へジャンプ