(57)【要約】【課題】  複数段の仮想計算機から成る多段仮想化環境において、上段の仮想計算機上のＯＳから実行するＩ／Ｏの性能は、物理環境や、下段の仮想計算機上のＯＳから実行するＩ／Ｏの性能と比較して劣化する。【解決手段】  ｎ段目の仮想計算機上のＯＳで稼働するデバイスドライバをｎ＋ｍ段目の仮想計算機上のＯＳに認識させる（ｎ、ｍは自然数）。  具体的には、メモリに共有領域を作成し、２段目のOSで稼働するデバイスドライバを2段目のOSにパススルーで認識させる。【選択図】  図２
2014211727.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵと物理メモリとを備える物理計算機と、
前記物理計算機上で動作して、第一の仮想計算機を提供する第一の仮想化機構と、
前記第一の仮想計算機上で動作して、第二の仮想計算機を提供する第二の仮想化機構と、
前記物理計算機に接続されるデバイスとを備え、
前記第一の仮想計算機が有するドライバ生成機構１は、
前記第一の仮想計算機に割当てられたデバイスのドライバ１を、前記第一の仮想計算機に割り当てられた第一の仮想メモリに展開し、
前記第一の仮想計算機に割当てられたデバイスの識別子をコントローラ情報として、前記ドライバ１に格納し、
前記ドライバ１が展開された前記第一の仮想メモリの領域内に、共有領域１を生成し、
前記ドライバ１に対応し、前記第一の仮想計算機に割当てられたデバイスの識別子と、前記共有領域１のアドレスとを、アドレス管理情報に格納し、
前記アドレス管理情報を、前記第一の仮想化機構に送信し、
前記第一の仮想化機構が有するドライバ生成機構Ａは、
前記ドライバ生成機構１から受信した前記アドレス管理情報を参照して、前記第一の仮想計算機に割当てられたデバイスの識別子を取得し、
前記取得した第一の仮想計算機に割当てられたデバイスの識別子を、前記第一の仮想化機構が認識するデバイスの識別子に変換し、
前記第一の仮想化機構が認識するデバイスの識別子に対応するデバイスのドライバＡを、前記物理メモリに展開し、
前記受信したアドレス管理情報を参照して、前記第一の仮想計算機が割当てられたデバイスの識別子に対応する前記共有領域１のアドレスを取得し、
前記取得した共有領域１のアドレスを、前記第一の仮想化機構が認識する共有領域Ａのアドレスに変換し、
前記ドライバＡが展開された前記物理メモリの領域内に、前記第一の仮想化機構が認識するアドレスに変換された共有領域Ａを生成し、
前記ドライバ生成機構１は、
前記コントローラ情報に格納される識別子を用いて、前記アドレス管理情報を検索し、
前記アドレス管理情報に含まれる識別子と、前記コントローラ情報に格納される識別子とが一致する場合、前記一致する識別子に対応する共有領域１のアドレスを取得し、
前記取得した共有領域１のアドレスを、前記第二の仮想計算機が認識する共有領域２のアドレスに変換し、
前記変換した共有領域２のアドレスを、前記第二の仮想計算機に送信し、
前記第二の仮想計算機は、
前記第一の仮想計算機から受けた割込に対応するデバイスのドライバを、第二の仮想計算機のドライバ２とし、
前記ドライバ生成機構１から受信した前記共有領域２のアドレスを、前記ドライバ２に格納し、
前記第二の仮想計算機のドライバ２は、
前記第二の仮想計算機のＩＯの実行要求を受信し、
前記共有領域２に、前記受信したＩＯの実行要求を格納し、
前記第一の仮想化機構は、
前記ＩＯの実行要求の前記共有領域２への格納により、前記共有領域２と対応する前記共有領域Ａを参照し、
前記ＩＯの実行要求を、前記第一の仮想計算機に割当てられたデバイスに対して実行し、
前記ＩＯの実行完了を、前記ドライバ１に送信し、
前記第一の仮想計算機のドライバ１は、
前記第一の仮想化機構から受信したＩＯの実行完了を、前記ドライバ２に送信し、
前記第二の仮想計算機のドライバ２は、
前記ドライバ１から、ＩＯの実行完了を受信する
ことを特徴とする仮想計算機システム。
【請求項２】
前記第二の仮想計算機は、前記第一の仮想計算機に割当てられたデバイスのドライバ１を認識することを特徴とする請求項１記載の仮想計算機システム。
【請求項３】
前記共有領域は、前記第一の仮想化機構と前記第二の仮想計算機から操作可能であることを特徴とする請求項２記載の仮想計算機システム。
【請求項４】
前記仮想計算機の構成を多段とすることを特徴とする請求項３記載の計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想化機構を多段に重ねた環境において最上段計算機環境から実施するＩ／Ｏに関するものである。
【背景技術】
【０００２】
本技術分野の背景技術として、特開２００９−００３７４９号公報（特許文献１）がある。この公報には、「ホストＶＭＭの呼び出しの要因に応じて、第２の仮想プロセッサ上のユーザプログラムを実行するためのゲスト状態エリア２２１と、ゲストＶＭＭを実行するためのホスト状態エリア２２２の何れかを選択し、物理プロセッサを制御するためのシャドウＶＭＣＢのゲスト状態エリア１３１を更新することで、第１の仮想プロセッサ上で仮想化機能を備えた次世代ＯＳをユーザプログラムとして実行する。」と記載されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００９−００３７４９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１には、物理計算機上で仮想化技術を用いて構築した仮想計算機の上で仮想化機構を備えたＯＳを動作させる手段、いわゆる多段仮想化技術が示されている。多段仮想化技術を用いることで、複数段の仮想計算機から成る環境を構築することができる。
【０００５】
多段仮想計算機環境には、柔軟なシステム構成が可能という利点がある。一方で、上段の仮想計算機が下段の物理計算機環境にアクセスするには、中段の仮想計算機や仮想化機構を経由する必要があり、性能劣化が生じやすいという問題がある。
【０００６】
例えば２段の仮想計算機環境において、２段目の仮想計算機上のＯＳから物理デバイスにＩ／Ｏを発行することを想定する。２段目の仮想計算機上のＯＳで実行されたＩ／Ｏは、仮想化機構を備えた１段目の仮想計算機上のＯＳで受け取られる。１段目の仮想計算機上のＯＳは、受け取ったＩ／Ｏ要求を実行する。このＩ／Ｏ要求は、物理計算機上の仮想化機構に受け取られる。仮想化機構は、物理デバイスに対してＩ／Ｏを実行する。
【０００７】
本例から、「２段目の仮想計算機上のＯＳで実施したＩ／Ｏは、１段目の仮想計算機と物理計算機上の仮想化機構の２層を経由して実行される」ことがわかる。これにより、２段目の仮想計算機上のＯＳで実行したＩ／Ｏの性能は、物理計算機や１段目の仮想計算機上のＯＳで実行したＩ／Ｏの性能よりも、劣化することがわかる。
【課題を解決するための手段】
【０００８】
上述の課題を解決するために、本発明に係る仮想計算機システムは、ＣＰＵと物理メモリとを備える物理計算機と、前記物理計算機上で動作して、第一の仮想計算機を提供する第一の仮想化機構と、前記第一の仮想計算機上で動作して、第二の仮想計算機を提供する第二の仮想化機構と、前記物理計算機に接続されるデバイスとを備える。
【０００９】
そして、前記第一の仮想計算機が有するドライバ生成機構１のうち自ドライバ生成部は、
前記第一の仮想計算機に割当てられたデバイスのドライバ１を、前記第一の仮想計算機に割り当てられた第一の仮想メモリに展開し、
前記第一の仮想計算機に割当てられたデバイスの識別子をコントローラ情報として、前記ドライバ１に格納し、
前記ドライバ１が展開された前記第一の仮想メモリの領域内に、共有領域１を生成し、
前記ドライバ１に対応し、前記第一の仮想計算機に割当てられたデバイスの識別子と、前記共有領域１のアドレスとを、アドレス管理情報に格納し、
前記アドレス管理情報を、前記第一の仮想化機構に送信し、
前記第一の仮想化機構が有するドライバ生成機構Ａは、
前記ドライバ生成機構１から受信した前記アドレス管理情報を参照して、展開するドライバに対応する前記第一の仮想計算機に割当てられたデバイスの識別子を取得し、
前記取得した第一の仮想計算機に割当てられたデバイスの識別子を、前記第一の仮想化機構が認識するデバイスの識別子に変換し、
前記第一の仮想化機構が認識するデバイスの識別子に対応するデバイスのドライバＡを、前記物理メモリに展開し、
前記受信したアドレス管理情報を参照して、前記第一の仮想計算機が割当てられたデバイスの識別子に対応する前記共有領域１のアドレスを取得し、
前記取得した共有領域１のアドレスを、前記第一の仮想化機構が認識する共有領域Ａのアドレスに変換し、
前記ドライバＡが展開された前記物理メモリの領域内に、前記第一の仮想化機構が認識するアドレスに変換された共有領域Ａを生成し、
前記ドライバ生成機構１のうちゲストドライバ生成部４３２は、
前記コントローラ情報に格納される識別子を用いて、前記アドレス管理情報を検索し、
前記アドレス管理情報に含まれる識別子と、前記コントローラ情報に格納される識別子とが一致する場合、前記一致する識別子に対応する共有領域１のアドレスを取得し、
前記取得した共有領域１のアドレスを、前記第二の仮想計算機が認識する共有領域２のアドレスに変換し、
前記変換した共有領域２のアドレスを、前記第二の仮想計算機に送信し、
前記第二の仮想計算機は、
前記第一の仮想計算機から受けた割込に対応するデバイスのドライバを、第二の仮想計算機のドライバ２とし、
前記ドライバ生成機構１から受信した前記共有領域２のアドレスを、前記ドライバ２に格納し、
前記第二の仮想計算機のドライバ２は、
前記第二の仮想計算機のＩＯの実行要求を受信し、
前記共有領域２に、前記受信したＩＯの実行要求を格納し、
前記第一の仮想化機構は、
前記ＩＯの実行要求の前記共有領域２への格納により、前記共有領域２と対応する前記共有領域Ａを参照し、
前記ＩＯの実行要求を、前記第一の仮想計算機に割当てられたデバイスに対して実行し、
前記ＩＯの実行完了を、前記ドライバ１に送信し、
前記第一の仮想計算機のドライバ１は、
前記第一の仮想化機構から受信したＩＯの実行完了を、前記ドライバ２に送信し、
前記第二の仮想計算機のドライバ２は、
前記ドライバ１から、ＩＯの実行完了を受信する。
【発明の効果】
【００１０】
本発明によれば、２段目のOSで稼働するデバイスドライバを2段目のOSにパススルーで認識させる。これにより，従来の2段仮想化機構で生じていた1段目のOSでのI/O処理を削減し，I/O性能の劣化を抑える。
【００１１】
具体的には，1段目のOSがI/Oを実施する際にVMMへのI/O要求通知に用いるバッファを2段目のOSから使用可能とする。また，1stOSが用いているI/O実施を通知する機構も2段目のOSに提供する。2段目のOSは，当該バッファと通知機構を用いて1段目のOSの処理をほとんど必要とすることなくI/O処理を実施することができる。
【００１２】
つまり、ｎ段目の仮想計算機上のＯＳで稼働するデバイスドライバを、ｎ＋ｍ段目の仮想計算機上のＯＳに認識させる（ｎ、ｍは自然数）。これにより、従来は多段仮想化機構の各仮想計算機層で行っていたＩ／Ｏ処理を削減し、ｎ＋ｍ段目の仮想計算機上のＯＳのＩ／Ｏ性能の劣化を抑制する。
【図面の簡単な説明】
【００１３】
【図１】本発明の適用可能な環境の一例を示す機器構成図
【図２】図１に示した機器構成のメモリ構成図
【図３】図１に示した仮想化機構Ａの構成図
【図４】図１に示した１ｓｔＯＳの構成図
【図５】図１に示した仮想化機構Ｂの構成図
【図６】図１に示した２ｎｄＯＳの構成図
【図７】図３に示したデバイス割当テーブルＡ、コントローラ情報Ａ、実行中情報Ａ、データテーブルＡ、使用情報Ａ、完了情報Ａ，識別子変換情報Ａ，アドレス変換情報Ａの例
【図８】図４に示した１ｓｔＯＳアドレステーブル１、接続デバイステーブル１、デバイス割当テーブル１、コントローラ情報１の例
【図９】図６に示したアドレステーブル２、キュー２、データテーブル２、使用情報２、完了情報２の例
【図１０】ゲストＯＳ生成機構により実行される１ｓｔＯＳ起動処理のフローチャート
【図１１】ドライバ生成機構により実行される１ｓｔＯＳのドライバ生成処理のフローチャート
【図１２】ドライバ生成機構により実行される仮想化機構Ａのドライバ生成処理のフローチャート
【図１３】ゲストＯＳ生成機構により実行される２ｎｄＯＳ起動処理のフローチャート
【図１４】ドライバ生成機構により実行される２ｎｄＯＳのドライバ生成処理のフローチャート
【図１５】ドライバ生成機構により実行される１ｓｔＯＳのドライバ生成処理のフローチャート
【図１６】ドライバ生成機構により実行される２ｎｄＯＳのドライバ生成処理のフローチャート
【図１７】２ｎｄＯＳのドライバにより実行されるＩ／Ｏ処理のフローチャート
【図１８】仮想化機構Ａのドライバにより実行されるＩ／Ｏ処理のフローチャート
【図１９】仮想化機構Ａのドライバにより実行されるＩ／Ｏ完了処理のフローチャート
【図２０】１ｓｔＯＳのドライバにより実行されるＩ／Ｏ完了処理のフローチャート
【図２１】２ｎｄＯＳのドライバにより実行されるＩ／Ｏ完了処理のフローチャート
【図２２】図５に示したアドレス変換情報Ｂの例
【発明を実施するための形態】
【００１４】
図１は、計算機システムの全体構成を示す。
【００１５】
計算機システムは、物理計算機（１０１）、物理計算機（１０１）に接続するデバイス（１０２）で構成される。
【００１６】
物理計算機（１０１）は、ＣＰＵ（１１１）と物理メモリ（１１２）とＩ／Ｏコントローラ（１１３）を有する。ＣＰＵ（１１１）は、１つに限定されず複数個あってもよい。物理メモリ（１１２）は、仮想化機構Ａ（１２１）、１ｓｔＯＳ（１２２）、仮想化機構Ｂ（１２３）、２ｎｄＯＳ（１２４）を有する。
【００１７】
物理計算機（１０１）上で、仮想化機構Ａ（１２１）が稼働する。仮想化機構Ａ（１２１）は、物理計算機（１０１）のＣＰＵ等の物理資源を論理的に分割することで形成される論理資源を割り当てた第一の仮想計算機の環境を、生成する。生成された第一の仮想計算機上で、１ｓｔＯＳ（１２２）が稼働する。
【００１８】
更に、１ｓｔＯＳ（１２２）が稼動する仮想計算機上で、仮想化機構Ｂ（１２３）が稼働する。仮想化機構Ｂ（１２３）は、仮想化機構Ｂが認識するＣＰＵ等の資源を論理的に分割することで形成される論理資源を割り当てた第二の仮想計算機の環境を、生成する。生成された第二の仮想計算機上で、２ｎｄＯＳ（１２４）が稼働する。
【００１９】
なお、本例では、２段の仮想化計算機環境について述べるが、２段以上の仮想計算機環境であってもよい。また、本例では仮想化機構Ａ上に１台の仮想計算機を生成しその仮想計算機上で１ｓｔＯＳを稼働させているが、仮想化機構Ａ上に複数台の仮想計算機を生成し各々の仮想計算機上で１ｓｔＯＳを稼働させてもよい。また、仮想化機構Ｂ上に１台の仮想計算機を生成し，その仮想計算機上で２ｎｄＯＳを稼働させているが、仮想化機構Ｂ上に複数台の仮想計算機を生成し，各々の仮想計算機上で２ｎｄＯＳを稼働させてもよい。
【００２０】
図２は、各仮想化機構とＯＳへの、メモリ割り当ての様子を示す。
【００２１】
物理計算機（１０１）は、物理メモリ（１１２）を搭載する。仮想化機構Ａ（１２１）は、物理メモリ（１１２）を認識し、物理メモリ（１１２）の一部を仮想的なメモリ（２０１）として、仮想計算機に割り当てる。仮想計算機上で稼働する１ｓｔＯＳ（１２２）はメモリ（２０１）を認識する。
【００２２】
１ｓｔＯＳ（１２２）上では、仮想化機構Ｂ（１２３）が稼働する。１ｓｔＯＳ（１２２）は、１ｓｔＯＳ（１２２）が認識するメモリである仮想的なメモリ（２０１）の一部をメモリ（２０２）として、仮想化機構Ｂ（１２３）からの操作を許可する。
【００２３】
仮想化機構Ｂ（１２３）は、操作を許可された仮想的なメモリ（２０２）の一部を仮想的なメモリ（２０３）として、仮想計算機に割り当てる。仮想計算機上で稼働する２ｎｄＯＳ（１２４）はメモリ（２０２）を認識する。
【００２４】
２ｎｄＯＳ（１２４）の認識する仮想的なメモリ（２０３）は，仮想化機構Ａ（１２１）の認識する物理メモリ（１１２）に含まれる。２ｎｄＯＳは、認識しているメモリ（２０３）に、２ｎｄＯＳが認識するアドレス番地ａ３を用いて、アクセスする。ここで、２ｎｄＯＳが用いるアドレス番地は，仮想化機構Ａ及び仮想化機構Ｂの各々でアドレス変換処理が行われた後の値であり，仮想化機構Ａが認識する物理メモリにおけるアドレス番地ａ０の値とは異なる。そのため，２ｎｄＯＳが物理メモリにアクセスする際に、２ｎｄＯＳの認識するアドレス番地を用いても，２ｎｄＯＳの意図するようにアクセスすることはできない。
【００２５】
本例では，１ｓｔＯＳの認識する仮想メモリ（２０１）上に確保した共有領域のアドレスａ１及び共有領域のサイズを、仮想化機構Ａに通知する。仮想化機構Ａはアドレス変換を行い，１ｓｔＯＳの認識するアドレスａ１を仮想化機構Ａの認識するアドレスａ０に変換する。１ｓｔＯＳは、アドレスａ１と仮想化機構Ａに通知した共有領域のサイズとを用いる。仮想化機構Ａは、アドレスａ０と１ｓｔＯＳから通知された共有領域のサイズを用いる。これにより、両機構から共有領域にアクセスが可能となる。
【００２６】
また，１ｓｔＯＳは、２ｎｄＯＳにも，共有領域のアドレス及び共有領域のサイズを、通知する。この際，１ｓｔＯＳは，１ｓｔＯＳが認識する共有領域のアドレスａ１ではなく、２ｎｄＯＳが認識する共有領域のアドレスａ３を，２ｎｄＯＳに通知する。
【００２７】
以上により，１ｓｔＯＳはアドレスａ１を，仮想化機構Ａはアドレスａ０を，２ｎｄＯＳはアドレスａ３を用いることで，全機構から共有領域にアクセスすることができる。
【００２８】
同様の方式により，仮想化機構Ａ，１ｓｔＯＳ，２ｎｄＯＳからアクセス可能な領域である通知領域を確保する。１ｓｔＯＳはアドレスｂ１を，仮想化機構Ａはアドレスｂ０を，２ｎｄＯＳはアドレスｂ３を用いることで，全機構から通知領域にアクセスすることができる。
【００２９】
同様の方式により，１ｓｔＯＳ，２ｎｄＯＳからアクセス可能な領域であるイベント通知領域を確保する。１ｓｔＯＳはアドレスｃ１を，２ｎｄＯＳはアドレスｃ２を用いることで，両機構からイベント通知領域にアクセスすることができる。
【００３０】
以上の方法で，２ｎｄＯＳ，１ｓｔＯＳ，仮想化機構Ａからアクセス可能な共有領域を設定することができる。そして、共有領域を介することで，２ｎｄＯＳと仮想化機構Ａの間で，１ｓｔＯＳや仮想化機構Ｂを経由することなく、データの通信が可能となる。
【００３１】
図３は、仮想化機構Ａ（１２１）の構成を示す。
【００３２】
仮想化機構Ａ（１２１）には、物理メモリ（１１２）が割り当てられている。物理メモリ（１１２）には、ドライバＡ（３０１）、デバイス割当テーブルＡ（３０２）、アドレス変換機構Ａ（３０３）、識別子変換機構Ａ（３０４）、ゲストＯＳ生成機構Ａ（３０５）、ドライバ生成機構Ａ（３０６），ドライバ群Ａ（３０７）が格納される。
【００３３】
ドライバＡ（３０１）は、共有領域Ａ（３１１）、通知領域Ａ（３１２）、Ｉ／Ｏ完了部Ａ（３１３）、Ｉ／Ｏ実行部Ａ（３１４）、コントローラ情報Ａ（３１５）、実行中情報Ａ（３１６）を有する。
【００３４】
共有領域Ａ（３１１）は、データ格納領域Ａ（３２１）、データテーブルＡ（３２２）、使用情報Ａ（３２３）、完了情報Ａ（３２４）で構成される。データテーブルＡ（３２２），使用情報Ａ（３２３），完了情報Ａ（３２４）はサイズが固定されている。共有領域Ａ（３１１）を確保した時点で，データ格納領域Ａ（３２１），データテーブルＡ（３２２），使用情報Ａ（３２３），完了情報Ａ（３２４）の領域のアドレスが定まる。
【００３５】
アドレス変換機構Ａ（３０３）は，アドレス変換情報Ａ（３６１）を有する。
【００３６】
識別子変換機構Ａ（３０４）は，識別子変換情報Ａ（３５１）を有する。
【００３７】
ゲストＯＳ生成機構Ａ（３０５）は、ゲストＯＳ起動部Ａ（３３１）を有する。
【００３８】
ドライバ生成機構Ａ（３０６）は自ドライバ生成部Ａ（３４１）を有する。
【００３９】
図４は、１ｓｔＯＳ（１２２）の構成を示す。
【００４０】
１ｓｔＯＳ（１２２）は、メモリ（２０１）を有する。メモリ（２０１）には、仮想化機構Ｂ（１２３）、ドライバ１（４０１）、１ｓｔＯＳアドレステーブル１（４０２）、接続デバイステーブル１（４０３）、デバイス割当テーブル１（４０４）、ゲストＯＳ生成機構１（４０５）、ドライバ生成機構１（４０６），イベント通知領域１（４０７）が格納される。
【００４１】
ドライバ１（４０１）は、共有領域１（４１１）、通知領域１（４１２）、コントローラ情報１（４１３）、割込受信部１（４１４）、割込発行部１（４１５）、ドライバ生成部１（４１６），通知領域サイズ１（４１７），共有領域サイズ１（４１８）を有する。
【００４２】
共有領域１（４１１）は、図２において１ｓｔＯＳのメモリ２０１のアドレスa１から始まる領域であり，これは図２において物理メモリ１１２のアドレスａ０から始まる共有領域Ａ（３１１）と同じ領域である。
【００４３】
通知領域１（４１２）は，図２において１ｓｔＯＳのメモリ２０１のアドレスｂ１から始まる領域であり，これは図２において物理メモリ１１２のアドレスｂ０から始まる通知領域Ａ（３１２）と同じ領域である。通知領域サイズ１（４１７）および共有領域サイズ１（４１８）には，通知領域１（４１２），共有領域１（４１１）のサイズが格納されている。本実施例では，通知領域サイズ１（４１７），共有領域サイズ１（４１８）には予め値が格納されていることを想定しているが，ユーザにより値を変更することも可能である。
【００４４】
ゲストＯＳ生成機構１（４０５）は、ゲストドライバ割当部１（４２１）、ゲストＯＳ起動部１（４２２）を有する。
【００４５】
ドライバ生成機構１（４０６）は、自ドライバ生成部１（４３１）、ゲストドライバ生成部１（４３２）、通知部１（４３３）を有する。
【００４６】
図５は、仮想化機構Ｂ（１２３）の構成を示す。
【００４７】
仮想化機構Ｂ（１２３）は、メモリ（２０２）を有する。メモリ（２０２）には、アドレス変換機構Ｂ（５０１）が格納される。アドレス変換機構Ｂ（５０１）は，アドレス変換情報Ｂ（５１１）を有する。
【００４８】
図６は、２ｎｄＯＳ（１２４）の構成を示す。
【００４９】
２ｎｄＯＳ（１２４）は、メモリ（２０３）を有する。メモリ（２０３）には、ドライバ２（６０１）、ドライバ生成機構２（６０２）、アプリケーション２（６０３），イベント通知領域２（６０４）が格納される。
【００５０】
イベント通知領域２（６０４）は，図２において２ｎｄＯＳのメモリ２０３のアドレスｃ２から始まる領域であり，これは図２において１ｓｔＯＳのメモリ２０１のアドレスｃ１から始まるイベント通知領域１（４０７）と同じ領域である。
【００５１】
ドライバ２（６０１）は、共有領域２（６１１）、通知領域２（６１２）、アドレステーブル２（６１３）、キュー２（６１４）、一時格納領域２（６１５）、割込受信部２（６１６）、Ｉ／Ｏ実行部２（６１７）を有する。
【００５２】
共有領域２（６１１）は、図２において２ｎｄＯＡのメモリ２０３のアドレスa２から始まる領域であり，図２において１ｓｔＯＳのメモリ２０１のアドレスａ１から始まる共有領域１（４１１）および図２において物理メモリ１１２のアドレスa０から始まる共有領域Ａ（３１１）と、同じ領域である。
【００５３】
通知領域２（６１２）は，図２において２ｎｄｏＯＳのメモリ２０３のアドレスｂ２から始まる領域であり，図２において１ｓｔＯＳのメモリ２０１のアドレスｂ１から始まる通知領域１（４１２）および図２において物理メモリ１１２のアドレスｂ０から始まる通知領域Ａ（３１２）と同じ領域である。
【００５４】
共有領域２（６１１）は、データ格納領域２（６２１）、データテーブル２（６２２）、使用情報２（６２３）、完了情報２（６２４）で構成される。データテーブル２（６２２），使用情報２（６２３），完了情報２（６２４）はサイズが固定されている。共有領域２（６１１）を確保した時点で，データ格納領域２（６２１），データテーブル２（６２２），使用情報２（６２３），完了情報２（６２４）の領域のアドレスが定まるドライバ生成機構２（６０２）は、ドライバ生成部２（６３１）を有する。
【００５５】
図７に、デバイス割当テーブルＡ（３０２）、コントローラ情報Ａ（３１５）、実行中情報Ａ（３１６）、データテーブルＡ（３２２）、使用情報Ａ（３２３）、完了情報Ａ（３２４），識別子変換情報Ａ（３５１），アドレス変換情報Ａ（３６１）を示す。
【００５６】
デバイス割当テーブルＡ（３０２）には、デバイス割当対象となる仮想計算機を識別する名前７１１と、名前７１１で特定される仮想計算機に割り当てるデバイスを識別する識別子７１２と、を格納する。例えば７１０は、１ｓｔＯＳ１という名前で識別される仮想計算機に、識別子００：１６．０で識別されるデバイスを割り当てることを示している。これらの情報は、例えばユーザにより指定され格納される。
【００５７】
コントローラ情報Ａ（３１５）には、コントローラ情報Ａ（３１５）を有するドライバＡ（３１１）が対応するデバイスを識別する識別子７２１を格納する。例えば７２０は、コントローラ情報Ａ（３１５）を有するドライバＡ（３０１）は識別子００：１６．０で識別されるデバイスに対応していることを示している。
【００５８】
実行中情報Ａ（３１６）には、データテーブルＡ（３２２）内に格納されている，発行中のＩ／Ｏ要求を特定するインデックス７３１と，特定したＩ／Ｏ要求を発行しているデバイス（１０２）のアドレス７３２とを格納する。例えば７３０は、データテーブルＡ（３２２）のインデックス３で特定される行に、格納された情報から特定されるＩ／Ｏ要求を、デバイス（１０２）のアドレス１２８に発行中であることを示す。
【００５９】
データテーブルＡ（３２２）には、実行中情報Ａ（３１６），使用情報Ａ（３２３），完了情報Ａ（３２４）等でデータテーブルＡ（３２２）内の行を特定するために使用されるインデックス７４１、Ｉ／Ｏ要求の格納されているアドレス７４２、Ｉ／Ｏ要求のサイズ７４３を格納する。例えば７４０は、データテーブルＡ（３２２）においてインデックス１で特定される行であり、この行は、データ格納領域Ａ（３２１）のアドレス１０２４からサイズ４の領域に、Ｉ／Ｏ要求を格納していることを示している。
【００６０】
使用情報Ａ（３２３）には、データテーブルＡ（３２３）内に格納されている，未発行のＩ／Ｏ要求を特定するインデックス７５１を格納する。例えば７５０は、データテーブルＡ（３２２）のインデックス１の行に格納された情報から特定されるＩ／Ｏ情報が、まだデバイス（１０２）に対して発行されていないことを示している。
【００６１】
完了情報Ａ（３２４）には、データテーブルＡ（３２３）内に格納されている，２ｎｄＯＳ（１２４）の受け取りを待っている状態のＩ／Ｏ要求を特定するインデックス７６１を格納する。例えば７６０は、データテーブルＡ（３２２）のインデックス２の行に格納された情報から特定されるＩ／Ｏ情報が、まだ２ｎｄＯＳ（１２４）に受け取られていないことを示している。
【００６２】
アドレス変換情報Ａ（３６１）は，仮想化機構Ａ（１２１）が認識するアドレスである仮想化機構アドレス（７８１）と，仮想化機構アドレス（７８１）で特定されるメモリを割り当てている仮想計算機を特定する１ｓｔＯＳ名（７８２）と，１ｓｔＯＳ名（７８２）で特定される仮想計算機が認識する変換された仮想化機構アドレス（７８１）である１ｓｔＯＳアドレス（７８３）とを有する。例えば７８０は，仮想化機構Ａ（１２１）においてａａｂｃと認識されるアドレスが示すメモリは，１ｓｔＯＳ１という名前で特定される１ｓｔＯＳにおいては，００００というアドレスでアクセスできるメモリとして認識されることを示している。
【００６３】
本アドレス変換情報Ａ（３６１）を用いることで，仮想化機構Ａの認識する共有領域Ａのアドレスａ０と，１ｓｔＯＳの認識する共有領域１のアドレスａ１を変換することができる。また，仮想化機構Ａの認識する通知領域Ａのアドレスｂ０と，１ｓｔＯＳの認識する通知領域１のアドレスｂ１を変換することができる。
【００６４】
本実施例では，アドレス変換情報Ａは，１ｓｔＯＳ名（７８２）を用いることで，一つのテーブルに複数の仮想計算機のアドレス変換情報を有している。複数のアドレス変換情報Ａを持つことで，１ｓｔＯＳ名（７８２）を用いずに，仮想計算機毎にアドレス変換情報を有してもよい。
【００６５】
図８に、１ｓｔＯＳアドレステーブル１（４０２）、接続デバイステーブル１（４０３）、デバイス割当テーブル１（４０４）、コントローラ情報１（４１３）を示す。
【００６６】
１ｓｔＯＳアドレステーブル１（４０２）には、デバイスを識別する識別子８１１、識別子８１１で識別されるデバイスに対応するドライバの使用する通知領域アドレス８１２、通知領域サイズ８１３、共有領域アドレス８１４、共有領域サイズ８１５を格納する。例えば８１０は、識別子０２：００．１で識別されるデバイス（１０２）に対するドライバ１（４０１）の持つ通知領域１（４１２）が、アドレス１２８からサイズ６４で確保されていること、及び共有領域１（４１１）が、アドレス５１２からサイズ１０２４で確保されていること、を示す。なお，１ｓｔＯＳアドレステーブル１（４０２）には，１ｓｔＯＳが起動し，１ｓｔＯＳにデバイスが接続されたことを認識したタイミングで，適宜，行が追加されていく。
【００６７】
接続デバイステーブル１（４０３）には、１ｓｔＯＳ（１２２）に接続しているデバイスの識別子８２１、識別子８２１で識別されるデバイスの名前８２２を格納する。例えば８２０は、識別子０２：００．１で識別される、名前がＥｔｎｅｒｎｅｔ  Ｃｏｎｔｒｏｌｌｅｒで特定されるデバイス（１０２）が，１ｓｔＯＳ（１２２）に接続されていること、を示している。
【００６８】
デバイス割当テーブル１（４０４）には、２ｎｄＯＳが稼働する仮想計算機の名前８３１と，名前８３１で特定される仮想計算機に割り当てるデバイスを特定する識別子８３２とを格納する。例えば８３０は、名前ゲスト１で特定される２ｎｄＯＳが稼働する仮想計算機に、識別子０２：００．１で特定されるデバイスを割り当てることを示している。
【００６９】
コントローラ情報１（４１３）には、コントローラ情報１（４１３）を有するドライバ１（４０１）が対応するデバイスを識別する識別子８４１を格納する。例えば８４０は、コントローラ情報１（４１３）を有するドライバ１（４０１）が、識別子０２：００．１で識別されるデバイスに対応していることを示している。
【００７０】
図２２に，アドレス変換情報Ｂ（５１１）を示す。アドレス変換情報Ｂ（５１１）は，１ｓｔＯＳ（１２２）が認識するアドレスである１ｓｔＯＳアドレス（２２０１）と，１ｓｔＯＳアドレス（２２０１）で特定されるメモリを割り当てている２ｎｄＯＳ（１２４）を特定するゲスト名（２２０２）と，ゲスト名（２２０２）で特定される２ｎｄＯＳ（１２４）の認識する変換された１ｓｔＯＳアドレス（２２０１）であるゲストアドレス（２２０３）とを有する。例えば２２２０は，１ｓｔＯＳ（１２２）において８７６５と認識されるアドレスが示すメモリは，ゲスト１という名前で特定される２ｎｄＯＳ（１２４）においては，００００というアドレスでアクセスできるメモリとして認識されることを示している。
【００７１】
本アドレス変換情報Ｂ（５１１）を用いることで，１ｓｔＯＳの認識する共有領域１のアドレスａ１と，２ｎｄＯＳの認識する共有領域２のアドレスａ２を変換することができる。また，１ｓｔＯＳｎｏ認識する通知領域１のアドレスｂ１と，２ｎｄＯＳの認識する通知領域２のアドレスｂ２を変換することができる。
【００７２】
本実施例では，アドレス変換情報Ｂは，１ｓｔＯＳ名（７８２）を用いることで，一つのテーブルに複数の仮想計算機のアドレス変換情報を有している。複数のアドレス変換情報Ｂを持つことで，ゲスト名（２２０２）を用いずに，仮想計算機毎にアドレス変換情報を有してもよい。
【００７３】
図９に、アドレステーブル２（６１３）、キュー２（６１４）、データテーブル２（６２２）、使用情報２（６２３）、完了情報２（６２４）を示す。
【００７４】
アドレステーブル２（６１３）には、アドレステーブル２（６１３）を有するドライバ２（６０１）の対応するデバイスを識別する識別子９１１、アドレステーブル２（６１３）を有するドライバ２（６０１）の使用する通知領域２と共有領域２を特定する，通知領域アドレス９１２、通知領域サイズ９１３、共有領域アドレス９１４、共有領域サイズ９１５を格納する。例えば９１０は、識別子０２：００．１で識別されるデバイスに対応するドライバの持つ通知領域２が、アドレス８からサイズ６４で確保されていること、及び共有領域２が、アドレス２５６からサイズ１０２４で確保されていること、を示す。
【００７５】
キュー２（６１４）には、未実行のＩ／Ｏ要求の格納されている領域のアドレス９２１とサイズ９２２を格納する。例えば９２０は、２ｎｄＯＳ（１２４）上のメモリ（２０３）のアドレス１６からサイズ１６の領域に格納されているＩ／Ｏ要求は、まだ実行されていないことを示す。
【００７６】
データテーブル２（６２２），使用情報２（６２３），完了情報２（６２４）には，それぞれデータテーブルＡ（３２２），使用情報Ａ（３２３），完了情報Ａ（３２４）と同じ情報が格納される。
【００７７】
図１０に、仮想化機構Ａ（１２１）のゲストＯＳ生成機構Ａ（３０５）が有するゲストＯＳ起動部Ａ（３３１）の処理フローチャートを示す。
【００７８】
１ｓｔＯＳの起動が開始されると，ゲストＯＳ起動部Ａ（３３１）は、デバイス割当テーブルＡ（３０２）を参照する（ステップ１００１）。
【００７９】
ゲストＯＳ起動部Ａ（３３１）は、デバイス割当テーブルＡ（３０２）から，ステップ１００１で起動を開始した１ｓｔＯＳの名前と一致する名前７１１を有する行７１０に格納されているデバイスの識別子７１２を取得する。（ステップ１００２）
ゲストＯＳ起動部Ａ（３３１）は、ステップ１００２で取得したデバイスの識別子７１２で特定されるデバイスをステップ１００１で起動を開始した１ｓｔＯＳ１，例えば１ｓｔＯＳ１２２に割り当てて，１ｓｔＯＳの起動を継続する（ステップ１００３）。
【００８０】
図１１に、１ｓｔＯＳ（１２２）のドライバ生成機構１（４０６）の処理フローチャートを示す。
【００８１】
１ｓｔＯＳ（１２２）のドライバ生成機構１（４０６）が有する自ドライバ生成部１（４３１）は、ステップ１００２で与えられたデバイスの識別子７１２の情報を取得し、識別子７１２と，１ｓｔＯＳ（１２２）が認識する識別子７１２で特定されるデバイスの情報である名前を，それぞれ識別子８２１，名前８２２として接続デバイステーブル１（４０３）に格納する（ステップ１１０１）。
【００８２】
自ドライバ生成部１（４３１）は、ステップ１１０１におけるデバイス識別子７１２の格納後の接続デバイステーブル１（４０３）を、識別子７１２で特定されるデバイスが有する通知領域および共有領域を作成するために、走査する（ステップ１１０２）。
【００８３】
接続デバイステーブル１（４０３）に、未走査の行がある場合、自ドライバ生成部１（４３１）は、未走査の行８２０の識別子（８２１）のデバイスに対応するドライバ１（４０１）を展開する（ステップ１１０３）。
【００８４】
自ドライバ生成部１（４３１）は、１ｓｔＯＳのドライバ１（４０１）に、割当てるデバイスの識別子８２１を格納したコントローラ情報１（４１３）を、格納する（ステップ１１０４）。
【００８５】
自ドライバ生成部１（４３１）は、１ｓｔＯＳのドライバ１（４０１）内に，通知領域サイズ１（４１７）に格納されているサイズの通知領域１（４１２）を生成して、生成した通知領域１（４１２）のアドレスｂ１を取得する（ステップ１１０５）。
【００８６】
自ドライバ生成部１（４３１）は、１ｓｔＯＳのドライバ１（４０１）内に，共有領域サイズ１（４１８）に格納されているサイズを空き領域から確保することで、共有領域１（４１１）を生成する。そして、生成した共有領域１（４１１）の始点をアドレスａ１とし、そのアドレスa１を取得する（ステップ１１０６）。
【００８７】
自ドライバ生成部１（４３１）は、割当てるデバイスの識別子（８２１）、ステップ１１０５で取得した通知領域１（４１２）のアドレスｂ１、ステップ１１０５で生成した通知領域１（４１２）のサイズ、ステップ１１０６で取得した共有領域１（４１１）のアドレスａ１、ステップ１１０６で生成した共有領域１（４１１）のサイズを、１ｓｔＯＳアドレステーブル１（４０２）に格納する（ステップ１１０７）。
【００８８】
ステップ１１０２で全ての行の走査が終了した場合、１ｓｔＯＳ（１２２）のドライバ生成機構１（４０６）が有する通知部１（４３３）は、仮想化機構Ａ（１２１）に、１ｓｔＯＳアドレステーブル１（４０２）の情報を通知する（ステップ１１０８）。
【００８９】
図１２に、仮想化機構Ａ（１２２）のドライバ生成機構Ａ（３０６）の処理フローチャートを示す。
【００９０】
仮想化機構Ａ（１２２）のドライバ生成機構Ａ（３０６）が有する自ドライバ生成部Ａ（３４１）は、ステップ１１０８で通知された１ｓｔＯＳアドレステーブル１（４０２）の情報を受信し，メモリ（１１２）上に保持する（ステップ１２０１）。
【００９１】
自ドライバ生成部Ａ（３４１）は、ステップ１２０１にて受信してメモリ（１１２）上に保持している１ｓｔＯＳメモリアドレステーブル１（４０２）を、１ｓｔＯＳメモリアドレステーブルに格納されているデバイスに対応するドライバを展開するために走査する（ステップ１２０２）。
【００９２】
１ｓｔＯＳメモリアドレステーブル１（４０２）に未走査の行８１０がある場合、自ドライバ生成部Ａ（３４１）は、未走査の行８１０からドライバを展開するデバイスの識別子８１１を取得する。識別変換機構Ａ（３０４）は，取得した識別子８１１に対して，識別子変換情報Ａ（３５１）を用いて、１ｓｔＯＳ（１２２）が認識する識別子７７２から仮想化機構Ａ（１２１）が認識する識別子７７１に値を変換する（ステップ１２０３）。
【００９３】
自ドライバ生成部Ａ（３４１）は、ステップ１２０３で変換した識別子７７１で識別されるデバイスに対応するドライバＡ（３０１）を、前記物理メモリに展開する（ステップ１２０４）。
【００９４】
自ドライバ生成部Ａ（３４１）は、ドライバＡ（３０１）のコントローラ情報Ａ（３１５）に、ステップ１２０３で仮想化機構Ａが認識する値に変換した識別子７７１を格納する（ステップ１２０５）。
【００９５】
自ドライバ生成部Ａ（３４１）は、ステップ１２０３にて識別子８１１を取得した１ｓｔＯＳメモリアドレステーブル１（４０２）の行から、通知領域アドレス８１２および共有領域アドレス８１４を取得する。アドレス変換機構Ａ（３０３）は，通知領域アドレス８１２と共有領域アドレス８１４を，アドレス変換情報Ａ（３６１）を用いて、１ｓｔＯＳ（１２２）が認識するアドレスから仮想化機構Ａ（１２１）が認識するアドレスに値を変換する（ステップ１２０６）。
【００９６】
自ドライバ生成部Ａ（３４１）は、ステップ１２０３にて識別子８１１を取得した１ｓｔＯＳメモリアドレステーブル１（４０２）の行から取得する通知領域サイズ（８１３）と，ステップ１２０６で１ｓｔＯＳ（１２２）が認識するアドレスから仮想化機構Ａ（１２１）が認識するアドレスに変換した通知領域アドレスとから指定される領域を、通知領域Ａ（３１２）として、ドライバＡ（３０１）に格納する（ステップ１２０７）。
【００９７】
自ドライバ生成部Ａ（３４１）は、ステップ１２０３にて識別子８１１を取得した１ｓｔＯＳメモリアドレステーブル１（４０２）の行から取得する共有領域サイズ（８１５）と，ステップ１２０６で１ｓｔＯＳ（１２２）が認識するアドレスから仮想化機構Ａ（１２１）が認識するアドレスに変換した共有領域アドレスとから指定される領域を共有領域Ａ（３１１）として、ドライバＡ（３０１）に格納する（ステップ１２０８）。
【００９８】
ステップ１２０８の終了後に、ステップ１２０２に戻る。そして、ステップ１２０２において全ての行の走査が終了した場合、処理を完了する。
【００９９】
図１３に、１ｓｔＯＳ（１２２）のゲストＯＳ生成機構１（４０５）の処理フローチャートを示す。
【０１００】
接続デバイステーブル１（４０３）に格納されている行８２０の識別子８２１により識別されるデバイスを割り当てる２ｎｄＯＳ（１２４）の起動を開始すると，１ｓｔＯＳ（１２２）のゲストＯＳ生成機構１（４０５）が有するゲストドライバ割当部１（４２１）は、起動した２ｎｄＯＳ（１２４）を識別する名前を，デバイス割当テーブル１（４０４）に格納する。
【０１０１】
また，接続デバイステーブル１（４０３）から取得した識別子８２１を２ｎｄＯＳ（１２４）に割り当てるデバイスの識別子８３２として，デバイス割当テーブル１（４０４）に格納する。（ステップ１３０１）。なお、接続デバイステーブル１（４０３）のどの行を選択するかは、例えばユーザによって指定される。
【０１０２】
１ｓｔＯＳ（１２２）のゲストＯＳ生成機構１（４０５）が有するゲストＯＳ起動部１（４２２）は、ステップ１３０１でデバイス割当テーブルに格納した，２ｎｄＯＳ（１２４）に割り当てるデバイスの識別子８２１を引数として、名前８３１で特定される２ｎｄＯＳ（１２４）の起動を継続する。 （ステップ１３０２）。
【０１０３】
図１４に、２ｎｄＯＳ（１２４）のドライバ生成機構２（６０２）の処理フローチャートを示す。
【０１０４】
２ｎｄＯＳ（１２４）のドライバ生成機構２（６０２）が有するドライバ生成部２（６３１）は、２ｎｄＯＳ（１２４）が起動すると，ステップ１３０２により２ｎｄＯＳ（１２４）に割り当てられたデバイスに対応するドライバを展開するために，イベント通知領域２（６０４）に、アクセスする（ステップ１４０１）。
【０１０５】
ドライバ生成部２（６３１）は、１ｓｔＯＳ（１２２）からの割込を待つ（ステップ１４０２）。
【０１０６】
図１５に、１ｓｔＯＳ（１２２）のドライバ生成機構１（４０６）のフローチャートを示す。
【０１０７】
１ｓｔＯＳ（１２２）のドライバ生成機構１（４０６）のゲストドライバ生成部１（４３２）は、ステップ１４０１で発生した２ｎｄＯＳ上のドライバ生成部２（６３１）からイベント通知領域２（６０４）へのアクセスを受け取る。イベント通知領域１（４０７）は図２において１ｓｔＯＳのメモリ２０１のアドレスｃ１から始まる領域であり，これは図２において２ｎｄＯＳのメモリ２０３のアドレスｃ２から始まる領域であるイベント通知領域２（６０４）と同じ領域を示している。（ステップ１５０１）。
【０１０８】
ゲストドライバ生成部１（４３２）は、通知領域１と共有領域１のアドレスを取得するために，コントローラ情報１（４１３）に格納されている識別子（８４１）を用いて１ｓｔＯＳアドレステーブル１（４０２）を走査する（ステップ１５０２）。
【０１０９】
１ｓｔＯＳアドレステーブル１（４０２）に未走査の行が残っている場合、ゲストドライバ生成部１（４３２）は、コントローラ情報１（４１３）に格納されている識別子８４１と１ｓｔＯＳアドレステーブル１（４０２）の未走査の行８１０の識別子８１１とが一致するかを、調査する（ステップ１５０３）。
【０１１０】
ステップ１５０３において，識別子が一致しない場合、ステップ１５０２に戻る。
【０１１１】
ステップ１５０３において，識別子が一致する場合、ゲストドライバ生成部１（４３２）は、ステップ１５０３で識別子８４１と一致する識別子８１１を持つとして選択した行８１０から通知領域アドレス８１２と共有領域アドレス８１４を取得する。そして、ゲストドライバ生成部１（４３２）は、仮想化機構Ｂ（１２３）の有するアドレス変換機構Ｂ(５０１)を用いて、アドレス変換情報Ｂ（５１１）を参照し，１ｓｔＯＳ（１２２）が認識している値２２０１から、２ｎｄＯＳ（１２４）が認識する値２２０３に変換する（ステップ１５０４）。
【０１１２】
ここで、ゲストドライバ生成部１が、仮想化仮想化機構Ｂ内のアドレス変換機構を用いたり、テーブルを参照したりできる理由を説明する。図２より，仮想化機構Ｂのメモリは、１ｓｔＯＳのメモリに含まれている。仮想化機構Ｂ上のデータは，１ｓｔＯＳからはアクセス可能とされている。そのため，１ｓｔＯＳ内の各種機構、例えばゲストドライバ生成部１は，仮想化機構Ｂ上のデータにアクセスすることができる。
【０１１３】
ドライバ生成機構１（４０６）の通知部１（４３３）は、１ｓｔＯＳアドレステーブル１（４０３）の通知領域アドレス８１２と共有領域アドレス８１４を、ステップ１５０４で変換した値に変更して、通知領域サイズ１（４１７）と共有領域サイズ１（４１８）とともに，イベント通知領域１（４０７）を用いて２ｎｄＯＳ（１２４）に通知する（ステップ１５０５）。ステップ１５０２に戻る。
【０１１４】
ステップ１５０２において、全ての行の走査が終わった場合、処理を終了する。
【０１１５】
図１６に、２ｎｄＯＳ（１２４）のドライバ生成機構２（６０２）の処理フローチャートを示す。
【０１１６】
２ｎｄＯＳ（１２４）のドライバ生成機構２（６０２）が有するドライバ生成部２（６３１）は、ステップ１５０５でイベント通知領域１（４０７）を用いて通知された，ステップ１４０１でイベント通知機構２アクセスしたドライバ生成部２（４３２）が展開するデバイスに対応するドライバ２（６０１）の通知領域アドレスと通知領域サイズと共有領域アドレスと共有領域サイズを受け取り、ドライバ２（６０１）を展開する（ステップ１６０１）。
【０１１７】
ドライバ生成部２（６３１）は，ステップ１６０１で受け取った通知領域アドレスと通知領域サイズと共有領域アドレスと共有領域サイズを，２ｎｄＯＳ（１２４）のドライバ２（６０１）内のアドレステーブル２（６１３）に格納する（ステップ１６０２）。
【０１１８】
イベント通知領域１（４０７）は図２において１ｓｔＯＳのメモリ２０１のアドレスｃ１から始まる領域であり，これは図２において２ｎｄＯＳのメモリ２０３のアドレスｃ２から始まる領域であるとイベント通知領域２（６０４）と同じ領域を示している。
【０１１９】
図１７に、２ｎｄＯＳ（１２４）のドライバ２（６０１）によるＩ／Ｏ処理のフローチャートを示す。
【０１２０】
ドライバ２（６０１）のＩ／Ｏ実行部２（６１７）は、２ｎｄＯＳ上のアプリケーション２（６０３）が実行したＩ／Ｏ要求を、受け取る（ステップ１７０１）。
【０１２１】
Ｉ／Ｏ実行部２（６１７）は、ステップ１６０１で各種情報を格納されたアドレステーブル２（６１３）を参照し、共有領域アドレス９１４を取得する（ステップ１７０２）。
【０１２２】
Ｉ／Ｏ実行部２（６１７）は、ステップ１７０１で受信した全てのＩ／Ｏ要求について、処理を終えたか否かを判断する。未走査の要求がある場合、ステップ１７０４に進む。未走査の要求がない場合、すなわち全てのＩ／Ｏ要求について処理を終えた場合、ステップ１７０８に進む（ステップ１７０３）。
【０１２３】
Ｉ／Ｏ実行部２（６１７）は、ドライバ２（６０１）内のデータ格納領域（６２１）における空き領域の有無を確認する（ステップ１７０４）。
【０１２４】
ステップ１７０４で、データ格納領域（６２１）に空き領域がある場合、Ｉ／Ｏ実行部２（６１７）は、ステップ１７０３で未走査と判断したＩ／Ｏ要求を、ステップ１７０４で確認したデータ格納領域（６２１）の空き領域に格納する（ステップ１７０５）。
【０１２５】
Ｉ／Ｏ実行部２（６１７）は、データテーブル２（６２２）の全行のインデックスを調べて取得した，データテーブル２（６２２）で使用されていないインデックスと，ステップ１７０５でＩ／Ｏ要求を格納したデータ格納領域（６２１）におけるアドレスと、データ格納領域（６２１）に格納したＩ／Ｏ要求のデータサイズとを、ドライバ２（６０１）内のデータテーブル２（６２２）に格納する（ステップ１７０６）。
【０１２６】
Ｉ／Ｏ実行部２（６１７）は、ステップ１７０６で格納したデータテーブル２（６２２）のインデックスを、ドライバ２（６０１）の使用情報２（６２３）に格納する（ステップ１７０７）。
ステップ１７０７実施後，ステップ１７０３に戻る。
【０１２７】
一方、ステップ１７０３において、ドライバ２（６０１）が受け取ったＩ／Ｏ要求を全て処理した場合、Ｉ／Ｏ実行部２（６１７）は、ドライバ２（６０１）内のアドレステーブル２（６１３）を参照して、通知領域アドレス９１２を取得する（ステップ１７０８）。
【０１２８】
Ｓ１７０８の後、Ｉ／Ｏ実行部２（６１７）は、Ｉ／Ｏを発行することを１ｓｔＯＳ（１２２）に通知するために，通知領域２（６１２）に格納されている値を０から１に変更する（ステップ１７０９）。ステップ１７０９により，ドライバ２（６０１）は２ｎｄＯＳ（１２４）の認識するデバイスにＩ／Ｏ要求を発行したことになる。
【０１２９】
Ｉ／Ｏ実行部２（６１７）は、ステップ１７０９で２ｎｄＯＳ（１２４）の認識するデバイスに対して発行したＩ／Ｏが完了し，その旨を通知する割込の受信待つ（ステップ１７１０）。
【０１３０】
また、ステップ１７０４で、データ格納領域（６２１）に空き領域がなかった場合、Ｉ／Ｏ実行部２（６１７）は、取得したＩ／Ｏ要求を一時格納領域２（６１５）に格納し、一時格納領域２（６１５）の格納位置を示すアドレスおよび格納したＩ／Ｏ要求のサイズをキュー２（６１４）に格納し、処理を終える（ステップ１７１１）。
【０１３１】
なお、非同期にＩ／Ｏを実施する場合、ステップ１７０１でドライバ２（６０１）がＩ／Ｏ要求を受け取った時点で、アプリケーション２（６０３）にＩ／Ｏ完了を通知してもよい。その場合、ドライバ２（６０１）はアプリケーション２（６０３）の処理と同期することなく、ステップ１７０２以降の処理を継続する。
【０１３２】
図１８に、仮想化機構Ａ（１２１）のＩ／Ｏ実行部Ａ（３１４）の処理のフローチャートを示す。
【０１３３】
Ｉ／Ｏ実行部Ａ（３１４）は、ステップ１７０９で実行された通知領域Ａ（３１２）への書き込みを、受信する。通知領域Ａに格納されている値を０に戻す（ステップ１８０１）。通知領域２（６１２）は，図２において２ｎｄＯＳのメモリ２０３のアドレスｂ２から始まる領域であり，これは図２において物理メモリ１１２のアドレスｂ０から始まる通知領域Ａ（３１２）と同じ領域を示している。
【０１３４】
通知領域Ａ（３１２）への書き込みを受信したＩ／Ｏ実行部Ａ（３１４）は、デバイス（１０２）に対して実行するＩ／Ｏ要求の有無を調べるために，ドライバＡ（３０１）内の使用情報Ａ（３２３）を走査する（ステップ１８０２）。
【０１３５】
Ｉ／Ｏ実行部Ａ（３１４）は，使用情報Ａ（３２３）に、未走査のインデックス７５１がある場合、未走査のインデックスを取得する（ステップ１８０３）。
【０１３６】
Ｉ／Ｏ実行部Ａ（３１４）は、ステップ１８０３で取得した未走査のインデックス７５１と一致するデータテーブルＡ（３２２）のインデックスが格納された行を特定し、特定した行に格納されている，データ格納領域３２１のアドレス７４２とサイズ７４３を取得し、取得したアドレス７４２とサイズ７４３を用いてデータ格納領域３２１に格納されたＩ／Ｏ要求を取得する（ステップ１８０４）。データ格納領域２（６２１）とデータ格納領域Ａ（３２１）は同じ領域を示している。
【０１３７】
Ｉ／Ｏ実行部Ａ（３１４）は、ステップ１２０５で更新されたコントローラ情報Ａ（３１５）で特定されるデバイス（１０２）に対して、ステップ１８０４で取得したＩ／Ｏを実行する（ステップ１８０５）。
【０１３８】
Ｉ／Ｏ実行部Ａ（３１４）は、実行中情報Ａ（３１６）に、ステップ１８０５で実行したＩ／Ｏの情報が格納されていたデータテーブルＡ（３２２）の行に格納されているインデックス７４１と、ステップ１８０５で実行したＩ／Ｏの実行先のアドレスを格納する（ステップ１８０６）。
【０１３９】
Ｉ／Ｏ実行部Ａ（３１４）は、ステップ１８０６で実行したＩ／Ｏ要求に対する，デバイスからの応答を待つ（ステップ１８０７）。ステップ１８０２に戻る。
【０１４０】
使用情報Ａ（３２３）に、未走査のインデックス７５１がない場合、使用情報Ａ（３２３）の走査が完了したものとして、本フローを終了する。
【０１４１】
図１９に、仮想化機構Ａ（１２１）のＩ／Ｏ完了部Ａ（３１３）の処理フローチャートを示す。Ｉ／Ｏ完了部Ａ（３１３）は、ステップ１８０５で実行したＩ／Ｏの結果を、デバイス（１０２）から受信する（ステップ１９０１）。
【０１４２】
Ｉ／Ｏ完了部Ａ（３１３）は、実行中情報Ａ（３１６）において，アドレス７３２がステップ１９０１で受信したＩ／Ｏの実行先のアドレスと一致する行７３０を特定し、特定した行７３０からインデックス７３１を取得する。データテーブルＡ（３２２）において，インデックス７４１が取得したインデックス７３１と一致する行７４０を取得する（ステップ１９０２）。
【０１４３】
Ｉ／Ｏ完了部Ａ（３１３）は、ステップ１９０２で特定した実行中情報Ａ（３１６）の行７３０を削除する（ステップ１９０３）。
【０１４４】
Ｉ／Ｏ完了部Ａ（３１３）は、ステップ１９０１でデバイスから受信したＩ／Ｏ結果を、ステップ１９０２で取得したデータテーブル（３２２）の行７４０に格納されているアドレス７４２とサイズ７４３で特定されるデータ格納領域（３２１）内の領域に格納する（ステップ１９０４）。
【０１４５】
Ｉ／Ｏ完了部Ａ（３１３）は、使用情報Ａ（３２３）から，ステップ１９０１で取得したインデックス７３１と同じ値であるインデックスが格納された行７５０を削除する（ステップ１９０５）。
【０１４６】
Ｉ／Ｏ完了部Ａ（３１３）は、完了情報Ａ（３２４）にステップ１９０１で取得したインデックス７３１をインデックス７６１として格納する（ステップ１９０６）。
【０１４７】
Ｉ／Ｏ完了部Ａ（３１３）は、コントローラ情報Ａ（３１５）から識別子７２１を取得し、識別子７２１とデバイス割当テーブルＡ（３０２）の識別子７１２が一致する行７１０を特定して、行７１０に格納された名前７１１から１ｓｔＯＳ（１２２）を特定し、特定した１ｓｔＯＳ（１２２）にＩ／Ｏ完了割込を発行する（ステップ１９０７）。
【０１４８】
図２０は、１ｓｔＯＳ（１２２）のドライバ１（４０１）の処理フローチャートを示す。
【０１４９】
１ｓｔＯＳ（１２２）のドライバ１（４０１）の割込受信部１（４１４）は、ステップ１９０７で発行されたＩ／Ｏ完了割込を受信する（ステップ２００１）。
【０１５０】
割込発行部１（４１４）は、コントローラ情報１（４１３）から識別子８４１を取得し、デバイス割当テーブル１（４０４）を参照して、識別子８４１で特定されるデバイスが割り当っている２ｎｄＯＳ（１２４）を特定し、特定した２ｎｄＯＳ（１２４）にＩ／Ｏ完了割込を発行する（ステップ２００２）。
【０１５１】
図２１は、２ｎｄＯＳ（１２４）の割込受信部２（６１６）による２ｎｄＯＳ（１２４）のＩ／Ｏ受信処理のフローチャートを示す。
【０１５２】
割込受信部２（６１６）は、ステップ２００２で発行されたＩ／Ｏ完了割込を受信する（ステップ２１０１）。
【０１５３】
割込受信部２（６１６）は、１９０６で更新された完了情報２（６２４）を走査する（ステップ２１０２）。完了情報Ａ（３２４）と完了情報２（６２４）は同じ情報を示している。
【０１５４】
完了情報２（６２４）に未走査のインデックス９５１がある場合、割当受信部２（６１６）は、未走査のインデックス９５１を取得する（ステップ２１０３）。
【０１５５】
割込受信部２（６１６）は、ステップ２１０３で取得したインデックス９５１と一致するインデックス９３１を持つデータテーブル２（６２２）の行９３０から、データ格納領域２（６２１）のアドレス９３２とサイズ９３３とを取得する（ステップ２１０４）。
【０１５６】
割込受信部２（６１６）は、ステップ２０１４で取得したアドレスとサイズとで特定されるデータ格納領域（６２１）内の領域から、完了したＩ／Ｏ要求を取得する（ステップ２１０５）。
【０１５７】
ステップ２１０５が終了したら，ステップ２１０２に戻る。
【０１５８】
ステップ２１０２にて完了情報２（６２４）の走査が終了すると、割込受信部２（６１６）は、アプリケーション２（６０３）にＩ／Ｏの完了を通知する（ステップ２１０６）。
【０１５９】
ステップ２１０６が終了すると，割込受信部２（６１６）は、キュー２（６１４）の確認をする（ステップ２１０７）。
【０１６０】
キュー２（６１４）にＩ／Ｏ要求が格納されている場合、格納されていたＩ／Ｏ要求取得し，キュー２（６１４）から取得したＩ／Ｏ要求を削除し，取得したＩ／Ｏ要求を引数としてＩ／Ｏ実行部２（６１７）を呼び出しステップ１７０３以降の処理を実施する（ステップ２１０８）。
【０１６１】
キュー２（６１７）にＩ／Ｏ要求が格納されていない場合、２ｎｄＯＳ（１２４）のＩ／Ｏ受信処理を完了する。
【符号の説明】
【０１６２】
１０１．物理計算機
１０２．デバイス
１１１．ＣＰＵ
１１２．メモリ
１１３．Ｉ／Ｏコントローラ
１２１．仮想化機構Ａ
１２２．１ｓｔＯＳ
１２３．仮想化機構Ｂ
１２４．２ｎｄＯＳ
【図１】
2014211727.tif 000003
【図２】
2014211727.tif 000004
【図３】
2014211727.tif 000005
【図４】
2014211727.tif 000006
【図５】
2014211727.tif 000007
【図６】
2014211727.tif 000008
【図７】
2014211727.tif 000009
【図８】
2014211727.tif 000010
【図９】
2014211727.tif 000011
【図１０】
2014211727.tif 000012
【図１１】
2014211727.tif 000013
【図１２】
2014211727.tif 000014
【図１３】
2014211727.tif 000015
【図１４】
2014211727.tif 000016
【図１５】
2014211727.tif 000017
【図１６】
2014211727.tif 000018
【図１７】
2014211727.tif 000019
【図１８】
2014211727.tif 000020
【図１９】
2014211727.tif 000021
【図２０】
2014211727.tif 000022
【図２１】
2014211727.tif 000023
【図２２】
2014211727.tif 000024