Xenが仮想マシン環境を実現するために行っていることの全体を眺めてみましょう
Xenの内部設計 |
Xenが仮想マシン環境を実現するために行っていることの全体を眺めてみましょう。一つ一つの機能については、今後の連載で詳細に説明していきます。今回は、Xenがどのような設計になっているか、全体をイメージできれば十分だと思います。
Xenの環境では、それぞれのドメインに1つの仮想空間を割り当てています*(多重仮想空間)。x86(IA-32)用Xenでは、仮想空間の上位アドレスの64MバイトはXenが予約しており、ゲストOSが利用できるのは、残りの4Gバイトから64Mバイトを除いた空間です。Xen本体は仮想空間の最上位アドレスに存在し、ゲストOS空間の最上位アドレスには、ゲストOS依存のデータを配置します。物理アドレスとマシンアドレスの対応表もこの領域に配置され、必要に応じてゲストOSから参照します(図5)。
IA-32アーキテクチャーでは、リングプロテクション機能を利用して保護するのが一般的です。IA-32アーキテクチャーの実ハードウェア上でOSが動作している場合、OSを特権レベル0(リング0)に配置し、アプリケーションを特権レベル1〜3(Linuxではレベル3)に配置することで、アプリケーションの動作からOSを保護しています(図6)。
アプリケーションがリングの壁を超えてOSの機能を呼び出すための仕掛けとして、システムコールを用意しています。
Xen環境では、Xenが存在する領域を、ゲストOSから壊されないようにする必要があります。IA-32用Xenでは、Xenを特権レベル0に配置し、準仮想化ドメインのゲストOSを特権レベル1に配置します(図7)。アプリケーションは、特権レベル2または3に配置しなければなりません。
ゲストOSがLinuxの場合、アプリケーションはレベル3に置きます。アプリケーションがOSを呼び出すときには、システムコールという仕掛けを利用します。同様に、ゲストOSがXenを呼び出したいときには、ハイパーバイザコールを利用します。また、例外を利用してゲストOSの動きを捕捉し、特権レベル0のXenがゲストOSから実行権を奪い取ることもあります。
完全仮想化ドメインの場合は、XenもゲストOSのどちらも、特権レベル0に配置します。ただし、VT機能を利用してXenをVMX rootオペレーションモードの領域に配置し、ゲストOSのあるドメインをVMX non-rootオペレーションモードの領域に配置します(図8)。
ゲストOSからXenを呼び出すのは、VM exitが発生する命令*を実行したときになります。
Xen上では複数のドメインが同時に動作します。しかしこれは見かけ上そう見えるというだけで、実際にはそれぞれのドメインに対してCPUの実行権を細かく振り分けるということをXenが行っています。
このためにXenでは、仮想CPUというものを定義しています。Xenにおける仮想CPUは実行の単位であり、ゲストOSの要求に応じて各ドメインに幾つかの仮想CPUが割り当てられます。仮想CPUは、ドメイン上のゲストOSから見ると実CPUのように見えます。
Xenは仮想CPUの実CPUへの割り当てを制御しますが、この仕事を行う機能はドメインスケジューラと呼ばれています。ドメインスケジューラは、いつ、どの仮想CPUに、どれだけの実行時間を与えるかを制御するものです。ある一瞬を見ると、実CPUはある特定の仮想CPUにアタッチされています(図9)。
実はこの仕組みは、プロセスとスレッド*の関係に似ています。マルチスレッドプログラミングを利用する場合、1つのプロセス中で複数のスレッドが並列動作することになります。UNIX/Linuxは、スレッドをスケジューリングして、実行するのに最もふさわしいスレッドにCPUの使用権を与えます*。
ドメインスケジューラには、sedfとbvtという2種類のスケジューリングポリシーが用意されていて、Xen起動時に選択できるようになっています。sedfは、Simple Early Deadline First schedulerの略で、bvdは、Borrowed VirtualTimer schedulerの略です。どちらも、リアルタイムスケジューリングがベースとなっていて、標準スケジューラはsedfです。
sedfは、一定期間ごとに一定のCPU時間をドメインに割り当てるアルゴリズムになっています。ドメインスケジューラが再スケジューリングを行うと、仮想CPUの切り替えが発生します。仮想CPUの切り替えが発生すると、現在動作している仮想CPUのコンテキストを待避させ、次に動作すべき仮想CPUのコンテキストを読み込みます。これは、プロセス(スレッド)と似た処理といえるでしょう。
もちろん各ドメインのゲストOSは、プロセスやタスクのために、そのドメイン内にさらに複数の仮想空間を作りあげる。
通常の命令であり、ゲストOSからは、直接CPUを制御しているか、Xenの呼び出しになっているかの区別はできない。
書籍「Linux 2.6カーネル解読室」の「Part2 プロセス管理」参照。
書籍「Linux 2.6カーネル解読室」の「Part1 カーネルプリミティブ」内「第1章 プロセススケジューリング」参照。
Copyright © ITmedia, Inc. All Rights Reserved.