***本記事にはプロモーションが含まれています。***
準仮想化クロックについていろいろ調べてみて、Hyper-Vでは何をやっているのだろうと疑問に思いました。
そこで、LinuxのHyper-V用準仮想化クロックのドライバを見てみることにしました。
準仮想化クロックは、ソースコードLinux/arch/x86/kernel/cpu/mshyperv.cで、hyperv_clocksourceという名前で登録されています。
しくみについて簡単にコメントがありました。MSRというCPU内部のレジスタにHV_X64_MSR_TIME_REF_COUNTという名前のレジスタがあります。そのレジスタを読むとパーティションカウンターという数値が読めます。これは、子パーティション(ゲスト)が作られてからのtick countという値です。このcountは、子パーティションが作られたとき0になり、100 nanosecond単位で増加します。
要するに子パーティションができてからの時間が分かります。
これで、ゲスト起動時に時刻が設定されていれば現在時刻を計算することができます。
後はどれくらいの頻度で値が更新され、どれくらいの頻度で見に行くのかですが、Windowsで何をやっているのかですね。
意外にシンプルなことをやっていますね。その分kvm-clockと比べて少し精度は落ちるのかもしれません。起動してからの経過時間を使って時計を正確にしようとしているのは、LinuxとWindowsで似ていて面白かったです。
Hyper-Vについて書かれたKVMの資料
KVM as a Microsoft-compatible hypervisor.
Hyper-Vのインターフェースについて書かれた公式資料
Requirements for implementing the Microsoft Hypervisor interface