φ(・・*)ゞ ウーン jailhouseのコードを読んでみるの1

まあ、なんとなく。。。

見ているコードはgitのこのコミットで。

jailhouseのツールとしての構成としては以下のようになっているようです。

  • カーネルモジュールのjailhouse.ko
  • ↑が読み込むファームウェアのjailhouse.bin
  • ユーザーランドのツールのjailhouse

ソースコードのルートディレクトリでmakeするとjailhouse.ko、jailhouse.bin、その他諸々(デモ用のバイナリ)が作られ、jailhouseコマンドについては別途tools/に移動してからmakeして作る形になってます。

jailhouseが対応しているアーキテクチャは現状x86_64だけみたいです。x86_64といってもさらに以下のような要求があります。

  • 64bit対応してるx86 cpu
  • EPT
  • VMX
  • 最低2個の論理cpu

ソースコードのディレクトリにはarmのディレクトリもありますが。。。

さて、jailhouse.koはアーキテクチャ非依存部分の処理を実行してアーキテクチャ固有部分はjailhouse.binにまとめられて、そちらのコードを実行するようになってます。ざっくりと見た感じではarch_XXXXとなっているものはjailhouse.binにあるっぽい。例えば、hypervisor/setup.cのcpu_init()からarch_cpu_init()を呼び出し、これはx86ならhypervisor/arch/x86/setup.cにあるみたいな。

カーネルモジュールの操作はioctl経由で行います。モジュールが使用できるオペレーションは4個あります。

  • jailhouseのenable(jailhouse_enable)
  • jailhouseのdisable(jailhouse_disable)
  • cellの作成(jailhouse_cell_create)
  • cellの削除(現状は-ENOSYSを返すだけから実質何もしていない)

ここで言っているcellは単純に言ってしまうと仮想環境のインスタンスですかね。KVM Forum 2013の資料のp13に図あります。

jailhouseで仮想環境を実行する場合はenableしてからcreateとREADMEに書かれているのでjailhouse_enable() -> jailhouse_cell_create()の順番で使う流れです。
そして、仮想cpuとかメモリ周りの設定はjailhouse_enable()から行っています。(´-`).。oO(今度はコードを読み進めていこう

P.S.
ファームウェアのjailhouse.binを読み込むのはjailhouse_enable()でやっていますが、このファイルの読み込みに使うrequest_firmware()に関しては先日書いた「φ(.. )メモシテオコウ Linux:firmwareの読み込み処理めも」に書きました。