[BitVisor-devel:115] Re: BitVisor上のWindows 10がブルースクリーンを発生させる

Hideki EIRAKU hdk @ igel.co.jp
2018年 4月 26日 (木) 11:11:46 JST


イーゲル 榮樂です。こんにちは。

From: Satoru Takekoshi <satorut @ osss.cs.tsukuba.ac.jp>
Subject: [BitVisor-devel:89] BitVisor上のWindows 10がブルースクリーンを発生させる
Date: Mon, 31 Oct 2016 10:24:03 +0900

> 筑波大学の竹腰です。
> 
> BitVisor上でWindows
> 10を動作させると、作業中に突然ブルースクリーン(BSoD)が発生する事象を私の手元環境で確認しました。相当時間調査したものの、原因の特定には至っていません。現時点で分かった事や回避策を共有します。

報告を頂いてから 1 年半が経ってしまいましたが、本件について再現ができ
るようになり、一応の修正ができました。

https://bitbucket.org/bitvisor/bitvisor/commits/aa1ae304e7053ddca713e499acb97fbf5b644f57

最近の (Haswell 以降?) Intel プロセッサには IA32_TSC_ADJUST MSR という
TSC 補正用の MSR が追加されています。この MSR は、TSC が変更された時に
TSC をどれだけ増減させたか、内部に持っている基準となる TSC との差分を
保持するようです。Windows は TSC を 0 にしてからこの MSR をどうにかし
て (詳しいアルゴリズムはわかりませんが) 全コアの TSC を揃えようとする
ようです。今回の修正はこの MSR の読み書きをフックして処理するようにす
るものです。

問題だったのは、BitVisor が TSC の変更は追跡しているにも関わらず、この
MSR をパススルーにしてしまっていたために、ゲストオペレーティングシステ
ムから見ると、TSC を変更してもこの MSR は変わらない、かつ、この MSR を
変更すると TSC は変わるという、全く正しくない動作になっていたことのよ
うです。また、BitVisor としても、vmm.ignore_tsc_invariant=0 の場合
Invariant TSC 対応であれば TSC を元にした時刻情報を使うようになってい
ますので、この MSR で TSC が変化すると、時刻情報が飛ぶといった問題が発
生していたと考えられます。実際の TSC を BitVisor 側で見ていると、
Windows 起動時に、BSP 以外の TSC が突然 2 倍になるという風に見えていま
した。

ゲストオペレーティングシステム側でこれによる問題がどのように起きていた
のかは特定できていないのですが (簡単に確認したところ TSC は各コア間で
揃っているようには見えていました)、UEFI 環境で BitVisor を起動する前に
1, 2 分程度の時間をおいた時に特に再現しやすいようです。また、回避策は、

> === 回避策 ===
> 1. BIOS設定でC statesを全て無効にする。
> 2. BIOS設定でコア数を1つにする(物理1コア, HTT無効)。
> 3. RDTSCでVMexitさせる(exitしてきたら単純にVMM内でrdtscした値を返す)。
> 4. ゲストに見せるCPUIDの返り値からInvariant TSC bitを落とす。
> 5. ゲストに見せるCPUIDの返り値にHypervisor present bitを立てる。

2 はシングルプロセッサ環境になるので TSC を揃える必要がなくなりますし、
4 は TSC がクロック周波数等で変動する扱いになるので TSC を揃える意味が
なくなります。その他、useplatformclock という Windows の起動パラメーター
を true に設定することによっても回避できるようです。

-- 
Hideki EIRAKU <hdk @ igel.co.jp>


BitVisor-devel メーリングリストの案内