(57)【要約】【課題】データの受信状況の確認を効率化すること。【解決手段】接続ポート１１は、自ポートで発生したエラーの検出機能とエラーの検出結果を記憶する検出結果記憶部１１ａとを備える。接続ポート１１は、ストレージ制御装置２０へのデータ送信に用いられる。処理部１２は、接続ポート１１およびストレージ制御装置２０が備える接続ポート２１を介して、ストレージ制御装置２０にデータを送信する。処理部１２は、接続ポート２１が備える検出結果記憶部２１ａから接続ポート２１によるエラーの検出結果を取得し、取得したエラーの検出結果に基づいて、ストレージ制御装置２０におけるデータの受信状況を確認する。【選択図】図１
2018060419.tif 000002
【特許請求の範囲】
【請求項１】
自ポートで発生したエラーの検出機能と前記エラーの検出結果を記憶する第１の記憶部とを備え、他のストレージ制御装置へのデータ送信に用いられる第１の接続ポートと、
前記第１の接続ポートおよび前記他のストレージ制御装置が備える第２の接続ポートを介して、前記他のストレージ制御装置にデータを送信し、前記第２の接続ポートが備える第２の記憶部から前記第２の接続ポートにおける前記検出結果を取得し、取得した前記検出結果に基づいて、前記他のストレージ制御装置における前記データの受信状況を確認する処理部と、
を有するストレージ制御装置。
【請求項２】
前記第２の接続ポートは複数の接続ポートを含み、
前記処理部は、複数の前記第２の接続ポートから取得した複数の前記検出結果に基づいて、前記データの受信状況を確認する、請求項１記載のストレージ制御装置。
【請求項３】
前記処理部は、複数の前記検出結果のうち、全てがエラーなしを示す場合、前記データが適切に受信されていると判定し、少なくとも１つがエラーありを示す場合、前記データが適切に受信されていないと判定する、請求項２記載のストレージ制御装置。
【請求項４】
前記処理部は、複数の前記第２の接続ポートのうち、前記エラーを検出した前記第２の接続ポートを、前記データの受信に失敗した要因と決定する、請求項２または３記載のストレージ制御装置。
【請求項５】
前記エラーは、前記データに対する訂正不可能な誤りの発生を示すエラーである、請求項１乃至４の何れか１項に記載のストレージ制御装置。
【請求項６】
前記処理部は、前記処理部により管理される第１のアドレス範囲のうち、前記第２の記憶部に対応する第１のアドレスを指定したアクセス要求を生成し、
前記第１の接続ポートは、前記アクセス要求の前記第１のアドレスを、前記他のストレージ制御装置により管理される第２のアドレス範囲のうち前記第２の記憶部に対応する第２のアドレスに変換し、変換後の前記アクセス要求を前記他のストレージ制御装置に送信し、前記アクセス要求に応じた前記検出結果を前記他のストレージ制御装置から受信する、請求項１記載のストレージ制御装置。
【請求項７】
前記処理部は、前記処理部により管理される第１のアドレス範囲のうち、前記第２の記憶部に対応する第１のアドレスを指定したアクセス要求を生成し、
前記第１の接続ポートは、複数の前記第２の接続ポートのうち前記第１の接続ポートに接続されている第３の接続ポートに前記アクセス要求を送信し、前記第３の接続ポートにより、前記アクセス要求の前記第１のアドレスを、前記他のストレージ制御装置により管理される第２のアドレス範囲のうち前記第２の記憶部に対応する第２のアドレスに変換させ、変換後の前記アクセス要求に応じた前記検出結果を、前記第３の接続ポートから受信する、請求項２記載のストレージ制御装置。
【請求項８】
自ポートで発生したエラーの検出機能と前記エラーの検出結果を記憶する記憶部とを備える第１の接続ポートを有する第１のストレージ制御装置と、
前記第１のストレージ制御装置へのデータ送信に用いられる第２の接続ポートと、前記第２の接続ポートおよび前記第１の接続ポートを介して前記第１のストレージ制御装置にデータを送信し、前記記憶部から前記検出結果を取得し、取得した前記検出結果に基づいて、前記第１のストレージ制御装置における前記データの受信状況を確認する処理部と、を有する第２のストレージ制御装置と、
を有するストレージ装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はストレージ制御装置およびストレージ装置に関する。
【背景技術】
【０００２】
現在、データの保存にストレージ装置が利用されている。ストレージ装置は、ＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）などの記憶装置を複数有し、大容量の記憶領域を提供する。ストレージ装置は、記憶装置に対するデータの書き込みや読み出しのアクセス制御を行うストレージ制御装置を有する。ストレージ装置では、ストレージ制御装置を複数搭載して、データアクセスの分散化や冗長化を図り、データアクセスの性能や信頼性を向上させることがある。
【０００３】
例えば、ホストから一方のディスクアレイコントローラに転送されたデータを、コントローラ間インタフェースを介して他方のディスクアレイコントローラに転送し、両コントローラのディスクキャッシュ上のデータを多重化して、高信頼化を図る提案がある。
【０００４】
また、制御装置間のＤＭＡ（Direct Memory Access）を制御するＤＭＡチップが、データの書き込み要求のあった第１の制御装置のメモリ、および、第１の制御装置と冗長化された第２の制御装置のメモリへデータを転送して、データを冗長化する提案もある。
【０００５】
なお、メモリバスと入出力バスとを接続するバスインタフェース装置が、バスに接続された装置により出力されたデータからチェックコードを計算し、同装置により出力されたチェックコードと比較することで、転送中のデータのエラーを発見する提案もある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平８−３２８７５８号公報
【特許文献２】特開２０１４−３２５１６号公報
【特許文献３】特開平５−２２４９６８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上記のように、あるストレージ制御装置が他のストレージ制御装置へデータを送信することがある。しかし、他のストレージ制御装置におけるエラーによって、データが適切に受信されないことがある。データが適切に受信されないと、両ストレージ制御装置の連携を適切に行えず、ストレージ装置の信頼性の低下を招くおそれがある。そこで、送信先のストレージ制御装置によるデータの適切な受信を保証する仕組みが問題となる。
【０００８】
例えば、データ送信毎に、送信元のストレージ制御装置により、送信先のストレージ制御装置に対してデータの受信確認を要求する要求メッセージを送信する方法が考えられる。送信先のストレージ制御装置は、要求メッセージに応じて、受信したデータを確認し、データ受信の成否を判定し、判定結果を示す応答メッセージを送信元のストレージ制御装置に応答する。
【０００９】
しかし、この方法では、両ストレージ制御装置間で送受信される確認用のメッセージにより通信量が増える可能性がある。また、ストレージ制御装置において、確認用のメッセージ通信や受信成否確認を行うプロセッサの負荷が増える可能性がある。
【００１０】
１つの側面では、本発明は、データの受信状況の確認を効率化することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、ストレージ制御装置が提供される。ストレージ制御装置は、第１の接続ポートと処理部とを有する。第１の接続ポートは、自ポートで発生したエラーの検出機能とエラーの検出結果を記憶する第１の記憶部とを備え、他のストレージ制御装置へのデータ送信に用いられる。処理部は、第１の接続ポートおよび他のストレージ制御装置が備える第２の接続ポートを介して、他のストレージ制御装置にデータを送信し、第２の接続ポートが備える第２の記憶部から第２の接続ポートにおける検出結果を取得し、取得した検出結果に基づいて、他のストレージ制御装置におけるデータの受信状況を確認する。
【００１２】
また、１つの態様では、ストレージ装置が提供される。ストレージ装置は、第１のストレージ制御装置と第２のストレージ制御装置とを有する。第１のストレージ制御装置は、第１の接続ポートを有する。第１の接続ポートは、自ポートで発生したエラーの検出機能とエラーの検出結果を記憶する記憶部とを備える。第２のストレージ制御装置は、第２の接続ポートと処理部とを有する。第２の接続ポートは、第１のストレージ制御装置へのデータ送信に用いられる。処理部は、第２の接続ポートおよび第１の接続ポートを介して第１のストレージ制御装置にデータを送信し、記憶部から検出結果を取得し、取得した検出結果に基づいて、第１のストレージ制御装置におけるデータの受信状況を確認する。
【発明の効果】
【００１３】
１つの側面では、データの受信状況の確認を効率化できる。
【図面の簡単な説明】
【００１４】
【図１】第１の実施の形態のストレージ装置を示す図である。
【図２】第２の実施の形態の情報処理システムを示す図である。
【図３】ストレージ装置のハードウェア例を示す図である。
【図４】デバイスツリーの例を示す図である。
【図５】ストレージ装置の機能例を示す図である。
【図６】他ＣＭ上のデバイスへのアクセス例を示す図である。
【図７】メモリ空間の例を示す図である。
【図８】他ＣＭ上のデバイスのＵＥＳＴＳに対するアクセス例を示す図である。
【図９】ＣＭのＤＭＡによるデータ転送例を示すフローチャートである。
【図１０】他ＵＰのＵＥＳＴＳに対するアクセス例を示す図である。
【図１１】他ＲＰのＵＥＳＴＳに対するアクセス例を示す図である。
【図１２】異常検出の例（その１）を示す図である。
【図１３】異常検出の例（その２）を示す図である。
【図１４】データの受信状況の確認機能の比較例を示す図である。
【図１５】ストレージ装置の他のハードウェア例（その１）を示す図である。
【図１６】ストレージ装置の他のハードウェア例（その２）を示す図である。
【発明を実施するための形態】
【００１５】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態のストレージ装置を示す図である。ストレージ装置１は、ストレージ制御装置１０，２０および記憶装置群３０を有する。ストレージ制御装置１０，２０は、記憶装置群３０に属する複数の記憶装置に対するデータアクセスを制御する。記憶装置群３０は、ＨＤＤやＳＳＤなどの複数の記憶装置を含む。例えば、ストレージ装置１は、情報処理装置（図１では図示を省略）に接続され、上記複数の記憶装置による大容量のデータ記憶領域を情報処理装置に提供する。
【００１６】
ストレージ制御装置１０，２０は相互に連携する。例えば、ストレージ制御装置１０，２０のうちの何れか一方が故障しても、他方のストレージ制御装置がデータアクセスを継続する。ストレージ制御装置１０，２０は、ユーザデータの二重化や連携用の制御情報を受け渡すために通信を行う。ストレージ制御装置１０，２０は、データが送信先のストレージ制御装置により適切に受信されたことの確認（受信状況の確認、あるいは、送達確認と称する）を行う機能を提供する。
【００１７】
ストレージ制御装置１０は、接続ポート１１、処理部１２およびデータ記憶部１３を有する。
接続ポート１１は、ストレージ制御装置２０へのデータ送信に用いられるインタフェースである。接続ポート１１は、自ポートで発生したエラーの検出機能を有する。接続ポート１１は、検出結果記憶部１１ａを有する。検出結果記憶部１１ａは、接続ポート１１のエラー検出機能によるエラーの検出結果を記憶する。接続ポート１１は、エラーの検出結果として、検出したエラーに対応する識別情報を生成し、検出結果記憶部１１ａに格納する。
【００１８】
接続ポート１１の一例として、ＰＣＩｅ（Peripheral Component Interconnect Express）のインタフェースが挙げられる。ＰＣＩｅのインタフェースを用いる場合、検出結果記憶部１１ａは、例えばＰＣＩｅにおけるアンコレクタブル・エラー・ステータス・レジスタ（ＵＥＳＴＳ：Uncorrectable Error Status register）である。ＵＥＳＴＳは、アンコレクタブルエラーに関する情報を記憶する。アンコレクタブルエラーは、訂正不可能なデータ誤りの発生を示すエラーである。
【００１９】
ストレージ制御装置１０は、接続ポート１１を複数有してもよい。例えば、ＰＣＩｅデバイスを複数接続する場合に、両ＰＣＩｅデバイスが備える接続ポート同士を所定のケーブルで繋ぐことで、ＰＣＩｅデバイス同士を接続できる。また、接続ポート１１をストレージ制御装置２０が備える接続ポートと所定のケーブルで接続することで、ストレージ制御装置１０，２０の間の通信路を形成することもできる。すなわち、ストレージ制御装置１０では、複数の接続ポートが多段に接続されて、デバイス間の通信路を形成してもよい。
【００２０】
処理部１２は、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。処理部１２はプログラムを実行するプロセッサでもよい。プロセッサは、複数のプロセッサの集合（マルチプロセッサ）を含む。
【００２１】
データ記憶部１３は、処理部１２の処理に用いられるデータ（前述のユーザデータや制御情報など）を記憶する主記憶装置である。データ記憶部１３は、例えば、ＲＡＭ（Random Access Memory）やメモリなどと呼ばれる記憶装置でもよい。
【００２２】
ストレージ制御装置２０は、接続ポート２１、処理部２２およびデータ記憶部２３を有する。
接続ポート２１は、接続ポート１１と同様に、自ポートで発生したエラーの検出機能を有する。接続ポート２１は、検出結果記憶部２１ａを有する。検出結果記憶部２１ａは、接続ポート２１によるエラーの検出結果を記憶する。接続ポート２１は、エラーの検出結果として、検出したエラーに対応する識別情報を生成し、検出結果記憶部２１ａに格納する。接続ポート２１は、接続ポート１１と同様に、ＰＣＩｅのインタフェースでもよい。検出結果記憶部２１ａは、ＵＥＳＴＳでもよい。更に、ストレージ制御装置２０は、ストレージ制御装置１０と同様に、接続ポート２１を複数有してもよい。すなわち、ストレージ制御装置２０では、複数の接続ポートが多段に接続されて、デバイス間の通信路を形成してもよい。
【００２３】
処理部２２は、ＣＰＵ，ＤＳＰ，ＡＳＩＣ，ＦＰＧＡなどを含み得る。処理部２２はプログラムを実行するプロセッサでもよい。プロセッサは、マルチプロセッサでもよい。データ記憶部２３は、処理部２２の処理に用いられるデータを記憶する主記憶装置である。データ記憶部２３は、例えば、ＲＡＭやメモリなどと呼ばれる記憶装置でもよい。
【００２４】
ここで、ストレージ制御装置１０からストレージ制御装置２０へデータの送信を行う場合を考える。処理部１２は、データ記憶部１３に記憶されたデータをデータ記憶部２３へ送信する。このデータ送信は、ＤＭＡにより実現されてもよい。そのために、ストレージ制御装置１０，２０は、ＤＭＡを制御するＤＭＡコントローラを更に有してもよい。例えば、処理部１２は、ストレージ制御装置１０のＤＭＡコントローラを用いて、ＤＭＡによるストレージ制御装置２０へのデータ送信を実現することもできる。
【００２５】
処理部１２は、接続ポート１１，２１を介して、ストレージ制御装置２０にデータを送信する。このとき、接続ポート２１は、自ポートで発生したエラーを検出し、エラーの検出結果を検出結果記憶部２１ａに格納する。処理部１２は、接続ポート２１による検出結果を、検出結果記憶部２１ａから取得する。
【００２６】
処理部１２は、接続ポート２１から取得した検出結果を、データ記憶部１３に格納する。処理部１２は、取得した検出結果に基づいて、ストレージ制御装置２０によるデータの受信状況を確認する。ここで、ストレージ制御装置２０によるデータの受信状況の確認は、「データの送達確認」ともいえる。
【００２７】
例えば、検出結果がエラーの識別情報を含まない場合（全てエラーなしの場合）、処理部１２は、ストレージ制御装置２０により適切にデータが受信されたと判断する。また、検出結果がエラーの識別情報を含む場合（少なくとも１つのエラーありの場合）、処理部１２は、ストレージ制御装置２０により適切にデータが受信されていないと判断する。後者の場合、処理部１２は、更に、該当のデータの再送処理を行ってもよい。
【００２８】
このように、処理部１２は、ストレージ制御装置２０においてデータ送信の経路上にある接続ポート２１のエラー検出機能を、データの受信状況の確認に利用する。このため、ストレージ制御装置１０，２０の間で、受信状況の確認用のメッセージを余計に送受信しなくてもよくなる。また、ストレージ制御装置２０は受信データの確認処理を実行しなくてもよくなる。その結果、ストレージ制御装置１０，２０間の受信状況の確認に伴う通信量、および、処理部１２，２２の負荷が軽減される。そして、受信状況の確認に伴う所要時間を短縮できる。すなわち、データ送信元のストレージ制御装置１０から、ストレージ制御装置２０側の異常を直接検出することにより、性能劣化を抑えてデータの受信状況の確認を実現できる。こうして、データの受信状況の確認を効率化できる。
【００２９】
また、データ送信中に接続ポート２１でエラーが検出されている場合、データ送信に悪影響を及ぼしている可能性が高いと考えられる。そこで、接続ポート２１でエラーが検出されている場合には、処理部１２は、ストレージ制御装置２０が適切にデータを受信できていないと判断して、再送などのリカバーを行う。これにより、ストレージ装置１におけるストレージ制御装置１０，２０の連携を適切に行える。その結果、ストレージ装置１の信頼性の向上を図れる。特に、ストレージ制御装置１０，２０の冗長制御は、適切にデータを送受信できることが前提となる。例えば、ストレージ制御装置１０からストレージ制御装置２０へのデータ送信に失敗したまま、ストレージ制御装置１０が縮退すると、正常データが喪失されることになり、データの不整合が発生してしまう。このため、データの送達保証による信頼性向上は、ストレージ制御装置１０，２０において特に重要であり、受信状況の確認を高速実行する意義は大きい。
【００３０】
更に、エラーの検出結果として、例えば、前述のＰＣＩｅにおけるＵＥＳＴＳの情報のようにデータに対するアンコレクタブルエラーの検出状況を利用することで、データの受信失敗の検出精度を向上できる。なぜなら、接続ポート２１でアンコレクタブルエラーが発生している場合、接続ポート２１においてデータ化けやデータ欠落などが生じていることになり、この現象は正常な受信データの喪失を意味するからである。一方、アンコレクタブルエラーが検出されていなければ、接続ポート２１をデータが正しく通過したことを意味する。
【００３１】
なお、ストレージ制御装置２０が、複数の接続ポートを有する場合、処理部１２は、データの通信経路上にある複数の接続ポートそれぞれの検出結果記憶部から、各接続ポートによるエラーの検出結果を取得してもよい。そうすれば、処理部１２は、接続ポートを備えるデバイス毎に、エラーの発生状況を確認でき、データの受信失敗の要因になった通信経路上のデバイスを特定することもできる。例えば、処理部１２は、エラーの発生したデバイスに応じた再送制御を行ったり、特定したデバイスのエラーをログに出力したりしてもよい。
【００３２】
更に、ストレージ制御装置２０からストレージ制御装置１０へデータを送信する場合も、処理部２２は、処理部１２と同様に、データの受信状況の確認を行える。具体的には、処理部２２は、接続ポート１１が備える検出結果記憶部１１ａから、接続ポート１１によるエラーの検出結果を取得し、取得したエラーの検出結果に基づいてデータの受信状況の確認を行う。これにより、ストレージ制御装置２０によるデータの受信状況の確認も同様に効率化できる。
【００３３】
以下では、ストレージ制御装置１０，２０相当の機能を有するストレージ装置を更に具体的に説明する。
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムを示す図である。第２の実施の形態の情報処理システムは、ストレージ装置５０およびサーバ６０を含む。ストレージ装置５０およびサーバ６０は、ネットワーク７０に接続されている。ネットワーク７０は、例えば、ＳＡＮ（Storage Area Network）である。
【００３４】
ストレージ装置５０は、複数のＨＤＤ（またはＳＳＤ）を収納可能であり、複数のＨＤＤを組み合わせて大容量の記憶領域をサーバ６０に提供する。ストレージ装置５０は、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）装置、ディスクアレイ装置、または、ストレージシステムなどと呼ばれてもよい。
【００３５】
サーバ６０は、ストレージ装置５０に格納されたデータを用いて業務処理を実行するサーバコンピュータである。
図３は、ストレージ装置のハードウェア例を示す図である。ストレージ装置５０は、ドライブエンクロージャ（ＤＥ：Drive Enclosure）５１およびコントローラモジュール（ＣＭ：Controller Module）１００，２００を有する。
【００３６】
ＤＥ５１は、複数のＨＤＤを収納する。ＤＥ５１は、ＨＤＤに代えて、あるいは、ＨＤＤと併せて複数のＳＳＤを収納してもよい。
ＣＭ１００，２００は、ＤＥ５１に収納された複数のＨＤＤを組み合わせて、ＲＡＩＤの技術による論理的な記憶領域をサーバ６０に提供する。ＣＭ１００，２００は、ネットワーク７０を介してサーバ６０から、記憶領域に対するデータの読み出しや書き込みの要求を受け付け、ＤＥ５１に収納された複数のＨＤＤへアクセスする。ＣＭ１００，２００は、冗長化されている。ＣＭ１００，２００の何れか一方が故障しても、他方によりＤＥ５１へのアクセスを継続できる。
【００３７】
ＣＭ１００の装置番号は“＃０”である。ＣＭ２００の装置番号は“＃１”である。図中、例えば、ＣＭ１００を指して“ＣＭ＃０”や“ＣＭ（＃０）”のように表記することがある。ＣＭ１００，２００は、第１の実施の形態のストレージ制御装置１０，２０の一例である。
【００３８】
ＣＭ１００，２００は、互いに連携するために、相互に通信を行う（ＣＭ間通信と称することがある）。ＣＭ間通信では、ＤＭＡの技術により、一方のＣＭのメモリから他方のＣＭのメモリに、データが転送される。転送対象のデータは、ユーザデータであることもあるし、ＣＭ間の連携用の制御情報であることもある。
【００３９】
ＣＭ１００は、ＣＰＵ１１０、ＲＡＭ１２０、ＰＣＩｅスイッチ１３０，１４０、ＳＡＳ（Serial Attached SCSI）１５０およびＣＡ（Channel Adapter）１６０を有する。これらの各デバイスは、ＰＣＩｅのインタフェースを用いたバスにより接続される。
【００４０】
ＣＰＵ１１０は、ＣＭ１００全体を制御するプロセッサである。ＣＰＵ１１０は、マルチプロセッサであってもよい。ＣＰＵ１１０は、所定の機能を実現するＡＳＩＣやＦＰＧＡなどを備えてもよい。ＣＰＵ１１０は、ルートポート（ＲＰ：Root Port）１１１を有する。
【００４１】
ＲＰ１１１は、ＰＣＩｅスイッチ１３０と接続するインタフェースである。なお、ＣＰＵ１１０は、ＰＣＩｅスイッチ１４０と接続するＲＰも有している（図示を省略する）。
ＲＡＭ１２０は、ＣＭ１００の主記憶装置である。ＲＡＭ１２０は、ＣＰＵ１１０に接続される。ＲＡＭ１２０は、ＣＰＵ１１０に実行させるファームウェアのプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１２０は、ＣＰＵ１１０による処理に用いる各種データを記憶する。
【００４２】
ＰＣＩｅスイッチ１３０，１４０は、ＣＭ１００が備える各種のデバイス（ＣＰＵ１１０，ＳＡＳ１５０およびＣＡ１６０など）を接続する中継器である。ＰＣＩｅスイッチ１３０は、ＤＭＡ制御部１３１、アップストリームポート（ＵＰ：Upstream Port）１３２およびノントランスペアレントブリッジ（ＮＴＢ：Non Transparent Bridge）１３３を有する。
【００４３】
ＤＭＡ制御部１３１は、ＣＭ１００からＣＭ２００へのＤＭＡによるデータ転送を制御する。ＤＭＡ制御部１３１は、例えば、ＦＰＧＡやＡＳＩＣなどのプロセッサによって実現される。
【００４４】
ＵＰ１３２は、ＲＰ１１１と接続するインタフェースである。
ＮＴＢ１３３は、ＣＭ２００と接続するインタフェースである。ＮＴＢ１３３は、異なる２つのＰＣＩｅドメイン間を接続し、相互の通信を可能にする。ＮＴＢ１３３は、所定の条件に合致する通信に限定して、他ＰＣＩｅドメインへの通過を許容する。例えば、ＰＣＩｅの規約では、ＮＴＢ１３３は、メモリリクエストという種類のコマンドの通過を許容する。メモリリクエストは、相手側のＣＭのＲＡＭに対するデータの読み出しや書き込み（Ｒｅａｄ／Ｗｒｉｔｅ）を要求できる。後述するように、ＣＭ１００は、メモリリクエストを用いて、ＣＭ２００における各デバイスが保持する情報を読み取る。このため、メモリリクエストを、ＣＭ２００の各デバイスに対するアクセス要求であるともいえる。
【００４５】
ＰＣＩｅスイッチ１４０も、ＰＣＩｅスイッチ１３０と同様のハードウェアを備える。ＰＣＩｅスイッチ１４０は、ＣＰＵ１１０、ＳＡＳ１５０およびＣＡ１６０と接続される。ＰＣＩｅスイッチ１４０は、ＳＡＳ１５０およびＣＡ１６０と接続するダウンストリームポート（ＤＷ：DoWnstream port）を有するが図３では図示を省略している（ＰＣＩｅスイッチ１３０もＤＷを有する）。
【００４６】
ＳＡＳ１５０は、ＤＥ５１と接続するインタフェースである。
ＣＡ１６０は、ネットワーク７０と接続するインタフェースである。ＣＡ１６０としては、例えば、ファイバチャネル（ＦＣ：Fibre Channel）のインタフェースを用いることができる。
【００４７】
ＣＭ２００は、ＣＰＵ２１０、ＲＡＭ２２０、ＰＣＩｅスイッチ２３０，２４０、ＳＡＳ２５０およびＣＡ２６０を有する。これらの各デバイスは、ＰＣＩｅのインタフェースを用いたバスにより接続される。
【００４８】
ＣＰＵ２１０は、ＣＭ２００全体を制御するプロセッサである。ＣＰＵ２１０は、マルチプロセッサであってもよい。ＣＰＵ２１０は、所定の機能を実現するＡＳＩＣやＦＰＧＡなどを備えてもよい。ＣＰＵ２１０は、ＲＰ２１１を有する。
【００４９】
ＲＰ２１１は、ＰＣＩｅスイッチ２３０と接続するインタフェースである。なお、ＣＰＵ２１０は、ＰＣＩｅスイッチ２４０と接続するＲＰも有している（図示を省略する）。
ＲＡＭ２２０は、ＣＭ２００の主記憶装置である。ＲＡＭ２２０は、ＣＰＵ２１０に接続される。ＲＡＭ２２０は、ＣＰＵ２１０に実行させるファームウェアのプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ２２０は、ＣＰＵ２１０による処理に用いる各種データを記憶する。
【００５０】
ＰＣＩｅスイッチ２３０，２４０は、ＣＭ２００が備える各種のデバイスを接続する中継器である。ＰＣＩｅスイッチ２３０は、ＤＭＡ制御部２３１、ＵＰ２３２およびＮＴＢ２３３を有する。
【００５１】
ＤＭＡ制御部２３１は、ＣＭ２００からＣＭ１００へのＤＭＡによるデータ転送を制御する。ＤＭＡ制御部２３１は、例えば、ＦＰＧＡやＡＳＩＣなどのプロセッサによって実現される。
【００５２】
ＵＰ２３２は、ＲＰ２１１と接続するインタフェースである。
ＮＴＢ２３３は、ＣＭ２００と接続するインタフェースである。ＮＴＢ２３３は、ＮＴＢ１３３と同様に異なる２つのＰＣＩｅドメイン間を接続し、相互の通信を可能にする。ＮＴＢ２３３は、ＮＴＢ１３３と接続される。
【００５３】
ＰＣＩｅスイッチ２４０も、ＰＣＩｅスイッチ２３０と同様のハードウェアを備える。ＰＣＩｅスイッチ２４０は、ＣＰＵ２１０、ＳＡＳ２５０およびＣＡ２６０と接続される。ＰＣＩｅスイッチ２４０は、ＳＡＳ２５０およびＣＡ２６０と接続するＤＷを有するが図３では図示を省略している（ＰＣＩｅスイッチ２３０もＤＷを有する）。
【００５４】
ＳＡＳ２５０は、ＤＥ５１と接続するインタフェースである。ＳＡＳ２５０は、ＳＡＳ１５０にも接続される。
ＣＡ２６０は、ネットワーク７０と接続するインタフェースである。ＣＡ２６０としては、例えば、ＦＣのインタフェースを用いることができる。
【００５５】
ここで、ＲＰ１１１，２１１、ＵＰ１３２，２３２およびＮＴＢ１３３，２３３は、それぞれがエラー検出機能を有する。エラー検出機能により検出可能なエラーは、転送対象のデータに対するアンコレクタブルエラーを含む。ＲＰ１１１，２１１、ＵＰ１３２，２３２およびＮＴＢ１３３，２３３は、それぞれが自身で発生したアンコレクタブルエラーの情報を格納するためのＵＥＳＴＳと呼ばれるレジスタを有する。
【００５６】
ＰＣＩｅの規約では、単一のＣＭ内部でのデバイス間の通信は保証されるが、ＣＭ１００内部のデバイスとＣＭ２００内部のデバイスとの間の通信は保証されていない。すなわち、ＣＭ１００は、自ＣＭのデバイスツリーに属するデバイスにおける異常をＰＣＩｅの規約における通信保証の機能により検出できる。一方、ＣＭ１００は、ＣＭ２００のデバイスツリーに属するデバイスにおける異常をＰＣＩｅの規約における通信保証の機能では検出できない。そこで、ＣＭ１００，２００は、データの受信状況の確認を工夫して、ＣＭ１００，２００間の通信を保証する機能を提供する。
【００５７】
以下の説明では、ＣＭ１００からＣＭ２００へのＤＭＡによるデータ転送において、ＣＭ１００によりデータの受信状況の確認を行うケースを例示する。その際、ＣＭ１００は、ＣＭ２００側に存在するＵＥＳＴＳの情報を用いる。そこで、以下では、ＲＰ２１１、ＵＰ２３２およびＮＴＢ２３３それぞれのＵＥＳＴＳを図示するが、ＲＰ１１１、ＵＰ１３２およびＮＴＢ１３３それぞれのＵＥＳＴＳの図示を省略する。
【００５８】
ＲＰ２１１は、ＵＥＳＴＳ２１１ａを有する。ＵＰ２３２は、ＵＥＳＴＳ２３２ａを有する。ＮＴＢ２３３はＵＥＳＴＳ２３３ａを有する。
ＲＰ１１１、ＵＰ１３２およびＮＴＢ１３３は、第１の実施の形態の接続ポート１１の一例である。ＲＰ２１１、ＵＰ２３２およびＮＴＢ２３３は、第１の実施の形態の接続ポート２１の一例である。
【００５９】
図４は、デバイスツリーの例を示す図である。ＣＭ１００のデバイスツリーでは、ＣＰＵ１１０に属するルートコンプレックス（ＲＰ１１１に相当）を頂点とし、ＲＰ１１１の配下にＰＣＩｅスイッチ群ＳＷ１（ＰＣＩｅスイッチ１３０，１４０）が接続される。そして、ＰＣＩｅスイッチ群ＳＷ１の配下に、複数のエンドポイントが接続される。複数のエンドポイントは、ＮＴＢ１３３、ＳＡＳ１５０およびＣＡ１６０を含む。ＣＭ１００のデバイスツリーを、１つのＰＣＩｅドメインと呼ぶこともできる。
【００６０】
ＣＭ２００のデバイスツリーもＣＭ１００と同様の構造となる。ただし、図４では、両ＰＣＩｅドメインの接続関係を表すために、ルートコンプレックス（ＲＰ２１１に相当）を下側にして図示している。ＲＰ２１１の配下にＰＣＩｅスイッチ群ＳＷ２（ＰＣＩｅスイッチ２３０，２４０）が接続される。そして、ＰＣＩｅスイッチ群ＳＷ２の配下に、複数のエンドポイントが接続される。複数のエンドポイントは、ＮＴＢ２３３、ＳＡＳ２５０およびＣＡ２６０を含む。
【００６１】
ＣＭ１００のデバイスツリーおよびＣＭ２００のデバイスツリーは、ＮＴＢ１３３，２３３を介して接続される。ＣＭ１００，２００は、ＮＴＢ１３３，２３３を介して、所定のコマンドを送受信する。
【００６２】
ＮＴＢ１３３，２３３は、次の特性により、ＣＭ１００，２００の通信を可能とする。
第１に、ＮＴＢ１３３，２３３は、自ＣＭ側、および、他ＣＭ側の２つのバスを接続可能であり、両バスの２つのドメインを分離させつつ、電気的な接続を可能とする。
【００６３】
第２に、ＮＴＢ１３３，２３３は、両方のバスから異なるエンドポイントとして認識される。また、ＮＴＢ２３３は、相手側のデバイス（例えば、ＣＰＵ１１０）に、ＮＴＢ２３３のデバイス空間を認識させる機能をもつ。すなわち、ＣＰＵ１１０は、ＣＰＵ１１０が認識する論理的なアドレスを指定することで、ＮＴＢ２３３のレジスタへアクセス可能である。ＮＴＢ１３３も、ＣＭ２００に対して同様の機能をもつ。
【００６４】
第３に、ＮＴＢ１３３，２３３は、ＮＴＢ１３３，２３３を跨ぐ（ＰＣＩｅドメインを跨ぐ）パケットの送受信を可能とする。ここで、パケットは、通信対象のデータの一単位である。
【００６５】
第４に、ＮＴＢ１３３，２３３は、ＮＴＢ１３３，２３３を跨ぐパケットのアドレスを変換する機能を有する。
第５に、ＮＴＢ１３３，２３３は、ＰＣＩｅの標準規約で動作が定められているわけではないため、チップベンダ毎に異なった仕様にできる。
【００６６】
図５は、ストレージ装置の機能例を示す図である。図５では、主に、ＣＰＵ１１０、ＮＴＢ１３３，２３３、ＲＰ２１１およびＵＰ２３２が有する機能を説明する。
ＣＰＵ１１０は、送信制御部１１２を有する。
【００６７】
送信制御部１１２は、ＲＡＭ１２０に記憶されたプログラムがＣＰＵ１１０により実行されることで実現されてもよいし、所定のプロセッサ（例えば、ＡＳＩＣやＦＰＧＡなどのハードウェア）により実現されてもよい。
【００６８】
送信制御部１１２は、ＤＭＡによるデータ転送の準備処理を行い、ＤＭＡ制御部１３１にデータ転送を指示する。具体的には、送信制御部１１２は、ＣＭ２００の実メモリ空間に対するデータ転送用のＤＭＡ起動情報を生成し、ＤＭＡ制御部１３１に提供して、データ転送用のパケットを、ＤＭＡ制御部１３１を用いて送信する。なお、送信制御部１１２のＤＭＡによるデータ転送は、ＣＭ２００へのデータ送信であるともいえる。
【００６９】
また、送信制御部１１２は、ＤＭＡによるデータ転送のためのＤＭＡ起動情報に加えて、ＵＥＳＴＳ２１１ａ，２３２ａ，２３３ａに格納されたエラー情報を読み出すためのＤＭＡ起動情報を生成し、ＤＭＡ制御部１３１に提供する。こうして、送信制御部１１２は、ＵＥＳＴＳ２１１ａ，２３２ａ，２３３ａのＲＥＡＤコマンドを含むパケットをＤＭＡ制御部１３１の機能によりＣＭ２００に送信する。ここで、エラー情報は、ＲＰ２１１、ＵＰ２３２およびＮＴＢ２３３の各デバイスによるエラーの検出結果の情報である。送信制御部１１２は、ＵＥＳＴＳ２１１ａ，２３２ａ，２３３ａから取得されたエラー情報をＲＡＭ１２０に格納する。
【００７０】
送信制御部１１２は、ＲＡＭ１２０に格納されたエラー情報に基づいて、ＣＭ２００によるデータの受信状況の確認（データの送達確認）を行う。送信制御部１１２は、ＣＭ２００により適切にデータが受信されたと判定すると、今回のデータ転送を終了し、次のデータ転送に移る。送信制御部１１２は、ＣＭ２００により適切にデータが受信されていないと判定すると、今回のデータの再送を行う。
【００７１】
ここで、送信制御部１１２は、ＣＭ１００におけるメモリ空間の所定のメモリアドレス（単にアドレスと称することがある）を指定して、ＣＭ２００に対するコマンドを発行する（詳細は後述される）。ＣＭ１００により発行されるパケットは、アクセス先のデバイスに応じたアドレスを含む。
【００７２】
ＮＴＢ１３３は、アドレス変換部１３３ａを有する。アドレス変換部１３３ａは、所定のプロセッサ（例えば、ＡＳＩＣやＦＰＧＡなどのハードウェア）により実現される。
アドレス変換部１３３ａは、パケットのアドレス変換を行う。アドレス変換部１３３ａは、ＣＭ１００側のアドレスをＣＭ２００側のアドレスに変換することもあるし、ＣＭ２００側のアドレスをＣＭ１００側のアドレスに変換することもある。アドレス変換部１３３ａは、後述するメモリ空間におけるデバイスアドレスのレイアウトに従ってアドレスの変換を行う。
【００７３】
ＲＰ２１１は、エラー検出部２１１ｂを有する。エラー検出部２１１ｂは、所定のプロセッサ（例えば、ＡＳＩＣやＦＰＧＡなどのハードウェア）により実現される。
エラー検出部２１１ｂは、ＲＰ２１１におけるアンコレクタブルエラーを検出するエラー検出機能である。例えば、エラー検出部２１１ｂは、パケットに付加されたＣＲＣ（Cyclic Redundancy Check）の値によるデータ化けの検出や、パケットのシーケンス番号によるパケット欠落の検出などを行う。
【００７４】
エラー検出部２１１ｂは、検出したアンコレクタブルエラーの情報をＵＥＳＴＳ２１１ａに格納する。エラー検出部２１１ｂは、３２ビットのエラー情報をＵＥＳＴＳ２１１ａに格納する。エラーが検出されていない場合、エラー検出部２１１ｂは、エラー情報を０（＝０ｘ００００００００）とする。エラーが検出された場合、エラー検出部２１１ｂは、エラー情報に含まれる各ビットのうちエラーに応じたビットに１を設定する。
【００７５】
ＵＰ２３２は、エラー検出部２３２ｂを有する。エラー検出部２３２ｂは、所定のプロセッサ（例えば、ＡＳＩＣやＦＰＧＡなどのハードウェア）により実現される。
エラー検出部２３２ｂは、ＵＰ２３２におけるアンコレクタブルエラーを検出するエラー検出機能である。エラー検出部２３２ｂは、検出したアンコレクタブルエラーの情報をＵＥＳＴＳ２３２ａに格納する。エラー検出部２３２ｂによるエラー検出やエラー情報の設定方法は、エラー検出部２１１ｂと同様である。
【００７６】
ＮＴＢ２３３は、エラー検出部２３３ｂおよびアドレス変換部２３３ｃを有する。エラー検出部２３３ｂおよびアドレス変換部２３３ｃは、所定のプロセッサ（例えば、ＡＳＩＣやＦＰＧＡなどのハードウェア）により実現される。
【００７７】
エラー検出部２３３ｂは、ＮＴＢ２３３におけるアンコレクタブルエラーを検出するエラー検出機能である。エラー検出部２３３ｂは、検出したアンコレクタブルエラーの情報をＵＥＳＴＳ２３３ａに格納する。エラー検出部２３３ｂによるエラー検出やエラー情報の設定方法は、エラー検出部２１１ｂと同様である。
【００７８】
アドレス変換部２３３ｃは、パケットのアドレス変換を行う。アドレス変換部２３３ｃは、ＣＭ１００側のアドレスをＣＭ２００側のアドレスに変換することもあるし、ＣＭ２００側のアドレスをＣＭ１００側のアドレスに変換することもある。アドレス変換部２３３ｃは、後述するメモリ空間に対するデバイスアドレスのレイアウトに従ってアドレスの変換を行う。
【００７９】
図６は、他ＣＭ上のデバイスへのアクセス例を示す図である。前述のように、ＮＴＢ２３３は、ＣＰＵ１１０に対して、ＮＴＢ２３３のデバイス空間を認識させる機能をもつ。このため、ＣＰＵ１１０は、ＮＴＢ２３３のデバイス空間を、ＣＰＵ１１０が認識するアドレス空間にマッピングし、マッピングした所定のアドレスへアクセスすることで、ＮＴＢ２３３のＵＥＳＴＳ２３３ａへアクセスすることができる。
【００８０】
また、ＮＴＢ１３３，２３３は、ＮＴＢ１３３，２３３を跨ぐパケットを送受信可能である。例えば、ＮＴＢ１３３は、ＮＴＢ２３３へパケットを送信する。また、ＮＴＢ２３３は、ＮＴＢ１３３へパケットを送信する。このとき、ＮＴＢ１３３，２３３は、次のようにパケットのアドレスを変換する。
【００８１】
ＮＴＢ１３３は、ＣＰＵ１１０により指定されたＵＥＳＴＳ２３３ａに対応するアドレス（ＣＭ１００側のアドレス）を、ＣＭ２００側のアドレスに変換する。
ＮＴＢ２３３は、ＮＴＢ１３３から受信したパケットのＵＥＳＴＳ２３２ａに対応するアドレスを、ＵＥＳＴＳ２３２ａに対応するＣＭ２００側のアドレスに変換する。また、ＮＴＢ２３３は、ＮＴＢ１３３から受信したパケットのＵＥＳＴＳ２１１ａに対応するアドレスを、ＵＥＳＴＳ２１１ａに対応するＣＭ２００側のアドレスに変換する。
【００８２】
図７は、メモリ空間の例を示す図である。ＣＰＵ１１０が認識するメモリ空間は、アドレスの小さい方から順に、自メモリ空間、他ＮＴＢ領域、予約領域および他メモリ空間に区分される。
【００８３】
自メモリ空間は、ＲＡＭ１２０の実メモリ空間およびＣＭ１００側のＰＣＩｅデバイスに対応するアドレスを含むメモリ空間である。第２の実施の形態の例では、ＲＡＭ１２０の記憶容量は約８ギガバイト（ＧＢ：Giga Bytes）である。なお、図中“０ｘ００００００００”などの表記の単位は、バイト（Ｂ：Bytes）である。すなわち、アドレスの１単位は１バイト（Ｂ）に相当する。
【００８４】
他ＮＴＢ領域は、ＣＭ２００のＮＴＢ２３３に対応するアドレス空間である。ＣＰＵ１１０は、ＵＥＳＴＳ２３３ａに対応する他ＮＴＢ領域上のアドレスを指定してＲｅａｄリクエストを発行することで、ＵＥＳＴＳ２３３ａの情報を読み出す。
【００８５】
予約領域は、予め確保されたオフセット領域である。
他メモリ空間は、ＣＭ２００側のメモリ空間（ＣＭ２００における自メモリ空間に相当するメモリ空間）がマッピングされる領域である。
【００８６】
図７の例では、自メモリ空間のアドレス範囲は“０ｘ０＿００００００００”〜“０ｘ２＿１ＦＦＦＦＦＦＦ”である。他ＮＴＢ領域のアドレス範囲は“０ｘ２＿２０００００００”〜“０ｘ２＿２００００ＦＦＦ”である。予約領域のアドレス範囲は“０ｘ２＿２０００１０００”〜“０ｘ２＿ＦＦＦＦＦＦＦＦ”である。他メモリ空間のアドレス範囲は“０ｘ３＿００００００００”〜“０ｘ５＿２０００００００”（より厳密には“０ｘ５＿１ＦＦＦＦＦＦＦ”まで）である。
【００８７】
ここで、自メモリ空間は、Ｅｘｔｅｎｄｅｄ機構による拡張領域を含む。自メモリ空間のサイズ（ＲＡＭ１２０のサイズ）は、拡張領域以外のサイズ（８ＧＢ）に拡張領域分のサイズを加えたサイズとなる。
【００８８】
Ｅｘｔｅｎｄｅｄ機構とは、自ＣＭのＰＣＩｅデバイスに対応するアドレスをマッピングした拡張領域をメモリ空間に設け、拡張領域のアドレスを指定したメモリリクエスト（Ｒｅａｄ／Ｗｒｉｔｅ）を行うことで、ＰＣＩｅデバイスにアクセスする仕組みである。
【００８９】
図７の例では、自メモリ空間のアドレス範囲のうち、拡張領域以外のアドレス範囲は“０ｘ０＿００００００００”〜“０ｘ０＿ＤＦＦＦＦＦＦＦ”および“０ｘ１＿００００００００”〜“０ｘ２＿１ＦＦＦＦＦＦＦ”である。拡張領域のアドレス範囲は“０ｘ０＿Ｅ０００００００”〜“０ｘ０＿ＦＦＦＦＦＦＦＦ”である。
【００９０】
拡張領域は、更に、Ｅｘｔｅｎｄｅｄ空間、未使用領域およびＭＭＩＯ（Memory Mapped Input / Output）領域を含む。
Ｅｘｔｅｎｄｅｄ空間は、自ＣＭのＰＣＩｅデバイスに対応するアドレスが属する領域である。例えば、Ｅｘｔｅｎｄｅｄ空間のアドレス範囲は“０ｘ０＿Ｅ０００００００”〜“０ｘ０＿ＥＦＦＦＦＦＦＦ”である。アドレス範囲“０ｘ０＿Ｆ０００００００”〜“０ｘ１＿００００００００”の領域に未使用領域およびＭＭＩＯ領域が属する。
【００９１】
ここで、ＰＣＩｅデバイスへのアクセスでは、バス番号（Ｂと表記する）、デバイス番号（Ｄと表記する）およびファンクション番号（Ｆと表記する）の組み合わせ（Ｂ：Ｄ：Ｆ）に対応するアドレスが指定される。例えば、ＣＰＵ１１０は、所定のＢ：Ｄ：Ｆに対応するアドレスを指定することで、ＲＰ１１１、ＵＰ１３２またはＮＴＢ１３３のＵＥＳＴＳにアクセスする。
【００９２】
バス番号（Ｂ）の個数は最大で２５６個（８ビット）である。デバイス番号（Ｄ）の個数は最大で３２個（５ビット）である。ファンクション番号（Ｆ）の個数は最大で８個（３ビット）である。
【００９３】
また、Ｅｘｔｅｎｄｅｄ空間は、４キロバイト（ＫＢ：Kilo Bytes）単位のブロックに区切られている。１つのブロックの先頭のアドレスが、Ｂ：Ｄ：Ｆの１つの組に対応する。そして、（Ｂ：Ｄ：Ｆ）＝（０：０：０），（０：０：１），（０：０：２），・・・，（０：３１：７），（１：０：０），・・・，（２５５：３１：６），（２５５：３１：７）というようにＢ，Ｄ，Ｆの順に、昇順に各ブロックに対応付けられる。
【００９４】
この場合、ＣＰＵ１１０は、下記のように、ＰＣＩｅデバイス上のＵＥＳＴＳにアクセスする。
例えば、該当のＰＣＩｅデバイス（例えば、ＵＰ１３２）が（Ｂ：Ｄ：Ｆ）＝（１：０：０）で指定されるとする。そして、このＰＣＩｅデバイスのＵＥＳＴＳが（Ｂ：Ｄ：Ｆ）＝（１：０：０）に対応するアドレスを基準としたオフセット０ｘ１０に対応しているとする。この場合、（Ｂ：Ｄ：Ｆ）＝（１：０：０）にアクセスするには、０ｘ０＿Ｅ０００００００＋１バス番号分のアドレスにＲｅａｄ／Ｗｒｉｔｅすればよい。また、該当のＵＥＳＴＳにアクセスするには、当該アドレスに上記オフセット分を加算したアドレスにアクセスすればよい。
【００９５】
具体的には、ＣＰＵ１１０は、当該ＵＥＳＴＳをＲｅａｄする場合、次のようにＥｘｔｅｎｄｅｄ空間におけるアクセス先のアドレスＸ１を計算する。
Ｘ１＝０ｘ０＿Ｅ０００００００＋１ＭＢ＊１＋０ｘ１０＝０ｘ０＿Ｅ０１０００１０
ここで、１ＭＢは１メガバイト（Mega Bytes）を示す。ただし、１ＭＢ＝１０２４ＫＢ、１ＫＢ＝１０２４Ｂとする。１ＭＢ分のオフセットを加算する理由は次の通りである。１つのバス番号には、３２個のデバイス番号が属し、８＊３２＝２５６個のファンクション番号が属する。１ファンクション番号当たりのブロックサイズは４ＫＢなので、バス番号Ｂ＝１に相当するオフセット（Ｅｘｔｅｎｄｅｄ空間の先頭に対するオフセット）は、２５６＊４ＫＢ＝１ＭＢである。このため、Ｅｘｔｅｎｄｅｄ空間の先頭“０ｘ０＿Ｅ０００００００”に１ＭＢに相当するオフセット“０ｘ１０００００”を加算することになる。
【００９６】
また、該当のＰＣＩｅデバイス（例えば、ＲＰ１１１）が（Ｂ：Ｄ：Ｆ）＝（０：３：０）で指定されるとする。そして、このＰＣＩｅデバイスのＵＥＳＴＳが（Ｂ：Ｄ：Ｆ）＝（０：３：０）に対応するアドレスを基準としたオフセット０ｘ１０に対応しているとする。
【００９７】
ＣＰＵ１１０は、当該ＵＥＳＴＳをＲｅａｄする場合、次のようにＥｘｔｅｎｄｅｄ空間におけるアクセス先のアドレスＸ２を計算する。
Ｘ２＝０ｘ０＿Ｅ０００００００＋３２ＫＢ＊３＋０ｘ０＿００００００１０＝０ｘ０＿Ｅ００１８０１０
ここで、３２ＫＢ＊３＝９６ＫＢ分のアドレスを加算する理由は次の通りである。１つのデバイス番号には、８個のファンクション番号が属する。１ファンクション番号当たりのブロックサイズは４ＫＢなので、デバイス番号Ｄ＝３に相当するオフセット（Ｅｘｔｅｎｄｅｄ空間の先頭に対するオフセット）は、８＊４ＫＢ＊３＝３２ＫＢ＊３＝９６ＫＢである。このため、Ｅｘｔｅｎｄｅｄ空間の先頭“０ｘ０＿Ｅ０００００００”に９６ＫＢに相当するオフセット“０ｘ１８０００”を加算することになる。
【００９８】
拡張領域における未使用領域は、未使用の領域である。
ＭＭＩＯ領域は、ＭＭＩＯに用いられる領域である。
上記のメモリ空間に関する情報は、ＣＭ１００，２００が備える所定の記憶装置（ＲＡＭ１２０でもよいし、ＲＡＭ１２０以外の記憶装置でもよい）に予め格納される。また、ＲＰ１１１，２１１およびＵＰ１３２，２３２の各ＵＥＳＴＳに対応するＢ：Ｄ：Ｆの組み合わせは、ＣＭ１００，２００が備える所定の記憶装置に予め格納される。
【００９９】
図８は、他ＣＭ上のデバイスのＵＥＳＴＳに対するアクセス例を示す図である。ＣＰＵ１１０は、次のようにして、ＣＭ２００（他ＣＭ）のＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａにアクセス可能である。
【０１００】
まず、ＵＥＳＴＳ２３３ａに対するＲｅａｄの場合、ＣＰＵ１１０は、メモリ空間における他ＮＴＢ領域のＵＥＳＴＳ２３３ａに対応するアドレスを指定してメモリリクエスト（Ｒｅａｄ）のパケットを発行する。当該パケットは、ＲＰ１１１、ＵＰ１３２を経由してＮＴＢ１３３に到達する。ＮＴＢ１３３は、パケットに含まれるアドレスを、ＣＭ２００側で管理されるＵＥＳＴＳ２３３ａに対応するアドレスに変換して、ＮＴＢ２３３に送信する。ＮＴＢ２３３は、受信したパケットに応じて、ＵＥＳＴＳ２３３ａからエラー情報を読み取り、エラー情報を含むパケットを生成してＮＴＢ１３３に応答する。ＮＴＢ１３３は、応答として受信したパケットを、ＵＰ１３２およびＲＰ１１１を介してＣＰＵ１１０に送信する。
【０１０１】
なお、ＮＴＢ２３３によりエラー情報を含むパケットを応答するものとしたが、ＣＰＵ２１０により、メモリリクエストに応じたＵＥＳＴＳ２３３ａのＲｅａｄを実行し、ＣＰＵ２１０によりエラー情報を含むパケットをＮＴＢ１３３に応答してもよい。
【０１０２】
次に、ＵＥＳＴＳ２３２ａ，２１１ａに対するＲｅａｄの場合、ＣＰＵ１１０は、他メモリ空間に含まれるＥｘｔｅｎｄｅｄ空間のＵＥＳＴＳ２３２ａ，２１１ａに対応するアドレスを指定してメモリリクエスト（Ｒｅａｄ）のパケットを発行する。ここで、ＣＰＵ１１０，２１０が認識するメモリ空間のレイアウトは共通である。
【０１０３】
したがって、ＣＰＵ１１０は、自身のＥｘｔｅｎｄｅｄ空間におけるＵＰ１３２のＵＥＳＴＳに対応するアドレスに“０ｘ３＿００００００００”のオフセットを加算することで、ＵＥＳＴＳ２３２ａに対応するアドレスを指定できる。図７のメモリレイアウト例によれば、自メモリ空間のアドレスに対する他メモリ空間のアドレスのオフセットは、“０ｘ３＿００００００００”だからである。ＵＥＳＴＳ２１１ａについても同様である。
【０１０４】
当該パケットは、ＲＰ１１１、ＵＰ１３２およびＮＴＢ１３３を経由して、ＮＴＢ２３３に到達する。ＮＴＢ２３３は、パケットに含まれるアドレスを、ＣＭ２００側で管理されるアドレスに変換する。前述の例でいえば、ＮＴＢ２３３は、ＣＭ１００側から指定されたアドレスに対して加算されているオフセット分“０ｘ３＿００００００００”を減算する変換を行えばよい。ＮＴＢ２３３は、ＵＰ２３２およびＲＰ２１１を介して、ＣＰＵ２１０に当該パケットを転送する。ＣＰＵ２１０は、受信したパケットがＥｘｔｅｎｄｅｄ空間に対するメモリリクエストであると判断すると、当該メモリリクエストで指定されたアドレスに対応するＵＥＳＴＳ２１１ａまたはＵＥＳＴＳ２３２ａからエラー情報を読み出す。ＣＰＵ２１０は、読み出したエラー情報を含むパケットを発行し、ＮＴＢ２３３，１３３を介して、ＣＰＵ１１０に応答する。
【０１０５】
次に、ＣＭ１００による送達確認を含むデータ転送の手順を説明する。
図９は、ＣＭのＤＭＡによるデータ転送例を示すフローチャートである。以下、図９に示す処理をステップ番号に沿って説明する。
【０１０６】
（Ｓ１）送信制御部１１２は、初期設定を行う。具体的には、送信制御部１１２は、ＲＡＭ１２０に確保されたＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１用の記憶領域（各ＵＥＳＴＳの読み出し結果を格納する領域）を所定値で初期化する。送信制御部１１２は、所定値を、例えば、０ｘＥＥＥＥＥＥＥＥとする（理由は後述される）。
【０１０７】
（Ｓ２）送信制御部１１２は、ＤＭＡ準備を行う。具体的には、送信制御部１１２は、ＤＭＡによるデータ転送の準備（データ転送用のメモリリクエストの生成など）やＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａのＲｅａｄ用のメモリリクエストの生成を行う。送信制御部１１２は、当該Ｒｅａｄ用のメモリリクエストの生成の際に、他メモリ空間におけるＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａに対応するアドレスの計算も行う。
【０１０８】
（Ｓ３）送信制御部１１２は、ＤＭＡ起動を行う。具体的には、送信制御部１１２は、ＤＭＡ制御部１３１の機能によって、ステップＳ２で生成した各種のメモリリクエストを、ＮＴＢ１３３を介してＣＭ２００に送信する。これにより、ＤＭＡのメモリリクエストに応じてＤＭＡによるＣＭ１００からＣＭ２００へのデータ転送が開始されるとともに、各ＵＥＳＴＳのＲｅａｄのメモリリクエストに応じて各ＵＥＳＴＳの読み出し結果がＣＭ２００からＣＭ１００へ応答される。送信制御部１１２は、各ＵＥＳＴＳの読み出し結果を、ＲＡＭ１２０の所定の領域に格納する。
【０１０９】
（Ｓ４）送信制御部１１２は、ＤＭＡ制御部１３１からＤＭＡによるデータ転送が完了した旨を示す割り込みを受け付けることで、ＤＭＡ完了を検出する。
（Ｓ５）送信制御部１１２は、ＲＡＭ１２０を参照して、ＮＴＢ２３３（他ＮＴＢ）のＵＥＳＴＳ２３３ａから取得したエラー情報が０であるか否かを判定する。０である場合、処理をステップＳ６に進める。０でない場合、処理をステップＳ９に進める。
【０１１０】
（Ｓ６）送信制御部１１２は、ＲＡＭ１２０を参照して、ＵＰ２３２（他ＵＰ）のＵＥＳＴＳ２３２ａから取得したエラー情報が０であるか否かを判定する。０である場合、処理をステップＳ７に進める。０でない場合、処理をステップＳ９に進める。
【０１１１】
（Ｓ７）送信制御部１１２は、ＲＡＭ１２０を参照して、ＲＰ２１１（他ＲＰ）のＵＥＳＴＳ２１１ａから取得したエラー情報が０であるか否かを判定する。０である場合、処理をステップＳ８に進める。０でない場合、処理をステップＳ９に進める。
【０１１２】
（Ｓ８）送信制御部１１２は、ＤＭＡによるデータの転送に成功したと判断する。そして、送信制御部１１２は、処理を終了する。
（Ｓ９）送信制御部１１２は、ＤＭＡによるデータの転送に失敗したと判断する。この場合、送信制御部１１２は、該当のデータの再送処理を行う。送信制御部１１２は、再送時の受信状況の確認も、ステップＳ１〜Ｓ９の手順を用いて行う。そして、送信制御部１１２は、処理を終了する。
【０１１３】
ここで、ステップＳ１においてＲＡＭ１２０のＵＥＳＴＳの保持領域を０ｘＥＥＥＥＥＥＥＥで初期化する理由は次の通りである。例えば、０（０ｘ００００００００）で初期化すると、エラーなしと同じ値となり、該当の保持領域が更新されない場合に、正常なのか異常なのかを判断できないことになる。また、例えば、１（０ｘ０００００００１）で初期化すると、所定のエラー時と同じ値となり、該当の保持領域が更新されない場合に、エラーを誤判断するおそれがある。更に、例えば、オールＦ（０ｘＦＦＦＦＦＦＦＦ）で初期化すると、デバイスが無応答でタイムアウトとなった場合と同じ値となり、該当の保持領域が更新されない場合に、タイムアウトが発生したのか、保持領域が更新されなかったのかを判断できない。そこで、送信制御部１１２は、エラー情報として用いられない０ｘＥＥＥＥＥＥＥＥで、各保持領域を初期化することで、タイムアウトやエラーなどを、保持領域の無更新の場合と区別して検出可能となる。
【０１１４】
なお、上記の手順では、通常のＤＭＡによるデータ転送に比べて、ＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａをＲｅａｄするためのＤＭＡ起動情報（メモリリクエスト）を生成する処理と、取得した各エラー情報による転送成否の判定が追加となる。これらの２つの処理の追加のデータ転送に対する影響はほぼ無いと考えてよい。理由は次の通りである。
【０１１５】
第１に、送信制御部１１２は、ＤＭＡ起動情報の生成を、元々行っていたデータ転送用のＤＭＡ起動情報の生成処理に組み込める。具体的には、送信制御部１１２は、両ＤＭＡ起動情報の生成箇所をＲＡＭ１２０上のメモリ空間の連続領域とすることで、両情報に高速にアクセスでき（キャッシュヒットを期待でき）、当該生成処理による性能への影響はほぼ無いと考えてよい。
【０１１６】
第２に、送信制御部１１２は、ＤＭＡ完了後のエラー情報による判定では、ＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａから読み出したエラー情報を、ＤＭＡ完了の処理で使用したＲＡＭ１２０上のメモリ空間の連続領域に格納する。このため、送信制御部１１２は、エラー情報に高速にアクセスでき（キャッシュヒットを期待でき）、当該判定処理による性能への影響はほぼ無いと考えてよい。
【０１１７】
次に、ＣＭ１００によるＵＰ２３２のＵＥＳＴＳ２３２ａおよびＲＰ２１１のＵＥＳＴＳ２１１ａに対するアクセスの具体例を説明する。
図１０は、他ＵＰのＵＥＳＴＳに対するアクセス例を示す図である。ここで、各デバイスのＢ：Ｄ：Ｆの値は、次の通りであるとする。ＲＰ１１１，２１１は、（Ｂ：Ｄ：Ｆ）＝（０：３：０）である。ＤＭＡ制御部１３１，２３１は、（Ｂ：Ｄ：Ｆ）＝（１：０：１）である。ＵＰ１３２，２３２は、（Ｂ：Ｄ：Ｆ）＝（１：０：０）である。ＮＴＢ１３３，２３３は、（Ｂ：Ｄ：Ｆ）＝（２：０：０）である。
【０１１８】
また、ＵＥＳＴＳ２３２ａのアドレスは、ＵＰ２３２のアドレスに対してオフセット０ｘ１０である。この場合、ＣＭ１００は、次のように、ＵＥＳＴＳ２３２ａに格納されたエラー情報を読み出す。
【０１１９】
（１）ＤＭＡ制御部１３１は、ＤＭＡ  ＲＥＡＤコマンドを含むアクセス要求のパケットを、ＮＴＢ１３３を介してＣＭ２００に送信する。ＤＭＡ制御部１３１は、ＤＭＡ  ＲＥＡＤコマンドにおいて、ＲＥＡＤ先アドレスとして、“０ｘ３＿Ｅ０１０００１０”を指定する。
【０１２０】
（２）ＮＴＢ２３３は、ＮＴＢ１３３から当該パケットを受信すると、ＲＥＡＤ先アドレスを、“０ｘ３＿Ｅ０１０００１０”から“０ｘ３＿００００００００”を減算した“０ｘ０＿Ｅ０１０００１０”に変換して、ＣＰＵ２１０に送信する。
【０１２１】
（３）ＣＰＵ２１０は、“０ｘ０＿Ｅ０１０００１０”がＲＡＭ２２０のＥｘｔｅｎｄｅｄ領域に対応するデバイス宛であると判断し、“０ｘ０＿Ｅ０１０００１０”に対応するデバイスであるＵＰ２３２を特定する。
【０１２２】
（４）ＣＰＵ２１０は、該当のアドレスに対応するＵＥＳＴＳ２３２ａのＲＥＡＤ要求をＵＰ２３２に送信する。
（５）ＵＰ２３２は、ＲＥＡＤ要求で指定されたＵＥＳＴＳ２３２ａのエラー情報を読み出し、エラー情報を含むＲＥＡＤ応答をＣＰＵ２１０に送信する。
【０１２３】
（６）ＣＰＵ２１０は、ＵＥＳＴＳ２３２ａから読み出されたエラー情報を、ＮＴＢ２３３，１３３を介して、ＤＭＡ制御部１３１に応答する（ＤＭＡ  ＲＥＡＤに対する応答）。ＤＭＡ制御部１３１は、受信したエラー情報をＣＰＵ１１０に通知する。ＤＭＡ制御部１３１は、受信したエラー情報を、ＲＡＭ１２０の所定の領域に書き込んでもよい。
【０１２４】
図１１は、他ＲＰのＵＥＳＴＳに対するアクセス例を示す図である。ＵＥＳＴＳ２１１ａのアドレスは、ＲＰ２１１のアドレスに対してオフセット０ｘ１０である。この場合、ＣＭ１００は、次のように、ＵＥＳＴＳ２１１ａに格納されたエラー情報を読み出す。
【０１２５】
（１）ＤＭＡ制御部１３１は、ＤＭＡ  ＲＥＡＤコマンドを含むアクセス要求のパケットを、ＮＴＢ１３３を介してＣＭ２００に送信する。ＤＭＡ制御部１３１は、ＤＭＡ  ＲＥＡＤコマンドにおいて、ＲＥＡＤ先アドレスとして、“０ｘ３＿Ｅ００１８０１０”を指定する。
【０１２６】
（２）ＮＴＢ２３３は、ＮＴＢ１３３から当該パケットを受信すると、ＲＥＡＤ先アドレスを、“０ｘ３＿Ｅ００１８０１０”から“０ｘ３＿００００００００”を減算した“０ｘ０＿Ｅ００１８０１０”に変換して、ＣＰＵ２１０に送信する。
【０１２７】
（３）ＣＰＵ２１０は、“０ｘ０＿Ｅ００１８０１０”がＲＡＭ２２０のＥｘｔｅｎｄｅｄ領域に対応するデバイス宛であると判断し、“０ｘ０＿Ｅ００１８０１０”に対応するデバイスであるＲＰ２１１を特定する。
【０１２８】
（４）ＣＰＵ２１０は、該当のアドレスに対応するＵＥＳＴＳ２１１ａからエラー情報の読み出しを行う。
（５）ＣＰＵ２１０は、ＵＥＳＴＳ２１１ａから読み出されたエラー情報を、ＮＴＢ２３３，１３３を介して、ＤＭＡ制御部１３１に応答する（ＤＭＡ  ＲＥＡＤに対する応答）。ＤＭＡ制御部１３１は、受信したエラー情報をＣＰＵ１１０に通知する。ＤＭＡ制御部１３１は、受信したエラー情報を、ＲＡＭ１２０の所定の領域に書き込んでもよい。
【０１２９】
次に、送信制御部１１２による異常検出の具体例を説明する。
図１２は、異常検出の例（その１）を示す図である。前述のように送信制御部１１２は、ＲＡＭ１２０に、３つの領域１２１，１２２，１２３を設ける。領域１２１は、ＵＥＳＴＳ２３３ａから読み出したエラー情報を格納する領域である。領域１２２は、ＵＥＳＴＳ２３２ａから読み出したエラー情報を格納する領域である。領域１２３は、ＵＥＳＴＳ２１１ａから読み出したエラー情報を格納する領域である。
【０１３０】
送信制御部１１２は、ＤＭＡの準備処理において、領域１２１，１２２，１２３に“０ｘＥＥＥＥＥＥＥＥ”を設定する（ＳＴ１）。
そして、送信制御部１１２は、ＤＭＡによるデータ転送と共に、ＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａから読み出したエラー情報を領域１２１，１２２，１２３に格納する（ＳＴ２）。図１２の例では、領域１２１には、“０ｘ００１０００００”が格納される。領域１２２には、“０ｘ００００００００”が格納される。領域１２３には、“０ｘ００００００００”が格納される。
【０１３１】
送信制御部１１２は、領域１２１，１２２，１２３の値に基づいて、ＮＴＢ２３３において、アンコレクタブルエラーが発生したことを検出する。領域１２１に、所定のエラーに対応する値“０ｘ００１０００００”が格納されているからである。エラー情報では、エラーに応じた位置にビットが立つことになる。このため、送信制御部１１２は、エラー情報を参照して、アンコレクタブルエラーの種別を判断することもできる。
【０１３２】
例えば、ＵＥＳＴＳに要因が立つ（所定のビットに“１”が設定される）エラーの場合、送信制御部１１２は、該当のデバイスによるエラーハンドリングが可能なレベルの異常であると判断できる。また、無応答となるエラーの場合、送信制御部１１２は、該当のデバイスによるエラーハンドリングが不可能なレベルの異常であると判断できる。
【０１３３】
なお、この場合、送信制御部１１２は、ＵＰ２３２およびＲＰ２１１では、アンコレクタブルエラーが発生していないと判断する。領域１２２，１２３には、何れもエラーなしを示す“０ｘ００００００００”が設定されているからである。
【０１３４】
送信制御部１１２は、ＣＭ２００で適切にデータを受信できていないと判断し、該当のデータの再送処理を行う。
図１３は、異常検出の例（その２）を示す図である。送信制御部１１２は、ＤＭＡの準備処理において、領域１２１，１２２，１２３に“０ｘＥＥＥＥＥＥＥＥ”を設定する（ＳＴ１１）。
【０１３５】
そして、送信制御部１１２は、ＤＭＡによるデータ転送と共に、ＵＥＳＴＳ２３３ａ，２３２ａ，２１１ａから読み出したエラー情報を領域１２１，１２２，１２３に格納する（ＳＴ１２）。図１３の例では、領域１２１には、“０ｘ００００００００”が格納される。領域１２２には、“０ｘＦＦＦＦＦＦＦＦ”が格納される。領域１２３には、“０ｘ００００００００”が格納される。
【０１３６】
ここで、“０ｘＦＦＦＦＦＦＦＦ”が領域１２２に格納されたのは、ＵＰ２３２が無応答のままタイムアウトとなったからである。この場合、送信制御部１１２またはＤＭＡ制御部１３１により当該タイムアウトを検出して、“０ｘＦＦＦＦＦＦＦＦ”を設定する。
【０１３７】
送信制御部１１２は、領域１２１，１２２，１２３の値に基づいて、ＵＰ１３２において何らかのエラーが発生したことを検出する。また、送信制御部１１２は、領域１２２の値が“０ｘＥＥＥＥＥＥＥＥ”（初期値）のまま変更されていない場合にも、同様に、ＵＰ１３２において何らかのエラーが発生したことを検出する。
【０１３８】
送信制御部１１２は、ＣＭ２００で適切にデータを受信できていないと判断し、該当のデータの再送処理を行う。また、上記のように、ＣＭ２００で該当のデバイスによるエラーハンドリングが不可能な異常が発生した場合にも、ＣＭ１００側の情報によって、ＣＭ２００における異常の要因となった被疑デバイスを特定できる。
【０１３９】
なお、この例では、領域１２１，１２３には、何れもエラーなしを示す“０ｘ００００００００”が設定されている。このため、送信制御部１１２は、ＮＴＢ２３３，２１１では、アンコレクタブルエラーが発生していないと判断する。
【０１４０】
ここで、再送処理において、送信制御部１１２は、アンコレクタブルエラーの種別に応じて、再送処理の方法を選択してもよい。例えば、送信制御部１１２は、アンコレクタブルエラーの内容から、該当のデバイスによるエラーハンドリングが可能なレベルであるか否かなどを判断して、再送処理の方法を選択することが考えられる。より具体的には、送信制御部１１２は、エラーハンドリングが不可能なレベルの異常の場合には、ＣＭ２００により該当のデバイスを再起動またはリセットさせてから再送することが考えられる。また、送信制御部１１２は、エラーハンドリングが可能なレベルの異常の場合には、該当のデバイスを再起動させずに再送することが考えられる。
【０１４１】
また、送信制御部１１２は、ＣＭ１００が出力するログに、ＣＭ２００側から取得したアンコレクタブルエラーの内容を記録してもよい。あるいは、送信制御部１１２は、ＣＭ１００が備える表示パネルに、当該エラー内容を表示させてもよい。こうして、ＣＭ１００は、ＣＭ２００における異常原因のユーザによる調査を支援することもできる。
【０１４２】
次に、データの受信状況の確認機能の比較例を説明する。
図１４は、データの受信状況の確認機能の比較例を示す図である。ＣＭ１００（送信元）からＣＭ２００（送信先）へＤＭＡによるデータ送信を行った際に、次のような受信状況の確認方法も考えられる。まず、ＣＭ１００は、ＤＭＡ通信によりＣＭ２００にデータを送信する（ステップＳ１０１）。
【０１４３】
ＣＭ１００は、ＤＭＡ通信が完了すると、データが適切に受信されたことを確認する確認要求のメッセージ（ＭＳＧ：Message）をＣＭ２００に送信する（ステップＳ１０２）。
【０１４４】
ＣＭ２００は、確認要求のメッセージを受信すると、当該確認要求に応じて、ＤＭＡによるデータ受信を適切に行ったか否かを確認する（ステップＳ１０３）。例えば、ＣＭ２００は、データ受信を適切に行っていない場合、どのデバイスでどのような異常が発生したかを確認することも考えられる。
【０１４５】
ＣＭ２００は、確認結果を含む確認応答のメッセージをＣＭ１００に送信する。ＣＭ１００は、確認応答のメッセージを受信すると、当該確認応答により、ＣＭ２００によりデータが適切に受信されたか否かを判断する（ステップＳ１０４）。
【０１４６】
このように、ＤＭＡ通信後にＣＭ１００からＣＭ２００に確認要求のメッセージを送信し、ＣＭ２００からＣＭ１００に確認応答のメッセージを送信して、受信状況の確認を行うことも考えられる。しかし、この方法では、メッセージ送受信やメッセージ処理のオーバヘッドによって受信状況の確認を実現するのに時間がかかる。例えば、一連のメッセージの送受信およびＣＭ２００側での確認処理に伴う所要時間が、ミリ秒〜秒程度のオーダーに達することもある。
【０１４７】
これに対し、ＣＭ１００は、ＣＭ２００においてデータ送信の経路上にあるＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１のエラー検出機能を、データの受信状況の確認に利用する。このため、ＣＭ１００，２００の間で、受信状況の確認用のメッセージを送受信しなくてもよくなる。また、ＣＭ２００に受信データの確認処理を実行しなくてもよくなる。その結果、ＣＭ１００，２００間の受信状況の確認に伴う通信量、および、ＣＭ１００，２００の負荷が軽減される。そして、受信状況の確認に伴う所要時間を短縮できる。例えば、ＣＭ１００による受信状況の確認の所要時間を、ナノ秒〜マイクロ秒程度のオーダーに抑えられる。すなわち、データ送信元のＣＭ１００から、ＣＭ２００側の異常を直接検出することにより、性能劣化を抑えてデータの受信状況の確認を実現できる。こうして、データの受信状況の確認を効率化できる。
【０１４８】
また、データ送信中にＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１でアンコレクタブルエラーが検出されている場合、データ送信が適切に行えていないと考えられる。そこで、ＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１でアンコレクタブルエラーが検出されている場合には、ＣＭ１００は、ＣＭ２００が適切にデータを受信できていないと判断して、再送などのリカバーを行う。
【０１４９】
これにより、ストレージ装置５０におけるＣＭ１００，２００間の連携を適切に行える。その結果、ストレージ装置５０の信頼性の向上を図れる。特に、ＣＭ１００，２００の冗長制御は、適切にデータを送受信できることが前提となる。例えば、ＣＭ１００からＣＭ２００へのデータ送信に失敗したまま、ＣＭ１００が縮退すると、ＲＡＭ１２０上のデータが揮発して正常データが喪失されることになり、データの不整合が発生してしまう。このため、データの送達保証による信頼性向上は、ＣＭ１００，２００において特に重要であり、受信状況の確認を高速実行する意義は大きい。
【０１５０】
更に、前述のように、ＣＭ１００は、ＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１（複数の接続ポート）のうち、アンコレクタブルエラーを検出したデバイス（接続ポート）を、データの受信に失敗した要因と決定し、ログなどに出力することもできる。これにより、異常原因のユーザによる調査を支援することもできる。
【０１５１】
図１５は、ストレージ装置の他のハードウェア例（その１）を示す図である。これまでの説明では、ＰＣＩｅスイッチ１３０，２３０を接続する例を示したが、ＣＭ１００の複数のＰＣＩｅスイッチと、ＣＭ２００の複数のＰＣＩｅスイッチとを接続することもできる。
【０１５２】
例えば、ＣＭ１００は、ＰＣＩｅスイッチ１３０，１４０に加えて、ＰＣＩｅスイッチ１３０ａ，１３０ｂを更に有してもよい。ＰＣＩｅスイッチ１３０ａ，１３０ｂは、ＰＣＩｅスイッチ１３０と同様に、ＤＭＡ制御部、ＵＰおよびＮＴＢを備える。
【０１５３】
また、ＣＭ２００は、ＰＣＩｅスイッチ２３０，２４０に加えて、ＰＣＩｅスイッチ２３０ａ，２３０ｂを更に有してもよい。ＰＣＩｅスイッチ２３０ａ，２３０ｂは、ＰＣＩｅスイッチ２３０と同様に、ＤＭＡ制御部、ＵＰおよびＮＴＢを備える。
【０１５４】
この場合、ＰＣＩｅスイッチ１３０ａ，２３０ａを、ＰＣＩｅスイッチ１３０ａ，２３０ａそれぞれが備える２つのＮＴＢを介して接続する。また、ＰＣＩｅスイッチ１３０ｂ，２３０ｂを、ＰＣＩｅスイッチ１３０ｂ，２３０ｂそれぞれが備える２つのＮＴＢを介して接続する。図１５の例では、ＣＭ１００，２００間に合計３つのパスが形成されることになる。ただし、ＣＭ１００，２００間のパスは２つでもよいし、４以上でもよい。ＣＭ１００は１つまたは複数のパスを用いて、ＣＭ２００へのデータのＤＭＡ転送を行う。この場合にも、ＣＭ１００は、データ転送において、第２の実施の形態の方法による受信状況の確認をパス毎に行える。
【０１５５】
図１６は、ストレージ装置の他のハードウェア例（その２）を示す図である。更に、これまでの説明では、ストレージ装置５０が２つのＣＭ（ＣＭ１００，２００）を有する例を示したが、ストレージ装置５０は、３以上のＣＭを有してもよい。例えば、ＣＭ１００，２００，３００、および、ＣＭ１００，２００，３００を相互に接続するＰＣＩｅスイッチ４００をストレージ装置５０に設けることもできる。
【０１５６】
ここで、ＣＭ３００は、ＣＭ１００，２００と同様に、ＣＰＵ３１０、ＰＣＩｅスイッチ３３０およびＰＣＩｅスイッチ３４０を有する。ＣＰＵ３１０はＲＰ３１１を有する。ＰＣＩｅスイッチ３３０は、ＤＭＡ制御部３３１、ＵＰ３３２およびＮＴＢ３３３を有する。ＣＭ３００は、ＲＡＭも有するが、図１６ではＣＭ間の接続関係を主に表すため図示を省略している。
【０１５７】
ＰＣＩｅスイッチ４００は、ＤＷ４０１，４０２，４０３を有する。ＤＷ４０１，４０２，４０３は、ＰＣＩｅデバイスを接続するためのインタフェースである。
ＮＴＢ１３３は、ＮＴＢ２３３に代えて、ＤＷ４０１に接続される。ＮＴＢ２３３は、ＮＴＢ１３３に代えて、ＤＷ４０２に接続される。ＮＴＢ３３３は、ＤＷ４０３に接続される。
【０１５８】
ＰＣＩｅスイッチ４００は、ＤＷ４０１，４０２，４０３に接続されたＣＭ１００，２００，３００によるＣＭ間のデータ通信を中継する。例えば、ＣＭ１００は、ＮＴＢ１３３およびＤＷ４０１，４０２を介して、ＣＭ２００へのＤＭＡによるデータ転送を行える。この場合、ＣＰＵ１１０は、ＮＴＢ１３３およびＤＷ４０１，４０２を介して、ＮＴＢ２３３、ＵＰ２３２およびＲＰ２１１の各ＵＥＳＴＳを読み取り、データの受信状況の確認を行う。
【０１５９】
また、ＣＭ１００は、ＮＴＢ１３３およびＤＷ４０１，４０３を介して、ＣＭ３００へのＤＭＡによるデータ転送を行える。この場合、ＣＰＵ１１０は、ＮＴＢ１３３およびＤＷ４０１，４０３を介して、ＮＴＢ３３３、ＵＰ３３２およびＲＰ３１１の各ＵＥＳＴＳを読み取り、データの受信状況の確認を行う。
【０１６０】
こうして、ストレージ装置５０がＣＭを３以上有する場合でも、データの受信状況の確認の効率を容易に向上できる。
【符号の説明】
【０１６１】
１  ストレージ装置
１０，２０  ストレージ制御装置
１１，２１  接続ポート
１１ａ，２１ａ  検出結果記憶部
１２，２２  処理部
１３，２３  データ記憶部
３０  記憶装置群
【図１】
2018060419.tif 000003
【図２】
2018060419.tif 000004
【図３】
2018060419.tif 000005
【図４】
2018060419.tif 000006
【図５】
2018060419.tif 000007
【図６】
2018060419.tif 000008
【図７】
2018060419.tif 000009
【図８】
2018060419.tif 000010
【図９】
2018060419.tif 000011
【図１０】
2018060419.tif 000012
【図１１】
2018060419.tif 000013
【図１２】
2018060419.tif 000014
【図１３】
2018060419.tif 000015
【図１４】
2018060419.tif 000016
【図１５】
2018060419.tif 000017
【図１６】
2018060419.tif 000018