まあ、なんとなく。。。
見ているコードは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の読み込み処理めも」に書きました。