(57)【特許請求の範囲】
【請求項１】
ＣＰＵと、ブリッジを介して前記ＣＰＵに接続する主記憶部と、前記ブリッジに接続するＰＣＩｅバスを介して前記ＣＰＵ及び前記主記憶部に接続し、Ｉ／Ｏ装置とデータの送受信を行うホストバスアダプタ（ＨＢＡ）とを備える計算機における入出力制御方法であって、
前記ＨＢＡは、ＨＢＡファームウエアと、記憶領域とを有し、
前記ＣＰＵは、ＯＳと、前記ＯＳ上で動作し前記ＨＢＡを制御するＨＢＡドライバを実行し、
前記主記憶部は、前記データがエンキュー又はデキューされるＩ／Ｏ応答キューと、前記Ｉ／Ｏ応答キューからエンキュー又はデキューされる前記データのキュー番号を管理する管理キューと、前記ＨＢＡの記憶領域がマッピングされたＭｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ（ＭＭＩＯ）領域とを有し、
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの管理情報を、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込み、
前記計算機が前記Ｉ／Ｏ装置からデータを受信する場合：
前記ＨＢＡファームウエアは、
前記ＰＣＩｅバスを経由して、前記Ｉ／Ｏ装置から受信した受信データを、前記Ｉ／Ｏ応答キューにエンキューし、
前記ＰＣＩｅバスを経由して、前記受信データのエンキューを、前記ＨＢＡドライバに通知し、
前記通知を受信した前記ＨＢＡドライバは、
前記受信データを、前記Ｉ／Ｏ応答キューからデキューし、
前記デキューした前記受信データを、前記ＯＳ上で動作するアプリケーションに送信し、
前記Ｉ／Ｏ応答キューは、前記Ｉ／Ｏ応答キューのエントリの有効、無効を示す識別子を有し、
前記識別子が有効を示す場合、前記エントリは、受信データがデキューされていないことを示し、
前記識別子が無効を示す場合、前記エントリは、受信データがデキューされていることを示す
ことを特徴とする入出力制御方法。
【請求項２】
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの１つ前のキュー番号を管理情報として、前記ＭＭＩＯ領域に書き込むことを特徴とする請求項１記載の入出力制御方法。
【請求項３】
前記ＨＢＡドライバは、
前記Ｉ／Ｏ応答キューから前記受信データをデキューすると、
前記管理キューを、デキューされた前記受信データのキュー番号の次の番号に更新し、
前記更新された管理キューの１つ前のキュー番号を管理情報として、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、
前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込む
ことを特徴とする請求項１記載の入出力制御方法。
【請求項４】
前記ＨＢＡの記憶領域は、
前記ＯＳにより、前記管理情報を書き込まれるＯｕｔ＿Ｆｒｅｅ＿Ｑと、
前記ＨＢＡファームウエアが次にエンキューするＩ／Ｏ応答キューのキュー番号を管理するｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅと、
前記ＨＢＡドライバから前記ＨＢＡファームウエアに通知されたＩ／Ｏ応答キューからのデキュー済み番号を管理するｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅとを有し、
前記ＨＢＡファームウエアは、
前記Ｏｕｔ＿Ｆｒｅｅ＿Ｑに書き込まれた前記管理情報を参照し、
前記参照した管理情報を、前記ｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅに書き込み、
前記ｆｗ_Ｒ_Ｉｎ_Ｑｕｅｕｅが示すキュー番号と、前記ｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅが示すキュー番号とを比較し、両者が一致しない場合に、ｆｗ_Ｒ_Ｉｎ_Ｑｕｅｕｅが示すＩ／Ｏ応答キューのキュー番号に、前記受信データをエンキューする
ことを特徴とする請求項３記載の入出力制御方法。
【請求項５】
ＣＰＵと、ブリッジを介して前記ＣＰＵに接続する主記憶部と、前記ブリッジに接続するＰＣＩｅバスを介して前記ＣＰＵ及び前記主記憶部に接続し、Ｉ／Ｏ装置とデータの送受信を行うホストバスアダプタ（ＨＢＡ）とを備える計算機における入出力制御方法であって、
前記ＨＢＡは、ＨＢＡファームウエアと、記憶領域とを有し、
前記ＣＰＵは、ＯＳと、前記ＯＳ上で動作し前記ＨＢＡを制御するＨＢＡドライバを実行し、
前記主記憶部は、前記データがエンキュー又はデキューされるＩ／Ｏ起動キューと、前記Ｉ／Ｏ起動キューからエンキュー又はデキューされる前記データのキュー番号を管理する管理キューと、前記ＨＢＡの記憶領域がマッピングされたＭｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ（ＭＭＩＯ）領域とを有し、
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの管理情報を、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込み、
前記計算機が前記Ｉ／Ｏ装置へデータを送信する場合：
前記ＨＢＡドライバは、
前記Ｉ／Ｏ装置へ送信する送信データを、前記ＯＳ上で動作するアプリケーションから受信し、
前記送信データを、前記Ｉ／Ｏ起動キューにエンキューし、
前記ＰＣＩｅバスを経由して、前記送信データのエンキューを、前記ＨＢＡファームウエアに通知し、
前記通知を受信した前記ＨＢＡファームウエアは、
前記ＰＣＩｅバスを経由して、前記送信データを、前記Ｉ／Ｏ起動キューからデキューし、
前記デキューした前記送信データを、前記Ｉ／Ｏ装置へ送信し、
前記Ｉ／Ｏ起動キューは、前記Ｉ／Ｏ起動キューのエントリの有効、無効を示す識別子を有し、
前記識別子が有効を示す場合、前記エントリは、送信データがデキューされていないことを示し、
前記識別子が無効を示す場合、前記エントリは、送信データがデキューされていることを示す
ことを特徴とする入出力制御方法。
【請求項６】
前記ＨＢＡドライバは、
前記Ｉ／Ｏ起動キューに前記送信データをエンキューすると、
前記管理キューを、デキューされた前記送信データのキュー番号の次の番号に更新し、
前記更新された管理キューの１つ前のキュー番号を管理情報として、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、
前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込む
ことを特徴とする請求項５記載の入出力制御方法。
【請求項７】
前記ＨＢＡの記憶領域は、
前記ＯＳにより、前記管理情報を書き込まれるＩｎ＿Ｆｒｅｅ＿Ｑと、
ＨＢＡドライバからＨＢＡファームウエアに通知されたＩ／Ｏ起動キューへのエンキュー済み番号をＨＢＡファームウエアが管理するｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅと、
Ｉ／Ｏ起動キューから次にデキューするキュー番号を管理するｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅとを有し、
前記ＨＢＡファームウエアは、
前記Ｉｎ＿Ｆｒｅｅ＿Ｑに書き込まれた前記管理情報を参照し、
前記参照した管理情報を、前記ｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅに書き込み、
前記ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅが示すキュー番号に対応する前記Ｉ／Ｏ起動キューのエントリから、前記送信データをデキューし、
前記ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅが示すキュー番号と前記ｆｗ_Ｓ_Ｉｎ_Ｑｕｅｕｅが示すキュー番号とを比較し、前記ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅが前記ｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅの次のキュー番号を示すまで、前記Ｉ／Ｏ起動キューから前記送信データ
をデキューする処理を繰り返す
ことを特徴とする請求項６記載の入出力制御方法。
【請求項８】
ＨＢＡファームウエアと、記憶領域とを有し、Ｉ／Ｏ装置とデータの送受信を行うホストバスアダプタ（ＨＢＡ）と、
ＯＳと、前記ＯＳ上で動作し前記ＨＢＡを制御するＨＢＡドライバとを実行するＣＰＵと、
前記データがエンキュー又はデキューされるＩ／Ｏ応答キューと、前記Ｉ／Ｏ応答キューからエンキュー又はデキューされる前記データのキュー番号を管理する管理キューと、前記ＨＢＡの記憶領域がマッピングされたＭｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ（ＭＭＩＯ）領域とを有し、ブリッジを介して前記ＣＰＵに接続する主記憶部と、
前記ＣＰＵ及び前記主記憶部と前記ＨＢＡとを、前記ブリッジを介して接続するＰＣＩｅバスとを備え、
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの管理情報を、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込み、
前記計算機が前記Ｉ／Ｏ装置からデータを受信する場合：
前記ＨＢＡファームウエアは、
前記ＰＣＩｅバスを経由して、前記Ｉ／Ｏ装置から受信した受信データを、前記Ｉ／Ｏ応答キューにエンキューし、
前記ＰＣＩｅバスを経由して、前記受信データのエンキューを、前記ＨＢＡドライバに通知し、
前記通知を受信した前記ＨＢＡドライバは、
前記受信データを、前記Ｉ／Ｏ応答キューからデキューし、
前記デキューした前記受信データを、前記ＯＳ上で動作するアプリケーションに送信し、
前記Ｉ／Ｏ応答キューは、前記Ｉ／Ｏ応答キューのエントリの有効、無効を示す識別子を有し、
前記識別子が有効を示す場合、前記エントリは、受信データがデキューされていないことを示し、
前記識別子が無効を示す場合、前記エントリは、受信データがデキューされていることを示す
ことを特徴とする計算機。
【請求項９】
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの１つ前のキュー番号を管理情報として、前記ＭＭＩＯ領域に書き込むことを特徴とする請求項８記載の計算機。
【請求項１０】
ＨＢＡファームウエアと、記憶領域とを有し、Ｉ／Ｏ装置とデータの送受信を行うホストバスアダプタ（ＨＢＡ）と、
ＯＳと、前記ＯＳ上で動作し前記ＨＢＡを制御するＨＢＡドライバとを実行するＣＰＵと、
前記データがエンキュー又はデキューされるＩ／Ｏ起動キューと、前記Ｉ／Ｏ起動キューからエンキュー又はデキューされる前記データのキュー番号を管理する管理キューと、前記ＨＢＡの記憶領域がマッピングされたＭｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ（ＭＭＩＯ）領域とを有し、ブリッジを介して前記ＣＰＵに接続する主記憶部と、
前記ＣＰＵ及び前記主記憶部と前記ＨＢＡとを、前記ブリッジを介して接続するＰＣＩｅバスとを備え、
前記ＨＢＡドライバは、前記管理キューが更新されると、更新された管理キューの管理情報を、前記ＭＭＩＯ領域に書き込み、
前記ＯＳは、前記ＭＭＩＯ領域に書き込まれた前記管理情報を、前記ＭＭＩＯ領域に対応する前記ＨＢＡの記憶領域に書き込み、
前記計算機が前記Ｉ／Ｏ装置へデータを送信する場合、
前記ＨＢＡドライバは、
前記Ｉ／Ｏ装置へ送信する送信データを、前記ＯＳ上で動作するアプリケーションから受信し、
前記送信データを、前記Ｉ／Ｏ起動キューにエンキューし、
前記ＰＣＩｅバスを経由して、前記送信データのエンキューを、前記ＨＢＡファームウエアに通知し、
前記通知を受信した前記ＨＢＡファームウエアは、
前記ＰＣＩｅバスを経由して、前記送信データを、前記Ｉ／Ｏ起動キューからデキューし、
前記デキューした前記送信データを、前記Ｉ／Ｏ装置へ送信し、
前記Ｉ／Ｏ起動キューは、前記Ｉ／Ｏ起動キューのエントリの有効、無効を示す識別子を有し、
前記識別子が有効を示す場合、前記エントリは、送信データがデキューされていないことを示し、
前記識別子が無効を示す場合、前記エントリは、送信データがデキューされていることを示す
ことを特徴とする計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｉ／Ｏ装置との間でデータの送受信を制御するＨＢＡを備える計算機に関する。
【背景技術】
【０００２】
近年、計算機システム上で処理されるデータ量は増加の一途をたどっており、膨大なデータを高速に処理することが、必要となっている。それに伴い、計算機とＩ／Ｏ装置との間の通信速度のさらなる高速化が、必要とされている。また、Ｉ／Ｏ装置とのデータ送受信を制御する計算機の高速化も、必要である。
【０００３】
オープンシステムにおける計算機では、計算機内部のＣＰＵや主記憶装置との接続に、ＰＣＩ−ＳＩＧにて策定されたＰｅｒｉｐｈｅｒａｌ Ｃｏｍｐｏｒｎｅｎｔ Ｉｎｔｅｒｃｏｎｎｅｃｔ（ＰＣＩ）バスを使用するＨｏｓｔ  Ｂｕｓ  Ａｄａｐｔｅｒ（ＨＢＡ）が広く用いられている。さらに、ＰＣＩバスに代わり、より高速化されたＰＣＩ  Ｅｘｐｒｅｓｓ（Ｒ）バス（ＰＣＩｅバス）を使用するＨＢＡも広く用いられている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００８−１０２９２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ＨＢＡがＩ／Ｏ装置との間でデータの送受信を行う際、ＨＢＡは、ＰＣＩｅバスを通って計算機上の主記憶装置に対してアクセスを行う必要がある。しかし、ＰＣＩｅバスを経由したアクセスは、ＨＢＡ上で動作するファームウェア（ＨＢＡ−Ｆ／Ｗ）のＨＢＡ内の記憶領域へのアクセスやＨＢＡドライバの主記憶装置へのアクセスと比較して、非常に低速である。ゆえに、ＰＣＩｅバスに接続されたＨＢＡがデータ送受信処理を行う際、ＰＣＩｅバスへのアクセスが、性能を低下させる要因の１つとなる。
【０００６】
まず、従来の計算機における入出力制御方法について図６を用いて説明し、図７、図８を用いて図６の計算機で発生する課題を説明する。
【０００７】
図６は、従来の計算機１１１０における入出力制御方法の一例を示している。図６を用いて、Ｉ／Ｏ装置１１１３から送信されたデータをＨＢＡ１１０６が受信した場合に、アプリケーション１１０１へ受信データを渡す処理について、説明する。
【０００８】
ＯＳ（オペレーティングシステム）１１００上では、ＨＢＡ１１０６の制御を行うＨＢＡドライバ１１０２が動作する。ＨＢＡ１１０６では、ＨＢＡ１１０６の制御、Ｉ／Ｏ装置１１１３とのデータ送受信制御や主記憶装置１１０３へのアクセス制御を行うＨＢＡ−Ｆ／Ｗ１１０７が動作している。ＨＢＡ１１０６には、記憶領域１１０８も搭載されている。
【０００９】
ＨＢＡドライバ１１０２とＨＢＡ−Ｆ／Ｗ１１０７とは、主記憶装置１１０３上に存在するＩ／Ｏ応答キュー１１１４を使用して、Ｉ／Ｏ装置１１０３から受信したデータを、ＨＢＡから主記憶装置１１０３上へ転送する。Ｉ／Ｏ応答キュー１１１４は、受信データに１つのエントリが割当てられ、同時に複数データ受信を可能とするためにＩ／Ｏ応答キュー１１１４は複数のエントリで構成される。その複数のエントリで構成されるＩ／Ｏ応答キュー１１１４のエンキュー位置は、Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１で示し、デキュー位置はＲ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２で示す。
【００１０】
また、ＨＢＡドライバ１１０２とＨＢＡ−Ｆ／Ｗ１１０７とは、主記憶装置１１０３上に存在するＩ／Ｏ起動キュー１１１５を使用して、主記憶装置１１０３から送信するデータを、ＨＢＡからＩ／Ｏ装置１１１３へ転送する。Ｉ／Ｏ起動キュー１１１５は、送信データに１つのエントリが割当てられ、同時に複数データの送信を可能とするためにＩ／Ｏ起動キュー１１１５は複数のエントリで構成される。その複数のエントリで構成されるＩ／Ｏ起動キュー１１１５のエンキュー位置は、Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３で示し、デキュー位置はＳ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４で示す。
【００１１】
エンキュー、デキューは、先頭エントリから順番に実行する。最終エントリまでのエンキュー、デキューが完了した時には、先頭エントリからエンキュー、デキューを実行する。
【００１２】
さて、ＨＢＡ１１０６がＩ／Ｏ装置１１１３から送信されたデータを受信すると、ＨＢＡ−Ｆ／Ｗ１１０７は、ＰＣＩｅバス１１０５を通じて主記憶装置１１０３にアクセスし、前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１及び前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を読込み、Ｉ／Ｏ応答キュー１１１４のエンキュー位置を確認する。その後、ＨＢＡ−Ｆ／Ｗ１１０７は、ＰＣＩｅバス１１０５を通して主記憶装置１１０３にアクセスし、確認したＩ／Ｏ応答キュー１１１４が示すエントリへデータをエンキューし、更にＰＣＩｅバス１１０５を通して主記憶装置１１０３にアクセスし、前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１を次のエントリを示す値に更新する。
【００１３】
その後、ＨＢＡドライバ１１０２は、ＨＢＡ−Ｆ／Ｗ１１０７からデータをエンキューしたことを通知されると、主記憶装置１１０３にアクセスし、前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１及び前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を読み込んで、Ｉ／Ｏ応答キュー１１１４からデキューすべきデータの格納場所をチェックする。そして、ＨＢＡドライバ１１０２は、チェックした格納場所からデキューを行い、前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を次のエントリを示す値に更新する。
【００１４】
ＨＢＡドライバ１１０２が、デキューしたデータをアプリケーション１１０１に渡すことで、Ｉ／Ｏ装置１１１３から受信したデータの処理が完了する。
【００１５】
また、ＨＢＡドライバ１１０２がＯＳ１１００からデータの送信要求を受けると、主記憶装置１１０３にアクセスし、前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３及び前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を読込み、Ｉ／Ｏ起動キュー１１１５のエンキュー位置を確認する。その後、ＨＢＡドライバ１１０２は、主記憶装置１１０３にアクセスし、確認したＩ／Ｏ起動キュー１１１５が示すエントリへデータをエンキューし、更に主記憶装置１１０３にアクセスし、前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３を次のエントリを示す値に更新する。
【００１６】
その後、ＨＢＡ−Ｆ／Ｗ１１０７は、ＨＢＡドライバ１１０２からデータをエンキューしたことを通知されると、ＰＣＩｅバス１１０５を通して主記憶装置１１０３にアクセスし、前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３及び前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を読み込んで、Ｉ／Ｏ起動キュー１１１５からデキューすべきデータの格納場所をチェックする。そして、ＨＢＡ−Ｆ／Ｗ１１０７は、ＰＣＩｅバス１１０５を通してチェックした格納場所からデキューを行い、前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を次のエントリを示す値に更新する。
【００１７】
ＨＢＡ−Ｆ／Ｗ１１０７が、デキューしたデータをＩ／Ｏ装置１１１３に対して送信することで、ＯＳ１１００から要求されたデータの送信処理が完了する。
【００１８】
図７は、従来の計算機１１１０において、Ｉ／Ｏ装置１１１３からデータを受信した際の、Ｉ／Ｏ応答キューの制御についての動作フローを示している。Ｉ／Ｏ装置１１１３からＨＢＡ１１０６がデータを受信する場合を例として、図７により、従来の計算機１１１０でＩ／Ｏ応答キューの制御を行う際に発生する課題について、説明する。
【００１９】
まず、ＨＢＡ−Ｆ／Ｗ１１０７は、Ｉ／Ｏ装置１１１３からデータを受信したことを認識すると（５００）、主記憶装置１１０３からＲ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１とＲ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を読み込む（５０１）。５０１の処理は、ＨＢＡ−Ｆ／Ｗ１１０７が、ＰＣＩｅバス１１０５を通じて、主記憶装置１１０３にアクセスする必要がある。
【００２０】
次に、ＨＢＡ−Ｆ／Ｗ１１０７は、前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２と前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１からＩ／Ｏ応答キュー１１１４のエンキュー可否をチェックし、エンキュー不可であると判断した場合、エンキュー可となるまでエンキューを保留する（５０２）。
【００２１】
５０２でエンキュー可と判断したら、ＨＢＡ−Ｆ／Ｗ１１０７は、前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１が示す主記憶装置１１０３のエントリに対して、受信したデータを書き込み（５０３）、前記Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１を次のエントリを示す値に更新し、主記憶装置１１０３に更新したＲ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１の値を書き込む（５０４）。５０１の処理と同様に、５０３及び５０４の処理においてもＨＢＡ−Ｆ／Ｗ１１０７はＰＣＩｅバス１１０５を通じて主記憶装置１１０３にアクセスする必要がある。
【００２２】
次に、ＨＢＡ−Ｆ／Ｗ１１０７は、ＨＢＡドライバ１１０２に対してＩ／Ｏ応答キュー１１１４にエンキューした事を通知するために、割込み処理を行う（５０５）。
【００２３】
割込みを受けたＨＢＡドライバ１１０２は、主記憶装置１１０３からＨＢＡ−Ｆ／Ｗ１１０７が更新したＲ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１及び前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を読み込み（５０６）、前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２が示すＩ／Ｏ応答キュー１１１４のエントリからデータを読み込む（５０７）。
【００２４】
次に、ＨＢＡドライバ１１０２は、前記Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２を次のエントリを示す値に更新し、主記憶装置１１０３に更新したＲ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２の値を書き込む（５０８）。
【００２５】
ＨＢＡドライバ１１０２は、更新したＲ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２の値がＲ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１の値に等しくなるまで５０７及び５０８の処理を繰り返す（５０９）。
【００２６】
このように、従来の計算機１１１０では、データの受信処理を行うたび、ＨＢＡ−Ｆ／Ｗ１１０７はＩ／Ｏ応答キュー１１１４へデータをエンキューする他に、Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２１とＲ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２２の読み込み、書き込みのためにＰＣＩｅバス１１０５を経由して主記憶装置１１０３に繰り返しアクセスする必要がある。
【００２７】
図８は、従来の計算機１１１０において、ＨＢＡ１１０６からデータを送信する際の、Ｉ／Ｏ起動キューの制御についての動作フローを示している。ＨＢＡ１１０６からＩ／Ｏ装置１１１３へデータを送信する場合を例として、図８により、従来の計算機１１１０でＩ／Ｏ起動キューの制御を行う際に発生する課題について、説明する。
【００２８】
まず、ＨＢＡドライバ１１０２は、ＯＳ１１００からデータの送信要求を受けたことを認識すると（５１０）、主記憶装置１１０３からＳ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３とＳ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を読み込む（５１１）。
【００２９】
次に、ＨＢＡドライバ１１０２は、前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４と前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３からＩ／Ｏ起動キュー１１１５のエンキュー可否をチェックし、エンキュー不可であると判断した場合、エンキュー可となるまでエンキューを保留する（５１２）。
【００３０】
５１２でエンキュー可と判断したら、ＨＢＡドライバ１１０２は、前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３が示す主記憶装置１１０３のエントリに対して、送信するデータを書き込み（５１３）、前記Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３を次のエントリを示す値に更新し、主記憶装置１１０３に更新したＳ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３の値を書き込む（５１４）。
【００３１】
次に、ＨＢＡドライバ１１０２は、ＨＢＡ−Ｆ／Ｗ１１０７に対してＩ／Ｏ起動キュー１１１５にエンキューした事を通知する処理を行う（５１５）。
【００３２】
通知を受けたＨＢＡ−Ｆ／Ｗ１１０７は、主記憶装置１１０３からＨＢＡドライバ１１０２が更新したＳ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３及び前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を読み込み（５１６）、前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４が示すＩ／Ｏ起動キュー１１１５のエントリからデータを読み込む（５１７）。５１６及び５１７の処理は、ＨＢＡ−Ｆ／Ｗ１１０７が、ＰＣＩｅバス１１０５を通じて、主記憶装置１１０３にアクセスする必要がある。
【００３３】
次に、ＨＢＡ−Ｆ／Ｗ１１０７は、前記Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４を次のエントリを示す値に更新し、主記憶装置１１０３に更新したＳ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４の値を書き込む（５１８）。５１６及び５１７の処理と同様に、５１８の処理においてもＨＢＡ−Ｆ／Ｗ１１０７はＰＣＩｅバス１１０５を通じて主記憶装置１１０３にアクセスする必要がある。
【００３４】
ＨＢＡ−Ｆ／Ｗ１１０７は、更新したＳ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４の値がＳ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３の値に等しくなるまで５１７及び５１８の処理を繰り返す（５１９）。最後にＨＢＡ−Ｆ／Ｗ１１０７は、Ｉ／Ｏ装置１１１３へ主記憶装置１１０３から読み込んだデータを送信する。
【００３５】
このように、従来の計算機１１１０では、データの送信処理を行うたび、ＨＢＡ−Ｆ／Ｗ１１０７はＩ／Ｏ起動キュー１１１５へデータをエンキューする他に、Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１１２３とＳ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１２４の読み込み、書き込みのためにＰＣＩｅバス１１０５を経由して主記憶装置１１０３に繰り返しアクセスする必要がある。
【００３６】
上述のＰＣＩｅバス１１０５を経由するアクセスを行う処理は、経由する経路等が多いため、ＨＢＡ１１０６内部で行われＨＢＡ１１０６内部で完結する処理やＨＢＡドライバ１１０２がホストブリッジ１１１２のみを介して主記憶装置１１０３にアクセスする処理と比較して、処理時間が長い。このため、この処理が繰り返し発生することが、従来の計算機１１１０の性能のボトルネックとなっており、課題である。
【００３７】
前記特許文献１には、「キュー・データ構造およびキュー・データ構造に関連する事前変換済みアドレスを使用して入出力装置またはエンドポイントと通信するための装置および方法を提供する」と記載されている（要約参照）。つまり本方式では、ＰＣＩバスに接続されたデバイスが、ＰＣＩバスを通じてＤｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ（ＤＭＡ）を行う際に必要となるアドレス変換を効率化し、ＤＭＡの実行速度を向上させることができる。しかし、ＰＣＩバスを経由するアクセス自体を削減するものではなく、依然として、ＰＣＩバスを経由するアクセスを行う処理がＰＣＩバスに接続されたデバイスの処理性能のボトルネックとなる問題点がある。
【課題を解決するための手段】
【００３８】
上述の課題を解決するために、本発明に係る計算機及びその入出力方法は、ＣＰＵと、ブリッジを介してＣＰＵに接続する主記憶部と、ブリッジに接続するＰＣＩｅバスを介してＣＰＵ及び主記憶部に接続し、Ｉ／Ｏ装置とデータの送受信を行うホストバスアダプタ（ＨＢＡ）とを備える計算機における入出力制御方法であって、ＨＢＡは、ＨＢＡファームウエアと、記憶領域とを有し、ＣＰＵは、ＯＳと、ＯＳ上で動作しＨＢＡを制御するＨＢＡドライバを実行し、主記憶部は、データがエンキュー又はデキューされるＩ／Ｏキュー、Ｉ／Ｏキューからエンキュー又はデキューされるデータのキュー番号を管理する管理キューと、ＨＢＡの記憶領域がマッピングされたＭｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ（ＭＭＩＯ）領域とを有する。ＨＢＡドライバは、管理キューが更新されると、更新された管理キューの管理情報を、ＭＭＩＯ領域に書き込み、ＯＳは、ＭＭＩＯ領域に書き込まれた管理情報を、主記憶部のＭＭＩＯ領域に対応するＨＢＡの記憶領域に書き込む。
【発明の効果】
【００３９】
本発明によれば、ＨＢＡとＣＰＵ及び主記憶装置の間でデータの送受信処理を行う際にＭＭＩＯ領域を利用するので、従来に比べてＰＣＩｅバスを経由するアクセス回数が削減されるので、ＨＢＡで行うデータの送受信の処理性能を向上することが可能となる。
【図面の簡単な説明】
【００４０】
【図１】本実施例の計算機システムの構成図。
【図２】本実施例のＩ／Ｏ装置と計算機との間のデータ送受信の流れを示した計算機システムの構成図。
【図３】本実施例の計算機上の主記憶装置とＨＢＡ上の記憶領域との対応を示す図。
【図４】本実施例の計算機システムにおけるＩ／Ｏ応答キューの制御フロー。
【図５】本実施例の計算機システムにおけるＩ／Ｏ起動キューの制御フロー。
【図６】従来の計算機システムの構成図。
【図７】従来の計算機システムにおけるＩ／Ｏ応答キューの制御フロー。
【図８】従来の計算機システムにおけるＩ／Ｏ起動キューの制御フロー。
【発明を実施するための形態】
【００４１】
以下、本発明を適用した計算機システムについて、図面を用いて説明する。本実施例では、ＨＢＡを用いてデータの送受信処理を行う際のＰＣＩｅバスを経由するアクセス回数を削減する計算機の例を説明する。
【００４２】
ＰＣＩｅバスに、ＨＢＡ１０６を接続した計算機システムを、図２に示す。計算機１１０内のＣＰＵ１１１及び主記憶装置１０３は、ホストブリッジ１１２によりＰＣＩｅバス１０５を通じてＨＢＡ１０６と接続する。計算機１１０は、ＨＢＡ１０６を介してＩ／Ｏ装置１１３と接続する。ＨＢＡ１０６は、Ｉ／Ｏ装置１１３との間で使用する接続プロトコルに応じてデータを送受信する。
【００４３】
ＨＢＡ１０６では、ＨＢＡ１０６の制御、Ｉ／Ｏ装置１１３とのデータ送受信制御や主記憶装置１０３へのアクセス制御を行うファームウェア（ＨＢＡ−Ｆ／Ｗ１０７）が動作している。
【００４４】
計算機１１０では、ＯＳ（オペレーティングシステム）１００が動作しており、ＯＳ１００上では、Ｉ／Ｏ装置１１３へデータを書き込んだりＩ／Ｏ装置１１３からデータを読み込んだりするアプリケーション１０１や、ＨＢＡ１０６の制御を行うＨＢＡドライバ１０２が動作している。
【００４５】
主記憶装置１０３上には、Ｉ/ＯキューとしてＩ/Ｏ起動キュー１２０及びＩ／Ｏ応答キュー１１４が存在する。Ｉ／Ｏ起動キュー１２０には、ＨＢＡ１０６から送信するためのデータが格納される。Ｉ／Ｏ応答キュー１１４には、ＨＢＡ１０６が受信したデータが格納される。
【００４６】
ここで、Ｉ／Ｏ装置１１３から送られたデータを、計算機１１０で受信する動作について、説明する。
【００４７】
まず、ＨＢＡ１０６がデータを受信すると、ＨＢＡ−Ｆ／Ｗ１０７は、受信したデータを、Ｉ／Ｏ応答キュー１１４にＰＣＩｅバス１０５を通してエンキューする（２０２）。その後、ＨＢＡ−Ｆ／Ｗ１０７は、Ｉ／Ｏ応答キュー１１４をエンキューした事を、ＨＢＡドライバ１０２に通知する（２１１）。
【００４８】
それをトリガとして、ＨＢＡドライバ１０２は、Ｉ／Ｏ応答キュー１１４からデータをデキューし、アプリケーション１０１に渡す（２０３）。データの送受信を行う場合、以上の処理を、計算機にて実施する。
【００４９】
次に、計算機１１０からＩ／Ｏ装置１１３へ、データを送信する動作について説明する。
【００５０】
アプリケーション１０１が、生成したデータのＩ／Ｏ装置１１３への書き込みを指示する。すると、ＯＳ１００は、ＨＢＡドライバ１０２に、Ｉ／Ｏ装置１１３への書き込み指示を行う。
【００５１】
ＨＢＡドライバ１０２は、ＨＢＡ１０６にＩ／Ｏ装置１１３へのデータ転送指示を行うために、Ｉ／Ｏ起動キュー１２０にデータを格納（エンキュー）する（２００）。その後、ＨＢＡドライバ１０２は、Ｉ／Ｏ起動キュー１２０にエンキューした事を、ＨＢＡ−Ｆ／Ｗ１０７に通知する（２１０）。
【００５２】
それをトリガとして、ＨＢＡ−Ｆ／Ｗ１０７は、ＰＣＩｅバス１０５を通じてＩ／Ｏ起動キュー１２０からデータを取り出し（デキュー）、デキューしたデータをＩ／Ｏ装置１１３に対して送信する（２０１）。ＨＢＡ１０６から送信するデータは、ＨＢＡ１０６とＩ／Ｏ装置１１３の間の接続プロトコルに応じて送受信に必要な情報を付加して、Ｉ／Ｏ装置１１３に対し送信される。
【００５３】
図１は、図２を詳細化したものであり、本発明を適用した計算機１１０の構成及び制御方法を示している。
【００５４】
ＨＢＡ１０６では、ＨＢＡ内部の記憶領域１０８を持ち、ＨＢＡ１０６の制御、Ｉ／Ｏ装置１１３とのデータの送受信を行う。その制御のため、記憶領域１０８へのアクセス及びＰＣＩｅバス１０５を通じてＨＢＡドライバ１０２との通信や主記憶装置１０３へのアクセスを行うＨＢＡ−Ｆ／Ｗ１０７が、動作する。
【００５５】
主記憶装置１０３には、ＨＢＡ１０６の内部情報でありＨＢＡ１０６を制御するための情報が、ＭＭＩＯ（Ｍｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ）１０４としてマッピングされ、ＨＢＡ内部の記憶領域１０８上の特定の領域１０９についても、主記憶装置１０３上にマッピングされる。主記憶装置１０３及びＨＢＡ内部の記憶領域１０８の使用方法については、図３を用いて詳細を説明する。
【００５６】
図３は、計算機１１０上の主記憶装置１０３と、ＨＢＡ１０６内部の記憶領域１０８との対応を示している。
【００５７】
主記憶装置１０３は、Ｉ／Ｏ応答キュー１１４、Ｉ／Ｏ起動キュー１２０、ＨＢＡドライバ１０２がＩ／Ｏ応答キュー１１４から次にデキューするキュー番号を管理するために使用するｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５、Ｉ／Ｏ起動キュー１２０に次にエンキューするキュー番号を管理するために使用するｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１、ＨＢＡ内部の記憶領域１０８上の特定の領域１０９がマッピングされる領域であるＭＭＩＯ１０４を保持する。なお、キュー番号とは、データが格納されている主記憶装置１０３上のエントリの番号を意味する。
【００５８】
ＨＢＡ内部の記憶領域１０８は、ＨＢＡ−Ｆ／Ｗ１０７がＩ／Ｏ応答キュー１１４に次にエンキューするキュー番号を管理するために使用するｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８、ＨＢＡドライバ１０２がＩ／Ｏ応答キュー１１４からのデキュー済み番号をＨＢＡ−Ｆ／Ｗ１０７に通知するＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７、Ｏｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７によりＨＢＡドライバ１０２からＨＢＡ−Ｆ／Ｗ１０７に通知されたＩ／Ｏ応答キュー１１４からのデキュー済み番号をＨＢＡ−Ｆ／Ｗ１０７が管理するために使用するｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１９を保持する。
【００５９】
また、ＨＢＡ内部の記憶領域１０８は、ＨＢＡ−Ｆ／Ｗ１０７がＩ／Ｏ起動キュー１２０から次にデキューするキュー番号を管理するために使用するｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４、ＨＢＡドライバ１０２がＩ／Ｏ起動キュー１２０へのエンキュー済み番号をＨＢＡ−Ｆ／Ｗ１０７に通知するＩｎ＿Ｆｒｅｅ＿Ｑ＃１２５、Ｉｎ＿Ｆｒｅｅ＿Ｑ＃１２５によりＨＢＡドライバ１０２からＨＢＡ−Ｆ／Ｗ１０７に通知されたＩ／Ｏ起動キュー１２０へのエンキュー済み番号をＨＢＡ−Ｆ／Ｗ１０７が管理するために使用するｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１２３を保持する。
【００６０】
Ｉ／Ｏ応答キュー１１４、Ｉ／Ｏ起動キュー１２０の各エントリには、Ｑｕｅｕｅ情報として、該当エントリの有効、無効を示すＶビットが用意されている。Ｖビットが有効を示す場合、そのエントリは、まだデキューされていないデータが格納されていることを示し、新たにデータをエンキューすることはできない。Ｖビットが無効を示す場合、そのエントリがデキュー済みであることを示し、新たにデータをエンキューすることが可能である。
【００６１】
ＨＢＡドライバ１０２は、Ｉ／Ｏ応答キュー１１４からデータをデキューする際、Ｖビットを参照することで、ＨＢＡ−Ｆ／Ｗ１０７がＩ／Ｏ応答キュー１１４のいずれのエントリまでデータをエンキュー済みであるか知ることができる。同様に、Ｉ／Ｏ起動キュー１２０へデータをエンキューする際、Ｖビットを参照することで、ＨＢＡ−Ｆ／Ｗ１０７がＩ／Ｏ起動キュー１２０のいずれのエントリまでデータをデキュー済みであるか知ることができる。
【００６２】
また、例えば、Ｉ／Ｏ応答キュー１１４、Ｉ／Ｏ起動キュー１２０がデータを格納するエントリを２５６個持っていたとすると、前記ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５、前記ｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８、前記ｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１９には、Ｉ／Ｏ応答キュー１１４が持つ０〜２５５のいずれかのエントリを示す番号が格納され、前記ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１、前記ｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１２３、前記ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４には、Ｉ／Ｏ起動キュー１２０が持つ０〜２５５のいずれかのエントリを示す番号が格納される。データは、番号０のエントリから順番に数字の大きいエントリに、エンキューもしくはデキューされる。番号２５５のエントリの次は巡回し、再び番号０のエントリに、エンキューもしくはデキューが行われる。
【００６３】
ＨＢＡドライバ１０２がＭＭＩＯ１０４へデータを書き込むと、ＭＭＩＯ１０４に書き込まれたデータは、ＯＳ１００により、ＨＢＡ内部の記憶領域１０８上の特定の領域１０９に、書き込まれる。すなわち、ＨＢＡドライバ１０２により主記憶装置１０３の一部（ＭＭＩＯ１０４）へ書き込まれた情報は、ＯＳ１００のアシストにより、ＨＢＡ１０６内部の記憶領域１０８上の特定の領域１０９へ、コピーされる。つまり、ＨＢＡドライバ１０２は、主記憶装置１０３のＭＭＩＯ１０４に書き込みを行うことで、あたかもＨＢＡ１０６内部の記憶領域１０８に書き込んでいるかのように、動作することが可能となる。
【００６４】
よって、本実施例のＨＢＡ−Ｆ／Ｗ１０７は、ＨＢＡドライバ１０２が書き込んだ主記憶装置１０３上のデータを読み込みたい場合、ＭＭＩＯ１０４にマッピングされているＨＢＡ内部の記憶領域１０８上の特定の領域１０９にアクセスすることでデータの取得が可能となり、ＰＣＩｅバス１０５を通じて主記憶装置１０３へアクセスし読み込む処理を行なう必要がない。
【００６５】
例えば、Ｉ／Ｏ装置１１３から送られたデータを計算機１１０で受信する動作において、ＨＢＡドライバ１０２が前記ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５を更新した際に、更新した値をＨＢＡ−Ｆ／Ｗ１０７に伝えたい場合、ＨＢＡドライバ１０２は、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５の１つ前のエントリを示す値を、ＨＢＡ内部の記憶領域１０８上のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７と対応するＭＭＩＯ１０４中のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１６に書き込む。
【００６６】
ＨＢＡ内部の記憶領域１０８上のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７と対応するＭＭＩＯ１０４中のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１６に、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５の１つ前のエントリを示す値を書き込む理由は、次の通りである。後述する３１０の時点でのｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５を＋１しているため、後述する３１２の時点でのｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５が示す値は、ＨＢＡドライバが次にデキューを行うエントリの番号である。すなわち、ＨＢＡドライバが最後にデキューを行ったエントリの番号は、後述する３１２の時点でのｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５から−１した値である。そこで、Ｏｕｔ＿Ｆｒｅｅ＿Ｑ＃１１６に対し、１つ前のエントリを示す値を書き込む。
【００６７】
すると、前記Ｏｕｔ＿Ｆｒｅｅ＿Ｑ＃１１６に書き込んだ値がＯＳ１００により、ＨＢＡ内部の記憶領域１０８上の特定の領域１０９中のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７に書き込まれる。よって、ＨＢＡ−Ｆ／Ｗ１０７、は前記Ｏｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７を読み込むことで、ＨＢＡドライバ１０２が更新したｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５の値を取得することができる。
【００６８】
ここで、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５は、Ｆｒｅｅ＿Ｑ＃１１７を経由して、ｆｗ_Ｒ_Ｏｕｔ_Ｑｕｅｕｅ＃１１９に書き込まれる。そして、ｆｗ_Ｒ_Ｏｕｔ_Ｑｕｅｕｅ＃１１９が示す値と、ｆｗ_Ｒ_Ｉｎ_Ｑｕｅｕｅ＃１１８＋１が示す値とを比較し、I/O応答キューがＦＵＬＬ状態(空きエントリがない状態)でないことを確認する。空きがあることを確認することで、初めてＨＢＡ−Ｆ／Ｗ１０７は、I/O応答キューにエンキューできる。
【００６９】
ｆｗ_Ｒ_Ｉｎ_Ｑｕｅｕｅ＃１１８は、ＨＢＡ−Ｆ／Ｗ１０７が最後にエンキューしたI/O応答キュー１１４のエントリの番号を示す。ｆｗ_Ｒ_Ｏｕｔ_Ｑｕｅｕｅ＃１１９は、ＨＢＡドライバ１０２が最後にデキューしたエントリの番号を示す。
【００７０】
後述する３０２でチェックしている「ｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃＋１＝ｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃？」とは、ＨＢＡドライバ１０２のデキューが遅れ、ＨＢＡ−Ｆ／Ｗ１０７がＨＢＡドライバ１０２がデキューする予定のエントリの手前までエンキューしてしまっているかどうか（I/O応答キューがFULL状態であるか）をチェックしていることである。
【００７１】
同様に、計算機１１０からＩ／Ｏ装置１１３へデータを送信する動作において、ＨＢＡドライバ１０２が前記ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１を更新した際に、更新した値をＨＢＡ−Ｆ／Ｗ１０７に伝えたい場合、ＨＢＡドライバ１０２は、ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１の１つ前のエントリを示す値を、ＨＢＡ内部の記憶領域１０８上のＩｎ＿Ｆｒｅｅ＿Ｑ＃１２５と対応するＭＭＩＯ１０４中のＩｎ＿Ｆｒｅｅ＿Ｑ＃１２２に書き込む。
【００７２】
すると、前記Ｉｎ＿Ｆｒｅｅ＿Ｑ＃１２２に書き込んだ値がＯＳ１００により、ＨＢＡ内部の記憶領域１０８上の特定の領域１０９中のＩｎ＿Ｆｒｅｅ＿Ｑ＃１２５に書き込まれる。よって、ＨＢＡ−Ｆ／Ｗ１０７は、前記Ｉｎ＿Ｆｒｅｅ＿Ｑ＃１２５を読み込むことで、ＨＢＡドライバ１０２が更新したｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１の値を取得することができる。
【００７３】
ｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１２３は、ＨＢＡドライバ１０２が最後にエンキューしたI/O起動キューのエントリ番号を示す。ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４は、ＨＢＡ−Ｆ／Ｗ１０７が最後にＩ／Ｏ起動キューからデキューした、エントリの番号を示す。
【００７４】
後述する３３２で「ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃＝ｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃＋１となるまで・・処理を繰り返す」とは、これらの値を参照することで、Ｉ／Ｏ起動キュー１２０にデキューすべきデータが残っているかをチェックしていることである。
【００７５】
このように、本発明を適用した計算機１１０では、従来にようにＨＢＡドライバ１１０２及びＨＢＡ−Ｆ／Ｗ１１０７の両方が主記憶装置１１０３にアクセスして主記憶装置上でＩ／Ｏキューの管理を一元的に実行するのではなく、ＨＢＡドライバ１０２は主記憶装置１０３上でＩ／Ｏキューの管理を独自に行い、ＨＢＡ−Ｆ／Ｗ１０７はＨＢＡ１０６上に存在する記憶領域１０８でＩ／Ｏキューの管理を独自に行う。また、ＨＢＡドライバ１０２とＨＢＡ−Ｆ／Ｗ１０７との間で、Ｉ／Ｏキューの管理を行うための情報をやりとりする際、ＭＭＩＯ１０４を利用する。以上の構成により、本発明を適用した計算機１１０では、ＨＢＡ１０６を用いてデータの送信制御を行う際、従来の方式と比較してＨＢＡ−Ｆ／Ｗ１０７がＰＣＩｅバスを通じて主記憶装置１０３にアクセスする処理を削減でき、計算機１１０の性能を向上させることが可能である。
【００７６】
以下、データ受信時とデータ送信時とについて、詳細に説明する。
【００７７】
＜データ受信時＞
図４は、計算機１１０において、Ｉ／Ｏ応答キューの制御を行う際の動作フローを示している。図４を用いて、ＨＢＡがＩ／Ｏ装置からデータを受信した場合について説明する。
【００７８】
まず、ＨＢＡ−Ｆ／Ｗ１０７は、データを受信したことを認識すると（３００）、ＨＢＡ内部の記憶領域１０８からＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７を読みこむことでＨＢＡドライバ１０２がＩ／Ｏ応答キュー１１４からＨＢＡドライバ１０２が最後にデキューしたエントリのキュー番号の値を取得し、その値をＨＢＡ−Ｆ／Ｗ１０７が管理するｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１９に書き込む（３０１）。
【００７９】
次に、ＨＢＡ−Ｆ／Ｗ１０７はｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１９とｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８をチェックして、ｆｗ＿Ｒ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１９がｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８の次のエントリを示す場合、エンキュー不可であると判断し、エンキュー可となるまでエンキューを保留する（３０２）。
【００８０】
３０２でエンキュー可と判断したら、ｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８が示すＩ／Ｏ応答キュー１１４のエントリに対して受信したデータを書き込み、前記エントリのＱｕｅｕｅ情報のＶビットを、有効を示す値に変更する（３０３）。
【００８１】
次に、ＨＢＡ−Ｆ／Ｗ１０７は、ｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８を次のエントリを示す値に更新し、ＨＢＡ内部の記憶領域１０８に更新したｆｗ＿Ｒ＿Ｉｎ＿Ｑｕｅｕｅ＃１１８の値を書き込み（３０４）、ＨＢＡドライバ１０２に対して割込み処理を行う（３０５）。
【００８２】
なお、３００〜３０４までの処理は、図２の２０２に対応する。３０５の処理は、図２の２１１に対応する。
【００８３】
なお、割り込み３０５（２１１）は、ＨＢＡドライバ１０２とＨＢＡ−Ｆ／Ｗ１０７とでＰＣＩｅバスを経由する処理であるが、ＨＢＡ−Ｆ／Ｗ１０７からＨＢＡドライバ１０２への通知を行うだけであり、いわゆるメモリへのアクセスとは異なる。したがって、割り込み３０５で処理されるデータ量は、メモリへのアクセスで処理されるデータ量に比べて、非常に小さなものである。したがって、割り込み３０５は、ＰＣＩｅバスを経由する処理であっても、データの送受信の処理性能には影響を与えるものではない。  割込みを受けたＨＢＡドライバ１０２は、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５が示す主記憶装置１０３のエントリのＱｕｅｕｅ情報を読み込み（３０６）、読み込んだＶビットの値をチェックする（３０７）。
【００８４】
前記Ｖビットが無効を示す値であれば、ＨＢＡドライバ１０２は次の割込みが行われるまで待機状態に移る。前記Ｖビットが有効を示す値であれば、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５が示す主記憶装置１０３のエントリからデータを読み込む（３０８）。
【００８５】
３０８での読み込みが完了したら、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５が示す主記憶装置１０３のエントリのＱｕｅｕｅ情報のＶビットに無効を示す値を書き込み（３０９）、ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５を次のエントリが示す値に更新し、主記憶装置１０３に更新したｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５の値を書き込む（３１０）。
【００８６】
３０６〜３１０の処理を３０７の処理においてＶビットのチェックで無効を示す値を検出するまで繰り返す（３１１）。
【００８７】
次に、ＨＢＡドライバ１０２は、主記憶装置１０３のＭＭＩＯ１０４中のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１６にｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１１５が示すエントリの1つ前のエントリを示す値を書き込む。これにより、ＨＢＡ内部の記憶領域１０８中のＯｕｔ＿Ｆｒｅｅ＿Ｑ＃１１７の値は、最後にＨＢＡドライバ１０２がＩ／Ｏ応答キュー１１４からデキューしたキュー番号に更新される（３１２）。３０６〜３１２までの処理が図２の２０３に対応する。
【００８８】
上記に説明した通り、本発明では従来の方式と比較し、ＨＢＡ１０６を用いてデータの送受信制御を行う際、ＨＢＡ−Ｆ／Ｗ１０７がＰＣＩｅバスを通じて主記憶装置１０３にアクセスする処理を削減でき、計算機１１０の性能を向上させることが可能である。本発明を用いることによる性能向上の効果を、本実施例に係る図４の動作フロー及び従来技術の図７の動作フローを用いて、説明する。
【００８９】
ＨＢＡ−Ｆ／Ｗ１０７、１１０７がＰＣＩｅバス１０５、１１０５を経由して主記憶装置１０３、１１０３に対して読み込みもしくは書き込みを行う処理１回に要する時間を、Ｔｉｍｅ＿Ａとする。この処理は、ＰＣＩｅバス１０５、１１０５を含め、経由する経路が多くＴＡＴ（Turn Around Time)が大きい。一般に、Ｔｉｍｅ＿Ａの処理時間は、数マイクロ秒程度である。
【００９０】
ＨＢＡ−Ｆ／Ｗ１０７がＨＢＡ１０６内部の記憶領域１０８に対して読み込みもしくは書き込みを行う処理１回に要する時間を、Ｔｉｍｅ＿Ｂとする。この処理は、ＨＢＡ１０６内部で完結する処理であり、ＴＡＴが小さい。一般に、Ｔｉｍｅ＿Ｂの処理時間は、数ナノ秒程度である。
【００９１】
ＨＢＡドライバ１０２、１１０２が主記憶装置１０３、１１０３に対して読み込みもしくは書き込みを行う処理１回に要する時間をＴｉｍｅ＿Ｃとする。この処理は、ホストブリッジ１１２のみを経由する処理であり、ＴＡＴが小さい。一般に、Ｔｉｍｅ＿Ｃの処理時間は、数ナノ秒程度である。
【００９２】
１つの受信データに対して一連の処理を行うために要する時間は、実施例の計算機１１０でＩ／Ｏ応答キューの制御を行う場合、Ｔｉｍｅ＿Ａ（３０３）×１＋Ｔｉｍｅ＿Ｂ（３０１読み、３０１書き、３０４）×３＋Ｔｉｍｅ＿Ｃ×４（３０６，３０８，３０９，３１０）となる。一方、１つの受信データに対して一連の処理を行うために要する時間は、従来の計算機１１１０でＩ／Ｏ応答キューの制御を行う場合、Ｔｉｍｅ＿Ａ（５０１，５０３，５０４）×３＋Ｔｉｍｅ＿Ｃ（５０６，５０７，５０８）×３となる。
【００９３】
上述のように、Ｔｉｍｅ＿Ａは、Ｔｉｍｅ＿Ｂ及びＴｉｍｅ＿Ｃに比べて、約１０００倍も値が大きい。このため、Ｔｉｍｅ＿Ａに係る処理は、処理時間が長いため、ボトルネックとなる。
【００９４】
本発明を適用した計算機１１０では、従来の計算機１１１０に比べると、受信処理に要する時間のうち「Ｔｉｍｅ＿Ａ×２」を削減可能である。より具体的には、Ｔｉｍｅ＿Ａ＝１０００ｎｓ（１ｕｓ）、Ｔｉｍｅ＿Ｂ＝１ｎｓ、Ｔｉｍｅ＿Ｃ＝１ｎｓであると仮定すると、従来の方式ではＴｉｍｅ＿Ａ×３＋Ｔｉｍｅ＿Ｃ×３＝１０００ｎｓ×３＋１ｎｓ×３＝３００３ｎｓであるのに対し、実施例の計算機１１０ではＴｉｍｅ＿Ａ×１＋Ｔｉｍｅ＿Ｂ×３＋Ｔｉｍｅ＿Ｃ×４＝１０００ｎｓ×１＋１ｎｓ×３＋１ｎｓ×４＝１００７ｎｓとなる。つまり、実施例の処理時間は、従来の方式に比べて約１／３に削減できる。
【００９５】
したがって、本発明を適用した計算機１１０では、ＨＢＡで行うデータの受信処理にかかる時間を従来に比べて約１／３に削減でき、入出力制御装置の性能を向上することができる。
【００９６】
＜データ送信時＞
図５は、計算機１１０において、Ｉ／Ｏ起動キューの制御を行う際の動作フローを示している。図５を用いて、ＨＢＡからＩ／Ｏ装置へデータを送信した場合について説明する。
【００９７】
まず、ＨＢＡドライバ１０２は、ＯＳ１００からデータの送信要求を受けたことを認識すると（３２０）、ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１が示す主記憶装置１０３のエントリのＱｕｅｕｅ情報を読み込み（３２１）、読み込んだＶビットの値をチェックする（３２２）。
【００９８】
前記Ｖビットが有効を示す値であれば、ＨＢＡドライバ１０２は待機状態に移る。前記Ｖビットが無効を示す値であれば、ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１が示す主記憶装置１０３のエントリへデータを書き込むと同時に、前記Ｖビットに有効を示す値を書き込む（３２３）。
【００９９】
ｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１を次のエントリが示す値に更新し、主記憶装置１０３に更新したｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１の値を書き込む（３２４）。
【０１００】
さらに送信するデータがあれば、３２１〜３２４の処理を繰り返す。ただし、３２２の処理においてＶビットのチェックで有効を示す値を検出したら、その時点で繰り返しを停止する（３１１）。
【０１０１】
次に、ＨＢＡドライバ１０２は、主記憶装置１０３のＭＭＩＯ１０４中のＩｎ＿Ｆｒｅｅ＿Ｑ＃１２２にｄｒｖ＿Ｉｎ＿Ｑｕｅｕｅ＃１２１が示すエントリの1つ前のエントリを示す値を書き込む。これにより、ＨＢＡ内部の記憶領域１０８中のＩｎ＿Ｆｒｅｅ＿Ｑ＃１２５の値は、最後にＨＢＡドライバ１０２がＩ／Ｏ起動キュー１２０へエンキューしたキュー番号に更新される（３２６）。３２０〜３２６までの処理が図２の２００に対応する。
【０１０２】
その後、ＨＢＡドライバ１０２は、ＨＢＡ−Ｆ／Ｗ１０７に対してＩ／Ｏ起動キュー１２０にエンキューした事を通知する処理を行う（３２７）。３２７の処理が図２の２１０に対応する。
【０１０３】
通知を受けたＨＢＡ−Ｆ／Ｗ１０７は、ＨＢＡ内部の記憶領域１０８からＩｎ＿Ｆｒｅｅ＿Ｑ＃１２５を読みこむことでＨＢＡドライバ１０２がＩ／Ｏ起動キュー１２０からＨＢＡドライバ１０２が最後にエンキューしたエントリのキュー番号の値を取得し、その値をＨＢＡ−Ｆ／Ｗ１０７が管理するｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１２３に書き込む（３２８）。
【０１０４】
次に、ＨＢＡ−Ｆ／Ｗ１０７は、ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４が示すＩ／Ｏ起動キュー１２０のエントリから送信するデータを読み込む（３２９）。
【０１０５】
３２９での読み込みが完了したら、ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４が示す主記憶装置１０３のエントリのＱｕｅｕｅ情報のＶビットに有効を示す値を書き込み（３３０）、ｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４を次のエントリを示す値に更新し、ＨＢＡ内部の記憶領域１０８に更新したｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４の値を書き込む（３３１）。
【０１０６】
ＨＢＡ−Ｆ／Ｗ１０７はｆｗ＿Ｓ＿Ｏｕｔ＿Ｑｕｅｕｅ＃１２４がｆｗ＿Ｓ＿Ｉｎ＿Ｑｕｅｕｅ＃１２３の次のエントリを示す状態になるまで、３２９〜３３１の処理を繰り返す（３３２）。最後にＨＢＡ−Ｆ／Ｗ１０７は、Ｉ／Ｏ装置１１３へ主記憶装置１０３から読み込んだデータを送信する（３３３）。３２８〜３３３までの処理が図２の２０１に対応する。
【０１０７】
１つの送信データに対して一連の処理を行うために要する時間は、実施例の計算機１１０でＩ／Ｏ起動キューの制御を行う場合、Ｔｉｍｅ＿Ａ（３２９、３３０）×２＋Ｔｉｍｅ＿Ｂ（３２８読み、３２８書き、３３１）×３＋Ｔｉｍｅ＿Ｃ（３２１、３２３、３２４）×３となる。一方、１つの送信データに対して一連の処理を行うために要する時間は、従来の計算機１１１０でＩ／Ｏ起動キューの制御を行う場合、Ｔｉｍｅ＿Ａ（５１６、５１７、５１８）×３＋Ｔｉｍｅ＿Ｃ（５１１、５１３、５１４）×３となる。
【０１０８】
上述のように、Ｔｉｍｅ＿Ａは、Ｔｉｍｅ＿Ｂ及びＴｉｍｅ＿Ｃに比べて、約１０００倍も値が大きい。このため、Ｔｉｍｅ＿Ａに係る処理は、処理時間が長いため、ボトルネックとなる。
【０１０９】
本発明を適用した計算機１１０では、従来の計算機１１１０に比べると、送信処理に要する時間のうち「Ｔｉｍｅ＿Ａ×１」を削減可能である。より具体的には、Ｔｉｍｅ＿Ａ＝１０００ｎｓ（１ｕｓ）、Ｔｉｍｅ＿Ｂ＝１ｎｓ、Ｔｉｍｅ＿Ｃ＝１ｎｓであると仮定すると、従来の方式ではＴｉｍｅ＿Ａ×３＋Ｔｉｍｅ＿Ｃ×３＝１０００ｎｓ×３＋１ｎｓ×３＝３００３ｎｓであるのに対し、実施例の計算機１１０ではＴｉｍｅ＿Ａ×２＋Ｔｉｍｅ＿Ｂ×３＋Ｔｉｍｅ＿Ｃ×３＝１０００ｎｓ×２＋１ｎｓ×３＋１ｎｓ×３＝２００６ｎｓとなる。つまり、実施例の処理時間は、従来の方式に比べて約２／３に削減できる。
【０１１０】
したがって、本発明を適用した計算機１１０では、ＨＢＡで行うデータの送信処理にかかる時間を従来に比べて約２／３に削減でき、入出力制御装置の性能を向上することができる。
【符号の説明】
【０１１１】
１００  ＯＳ（オペレーティングシステム）
１０１  データの送受信を行うアプリケーション
１０２  ＨＢＡ（Ｈｏｓｔ  Ｂｕｓ  Ａｄａｐｔｅｒ）ドライバ
１０３  主記憶装置
１０４  ＭＭＩＯ（Ｍｅｍｏｒｙ  Ｍａｐｐｅｄ  Ｉ／Ｏ）
１０５  ＰＣＩｅバス
１０６  ＨＢＡ（Ｈｏｓｔ  Ｂｕｓ  Ａｄａｐｔｅｒ）
１０７  ＨＢＡ−Ｆ／Ｗ（ＨＢＡ上で動作するファームウェア）
１０８  ＨＢＡ内部の記憶領域
１０９  主記憶装置上のＭＭＩＯにマッピングされるＨＢＡ内部の記憶領域上の領域
１１０  計算機
１１１  ＣＰＵ
１１２  ホストブリッジ
１１３  Ｉ／Ｏ装置
１１４  Ｉ／Ｏ応答キュー
１１５  ｄｒｖ＿Ｏｕｔ＿Ｑｕｅｕｅ＃
１１６  Ｏｕｔ＿Ｆｒｅｅ＿Ｑ＃
１１７  Ｉｎ＿Ｆｒｅｅ＿Ｑ＃
１１８  ｆｗ＿Ｉｎ＿Ｑｕｅｕｅ＃
１１９  ｆｗ＿Ｏｕｔ＿Ｑｕｅｕｅ＃
１２０  Ｉ／Ｏ起動キュー
１２１  従来手法でのＩ／Ｏ応答キューの次にエンキューするキュー番号Ｉｎ＿Ｑｕｅｕｅ＃
１２２  従来手法でのＩ／Ｏ応答キューの次にデキューするキュー番号Ｏｕｔ＿Ｑｕｅｕｅ＃
【図１】
0005847013.tif 000002
【図２】
0005847013.tif 000003
【図３】
0005847013.tif 000004
【図４】
0005847013.tif 000005
【図５】
0005847013.tif 000006
【図６】
0005847013.tif 000007
【図７】
0005847013.tif 000008
【図８】
0005847013.tif 000009