(57)【要約】【課題】入出力デバイスが異常状態の場合に不測のエラーが発生することを抑制する。【解決手段】入出力デバイスが接続可能な入出力部と、入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、基盤ソフトウエアを介して個別プログラムを実行する実行部と、実行部が基盤ソフトウエア及び個別プログラムを実行することにより、監視対象入出力デバイスの第１の領域へのアクセスを検出した場合、監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、第２の領域から読み出した値が異常値であることを検出する判定部と、を有する情報処理装置。【選択図】図３
2016197360.tif 000002
【特許請求の範囲】
【請求項１】
入出力デバイスが接続可能な入出力部と、
前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、
基盤ソフトウエアを介して個別プログラムを実行する実行部と、
前記実行部が前記基盤ソフトウエア及び前記個別プログラムを実行することにより、前記監視対象入出力デバイスの第１の領域へのアクセスを検出した場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であることを検出する判定部と、を有する情報処理装置。
【請求項２】
個別プログラムは、前記入出力デバイスにアクセスする第１のプログラムを有し、
前記判定部は、前記第２の領域から読み出した値が異常値である場合、前記第１の領域へのアクセスを抑止する、
請求項１に記載の情報処理装置。
【請求項３】
前記基盤ソフトウエアは、オペレーティングシステムと仮想マシンを生成するハイパバイザを有し、
前記個別プログラムは、前記仮想マシンが実行し、前記入出デバイスにアクセスする第１のプログラムを有し、
前記実行部が、前記基盤ソフトウエアと前記個別プログラムを実行することにより、前記仮想マシンを生成し、
前記判定部は、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスした場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止する、
請求項１に記載の情報処理装置。
【請求項４】
前記ハイパバイザは、前記監視対象入出力デバイスの識別情報を有し、
前記実行部が、前記ハイパバイザを実行することにより、
前記仮想マシンを起動した時の前記入出力デバイスの初期化処理に応答して、前記監視対象入出力デバイスの前記第１の領域の情報を前記情報保持部に登録する、
請求項３に記載の情報処理装置。
【請求項５】
前記監視対象入出力デバイスの第１の領域の情報は、前記仮想マシンの前記監視対象入出力デバイスに対する入出力ポート番号と、前記仮想マシンが扱う第１の物理ページと前記オペレーティングシステムが扱う第２の物理ページとの変換テーブルとを有する、
請求項４に記載の情報処理装置。
【請求項６】
前記実行部は、前記変換テーブルを参照して、前記監視対象入出力デバイスの第１の領域に対応する前記第１の物理ページから前記第２の物理ページに変換する場合、前記監視対象入出力デバイスの第１の領域へのアクセスを検出する、
請求項５に記載の情報処理装置。
【請求項７】
前記実行部は、前記仮想マシンが前記入出力デバイスへのアクセス命令を実行したことに応答して前記ハイパバイザを実行し、前記ハイパバイザの実行により、前記アクセス命令の入出力ポート番号が、前記第１の領域の情報に含まれる前記監視対象入出力デバイスに対する入出力ポート番号と一致することを検出した場合、前記監視対象入出力デバイスの第１の領域へのアクセスを検出する、
請求項５に記載の情報処理装置。
【請求項８】
前記実行部は、前記第２の領域から読み出した値が前記異常値でない場合、前記第１の領域から読み出した値を前記仮想マシンの記憶部に記憶する、
請求項３に記載の情報処理装置。
【請求項９】
前記基盤ソフトウエアは、オペレーティングシステムと仮想マシンを生成するハイパバイザを有し、
前記個別プログラムは、前記仮想マシンが実行し、前記入出デバイスにアクセスする第１のプログラムを有し、
前記実行部が、前記基盤ソフトウエアと前記個別プログラムを実行することにより、前記仮想マシンを生成し、
前記判定部は、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスした場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記異常値以外の値を前記仮想マシンに応答する、
請求項１に記載の情報処理装置。
【請求項１０】
入出力デバイスが接続可能な入出力部と、前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、個別プログラムを実行する実行部とを有する情報処理装置の制御処理を、前記情報処理装置に実行させる制御プログラムであって、
前記制御処理は、
前記監視対象入出力デバイスの第１の領域へのアクセスが検出された場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であるか否かを判定すること
を有する情報処理装置の制御プログラム。
【請求項１１】
前記制御処理は、さらに、
仮想マシンを生成し、
前記判定することは、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスしたことが検出された場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域の値にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止することを有する、
請求項１０に記載の情報処理装置の制御プログラム。
【請求項１２】
入出力デバイスが接続可能な入出力部と、前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、基盤ソフトウエアを介して個別プログラムを実行する実行部とを有する情報処理装置の制御方法であって、
前記監視対象入出力デバイスの第１の領域へのアクセスが検出された場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であるか否かを判定すること
を有する情報処理装置の制御方法。
【請求項１３】
さらに、
仮想マシンを生成し、
前記判定することは、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスしたことが検出された場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域の値にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止することを有する、
請求項１２に記載の情報処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，情報処理装置、情報処理装置の制御プログラム及び情報処理装置の制御方法に関する。
【背景技術】
【０００２】
情報処理装置は、CPU（Central Processing Unit）とメモリを有し、CPUがメモリ内のプログラムの命令を実行することで、プログラムの機能を実現する。さらに、情報処理装置は、I/O（Input Output）バスを有し、I/OバスにI/Oバスブリッジ（または入出力部、I/Oスイッチ、I/Oインターフェース）を介して様々なI/Oデバイス（または周辺デバイス）、例えばハードディスク、フラッシュメモリなどの周辺機器（Peripheral Component）、を接続する。また、情報処理装置は、I/Oデバイスを駆動するデバイスドライバをOS内に有し、CPUはOS内のデバイスドライバを介してデバイスにアクセスする。
【０００３】
I/Oバスブリッジに接続されているI/Oデバイスが故障したり活性状態で抜き取られると、切断検出イベントなどの回復不能エラーイベントが発生し、I/OバスブリッジからCPUにそのエラーイベントが伝搬し、システムダウンを招く場合がある。
【０００４】
そのようなエラーによるシステムダウンを回避するために、PCI Express (PCIe：Peripheral Component Interconnect express)の追加仕様として、ダウンポートコンテインメント（DPC：Downstream  Port  Containment、以下DPCと称する。）が採用されている。このDPC機能を搭載したバスブリッジは、バスブリッジのポートで発生したエラーイベントがCPUなどの上流側に伝わらないように閉じこめて、エラーによるシステムダウンを防止し、システムの継続動作を可能にする。これにより、バスの信頼性を高める。
【０００５】
一方、アプリケーションプログラムは、OSのデバイスオブジェクトなどのインターフェースにアクセスし、OS内のデバイスドライバを介してバススイッチに接続されたI/Oデバイスにアクセスする。この場合、例えば、I/Oデバイスがバススイッチから引き抜かれるなどI/Oデバイスに異常が発生すると、OS割込が発生し、OSは上記のデバイスオブジェクトを削除し、その後のI/Oデバイスへのアクセスを不能にする。
【０００６】
ここで、I/Oデバイスが抜かれるなどの異常が発生した直後で、OSがデバイスオブジェクトを削除完了する前のタイミングで、I/Oデバイスへのアクセスが発生する場合がある。通常、PCIeバスなどのI/Oバスのバスブリッジは、接続されていないI/Oデバイスへのアクセスに対して、例えばAll F（0xFFFF_FFFF）などのデータを応答する。上記のDPC機能を予定しているDPC対応のデバイスドライバは、このようなAll Fのデータを受信した場合、適切なエラー処理を実行し、All Fデータによる不正なメモリアクセスやシステム状態の不定の発生を回避する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１１−１００４３１号公報
【特許文献２】特開２０１１−１９７８４５号公報
【特許文献３】特開２０１１−１２３８５７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかし、DPC非対応のデバイスドライバは、上記のAll Fのデータを正常なデータとして取り扱い、適切なエラー処理をせず、不正なメモリアクセスを発生してデータを破壊したり、システム状態を不定にすることがある。そして、デバイスドライバの機能はデバイスベンダに依存するので、全てのデバイスドライバがDPC機能対応になることを保証することは困難である。
【０００９】
そこで，実施の形態の第１の側面の目的は，デバイスに異常が発生しても、デバイス異常による不測のエラーが発生することを抑制した情報処理装置、情報処理装置の制御プログラム及び情報処理装置の制御方法を提供することにある。
【課題を解決するための手段】
【００１０】
本実施の形態の第１の側面は，入出力デバイスが接続可能な入出力部と、前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、基盤ソフトウエアを介して個別プログラムを実行する実行部と、前記実行部が前記基盤ソフトウエア及び前記個別プログラムを実行することにより、前記監視対象入出力デバイスの第１の領域へのアクセスを検出した場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であることを検出する判定部と、を有する情報処理装置である。
【発明の効果】
【００１１】
第１の側面によれば，デバイス異常による不足のエラーが発生することを抑制する。
【図面の簡単な説明】
【００１２】
【図１】PCIeのDPC（Down Port Containment、ダウンポートコンテインメント）機能を説明する図である。
【図２】I/OデバイスがI/Oバスブリッジから抜かれた場合の動作を示す図である。
【図３】第１の実施の形態における情報処理装置の構成を示す図である。
【図４】監視対象I/Oデバイス表の一例を示す図である。
【図５】本実施の形態における情報処理装置１の起動時の処理を示すフローチャート図である。
【図６】本実施の形態における情報処理装置１の監視対象I/Oデバイスへのアクセス動作を示すフローチャート図である。
【図７】第２の実施の形態における情報処理装置１の構成を示す図である。
【図８】第２の実施の形態の情報処理装置１の仮想マシンの構成例を示す図である。
【図９】ハイパバイザのプログラムモジュール、テーブルなどの構成例を示す図である。
【図１０】VM制御構造体（VMCS）の構成例を示す図である。
【図１１】仮想マシン情報ファイル２８０内の各表及びテーブルの一例を示す図である。
【図１２】本実施の形態におけるCPUの仮想化に対応するハードウエア構成を示す図である。
【図１３】BARレジスタの構成例を示す図である。
【図１４】第２の実施の形態における情報処理装置の動作の概略を示すフローチャート図である。
【図１５】第２の実施の形態における情報処理装置の動作の概略を示すフローチャート図である。
【図１６】仮想マシンVM起動前の処理とVM_Entry後にVM_Exitした時の処理の概略を示すフローチャート図である。
【図１７】HVモードでのI/Oポート処理S50のフローチャート図である。
【図１８】HVモードでのI/Oポート処理S50内のI/Oライト処理S58のフローチャート図である。
【図１９】監視対象I/Oデバイスのコンフィグレーション領域へのライト処理S64のフローチャート図である。
【図２０】図１８の非初期化処理でのI/Oライト処理S66のフローチャート図である。
【図２１】図１７のI/Oリード処理S57のフローチャート図である。
【図２２】HVモードでのMMIO処理S49のフローチャート図である。
【図２３】HVモードのMMIO処理S49内のMMIOライト処理S100とMMIOリード処理S99のフローチャート図である。
【図２４】図２１、図２３のリード結果のエラーチェックS88のフローチャート図である。
【図２５】図１８のI/Oライト処理の変形例のフローチャート図である。
【発明を実施するための形態】
【００１３】
図１は、PCIeのDPC（Down Port Containment、ダウンポートコンテインメント）機能を説明する図である。図１は、I/Oバスブリッジ１６のダウンポートDPにI/OデバイスDEV1が接続され、I/OデバイスDEV2がダウンポートDPから抜かれたことをそれぞれ示す。DPC機能を有していないI/Oバスブリッジ１６に接続されているデバイスDEV2が抜かれると（工程SA）、回復できないフェイタルエラーがI/Oバスブリッジを伝搬し（工程SB）、CPU１０に伝搬してシステムダウンを招く場合がある（工程SC）。
【００１４】
DPC機能を有するI/Oバスブリッジ１６は、デバイスDEV2のI/Oバスブリッジ１６から抜かれたことで発生するエラーが伝搬するのを阻止する（工程SD）。具体的には、I/Oブリッジ１６は、フェイタルエラーを、そのエラーの度合いを下げてコレクタブルエラーに変更し、上流に伝搬させる。
【００１５】
これにより、デバイスの異常によるエラーによってシステムダウンが発生することを回避できる。その結果、I/Oバスの信頼性を高めている。近年のI/Oデバイスは、フラッシュメモリなど頻繁に挿入、抜き取りされるデバイスが含まれる。そのようなデバイスのI/Oバスブリッジからの引き抜きによるシステムダウンを防止することが望まれていた。
【００１６】
一方、アプリケーションプログラムは、OSのデバイスオブジェクトなどのインターフェースにアクセスし、OS内のデバイスドライバを介してバスブリッジ１６に接続されたI/Oデバイスにアクセスする。この場合、例えば、I/Oデバイスがバススイッチから引き抜かれるなどI/Oデバイスに異常が発生すると、OS割込が発生し、OSは上記のデバイスオブジェクトを削除し、その後のデバイスへのアクセスを不能にする。
【００１７】
図２は、I/OデバイスがI/Oバスブリッジから抜かれた場合の動作を示す図である。図２の左側に示された通常時のデバイスアクセスS1では、ユーザプログラムはI/OデバイスDevにアクセスする場合、オペレーティングシステムOS内のデバイスオブジェクトDOにアクセスし、それを介してOS内のデバイスドライバDDを実行する。
【００１８】
次に、図２の中央部に示されたデバイスDevに異常が発生した場合の動作S2によれば、デバイスDevがバスブリッジ１６から抜かれると、バスブリッジ１６を介してOSに割込が発生し、OSはデバイスオブジェクトDOを削除する。
【００１９】
しかし、図２の右側に示された動作S3によれば、デバイスが抜かれた後、OSが割込処理によりデバイスオブジェクトDOを削除中（削除完了前）に、ユーザプログラムがデバイスオブジェクトDOを介して抜かれたI/Oデバイスにアクセスすることが起こりうる。I/Oデバイスへのアクセスは、具体的にはデバイスのレジスタへのアクセスである。
【００２０】
例えば、PCIeの仕様では、I/Oデバイスが存在しないスロットへのリードアクセスに対しては、I/Oバスブリッジ１６はオールF（0xFFFF_FFFF）のデータを応答する。その理由は、I/Oバスブリッジのポートは、電源電圧にプルアップされているので、デバイスが接続されていなければオールFのデータが発生するからである。
【００２１】
ここで、DPC対応のI/Oデバイスのデバイスドライバは、オールFのデータを不正な値と判断し、不正なメモリの参照などを行わない。DPC機能によりデバイスが突然抜かれてもシステムダウンしないため、DPC対応のデバイスドライバは、上記のような不正なアクセスが発生することを想定して設計されているからである。
【００２２】
しかし、DPC非対応のデバイスのデバイスドライバは、オールFのデータを不正な値と判断できず、処理を続行してしまい、不正なメモリの参照などを招き、最悪データの破壊やシステム状態が不定を招くことがある。
【００２３】
そこで、I/Oデバイスに異常が発生しても、図２で示したようなデバイス異常による不測のエラーが発生することを防止することが求められる。
【００２４】
［第１の実施の形態］
図３は、第１の実施の形態における情報処理装置の構成を示す図である。情報処理装置１は、コンピュータ、サーバである。情報処理装置１は、情報処理回路であるCPU（Central Processing Unit）１０と、メインメモリ１２と、モニタやキーボードなどの入力デバイス１４と、それらを接続するCPUバス１６を有する。さらに、情報処理装置１は、CPUバス１６に接続されるI/Oバスブリッジ（または入出力部）１８を有し、I/Oバスブリッジ１８のI/OポートP1,P2にはI/Oデバイス（または周辺デバイス）DEV1、DEV2が接続されている。また、I/Oバスブリッジ１のI/OポートP3には、I/Oデバイスの一つであるハードディスクなどの大容量ストレージ装置２０が接続されている。
【００２５】
I/Oバスブリッジ１８は、I/OデバイスDEV1,DEV2が抜かれるなどの異常状態になった場合のフェイタルエラーをエラー度を下げてコレクタブルエラーとして上流側に伝搬するDPC機能を実装する。また、各I/OデバイスDEV1,DEV2は、CPU１０がアクセスするレジスタ群REGと、デバイスの機能を実現する機能回路または機能装置FUNCを有する。
【００２６】
また、ハードディスク２０は、例えば、アプリケーションプログラム（または個別プログラム）２４と、オペレーティングシステム（または基盤ソフトウエア）２２を記憶する。そして、情報処理装置１は起動すると、アプリケーションプログラム２４とOS２２をメインメモリ１２内に展開し、CPU１０がメインメモリ１２に展開されたアプリケーションプログラムとOSを実行する。
【００２７】
OS２２のカーネルは、少なくともI/OデバイスDEV1,DEV2をそれぞれ制御するデバイス制御プログラムであるデバイスドライバDD1,DD2を有する。さらに、本実施の形態では、OS２２のカーネルは、リードのシステムコールが行われた場合に、リードのアクセス先が監視対象I/Oデバイスであるかのチェックと、監視対象I/Oデバイス宛てのリードの場合、I/Oデバイスが正常に接続されているかをチェックまたは正常状態にあるかをチェックするリードチェック・デバイスドライバDDXを有する。
【００２８】
また、CPU１０がアプリケーションプログラムおよびOSを実行することで、I/OデバイスDEV1,DEV2にアクセスし、I/Oデバイスの機能回路または機能装置FUNCに所望の処理を実行させる。具体的には、CPU１０がアプリケーションプログラム２４を実行中にI/Oデバイスへのアクセスが発生すると、CPU１０は、OS内の図示しないデバイスオブジェクトを介してアクセス対象のデバイスドライバDD1,DD2を動作させ、デバイスドライバにI/OデバイスDEV1,DEV2内のレジスタに所定の設定値を書き込みを実行させ、その設定値に対応する処理を機能回路または機能装置FUNCに実行させる。
【００２９】
本実施の形態の情報処理装置１は、図２で説明した動作S3のようなエラーが発生しないように、I/Oバスブリッジに搭載されているI/Oデバイスのうち、DPC非対応のI/Oデバイスを監視対象デバイスに登録しておく。そして、情報処理装置１は、OSがリードのシステムコールを受信した場合、リードチェック・デバイスドライバDDXを動作させる。リードチェック・デバイスドライバDDXは、そのリードが監視対象デバイスへのアクセスか否かを検出する。リードが監視対象デバイスへのアクセスでない場合は、OSによるリード処理を実行させる。
【００３０】
リードが監視対象デバイスへのアクセスの場合、リードチェック・デバイスドライバDDXは、アクセス対象のI/Oデバイスの所定のレジスタの値を読み出し、I/OデバイスがI/Oバスブリッジから切断されているなどの異常状態にあるか否かをチェックする。異常状態にある場合は、アクセス対象のI/Oデバイスのデバイスドライバの動作を禁止してアクセスを抑止する。一方、異常状態でない場合に、アクセス対象のI/Oデバイスのデバイスドライバの動作を開始させ、アクセス対象のI/Oデバイスへのアクセスを実行させる。
【００３１】
図４は、監視対象I/Oデバイス表の一例を示す図である。図４の監視対象I/Oデバイス表２７０には、DPC非対応のI/Oデバイスが登録される。さらに、監視対象I/Oデバイスへのアクセスを検出するために、監視対象I/Oデバイスのレジスタのアドレス（第１の領域）も登録される。また、監視対象I/Oデバイス内の特定レジスタのアドレス（第２の領域）も登録される。この特定レジスタには、I/Oデバイスが異常状態の場合にI/Oバスブリッジが応答する異常値ではないデータが格納されていることが保証されるレジスタである。たとえば、I/Oデバイスのコンフィグレーション空間のベンダIDやプロダクトIDが格納されるレジスタが選択される。
【００３２】
図５は、本実施の形態における情報処理装置１の起動時の処理を示すフローチャート図である。まず、情報処理装置１が起動する（S5）。初期化動作の後、情報処理装置１は、DPC非対応のI/Oデバイスを監視対象I/Oデバイス表に登録する（S6）。例えば、監視対象にすべきI/Oデバイスのユニークな識別情報を、監視対象I/Oデバイス表に登録する。
【００３３】
次に、情報処理装置１は、監視対象I/Oデバイスのレジスタのアドレス（第１の領域）をI/Oデバイス内のベーシックアドレスレジスタ（BAR：Basic Address Resistor）から取得し、監視対象I/Oデバイス表の第１の領域に登録する（S7）。さらに、情報処理装置１は、特定レジスタのアドレスも、図４の監視対象I/Oデバイス表２７０内の特定レジスタのアドレス（第２の領域）に登録する（S7）。その後、情報処理装置１は、通常動作に移行し、CPU10が例えばアプリケーションプログラム２４を実行する。
【００３４】
図６は、本実施の形態における情報処理装置１の監視対象I/Oデバイスへのアクセス動作を示すフローチャート図である。図６には、OSと、デバイスドライバDD1,DD2と、リードチェック・デバイスドライバDDXの動作が示されている。
【００３５】
CPU１０は、通常動作でアプリケーションプログラム２４を実行し、必要に応じてリードアクセスを実行する。それに応答して、アプリケーションプログラム２４は、リードのシステムコールをOSに発行する。OSは、システムコールを受信し（S9）、それがリードのシステムコールの場合（S10のYES）リードチェック・デバイスドライバDDXの動作を開始させる。
【００３６】
これに応答して、リードチェック・デバイスドライバDDXは、リードのアクセス先が監視対象I/Oデバイス宛てか否かをチェックする（S11）。リードが監視対象I/Oデバイス宛てでない場合（S11のNO）、OSがそのリードのシステムコールを実行する（S12）。
【００３７】
一方、リードが監視対象I/Oデバイス宛ての場合、リードチェック・デバイスドライバDDXは、I/Oデバイスのアクセス先のアドレス（第１の領域内のアドレス）にリードアクセスを実行し（S13）、リードデータがALL Fか否かをチェックする（S14）。アクセス先のI/Oデバイスがバスブリッジのポートから抜かれていた（切断または非接続状態）場合は、通常バスブリッジはALL Fのデータを応答する。もし、リードデータがALL Fでない場合は（S14のNO）、アクセス先のI/Oデバイスが抜かれた異常状態ではないので、リードチェック・デバイスドライバDDXは、アクセス先のI/OデバイスのデバイスドライバDD1,DD2に動作を開始させる（S15）。一方、リードデータがALL Fの場合は（S14のYES）、リードチェック・デバイスドライバDDXは、アクセス先のI/Oデバイスの第２の領域のレジスタにリードアクセスを実行する（S16）。すなわち、ALL Fのリードデータが正常なレジスタ値である可能性があるので、必ず「０」のビットを含む第２の領域のレジスタの値を読み出して再度ALL Fか否かをチェックする。
【００３８】
そして、リードデータがALL Fでない場合（S17のNO）、アクセス先のI/Oデバイスが抜かれた異常状態ではないので、リードチェック・デバイスドライバDDXは、アクセス先のI/OデバイスのデバイスドライバDD1,DD2に動作を開始させる（S18）。一方、リードデータがALL Fの場合は（S17のYES）、リードチェック・デバイスドライバDDXは、アクセス先のI/Oデバイスのデバイスドライバの動作を禁止し、I/Oデバイスへのリードアクセスを抑止する（S18）。
【００３９】
リードチェック・デバイスドライバDDXは、I/OデバイスへのリードアクセスでALL Fのリードデータを受信しても、それに応答して、不都合なメモリアクセスを実行してデータを変更したりシステムを不定状態にする何らかの動作を行うことはない。リードチェック・デバイスドライバDDXは、リードが監視対象I/Oデバイス宛か否かと、アクセス先のI/OデバイスからのリードデータがALL Fか否かのチェックをそれぞれ行うだけであり、リードデータをCPUに応答したりしない。
【００４０】
それに対して、通常のデバイスドライバDD1,DD2は、I/OデバイスへのリードアクセスでALL Fのリードデータを受信した場合、リードデータを処理して何らかの不都合な処理を招く可能性を否定することができない。デバイスドライバの機能は、デバイスベンダに依存しているからである。
【００４１】
変形例として、図６に示した処理のうち、リードチェック・デバイスドライバDDXは、第１の領域にリードアクセスする処理S13を省略してもよい。その場合、リードチェック・デバイスドライバDDXは、監視対象I/Oデバイス宛てのリードであることを検出すると（S11のYES）、第２の領域にリードアクセスを実行し（S16）、そのリードデータがALL Fか否かを判定する（S17）。ALL Fの場合はI/Oアドレスが異常状態であるので、その後のデバイスドライバによる第１のアドレスへのリード動作を抑制する。
【００４２】
以上のとおり、第１の実施の形態の情報処理装置１は、OSがリードのシステムコールを受信すると、まずリードチェック・デバイスドライバが、アクセス先が監視対象I/Oデバイスかをチェックする。さらに、監視対象宛ての場合、リードチェック・デバイスドライバは、アクセス先I/Oデバイスの第２のアドレスにリードアクセスして異常状態にあるか否かをチェックし、正常状態の場合は、アクセス先I/Oデバイスに対応するデバイスドライバによるアクセス処理を実行させ、異常状態の場合は、そのデバイスドライバによるアクセスを抑止または禁止する。
【００４３】
したがって、第１の実施の形態によれば、DPC機能によりDPC非対応I/Oデバイスが抜かれて異常状態になってもシステムダウンが起こらない状況下で、異常状態のDPC非対応I/Oデバイスに不適切なアクセスが発生しても、メモリが不適切に書き換えられたりシステムが不定状態になることを抑制する。
【００４４】
［第２の実施の形態］
第２の実施の形態における情報処理装置は、仮想化制御プログラムであるハイパバイザを実行して仮想マシン（ゲストVM（Virtual Machine））を生成し、生成された各仮想マシンがそれぞれのアプリケーションプログラムをそれぞれのゲストOSと共に実行する。ハイパバイザは、各仮想マシンの仕様（CPUまたはCPUコア数、CPUのクロック数、メモリサイズ、ディスクサイズ、ネットワーク帯域など）に基づいて、情報処理装置のハードウエア（CPU、メインメモリ、ディスクストレージ装置、ネットワーク装置）の資源を割り当てることで、各仮想マシンを生成する。一般に、ホストOSはハイパバイザを含む。
【００４５】
第２の実施の形態では、DPC非対応I/Oデバイスへのアクセス時に、ハイパバイザが、I/Oデバイスが異常状態の場合に異常処理を行い、DPC非対応デバイスドライバによる不適切な動作を抑制する。これにより、デバイスベンダに依存したDPC非対応のデバイスドライバの機能不足を補い、異常状態のI/Oデバイスへのアクセス発生時に図２で示した異常動作が生じないようにする。
【００４６】
なお、第２の実施の形態に関連する技術については、末尾の［関連技術］にまとめている。したがって、それを適宜参照することで、以下の説明を理解することができる。
【００４７】
［第２の実施の形態の情報処理装置と仮想マシン］
図７は、第２の実施の形態における情報処理装置１の構成を示す図である。図３と同様に、情報処理装置１は、コンピュータ、またはサーバである。情報処理装置１は、情報処理回路であるCPU（Central Processing Unit）１０と、メインメモリ１２と、モニタやキーボードなどの入力デバイス１４と、それらを接続するCPUバス１６を有する。さらに、情報処理装置１は、CPUバス１６に接続されるI/Oバスブリッジ（または入出力部）１８を有し、I/Oバスブリッジ１８のI/OポートP1,P2にはI/Oデバイス（または周辺デバイス）DEV1、DEV2が接続されている。また、I/Oバスブリッジ１のI/OポートP3には、I/Oデバイスの一つであるハードディスクなどの大容量ストレージ装置２０が接続されている。
【００４８】
I/Oバスブリッジ１８は、I/OデバイスDEV1,DEV2が抜かれるなどの異常状態になった場合のフェイタルエラーをエラー度を下げてコレクタブルエラーとして上流側に伝搬するDPC機能を実装している。そして、各I/OデバイスDEV1,DEV2は、CPU１０がアクセスするレジスタ群REGと、デバイスの機能を実現する機能回路または機能装置FUNCを有する。
【００４９】
また、ハードディスク２０は、例えば、アプリケーションプログラム（または個別プログラム）２４と、オペレーティングシステム（または基盤ソフトウエア）２２を記憶する。そして、情報処理装置１は起動すると、アプリケーションプログラム２４とOS２２をメインメモリ１２内に展開し、CPU１０がメインメモリ１２に展開されたアプリケーションプログラムとOSを実行する。
【００５０】
OS２２のカーネルは、少なくともI/OデバイスDEV1,DEV2をそれぞれ制御するデバイス制御プログラムであるデバイスドライバDD1,DD2を有する。
【００５１】
そして、CPU１０がアプリケーションプログラムまたはOSを実行することで、I/OデバイスDEV1,DEV2にアクセスし、I/Oデバイスの機能回路または機能装置FUNCに所望の処理を実行させる。具体的には、CPU１０がアプリケーションプログラム２４を実行中にI/Oデバイスへのアクセスが発生すると、CPU１０は、OS内の図示しないデバイスオブジェクトを介してアクセス対象のデバイスドライバDD1,DD2を起動し、デバイスドライバにI/OデバイスDEV1,DEV2内のレジスタに所定の設定値を書き込み、その設定値に対応する処理を機能回路または機能装置FUNCに実行させる。ここまでは、図３と同様である。
【００５２】
図３と異なり、図７の情報処理装置１は、仮想化マシンを生成し制御するハイパバイザ（または基盤ソフトウエア）２６を有する。ハイパバイザ２６が仮想マシンを起動し、仮想マシンがアプリケーションプログラム２４を実行する際に、仮想マシンへのハードウエア資源の割当の制御を行う。ハイパバイザ２６は、OS２２に含まれるのが一般的である。
【００５３】
図８は、第２の実施の形態の情報処理装置１の仮想マシンの構成例を示す図である。図８の例では、ハイパバイザ２６が、３つの仮想マシンVM1、VM2、VM3を生成し動作させている。各仮想マシンVMに対応して、ゲストOSとアプリケーションプログラムAPLがインストールされる。CPU１０は、ハイパバイザ３６によるハードウエア資源割り当て制御のもとで、各仮想マシンVMのアプリケーションプログラムAPLをゲストOSと共に実行する。そして、仮想マシンVMがI/OデバイスDEV1,DEV2へのアクセスを要求すると、ハイパバイザ２６を介してホストOS２２内のデバイスドライバがアクセスを実行する。
【００５４】
第２の実施の形態の情報処理装置１は、図２の動作S3のようなエラーが発生しないように、I/Oバスブリッジに搭載されているI/Oデバイスのうち、DPC非対応のI/Oデバイスを監視対象デバイスに登録しておく。言い換えれば、DPC非対応のI/Oデバイスとは、DPC非対応デバイスドライバのI/Oデバイスの意味である。そして、仮想マシンVMがアプリケーションプログラムを実行中に、監視対象I/Oデバイスへのアクセスを発生した場合、仮想マシンの動作モード（以下VMモード）からハイパバイザの動作モード（以下HVモード）に遷移するよう各種設定をしておく。
【００５５】
監視対象I/Oデバイスへのアクセスが発生すると、HVモードに遷移し、ハイパバイザ２６は、デバイスドライバに代わって、アクセス対象のI/Oデバイスにアクセスし、読み出しデータが異常値かどうかをチェックする。読み出しデータが異常値（例えば前述のALL F）の場合は、不正なアクセスと判断し、対象の仮想マシンVMを停止する。これにより、対象の仮想マシンVMによるI/Oデバイスへのアクセスが中断され、結果的にアクセスが抑止される。一方、読み出しデータが異常値でない場合は、正常なアクセスと判断し、読み出しデータを仮想マシンのメモリやレジスタに格納し、仮想マシンの動作モード（VMモード）に遷移する。
【００５６】
第２の実施の形態では、ハイパバイザの動作モード（HVモード）と仮想マシンの動作モード（VMモード）とを利用し、仮想マシンによるDPC非対応I/Oデバイスへのアクセス要求（正確には、リードアクセス要求）に応答して、HVモードに遷移し、ハイパバイザがI/Oデバイスへのアクセス（リードアクセス）をエミュレートし、読み出しデータに基づいてI/Oデバイスが異常状態か否かをチェックする。異常状態でない場合は、VMモードに遷移する。但し、ハイパバイザがリード動作をエミュレート済みであるので、デバイスドライバによるI/Oデバイスへのアクセス処理を行わない。したがって、DPC非対応I/Oデバイスへのアクセスが発生したときに、ハイパバイザが、リアルタイムでアクセスの実行と異常状態のチェックを行う。
【００５７】
［ハイパバイザ］
次に、本実施の形態におけるハイパバイザの構成例、CPUの構成、I/Oデバイスのレジスタについて説明し、それらを前提に、情報処理装置１の初期化動作と、監視対象のI/Oデバイスへのアクセスが発生した場合の動作を詳述する。
【００５８】
図９は、ハイパバイザのプログラムモジュール、テーブルなどの構成例を示す図である。ハイパバイザ２６は、監視デバイス設定部２６１を有する。CPUは、監視デバイス設定部２６１を実行して、I/Oバスブリッジに装着されているI/Oデバイスのうち、DPC非対応I/Oデバイスを監視対象I/Oデバイスとして登録する。監視デバイス設定部２６１は一種のプログラムモジュールである。
【００５９】
ハイパバイザ２６は、仮想マシン情報を初期化するVM情報初期化部２６２を有する。VM情報初期化部２６２も一種のプログラムモジュールである。ハイパバイザ２６が最初に仮想マシンを起動したときに、CPUはVM情報初期化部２６２を実行して、各仮想マシンVM1,VM2,VM3の情報を初期化する。初期化される仮想マシンの情報は、例えば、図９中の各仮想マシンVM1,VM2,VM3の情報ファイル２８０内のデバイスID変換表２７２、監視I/Oポート番号管理表２７３、監視MMIOアドレス管理表２７４、TDP(Two Dimensional Paging)ページテーブル２７５、VM制御構造体（VMCS）２７６などである。これらの具体例については後述する。
【００６０】
さらに、ハイパバイザ２６は、仮想マシンを起動し、動作させ、一時停止（サスペンド）、再開（レジューム）、停止するなどの制御を行うVM実行部２６３を有する。VM実行部２６３は、一種のプログラムモジュールである。CPUは、VM実行部２６３を実行して、仮想マシン構成情報２７１に基づいて、仮想マシンの起動、動作、サスペンド、レジューム、停止を制御する。仮想マシン構成情報２７１は、仮想マシンの情報ファイル２８０に含まれ、仮想マシンの仕様（CPUまたはCPUコア数、CPUのクロック数、メモリサイズ、ディスクサイズ、ネットワーク帯域など）を有する一種のファイルである。
【００６１】
図１０は、VM制御構造体（VMCS）の構成例を示す図である。VM制御構造体２７６は、後述する［関連技術］に記載したとおり、仮想マシンの状態や設定などを記録するデータ構造体（Data Structure）である。VM制御構造体２７６の各構成は以下のとおりである。
・VMCS revision identifier２８０は、バージョン情報が書き込まれるエリアである。
・VMX-abort indicator２８１は、VM_Exit中にエラーが発生し、VM制御構造体にVM_Exit要因のデータを書き込めなかった場合のエラーコードが書き込まれるエリアである。
・VMCS dataは、様々なデータが読み書きされるエリアである。
・Guest-state area２８２は、VM_Exit時にゲストVMのCPU内のレジスタを退避し、VM_Entry時にゲストVMが復帰するためのエリアである。
・Host-state are２８３は、M_Entry時にハイパバイザのCPU内のレジスタを退避し、VM_Exit時にハイパバイザが復帰するためのエリアである。
・VM-execution control fields２８４は、ゲストVM実行時にどのようなイベントでVM_Exitするかという情報が設定されるフィールドである。第２の実施の形態では、ハイパバイザが、仮想マシンVMを起動する時、このフィールドにI/O命令実行時にVM_Exitするような設定を行う。この初期設定により、CPUはI/O命令の実行に応答してVM_Exitする。具体的には、CPU内の仮想化対応命令実行部がVM_Exitする。詳細は後述。
・VM-exit control fields２８５は、VM_Exit時のCPUの挙動を設定するエリアである。
・VM-entry control fields２８６は、VM_Entry時のCPUの挙動を設定するエリアである。
・VM-exit information fields２８７は、VM_Exit時の要因などが書き込まれるエリアである。
【００６２】
上記のとおり、VM制御構造体２７６には、VMが動作中のVMモードでVM_Exitする要因が設定され、実際にVM_Exitした時、VM_Exit発生の要因がVM制御構造体に書き込まれる。
【００６３】
図１１は、仮想マシン情報ファイル２８０内の各表及びテーブルの一例を示す図である。以下、それぞれの表及びテーブルを説明する。
【００６４】
監視対象デバイス登録表２７０は、I/Oバスブリッジに接続されたI/Oデバイスのうち、DPC非対応のデバイスドライバのI/Oデバイスを登録するテーブルである。仮想マシンVM毎に生成される。第２の実施の形態では、利用者が、ハイパバイザ２６の監視デバイス設定部２６１を利用して、事前にこの監視対象デバイス登録表にI/Oデバイスを登録する。登録するデバイスIDとして、例えばI/OデバイスのBDF（Bus番号、Device番号、Function番号）の組合せを利用する。BDFは情報処理装置１内でユニークな番号の組である。
【００６５】
デバイスID変換表２７２は、I/Oバスブリッジに接続された全てのパススルー対象のI/OデバイスのID変換表である。仮想マシンVM毎に生成される。デバイスID変換表２７１は、ゲストVM側からみたBDF(ゲストBDF)と、ホスト（ハイパバイザ）側からみたBDF（ホストBDF）とを対応付けて登録する。第２の実施の形態では、利用者が、ハイパバイザ２６のVM情報初期化部２６２を利用して、事前にデバイスID変換表２７１を作成する。パススルーについては、後述の［関連技術］の欄に記載されている。
【００６６】
ハイパバイザのVM情報初期化部２６２が、仮想マシンVMを起動した時の初期化処理で、監視対象デバイス登録票２７０とデバイスID変換表２７１を参照し、監視対象デバイスについて監視I/Oポート番号管理表２７３と監視MMIOアドレス管理表３７４を生成する。また、VM情報初期化部２６２は、さらに、TDPページテーブル２７５を全てのI/Oデバイスについて生成する。
【００６７】
監視I/Oポート番号管理表２７３は、ゲストVMからみたI/Oポート番号（及びサイズ）と、I/OデバイスのホストからアクセスできるI/Oポート番号（及びサイズ）の対応表であり、監視対象I/Oデバイスについて生成される。ゲストVMがI/OデバイスにアクセスするときゲストVMからみたI/Oポート番号を伴うので、ハイパバイザは、管理I/Oポート番号管理表２７３を参照して、監視対象I/Oデバイスへのアクセスか否かをチェックする。また、ハイパバイザは、ゲストVMがI/OデバイスのI/O空間へのアクセスを行う場合、管理I/Oポート番号管理表２７３を参照して、ゲストVMによるI/OデバイスへのアクセスのI/Oポート番号を、ホストからアクセスできるI/Oポート番号に変換し、アクセスをエミュレートする。
【００６８】
監視MMIOアドレス管理表２７４は、ゲストVMからみたMMIOアドレス（及びサイズ）と、I/OデバイスのホストからアクセスできるMMIOアドレス（及びサイズ）の対応表であり、監視対象I/Oデバイスについて生成される。ゲストVMがI/OデバイスにアクセスするときゲストVMからみたMMIOアドレスを伴うので、ハイパバイザは、管理MMIOアドレス管理表を参照して、ゲストVMによるI/OデバイスへのアクセスのMMIOアドレスを、ホストからアクセスできるMMIOアドレスに変換し、アクセスをエミュレートする。
【００６９】
TDPページテーブル２７５は、全てのI/Oデバイスについて、MMIO領域におけるゲスト物理ページとホスト物理ページの対応を記録する。そして、TDPページテーブル内の監視対象I/Oデバイスのゲスト物理ページ／ホスト物理ページのエントリのリードアクセスビットに、VM_Exitの発生を指示する「０」が設定される。これにより、監視対象I/Oデバイスへのリードアクセスが発生したとき、CPUがTDPページテーブル２７５を参照し、リードアクセスビットの「０」に応答して、VM_Exitする。これにより、監視対象I/Oデバイスへのリードアクセス時にCPUの動作で自動的にVM_Exitが発生する。具体的には、後述するCPUの仮想化対応MMU(Memory Management Unit)がVM_Exitする。この動作が、監視対象I/OデバイスのMMIO空間へのリードアクセスを検出する動作である。TDPページテーブルは、Intel社のEPT(Extended Page Table)に対応する。
【００７０】
［CPUの構成とBARの構成］
図１２は、本実施の形態におけるCPUの仮想化に対応するハードウエア構成を示す図である。ハイパバイザによる仮想化制御によるオーバヘッドを削減するために、CPUやI/Oバスブリッジは専用の回路構成を有する。図１２に示されるとおり、CPU１０は、仮想化対応命令実行部１０１と、仮想化対応MMU（Memory Management Unit）１０２を有する。いずれも論理回路で構成される。
【００７１】
仮想化対応命令実行部１０１は、特定の命令（例えばI/O命令）がゲストVMの実行モード（VMモード）で実行されたことを検出し、メモリ１２内のVM制御構造体のVM_Exit要因の設定に基づいて、自動的にVM_Exitし、ハイパバイザ実行モード（HVモード）に遷移する。したがって、各VMのVM制御構造体２７６には特定の命令でVM_Exitすることが設定され、CPU１０にVM制御構造体２７６のアドレスが通知される。
【００７２】
第２の実施の形態では、CPU内の仮想化対応命令実行部１０１が、I/O命令を実行するときに自動的にVM_ExitしてHVモードに遷移する。その後、ハイパバイザのVM実行部２６３が管理I/Oポート番号管理表を参照して、監視対象I/Oデバイスへのアクセスか否かをチェックする。これにより、ハイパバイザは、監視対象I/Oデバイスへのアクセスかを検出する。この動作が、監視対象I/OデバイスへのI/O空間へのアクセスを検出する動作である。
【００７３】
仮想化対応MMU１０２は、I/OデバイスにMMIO空間でアクセスが発生したとき、TDPページテーブルを参照してゲスト物理ページをホスト物理ページに変換し、リードアクセスビットの設定が「１」の場合に自動的にVM_Exitする。この動作が、監視対象I/OデバイスへのMMIO空間へのアクセスを検出する動作である。
【００７４】
図１３は、BARレジスタの構成例を示す図である。I/Oデバイスは、レジスタにハードウエアで対応付けられたBARレジスタBAR_REGを有する。情報処理装置の起動時の初期化プログラムが、BARレジスタに対応するレジスタに割り当てたI/O空間のアドレスまたはMMIO空間のアドレスと、書き込まれたアドレスがI/O空間かMMIO空間かを示すビット「１」または「０」とを、BARレジスタBAR_REGそれぞれに書き込んで初期設定する。これにより、アクセス要求が発行されると、I/OデバイスはBARに設定されたアドレスと、アクセス要求のアドレスとを比較して、どのレジスタがアクセス先かを決定する。
【００７５】
［第２の実施の形態における動作の概略］
図１４、図１５は、第２の実施の形態における情報処理装置の動作の概略を示すフローチャート図である。
【００７６】
［１．全体の初期化、図１４参照］
ユーザからの指示に応答して、ハイパバイザの監視デバイス設定部２６１は、監視対象のI/Oデバイスをハイパバイザ２６内の監視対象デバイス表に登録する（S20, S21）。監視対象I/Oデバイスは、DPC非対応のデバイスドライバでアクセスされるI/Oデバイスである。具体的には、図１１で説明したとおり、監視対象I/OデバイスのBDF番号を登録する。
【００７７】
さらに、ユーザからの指示に応答して、ハイパバイザのVM情報初期化部２６２は、ハイパバイザが起動する仮想マシンVMからパススルーで直接アクセスされる全てのI/Oデバイスを、デバイスID変換表２７２に登録する（S22, S23）。このとき、ゲストVMから認識できるBDF値とそれに対応するホスト側のBDF値とがデバイスID変換表２７２に登録される。
【００７８】
さらに、ユーザからの仮想マシンVMを実行（または起動）する指示に応答して、ハイパバイザのVM情報初期化部２６２は、起動対象の仮想マシンVMのVM制御構造体に、I/Oアクセス命令でExitするよう設定する（S24, S25）。これにより、CPU１０の仮想化対応命令実行部１０１が全てのI/O命令に対してExitするように設定される。また、このとき、VM情報初期化部２６２は、VM制御構造体で保管対象に設定されていないホスト用のCPU内のレジスタを退避する（S25）。
【００７９】
［２．VMの初期化、図１４参照］
次に、ハイパバイザのVM実行部２６３は、仮想マシンVMを起動してVM_Entyし、仮想マシンVMの動作モードであるVMモードに入る。具体的には、VM実行部２６３は、VM制御構造体２７６にVM制御情報を登録し、CPUのコンテキスト（レジスタ値）をゲストVMの値に切り替えて、仮想マシンVMを起動する。起動動作は、例えば、仮想マシンVMのBIOSを実行し、VMのブートローダを実行し、起動プログラムを実行する。
【００８０】
この起動時に、仮想マシンVMは、VMモードに入り、ハイパバイザのVM実行部２６３は、I/Oデバイスの初期化処理を実行する（S27）。I/Oデバイスの初期化処理で、ゲストVMが認識できるI/OデバイスのI/O空間とMMIO空間がI/Oデバイス内のBARに設定される。このI/Oデバイス内のBARにアドレスを設定する初期化フローはI/O命令を伴う。そのため、CPUの仮想化対応命令実行部１０１は、初期化フローのI/O命令を検出し、VM制御構造体のVM_Exit要因の設定に基づき、VM_Exitしてハイパバイザの動作モードであるHVモードに入る。
【００８１】
初期化処理でBARに設定されたアドレスがI/O空間の場合、且つアクセス先が監視対象デバイスのBARの場合、ハイパバイザのVM実行部２６３は、監視I/Oポート番号管理表２７３にゲストI/Oポート番号（及びサイズ）とホストI/Oポート番号（及びサイズ）の組を登録する（S28）。
【００８２】
具体的には、ハイパバイザのVM実行部２６３は、デバイスID変換表２７２を参照して、I/OアクセスのデバイスIDであるゲスト側BDF値からホスト側BDF値を抽出し、さらに、監視対象デバイス表２７０を検索して監視対象I/Oデバイスへのアクセスであるか否か判定する。監視対象I/OデバイスへのI/O命令の場合、VM実行部は、監視I/Oポート番号管理表２７３に前述のI/Oポート番号の組を登録する。ゲストVMがI/Oアクセスしたポート番号の情報は、VM制御構造体２７６のVM-exit information fields２８７から取得される。
【００８３】
初期化処理でBARに設定されたアドレスがMMIOアドレスの場合、且つアクセス先が監視対象デバイスの場合、ハイパバイザのVM実行部２６３は、監視MMIOアドレス管理表２７４にゲストMMIOアドレスとホストMMIOアドレスの組を登録する。さらに、VM実行部は、TDPページテーブル２７５に、当該MMIO領域におけるゲスト物理ページとホスト物理ページの組を登録する。この際、VM_Exitさせる設定（Read Access Bitを「０」に設定）も行う（S29）。アクセス先が監視対象デバイスか否かの判定は、I/O空間の場合と同様である。
【００８４】
以上でVM初期化フローが終了し、VM実行部は、VM_Entryし、再度仮想マシンVMの動作モードであるVMモードに戻し、仮想マシンVMの通常動作に移る。
【００８５】
［３．VM初期化後の通常動作、図１５参照］
VMモードの通常動作では、仮想マシンVMがI/O命令を実行すると、CPUの仮想化対応命令実行部１０１が、VM制御構造体２７６の設定に基づき自動的にVM_Exitする（S30のYES）。または、仮想マシンVMが監視対象I/OデバイスのMMIOアドレスへのアクセス（リードアクセス）を実行すると、CPUの仮想化対応MMU１０２が、TDPページテーブル２７５を参照してゲスト物理ページからホスト物理ページに変換する際に、監視対象I/OデバイスのMMIOアドレスに対するリードアクセスフラグ「０」に基づいて、自動的にVM_Exitする（S32のYES）。これらVM_ExitでHVモードに移る。
【００８６】
前述のI/O命令でVM_Exitしてきた場合、非監視対象デバイスも含めて全てのI/O命令でVM_Exitしている。したがって、HVモードにて、VM実行部２６３は、VM制御構造体からVM_Exitした要因（I/O命令）とアクセス先のI/Oポート番号を取得し、監視I/Oポート番号管理表２７３を参照して監視対象I/Oデバイスへのアクセスか否かを判別する（S31）。もし、アクセス先I/Oポート番号が監視I/Oポート番号管理表２７３内のゲストI/Oポート番号と一致すれば、監視対象I/Oデバイスへのアクセスであることが判明する。つまり、監視I/Oポート番号管理表内のI/Oポート番号は、監視I/Oデバイスへのアクセスアドレスである第１のアドレスの一つである。
【００８７】
もし、アクセス先I/Oポート番号が監視I/Oポート番号管理表２７３内のゲストI/Oポート番号と一致しなければ、VM実行部は、対応するI/O命令をエミュレートする（S31_2）。
【００８８】
一方、監視対象I/OデバイスのMMIO空間へのリードアクセスでVM_Exitした場合は（S32のYES）、監視対象I/Oデバイス宛のリードアクセスであることは判明している。つまり、監視MMIOアドレス管理表２７４内のアドレスは、監視I/Oデバイスへのアクセスアドレスである第１のアドレスの一つである。
【００８９】
次に、VM実行部２６３は、仮想マシンVMが行おうとしていたI/Oデバイスへのリードアクセスをエミュレートする（S33）。そのために、VM実行部は、監視I/Oポート番号管理表２７３を参照してホスト側I/Oポート番号を取得する。または、VM実行部は、監視MMIOアドレス管理表２７４を参照してホスト側MMIOアドレスを入手する。そして、VM実行部は、ホスト側I/Oポート番号またはホスト側MMIOアドレスで、仮想マシンVMが読み出そうとしていたI/Oデバイスのレジスタ（第１のレジスタ）の値を読み出す（S33）。
【００９０】
次に、ハイパバイザの異常判定部２６４は、アクセス先I/OデバイスがI/Oバスブリッジから切断されて異常状態にあるか否かを判定する。まず、前述のI/Oデバイスへのリードアクセスのデータ値が、ALL Fか否か判定する（S34）。ALL Fは、I/Oデバイスが異常状態の場合に応答する値である。
【００９１】
ALL Fの場合(S34のYES)、そのALL Fが正常値か異常値かを確認するため、異常判定部２６４は、そのI/Oデバイスの別のレジスタ（第２のアドレス領域の第２のレジスタで、必ず０があるレジスタ）をリードする（S35）。そして、そのリード値がALL Fか否かを判定する（S36）。
【００９２】
別のレジスタのリードデータがALL Fなら(S36のYES)、ハイパバイザの異常処理実行部２６５は、アクセス先I/Oデバイスは異常状態であることが確定するので、仮想マシンVMを停止（強制シャットダウン）する（S37）。これにより、第１のレジスタからのリードデータは仮想マシンVMに応答されず、第１のレジスタへのリードアクセスは中断される。
【００９３】
一方、別のレジスタのリードデータがALL Fでないなら（S36のNO）、アクセス先I/Oデバイスは正常状態であり、先に読み出した値のALL Fは正常な値であると判断される。そして、VM実行部２６３は、第１のアドレス領域の第１のレジスタから読み出した値を、仮想マシンVMのレジスタまたはメモリに格納する。これで、I/Oデバイスへのリードアクセスの動作が完了する。そして、VM実行部は、VM_Entryして、VMモードへ移行する（S38）。
【００９４】
処理S33でI/Oデバイスのアクセス先レジスタをリードしたときのリードデータがALL Fでない場合（S34のNO）、異常判定部は、そのI/Oデバイスは正常であることを検出し、リードエミュレートS33で得たリードデータを対応する仮想マシンVMのメモリ又はCPU内レジスタに書き込んで、VM Entryする（S38）。
【００９５】
［異常処理実行部による別の異常処理例］
上記の説明では、アクセス先I/Oデバイスが異常状態であることが判明した場合、異常処理実行部２６５は、I/Oアクセスを実行した仮想マシンVMを停止する。
【００９６】
しかし、監視対象I/Oデバイスの仕様により、異常値検出時において仮想マシンVMに応答する安全なダミーデータが存在する場合は、異常処理実行部２６５は、異常値に代えてダミーデータを仮想マシンVMのレジスタまたはメモリに格納し、VM_Entryする。安全なダミーデータであれば、不適切なメモリアクセスなどは発生しない。この場合も、I/Oアクセス先へのリードエミュレーションは中断され、そのI/Oアクセスは抑制される。
【００９７】
ダミーデータを異常値に代えて安全なダミーデータをリードデータとして利用するために、監視対象I/Oデバイス表２７０に安全なダミーデータを設定しておくのが望ましい。図１１の監視対象I/Oデバイス表に示すとおりである。
【００９８】
以上説明したとおり、第２の実施の形態では、仮想マシンが監視対象I/Oデバイスにリードアクセスすると、ハイパバイザのVM実行部がそのI/Oデバイスへの読み出しを行い、I/Oデバイスへのリードアクセスをエミュレートする。このリードアクセスで得たリードデータが異常値ALL Fと同じ場合、そのリードデータが正常値か異常値かを確認するために、ハイパバイザのVM実行部は第２のアドレスの第２のレジスタを読み出し、再度リードデータが異常値ALL Fと同じなら、異常判定部はI/Oデバイスは異常状態と判断する。異常状態と判断されると、VM実行部が仮想マシンを強制シャットダウンする。したがって、エミュレートしたリードデータが仮想マシンのレジスタまたはメモリに格納することがなく、I/Oデバイスへのリードアクセスが中断（または抑制）される。
【００９９】
第２の実施の形態では、I/Oリードアクセスをエミュレートした後に、第２のレジスタ（必ず０が含まれるレジスタ）をリードして異常状態を確認するので、第２のレジスタのリードデータが異常値でない場合は、エミュレートしたリードデータを仮想マシンのレジスタまたはメモリに格納する（S38）。
【０１００】
したがって、第２の実施の形態は、第１の実施の形態のように、リードチェック・デバイスドライバが第２のレジスタのデータをチェックした後に、本来のデバイスドライバがリードアクセスを実行する動作とは、異なる。
【０１０１】
また、第２の実施の形態では、監視対象I/Oデバイスへのアクセスを検出するために、CPUの仮想化対応命令実行部と仮想化対応MMUの機能を利用する。すなわち、I/Oデバイスへのリードアクセスは、I/O命令でI/Oポート番号を指定して行うI/Oポートアクセスと、リード命令でMMIOアドレスを指定して行うリードアクセスとがある。
【０１０２】
I/O空間へのアクセスの場合は、CPUの仮想化対応命令実行部１０１がI/O命令を検出したときにVM_Exitし、HVモードでVM実行部がI/Oポート番号が監視対象I/OデバイスのI/Oポート番号と一致するか否かをチェックし、監視対応I/Oデバイスへのアクセスを検出する。
【０１０３】
MMIO空間へのアクセスの場合は、CPUの仮想化対応MMU１０２がMMIOアドレスが監視対象I/OデバイスのMMIOアドレスと一致するか否かをチェックし、監視対応I/Oデバイスへのアクセスを検出する。したがって、CPUによるハードウエア回路１０１，１０２での自動検出機構が、監視対象I/Oデバイスへのアクセスを検出する。但し、I/O空間へのアクセスの場合はハイパバイザのVM実行部が最終的に検出する。
【０１０４】
そして、第２の実施の形態では、仮想マシンVMを起動したときのI/Oデバイスの初期化工程で、BARの設定のためのI/O命令によりCPUが自動的にVM_Exitし、ハイパバイザモードに入る。VM制御構造体にVM_Exit要因として設定されているからである。そして、HVモードで、VM実行部が、監視対象I/OデバイスにおけるゲストVMとホストのI/Oポート番号及びMMIOアドレスの対応表（管理表）の作成と、TDPページテーブルへのVM_Exitの設定を行う。監視I/Oポート番号管理表は、監視対象I/OデバイスへのI/Oポートアクセスか否かの確認に利用される。さらに、監視I/Oポート番号管理表と監視MMIOアドレス管理表は、ハイパバイザのVM実行部によるリードまたはライトエミュレーション工程で参照される。
【０１０５】
［第２の実施の形態の具体的動作例］
以下、第２の実施の形態の具体的動作例を説明する。図１６乃至図２６は、第２の実施の形態の具体的動作例を示すフローチャート図である。これらのフローチャート図では、２つのVM_Exit要因でVM_Exitした後の処理が含まれる。第１のVM_Exit要因は、VM起動時のI/Oデバイス初期化時のI/O命令で発生するVM_Exitであり、第２のVM_Exit要因は、VMモードで監視対象I/Oデバイスへのアクセス（I/O命令とMMIOアドレスへのリード又はライト命令）で発生するVM_Exitである。したがって、これらのフローチャートは、上記の第１のVM_Exitした後のHVモードでの初期化処理（ライト動作）と、第２のVM_Exitした後のHVモードでのリードエミュレーション動作とを有する。図１４、図１５の工程番号と同じ工程には、図１４、図１５の工程番号も明示した。
【０１０６】
図１６は、仮想マシンVM起動前の処理とVM_Entry後にVM_Exitした時の処理の概略を示すフローチャート図である。VM起動前の処理では、ハイパバイザHVが、DPC非対応I/Oデバイスのテーブル（監視対象I/Oデバイス表）を作成しメモリに記憶する（S41(S21)）。さらに、ハイパバイザHVが、パススルー対応の全てのI/OデバイスのデバイスID(BDF)変換表を作成しメモリに記憶する（S42(S22)）。そして、ハイパバイザHVが、VM制御構造体を初期化し、VM-Execution Control Fields内のUnconditional I/O exitingを「１」に設定する（S43(S25)）。この設定で、全てI/O命令がVM_Exitを招くようになる。
【０１０７】
次に、ハイパバイザHVのVM実行部は、仮想マシンVMを起動しVM_Entryする（S44(S26)）。仮想マシンVMの起動では、CPUが仮想マシンのBIOSを実行して仮想マシンVMを起動する（S44(S26)）。起動後のVM_Entry状態で、VM実行部は、様々な要因によりVM_Exitする（S45,S46）。このVM_Exitの要因には、I/O命令の実行と、監視対象I/OデバイスのMMIOアドレスへのリードアクセスに起因したTDPページフォルト（TDP違反）とが含まれる。
【０１０８】
VM_ExitしてHVモードになると、ハイパバイザのVM実行部は、MV_Exitの要因をVM制御構造体を参照して調査し、I/O命令が要因ならI/Oポート処理S50を、TDPページフォルトが要因ならMMIO処理S49を、それ以外の要因なら他のエミュレーション処理S48を、それぞれ実行する。I/Oポート処理S50は、前述のとおり、VM起動時のI/Oデバイスの初期化でのI/O命令と、通常動作時のI/O命令によりVM_Exitした後の処理である。一方、MMIO処理S49は、通常動作時の監視対象I/OデバイスへのアクセスによりVM_Exitした後の処理である。I/Oポート処理S50とMMIO処理S49は後で詳述する。
【０１０９】
I/Oポート処理S50とMMIO処理S49で第２のレジスタのリードデータが異常値であることを検出した場合（S51のYES）、仮想マシンVMを強制終了する（S53（S37））。異常値でない場合（S51のNO）と他のエミュレーションを実行した場合（S48）は、VM実行部は、仮想マシンVMをレジュームし、再度EM_Entryする（S52(S38)）。
【０１１０】
I/Oポート処理S50とMMIO処理S49について以下説明する。I/Oポート処理S50は、I/Oデバイス初期化時のライト処理と、通常動作時のI/Oデバイスアクセス時のリード及びライトエミュレーション処理などを含む。また、MMIO処理S49は、通常動作時のI/Oデバイスアクセス時のリード及びライトエミュレーション処理などを含む。また、通常動作時のリードエミュレーション処理は、I/Oデバイスが正常か異常かを判定する処理を含む。
【０１１１】
［I/Oポート処理、図１７−図２１］
図１７は、HVモードでのI/Oポート処理S50のフローチャート図である。VM実行部は、VM制御構造体２７６のVM-Exit Information FieldのExit qualification（Exit要因）からI/Oポート番号、リードまたはライトの情報を取得する。そして、VM実行部は、Exit要因がリードの場合（S56のRead）、I/Oリード処理S57を実行し、Exit要因がライトの場合（S56のWrite）、I/Oライト処理S58を実行する。I/Oリード処理S57は、初期化処理では発生せず、VMモードでI/O命令によりVM_Exitした後のHVモードでのリードエミュレーションと異常状態確認のリード動作を含む。I/Oライト処理S58は、初期化処理でのライト処理と、非初期化処理でのライトエミュレーションとを含む。
【０１１２】
図１８は、HVモードでのI/Oポート処理S50内のI/Oライト処理S58のフローチャート図である。VM実行部は、I/OライトアクセスのI/Oポート番号がI/Oデバイスの初期化処理に対応する場合（S60のYES）、書き込み用入力値をメモリに格納する（S61）。また、VM実行部は、表２７０，２７２を参照し(S62)、ホストBDFが監視対象デバイス登録表２７０のデバイスBDFと一致する場合（S63のYES）、監視対象I/Oデバイスのコンフィグレーションスペースにライト処理を行う(S64)。この処理S64は、図１４の処理S28,S29を含む。ホストBDFが監視対象デバイス登録表のデバイスBDFと一致しない場合、VM実行部は、通常のI/Oエミュレーション処理を行う。
【０１１３】
一方、VM実行部は、I/OライトアクセスのI/Oポート番号がI/Oデバイスの初期化処理に対応しない場合（S60のNO）、非初期化処理である通常動作でのI/Oライト処理を行う（S66）。
【０１１４】
図１９は、監視対象I/Oデバイスのコンフィグレーション領域へのライト処理S64のフローチャート図である。I/Oライトアクセス先のコンフィグレーション領域がBARである場合（S70のYES）、MV実行部は、BARに書き込まれるデータのbit1が「０」か否かを判定する（S71）。MV実行部は、bit1が「０」（MMIO空間）なら（S71のYES）、ホストI/Oデバイスのコンフィグレーション領域を読み出して（S74）、ホストI/OデバイスのBARと、ゲストI/OデバイスのBARとをTDPページテーブル上にマッピングし（S75）、TDPページテーブルのマップ先エントリのRead Access bitを「０」にWrite Access bitを「１」にそれぞれ設定する（S76(S29)）。さらに、VM実行部は、MMIOアドレス管理表にゲスト物理ページ（アドレス）とホスト物理ページ（アドレス）の対応を追加する（S77(S29)）。これにより、初期化処理での、TDPページテーブルへの設定と、監視MMIOアドレス管理表への登録がそれぞれ行われる。
【０１１５】
一方、VM実行部は、前述のbit1が「１」（I/O空間）なら（S71のNO）、ホストI/Oデバイスのコンフィグレーション領域を読み出して（S72）、I/Oポート番号管理表にゲストI/Oポート番号とホストI/Oポート番号との対応を追加する（S73(S28)）。これにより、初期化処理での監視I/Oポート番号管理表への登録が行われる。
【０１１６】
また、VM実行部は、I/Oライトアクセス先のコンフィグレーション領域がBARでない場合（S70のNO）、ホストI/Oデバイスのコンフィグレーション領域を読み出し（S78）、ホストI/Oデバイス上の指定されたレジスタにライト用入力値を書き込む（S79）。これは、BAR以外の初期化のための書き込み処理である。
【０１１７】
図２０は、図１８の非初期化処理でのI/Oライト処理S66のフローチャート図である。つまり、図２０のI/Oライト処理S66は、VMモードでの通常処理においてI/Oライトアクセスが発生し、VM_Exitした後のHVモードでのVM実行部によるI/Oライトエミュレーション処理である。
【０１１８】
I/OライトアクセスのI/Oポート番号が監視I/Oポート番号管理表に存在する場合（S80のYES）、管理対象I/Oデバイス宛てのライト命令であるので、VM実行部は、I/Oポート番号管理表からホストI/Oポート番号を取得し（S81）。そのホストI/Oポート番号に対してI/Oライト命令を実行する（S82）。I/Oライト命令では、監視対象I/Oデバイスが非接続状態になっていてもALL Fの読み出しデータが応答されることはない。
【０１１９】
一方、I/OライトアクセスのI/Oポート番号が監視I/Oポート番号管理表に存在しない場合（S80のNO）、VM実行部は、通常のI/Oライトエミュレーション処理を実行する（S83）。
【０１２０】
図２１は、図１７のI/Oリード処理S57のフローチャート図である。つまり、図２１のI/Oリード処理S57は、VMモードでの通常処理においてI/Oリードアクセスが発生し、VM_Exitした後のHVモードでのVM実行部によるI/Oリードエミュレーション処理である。
【０１２１】
I/OリードアクセスのI/Oポート番号が監視I/Oポート番号管理表に存在する場合（S85のYES）、管理対象I/Oデバイス宛てのリード命令であるので、VM実行部は、I/Oポート番号管理表からホストI/Oポート番号を取得し（S86）。そのホストI/Oポート番号に対してI/Oリード命令を実行する（S87（S33））。そして、監視対象I/Oデバイスが非接続状態で異常状態か否かをリードデータ基づいてチェックする（S88（S34-S35））。このエラーチェック処理は後述する。
【０１２２】
リードデータが異常値（ALL F）の場合（S89(S36)のYES）、異常処理実行部は、仮想マシンVMをシャットダウンする（S90(S37)）。一方、リードデータが異常値でない場合（S89(S36)のYES）、VM実行部は、リードデータをゲストVMのメモリとレジスタ（CPU内）に格納する（S91(S38)）。これによりI/Oリードエミュレーション処理が完了する。
【０１２３】
一方、I/OリードアクセスのI/Oポート番号が監視I/Oポート番号管理表に存在しない場合（S85(S31)のNO）、VM実行部は、通常のI/Oリードエミュレーション処理を実行する（S91(S38)）。
【０１２４】
[MMIO処理、図２２−図２３]
次に、図１６のMMIO処理S49について説明する。図１６で説明したとおり、CPUがTDPページテーブルを参照してページフォルトを発生してVM_Exitした後のHVモードでの処理である。このページフォルトには、VMモードでゲストVMが監視対象I/OデバイスのMMIO空間にアクセスしたときのページフォルトと、それ以外の一般的なページフォルトとが含まれる。
【０１２５】
図２２は、HVモードでのMMIO処理S49のフローチャート図である。VM実行部は、VM制御構造体２７６のVM-Exit Information FieldsのGuest-physical addressからゲスト物理アドレスを取得する（S95）。このゲスト物理アドレスは、仮想マシンVMが監視対象I/OデバイスのMMIOアドレスでアクセスした時のゲスト物理アドレスである。VM実行部は、そのゲスト物理アドレスが監視MMIOアドレス管理表２７４に存在するかをチェックする。存在する場合（S96のYES）、監視対象I/OデバイスへのMMIOアドレスによるアクセスであるので、VM実行部は、MMIOリード処理S99またはMMIOライト処理S100のいずれかを実行する。リードかライトかの判断のために、VM実行部は、VM制御構造体２７６内のVM-Exit Information FieldsのVM-Exit qualificationからリードまたはライトを取得し（S97）、判断する（S98）。
【０１２６】
一方、ゲスト物理アドレスが監視MMIOアドレス管理表２７４に存在しない場合（S96のNO）、一般的なページフォルトでVM_Exiteしたことを意味するので、VM実行部は、通常のI/Oエミュレーション処理を実行する（S101）。
【０１２７】
図２３は、HVモードのMMIO処理S49内のMMIOライト処理S100とMMIOリード処理S99のフローチャート図である。VM実行部は、MMIOライト処理S100において、監視MMIOアドレス管理表２７４を参照し、MMIOアドレスへのアクセスのゲストMMIOアドレスをホストMMIOアドレスに変換する（S105）。さらに、VM実行部は、ゲストVMの命令ポインタ（IP: Instruction Pointer）値を読み出し、その命令ポインタの命令をデコードし、書き込み情報（書き込み先のメモリ、レジスタ、書き込みサイズ）を取得し（S106）、ホストMMIOアドレスに対してデコードしたライト命令を実行する（S107）。
【０１２８】
一方、VM実行部は、MMIOリード処理S99において、監視MMIOアドレス管理表２７４を参照し、MMIOアドレスへのアクセスのゲストMMIOアドレスをホストMMIOアドレスに変換する（S110）。さらに、VM実行部は、ゲストVMの命令ポインタ（IP: Instruction Pointer）値を読み出し、その命令ポインタの命令をデコードし、読み出し情報（読み込み先のメモリ、レジスタ、読み込みサイズ）を取得し（S111）、ホストMMIOアドレスに対しデコードしたリード命令を実行する（S112（S33））。VM実行部は、このリードデータを保持する。
【０１２９】
そして、リードデータが異常値か否かをチェックし（S88(S34-S35)）、異常値なら（S113(S36)のYES）、VM実行部は仮想マシンVMをシャットダウンする（S114(S37)）。また、異常値でないなら（S113(S36)のNO）、VM実行部はリードデータをゲストVMのメモリとレジスタに格納する（S115(S38)）。
【０１３０】
図２４は、図２１、図２３のリード結果のエラーチェックS88のフローチャート図である。図１５と同様に、図２４では、ハイパバイザの異常判定部が、リードデータがALL Fか否かチェックする（S120(S34)）。リードデータがALL Fでなければ（S120のNO）、アクセス先のI/Oデバイスは正常と判断される。一方、リードデータがALL Fの場合、正常状態でレジスタデータのリードデータがALL Fか、異常状態でリードデータがALL Fかを確認する必要がある。
【０１３１】
そこで、ハイパバイザの異常判定部は、アクセス対象のI/Oデバイスのコンフィグレーションレション領域からI/OデバイスのベンダIDまたはプロダクトIDが格納される第２のレジスタにリードエミュレーションを実行し（S121(S35)）、リードデータがALL Fか否かをチェックする（S122(S36)）。異常判定部は、今回もリードデータがALL Fの場合（S122のYES）、対象のI/Oデバイスは異常状態であると判断し、一方、ALL Fでない場合（S122のNO）、対象のI/Oデバイスは正常状態と判断する。
【０１３２】
図２５は、図１８のI/Oライト処理の変形例のフローチャート図である。この変形例では、監視対象デバイス登録表２７０に代えて、非監視対象デバイス登録表を利用する。つまり、ブラックリストではなくホワイトリストにする。したがって、図２５は、I/Oライトアクセスのアクセス先I/OデバイスのID(BDF値)が、非監視対象I/Oデバイスか否か（S63）の判断結果のYESとNOが、図１８と逆になっている。つまり、VM実行部は、非監視対象I/Oデバイスの場合（S63のYES）、通常のI/Oエミュレーション処理を実行し（S65）、非監視対象I/Oデバイスでない場合（S63のNO）、監視対象I/Oデバイスのコンフィグレーション領域の処理を実行する。
【０１３３】
以上のとおり、第２の実施の形態では、仮想マシンVMがI/Oデバイスにアクセスする場合に、DPC非対応のI/Oデバイスのデバイスドライバが、異常状態で取得するリードデータに基づいて不適切な動作を行うことを抑制することができる。
【０１３４】
［関連技術］
以下は、本実施の形態に関する関連技術の簡単な説明である。必要に応じて参照される。
【０１３５】
（１）仮想化支援技術
・仮想化によるオーバヘッドを削減するために、ＣＰＵなどのハードウエアには、仮想化対応命令実行部や仮想化対応メモリ制御ユニットなどの論理回路が設けられる。第２の実施の形態では、この仮想化支援のためのハードウエア回路の機能を利用して、監視対象I/Oデバイスへのアクセス時にVMモードからVM_Exitする。
・VM制御構造体（VMCS：Virtual Machine Control Structure）は、仮想マシンの状態や設定などを記録するデータ構造であり、VMモードとHVモードとの間でのデータの受け渡しに利用される。
・TDP（Two Dimensional Paging）は、ゲスト物理アドレスとホスト物理アドレス変換をハードウエアで可能にする変換テーブルである。ゲストVMのゲストOSはページテーブルによりゲスト仮想アドレスからゲスト物理アドレスを取得する。TDP変換テーブルは、ゲスト物理アドレスをホスト物理アドレスに変換するための変換テーブルである。
【０１３６】
（２）I/Oデバイスの関連技術（特にPCIeデバイス）
・BDF（Bus/Device/Function）番号は、I/Oデバイスのユニークな番号であり、I/Oデバイスへのアクセスは、このI/Oデバイスをユニークに識別するBDF番号でアクセスされる。
・例えばPCIeバスなどのバスコンフィグレーション空間は、I/Oデバイスの基本情報を取得するためのアドレス空間であり次を含む。例えば、I/OポートCF8h（Configuration Index）に対してデバイスのBDF及びレジスタ番号が書き込まれ、I/OポートCFCh（Configuration Data）に対してリード／ライトを実行してコンフィグレーション空間にアクセスされる。コンフィグレーション空間から、I/OデバイスのベンダIDやプロダクトIDなどの製品識別情報が入手され、BAR（Base Address Register）の情報も入手される。
・BAR（Base Address Register）は、I/Oデバイス内のレジスタ群に対してアクセスするためのアドレス空間が記録されるI/Oデバイス内のレジスタであり、各I/Oデバイスに例えば最大で６つ存在する。そして、仮想マシンを起動するときに、ホストのBIOSが、各I/OデバイスのBARレジスタに適切なアドレスを設定する。I/Oデバイスのアドレス空間には、I/O空間とMMIO（Memory Mapped IO）空間の２種類があり、BARにはどちらかのアドレス空間が設定される。
・I/O空間は、INPUT命令とOUTPUT命令（I/O命令）によってI/Oポート経由でアクセスするアドレス空間であり、そのアドレス範囲は、例えば0x0000-0xFFFFである。
・MMIO（Memory Mapped IO）空間は、I/Oデバイスのレジスタがホストのメモリ空間に直接マッピングされるアドレス空間であり、MMIO空間のアドレスを使用して通常のメモリ転送命令によりI/Oデバイス内のレジスタに直接アクセスされる。
・PCI Passthroughとは、ゲストVMがI/Oデバイスに直接アクセスすることができる機能である。PCIパススルーによれば、ゲストオペレーティングシステムがホスト側のI/Oデバイスに直接物理的にアクセスでき、仮想マシンVMが仮想でないデバイスドライバをそのまま利用できる。通常は、ゲストVMによるI/Oデバイスへのアクセスは、ハイパバイザによりエミュレーション処理される。一方、ゲストVMは、パススルー機能を有するI/Oデバイスには、ハイパバイザによるエミュレーションを介さずに、直接I/Oアクセスできる。その場合、ゲストVMのMMIO空間とホストのMMIO空間との対応をTDPページテーブルにマップし、TDPページテーブルを参照して、ゲストVMが対象のI/Oデバイスに直接アクセスする。
仮想マシンVMが、パススルー機能を有するI/Oデバイスにリードアクセスするとき、仮想でないデバイスドライバを直接動作させる。そのため、DPC非対応のデバイスドライバは、異常状態のI/OデバイスからのALL Fのデータを適切にエラー処理できない。第２の実施の形態はこの課題を解決する。
【０１３７】
（３）ハイパバイザ動作関連技術
・VM_Entryは、仮想マシンVMが動作するVMモードに推移する動作である。ハイパバイザHVが動作するHVモードからVM_EntryによりVMモードに遷移する。VM_Entryする場合、CPU内は、HVモードでのホストのコンテキストが退避され、VMのコンテキストに交換される。第２の実施の形態では、CPUの仮想化対応命令実行部がVM_Entryを制御する。
・VM_Exitは、VMモードからHVモードに推移する動作である。第２の実施の形態ではゲストVMが発行する特定の命令をトラップしてHVモード（HVによる制御動作）に推移する。例えば、I/Oポートに対するアクセスがあった場合と、TDPのアクセス違反があった場合をトラップして、VM_Exitする。VM_Exitされた後HVモードで、HVは、VM制御構造体VMCSを参照することで、VM_Exitの起点となった命令やアクセス先のアドレスを取得する。また、ゲストVMのインストラクションポイントから、ゲストVMが実行中の命令を取得し、その命令をソフトウエアデコードすることで、VM_Exitの起点となった命令の状況（アクセス元、アクセス先、転送サイズなど）を知ることができる。第２の実施の形態では、CPUの仮想化対応命令実行部がVM_Exitを制御する。
・TDP違反（TDP Violation）については、TDPページテーブルを参照してVMの物理アドレスからホストの物理アドレスに変換する場合、変換先物理アドレスがないなどの理由でTDP違反が生じてページフォルトが発生する。第２の実施の形態では、TPDページテーブル内の監視対象I/Oデバイスのアドレスに、リードアクセスビットを「０」に設定することで、ページフォルトが発生する。CPUの仮想化対応メモリ制御ユニット（MMU）がTDPページテーブルを参照してアドレス変換を行い、上記のページフォルトを発生する。
【０１３８】
（４）BAR（Base Address Register）は、I/Oデバイス内のレジスタのアドレスを設定するレジスタである。I/Oデバイス内のレジスタへのアクセスは、メモリ空間に割り当てられたMMIO空間か、I/O空間に対し行われる。MMIOはMemory Mapped IOの省略である。そして、このMMIO空間とI/O空間はプログラマブルであり、システムの初期化プログラムがBARにMMIO空間とI/O空間を設定する。I/Oデバイスへのアクセスはこの設定されたMMIO空間とI/O空間にしたがって行われる。アクセス要求が発行されると、I/OデバイスはBARに設定されたアドレスと、アクセス要求のアドレスとを比較して、どのレジスタがアクセス先かを決定する。
【０１３９】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１４０】
（付記１）
入出力デバイスが接続可能な入出力部と、
前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、
基盤ソフトウエアを介して個別プログラムを実行する実行部と、
前記実行部が前記基盤ソフトウエア及び前記個別プログラムを実行することにより、前記監視対象入出力デバイスの第１の領域へのアクセスを検出した場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であることを検出する判定部と、を有する情報処理装置。
【０１４１】
（付記２）
個別プログラムは、前記入出力デバイスにアクセスする第１のプログラムを有し、
前記判定部は、前記第２の領域から読み出した値が異常値である場合、前記第１の領域へのアクセスを抑止する、
付記１に記載の情報処理装置。
【０１４２】
（付記３）
前記基盤ソフトウエアは、オペレーティングシステムと仮想マシンを生成するハイパバイザを有し、
前記個別プログラムは、前記仮想マシンが実行し、前記入出デバイスにアクセスする第１のプログラムを有し、
前記実行部が、前記基盤ソフトウエアと前記個別プログラムを実行することにより、前記仮想マシンを生成し、
前記判定部は、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスした場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止する、
付記１に記載の情報処理装置。
【０１４３】
（付記４）
前記ハイパバイザは、前記監視対象入出力デバイスの識別情報を有し、
前記実行部が、前記ハイパバイザを実行することにより、
前記仮想マシンを起動した時の前記入出力デバイスの初期化処理に応答して、前記監視対象入出力デバイスの前記第１の領域の情報を前記情報保持部に登録する、
付記３に記載の情報処理装置。
【０１４４】
（付記５）
前記監視対象入出力デバイスの第１の領域の情報は、前記仮想マシンの前記監視対象入出力デバイスに対する入出力ポート番号と、前記仮想マシンが扱う第１の物理ページと前記オペレーティングシステムが扱う第２の物理ページとの変換テーブルとを有する、
付記４に記載の情報処理装置。
【０１４５】
（付記６）
前記実行部は、前記変換テーブルを参照して、前記監視対象入出力デバイスの第１の領域に対応する前記第１の物理ページから前記第２の物理ページに変換する場合、前記監視対象入出力デバイスの第１の領域へのアクセスを検出する、
付記５に記載の情報処理装置。
【０１４６】
（付記７）
前記実行部は、前記仮想マシンが前記入出力デバイスへのアクセス命令を実行したことに応答して前記ハイパバイザを実行し、前記ハイパバイザの実行により、前記アクセス命令の入出力ポート番号が、前記第１の領域の情報に含まれる前記監視対象入出力デバイスに対する入出力ポート番号と一致することを検出した場合、前記監視対象入出力デバイスの第１の領域へのアクセスを検出する、
付記５に記載の情報処理装置。
【０１４７】
（付記８）
前記実行部は、前記第２の領域から読み出した値が前記異常値でない場合、前記第１の領域から読み出した値を前記仮想マシンの記憶部に記憶する、
付記３に記載の情報処理装置。
【０１４８】
（付記９）
前記基盤ソフトウエアは、オペレーティングシステムと仮想マシンを生成するハイパバイザを有し、
前記個別プログラムは、前記仮想マシンが実行し、前記入出デバイスにアクセスする第１のプログラムを有し、
前記実行部が、前記基盤ソフトウエアと前記個別プログラムを実行することにより、前記仮想マシンを生成し、
前記判定部は、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスした場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記異常値以外の値を前記仮想マシンに応答する、
付記１に記載の情報処理装置。
【０１４９】
（付記１０）
入出力デバイスが接続可能な入出力部と、前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、個別プログラムを実行する実行部とを有する情報処理装置の制御処理を、前記情報処理装置に実行させる制御プログラムであって、
前記制御処理は、
前記監視対象入出力デバイスの第１の領域へのアクセスが検出された場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であるか否かを判定すること
を有する情報処理装置の制御プログラム。
【０１５０】
（付記１１）
前記制御処理は、さらに、
仮想マシンを生成し、
前記判定することは、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスしたことが検出された場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域の値にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止することを有する、
付記１０に記載の情報処理装置の制御プログラム。
【０１５１】
（付記１２）
入出力デバイスが接続可能な入出力部と、前記入出力デバイスが入出力部から非接続にされた場合に生じるエラーの伝播を抑止するエラー抑止機能に対応しない監視対象入出力デバイスの識別情報を登録する情報保持部と、基盤ソフトウエアを介して個別プログラムを実行する実行部とを有する情報処理装置の制御方法であって、
前記監視対象入出力デバイスの第１の領域へのアクセスが検出された場合、前記監視対象入出力デバイスの第２の領域から読み出した値が所定値であるかを判断した結果、前記第２の領域から読み出した値が異常値であるか否かを判定すること
を有する情報処理装置の制御方法。
【０１５２】
（付記１３）
さらに、
仮想マシンを生成し、
前記判定することは、
前記仮想マシンが前記監視対象入出力デバイスの第１の領域にアクセスしたことが検出された場合、前記第１の領域にアクセスし、
前記第１の領域から読み出した値が前記異常値である場合、前記第２の領域の値にアクセスし、
前記第２の領域から読み出した値が前記異常値である場合、前記仮想マシンを停止することを有する、
付記１２に記載の情報処理装置の制御方法。
【０１５３】
（付記１４）
前記仮想マシンを起動した時の前記入出力デバイスの初期化処理に応答して、前記監視対象入出力デバイスの前記第１の領域の情報を前記情報保持部に登録する、
付記１２に記載の情報処理装置の制御方法。
【０１５４】
（付記１５）
前記監視対象入出力デバイスの第１の領域の情報は、前記仮想マシンの前記監視対象入出力デバイスに対する入出力ポート番号と、前記仮想マシンが扱う第１の物理ページと前記オペレーティングシステムが扱う第２の物理ページとの変換テーブルとを有する、
付記１３に記載の情報処理装置の制御方法。
【符号の説明】
【０１５５】
１０：CPU、実行部
１２：メインメモリ、情報保持部
１８：I/Oバスブリッジ、入出力部
DEV1, DEV2：入出力デバイス、周辺デバイス
REG：レジスタ
BAR：ベーシックアドレスレジスタ
OS：オペレーティングシステム
PM：プロセス管理モジュール
DD1、DD2：デバイスドライバ
DDX：リードチェック・デバイスドライバ
２４：アプリケーションプログラム
VM：ゲスト仮想マシン、仮想マシン
APL：アプリケーションプログラム
G_OS：ゲストOS
H_OS：ホストOS
２６、HV：ハイパバイザ
２６１：監視デバイス設定部
２６２：VM情報初期化部
２６３：VM実行部
２６４：異常判定部
２６５：異常処理実行部
２７０：監視対象入出力デバイス表
２８０：仮想マシン情報ファイル
２７１：VM構成情報
２７２：デバイスBDF変換表、デバイスID変換表
２７３：監視I/Oポート番号管理表
２７４：監視MMIOアドレス（Memory Mapped IO Address）管理表
２７５：TDP（Two Dimensional Paging）用ページテーブル
２７６：VM制御構造体（VMCS：Virtual Machine Control Structure）
【図１】
2016197360.tif 000003
【図２】
2016197360.tif 000004
【図３】
2016197360.tif 000005
【図４】
2016197360.tif 000006
【図５】
2016197360.tif 000007
【図６】
2016197360.tif 000008
【図７】
2016197360.tif 000009
【図８】
2016197360.tif 000010
【図９】
2016197360.tif 000011
【図１０】
2016197360.tif 000012
【図１１】
2016197360.tif 000013
【図１２】
2016197360.tif 000014
【図１３】
2016197360.tif 000015
【図１４】
2016197360.tif 000016
【図１５】
2016197360.tif 000017
【図１６】
2016197360.tif 000018
【図１７】
2016197360.tif 000019
【図１８】
2016197360.tif 000020
【図１９】
2016197360.tif 000021
【図２０】
2016197360.tif 000022
【図２１】
2016197360.tif 000023
【図２２】
2016197360.tif 000024
【図２３】
2016197360.tif 000025
【図２４】
2016197360.tif 000026
【図２５】
2016197360.tif 000027