LWNのKVM/ARMの記事の簡単なまとめ
LWNにSupporting KVM on the ARM architectureという記事が公開されていたので、ざっくりとまとめてみました。著者の一人はChristoffer DallというKVM/ARMの開発者の方です。
※書き終わってから、記事はまだ無料公開されているわけではないことを思い出したので、前半だけ公開することにします。もし続きが気になる方はLWNを購読してください(宣伝)。 どうやら無料公開されたようなのでこちらも全文公開します。もちろん正しい情報を得たい方はLWNの記事をご参照ください。
注意:私はあまりARMアーキテクチャは詳しくないので、解釈が間違っているかもしれません。
HYPモード
アドレス変換
- EPTのように、ゲスト物理→ホスト物理変換(ステージ2変換)のテーブルを追加
KVM/ARMの設計
動作概要
ブート
- ブートローダは常に(CPUが対応していれば)HYPモードでカーネルを起動する
- HYP対応カーネルの場合、KVM/ARM等のために小さなスタブハンドラを仕込む
- HYP対応でない場合でも、明示的にSVCモードに移行しているので問題ない
- そういえば確かにそんなコードがあったような
- カーネルが圧縮されている場合
- スタブの役割
- HYPモード用の割り込みベクタ
- ゲストからHYPモードへ戻ってきた時も、ホストでHVCを呼んでHYPモードへトラップした時も同じハンドラを実行する
- ステージ2ページテーブルレジスタのVMIDフィールドを見て、ゲスト(VMID>0)かホスト(VMID==0)を判断する
仮想GICとタイマ
- 古いARMではタイマへのアクセスはMMIOで単に(qemuで)エミュレーションするだけだと、とても遅い
- ホストカーネルでエミュレーションしてもまだ遅い
- ARMv7(の仮想化拡張では?)仮想/物理カウンタと仮想/物理タイマが導入された
- 仮想カウンタ/タイマはどのモードでもアクセス可能
- 物理カウンタ/タイマはHYPモードでのみアクセス可能
- なので、仮想カウンタ/タイマを使う限りにおいてはHYPモードへトラップしない
- 疑問: 仮想カウンタ/タイマを使うようにゲストカーネルを書き換えないといけない?それとも仮想という名前がついているけど、実際はゲストは気にしなくても良いもの?
- GICにはdistributorという機能があり、割り込みのマスクや割り込みの優先度設定や割り込みのアフィニティ等を制御する機能をもつ
- 通常のGICでは、割り込み後のGICへのackやEOI毎にHYPモードへトラップするためオーバヘッドが生じる
- VGICはトラップすることなく仮想割り込みへのackやEOIを可能とする
- またKVM/ARM(HYPモード?)でしかアクセスできない仮想制御インタフェースが追加され、仮想割り込みを発生させるときに使われる
- distributorへアクセスする頻度はそれほど高くないため、仮想distributorは提供されていない
- KVM/ARMはホストカーネル内でGICエミュレーションを行なう
- ハードウェア割り込みが発生した場合は常にHYPモードへトラップし、ホストの割り込みハンドラが割り込みを処理する
- VGICも仮想タイマも、物理割り込みを仮想割り込みとしてVMへ割り込みをかけることはできない
- そのため、VMのタイマ割り込みはホストがハンドルしてKVM/ARMが仮想割り込みとしてゲストに割り込みをかける