1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BitVisorAdvent Calendar 2015

Day 12

BitVisorにVMMCALLを追加する

Posted at

はじめに

BitVisor にVMMCALLを追加する方法を説明します.
本日はオーストリアよりBitVisor 情報をお届けなので,ソースコードの動作確認などできてません.
それなのに関数名を手で直したりしてるので,多分どこか動かない部分があると思います.
でもまぁ,だいたいの感じはつかんでもらえるかと思います.

VMMCALL って 何?

VMMCALL というのは,ゲストOSからVMMに機能を呼び出す機構です.
ゲストOSはvmmcall というCPU命令を発行することでVMMの機能を呼び出せます.
構造としては,アプリケーションレイヤからシステムコールを呼び出すのに似ています.

ゲストOSからVMM内の情報を取得したり,何か指示を出すのに有用な機能です.
BitVisor では,dbgsh(デバッグ用のシェル)などが,VMMCALLを用いて実現されています.

VMMCALL を追加する方法

core/vmmcall_hello.c ってな感じのファイルを追加しましょう.
中身は以下のような感じで.

core/vmmcall_hello.c
static void
hello(void)
{
  ulong rbx;
  ulong ret = 10;

  /*引数の受け取り*/
  current->vmctl.read_general_reg (GENERAL_REG_RBX, &rbx);

  printf("Hello BitVisor!, arg1 = %d\n", rbx);

  /*戻り値の格納*/
  current->vmctl.write_general_reg (GENERAL_REG_RAX, (ulong)ret);
}

/* 関数の登録 */

static void
vmmcall_hello_init(void)
{
  vmmcall_register("hello", hello);
}
INITFUNC ("vmmcal0", vmmcall_hello_init);

VMMCALL を呼び出す方法.

Makefile やらなんやら必要で,一から全部書くのは面倒なので,BitVisor 内ですでに定義しているVMMCALLをコピペして中を変えて,新しいVMMCALLを足してみましょう.
というわけで,VMMCALL をつかっているdbgshを拝借しましょう.

以下の準備はゲストOS上で行います.

まず,tools/dbgsh をコピー

cd ~/bitvisor/tool/
cp -r dbgsh hello

ファイル名の変更

cd hello
mv dbgsh.c hello.c

Makefile の変更
Makefile 内のdbgshをhelloに置換(sedとかM-%とかで)

windows 用のバイナリが不要な場合は以下を削除(この作業は要らないかも)
先頭3行
all: 行の my_vmmcall.exe
my_vmmcall.exe : の行とその次の行すべて

呼び出し側のコードのプログラムを以下のように書き換えます.

tools/hello/hello.c
static void
vmmcall_hello (int arg)
{
call_vmm_function_t f; /*vmm call に関する情報を格納*/
call_vmm_arg_t a; /*vmm call に渡す引数を格納*/
call_vmm_ret_t r; /*vmm call の戻り値を格納*/

CALL_VMM_GET_FUNCTION ("hello", &f); /*vmm call の名前から関数に関する情報を取得*/
/*エラー処理*/
if (!call_vmm_function_callable (&f)) {
	fprintf (stderr, "vmmcall \"hello\" failed\n");
	exit (1);
}
a.rbx = (long)c;                     /*引数を設定*/
call_vmm_call_function (&f, &a, &r); /*vmm call 呼び出し*/
return (int)r.rax;                   /*戻り値の取得*/

で,ビルドして動かしてみましょう.

$ make

BitVisor が動いてる状態で

$ ./hello

ってやれば動く(はず(はず))

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?