ドメインのスケジューリング【後編】:仮想マシンモニタ Xen 3.0解読室(1/3 ページ)
引き続き、ドメインのスケジューリングの仕組みを見ていきます。今回は、Xen上のゲストOSとして動作するLinuxカーネルでは、プロセス切り替えをどのように実現しているのかを解説します。
ゲストOSとしてのLinuxカーネル
Xenの準仮想化ドメインで動作するLinuxカーネルは、Xenと協調動作します。Linuxカーネルは、自身のコンテキスト操作を行うときハイパーバイザー呼び出しでXenに処理を依頼します。また、Linuxカーネルがアイドル状態になったときは、実行権の放棄をハイパーバイザー呼び出しでXenに伝えます。
Linuxプロセスのコンテキスト切り替え
ドメイン内のゲストOSとして、Linuxカーネルが動作可能です。Linuxカーネルは、その上で動作する複数のプロセスを切り替えながら実行しますが、ネイティブのLinuxカーネルでは、CPUを直接操作してプロセスのコンテキストを切り替えています。では、Xen上のゲストOSとして動作するLinuxカーネルでは、プロセス切り替えをどのように実現しているのでしょうか?
Xenの仮想マシン内で動作するゲストOSがプロセスの切り替えを実現するためには、仮想CPU上のコンテキストを入れ替える必要があります。ゲストOSとして動作するLinuxカーネルでは、ハイパーバイザー呼び出しを通して、Xenにこの切り替え処理を依頼します。
ゲストOSとして動作するLinuxカーネルは、ネイティブなLinuxカーネルと同様、switch_to関数(リスト1)で浮動小数点演算レジスタ、カーネルスタック、I/Oポートへのアクセス権などを切り替えます。各処理は次のようになります。
- 浮動小数点レジスタの遅延切り替えの依頼(B1)
- カーネルスタックの切り替え(B2)。システムコール発行時、(仮想)割り込み発生時に利用するカーネルスタックの底を設定する
- スレッドごとの固有データ(Thread-Local Storage)にアクセスするため、ディスクリプタを切り替える(B3)
- I/Oポートへのアクセス権の設定(B4、B5)
- ハイパーバイザー呼び出し(B6)。複数の処理依頼をまとめて呼び出すためのマルチコールと呼ばれる仕組みを利用している。ここでは、B1〜B5の処理を1つにまとめて、Xenに対するハイパーバイザー呼び出しとしている
- セグメントレジスタの切り替え(B7)
- デバッグレジスタの切り替え(B8)。現在の実装では、一つ一つがハイパーバイザー呼び出しとなっている
また、仮想空間の管理情報はswitch_mm関数で切り替えます。この情報はXenの管理下にあり、プロセス空間の操作であってもXenに操作を依頼する必要があります(図1)。これらについては、メモリ管理の回に詳しく説明します。
Copyright © ITmedia, Inc. All Rights Reserved.