(57)【要約】【課題】  オペレーティングシステムのモジュールを変更することなく、レガシーデバイスの多重化を実施することが可能な多重化装置を提供する。【解決手段】  複数のシステム１０、２０を具備する多重化装置を用いる。システム１０は、ＣＰＵ１０００と、擬似レガシーデバイス１３００と、レガシーデバイス１６００とを備える。擬似レガシーデバイス１３００は、リクエストバッファ１３０３と、擬似動作部１３０４とを含む。リクエストバッファ１３０３は、ＣＰＵ１０００が擬似レガシーデバイス１３００を介してレガシーデバイス１６００へリクエストを送信するとき、リクエストを記憶する。擬似動作部１３０４は、リクエストに基づいてレガシーデバイス１６００に関するエミュレーションを実行して、そのエミュレーション結果としてのレガシーデバイス１６００の内部状態を記憶する。【選択図】      図１
2006178688.tif 000002
【特許請求の範囲】
【請求項１】
複数のシステムを具備し、
前記複数のシステムの各々は、
ＣＰＵと、
前記ＣＰＵと通信可能に接続された擬似レガシーデバイスと、
前記擬似レガシーデバイスと通信可能に接続されたレガシーデバイスと
を備え、
前記擬似レガシーデバイスは、
前記ＣＰＵが前記擬似レガシーデバイスを介して前記レガシーデバイスへリクエストを送信するとき、前記リクエストを記憶するリクエストバッファと、
前記リクエストに基づいて前記レガシーデバイスに関するエミュレーションを実行して、前記エミュレーション結果としての前記レガシーデバイスの内部状態を記憶する擬似動作部と
を含む
多重化装置。
【請求項２】
請求項１に記載の多重化装置において、
前記擬似レガシーデバイスは、
前記レガシーデバイスからのレスポンスを記憶するレスポンスバッファと、
前記擬似動作部から出力された前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値と、前記レスポンスバッファから出力された前記レスポンスとを比較する比較エラー検出部と、
前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、前記期待値をレスポンスとして前記ＣＰＵへ出力する動作部と
を更に含む
多重化装置。
【請求項３】
請求項２に記載の多重化装置において、
受信した割込み通知に基づいて、前記ＣＰＵへ割込みを出力する割込みコントローラを更に備え、
前記動作部は、前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、前記割込みコントローラへ割込み通知を行う
多重化装置。
【請求項４】
請求項１に記載の多重化装置において、
前記擬似レガシーデバイスは、
前記レガシーデバイスからのレスポンスを記憶するレスポンスバッファと、
前記リクエストを前記リクエストバッファで受信してから予め設定された時間以内に、前記レスポンスを前記レスポンスバッファで受信できないタイムアウトを検出するタイムアウト検出部と、
前記タイムアウトに基づいて、前記擬似動作部から出力された前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値を、レスポンスとして前記ＣＰＵへ出力する動作部と
を更に含む
多重化装置。
【請求項５】
請求項４に記載の多重化装置において、
受信した割込み通知に基づいて、前記ＣＰＵへ割込みを出力する割込みコントローラを更に備え、
前記擬似レガシーデバイスは、
前記レガシーデバイスからのレスポンスを記憶するレスポンスバッファと、
前記擬似動作部から出力された前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値と、前記レスポンスバッファから出力された前記レスポンスとを比較する比較エラー検出部と
を更に含み、
前記動作部は、前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、前記割込みコントローラへ割込み通知を行う
多重化装置。
【請求項６】
請求項５に記載の多重化装置において、
前記擬似レガシーデバイスは、
前記動作部は、前記タイムアウトに基づいて、前記割込みコントローラへ割込み通知を行う
多重化装置。
【請求項７】
請求項１乃至６のいずれか一項に記載の多重化装置において、
前記レガシーデバイスは、タイマーであり、
前記擬似レガシーデバイスは、擬似タイマーである
多重化装置。
【請求項８】
多重化装置におけるレガシーデバイス多重化方法であって、
ここで、前記多重化装置は、複数のシステムを備え、
前記複数のシステムの各々
は、
ＣＰＵと、
前記ＣＰＵと通信可能に接続された擬似レガシーデバイスと、
前記擬似レガシーデバイスと通信可能に接続されたレガシーデバイスと
を含み、
（ａ）前記ＣＰＵが前記擬似レガシーデバイスを介して前記レガシーデバイスへリクエストを送信するとき、前記リクエストを記憶するステップと、
（ｂ）前記リクエストに基づいて前記レガシーデバイスに関するエミュレーションを実行するステップと、
（ｃ）前記エミュレーション結果としての前記レガシーデバイスの内部状態を記憶するステップと
を具備する
レガシーデバイス多重化方法。
【請求項９】
請求項８に記載の多重化装置におけるレガシーデバイス多重化方法において、
（ｄ）前記レガシーデバイスからのレスポンスを記憶するステップと、
（ｅ）前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値と、記憶された前記レスポンスとを比較するステップと、
（ｆ）前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、前記期待値をレスポンスとして前記ＣＰＵへ出力するステップと
を更に具備する
レガシーデバイス多重化方法。
【請求項１０】
請求項９に記載のレガシーデバイス多重化方法において、
（ｇ）前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、割込みコントローラへ割込み通知を行うステップを更に具備する
レガシーデバイス多重化方法。
【請求項１１】
請求項８に記載のレガシーデバイス多重化方法において、
（ｈ）前記リクエストを記憶してから予め設定された時間以内に、前記レガシーデバイスからのレスポンスを受信できないタイムアウトを検出するステップと、
（ｉ）前記タイムアウトに基づいて、前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値を、レスポンスとして前記ＣＰＵへ出力するステップと
を更に具備する
レガシーデバイス多重化方法。
【請求項１２】
請求項１１に記載のレガシーデバイス多重化方法において、
（ｊ）前記レガシーデバイスからのレスポンスを記憶するステップと、
（ｋ）前記エミュレーションにより得られる前記リクエストに対する前記レガシーデバイスの期待値と、記憶された前記レスポンスとを比較するステップと、
（ｌ）前記比較結果に基づいて、前記期待値と前記レスポンスとが一致しない場合、割込みコントローラへ割込み通知を行うステップと
を更に具備する
レガシーデバイス多重化方法。
【請求項１３】
請求項１２に記載のレガシーデバイス多重化方法において、
（ｍ）前記タイムアウトに基づいて、前記割込みコントローラへ割込み通知を行うステップを更に具備する
レガシーデバイス多重化方法。
【請求項１４】
請求項７乃至１３のいずれか一項に記載のレガシーデバイス多重化方法において、
前記レガシーデバイスは、タイマーであり、
前記擬似レガシーデバイスは、擬似タイマーである
レガシーデバイス多重化方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、多重化装置及びレガシーデバイス多重化方法に関し、特に擬似レガシーデバイスを用いてレガシーデバイスを多重化する多重化装置及びレガシーデバイス多重化方法に関する。
【背景技術】
【０００２】
近年、コンピュータシステムのオープン化が甚だしく進展している。従来は専用オペレーティングシステムと専用ハードウェアにより構築されてきた多重化システムも、汎用オペレーティングシステムと汎用ハードウェアにより構築されるようになりつつある。
【０００３】
しかし、汎用オペレーティングシステムは必ずしも多重化システムを意識して設計されていない。そのため、多重化システムを構築する際にはいくつかの問題が発生する。このうち、特に問題となるのがレガシーデバイスの多重化方法である。レガシーデバイスは、デバイスのアドレスが固定されており、システム内に1つしか存在しないことが前提となっている。そのため、オペレーティングシステムはレガシーデバイスの障害を検出すると、以降の動作を停止させてしまう場合もある。従って、多重化システムではレガシーデバイスに障害が発生した場合でも、その障害をオペレーティングシステムに気付かれないようにしなければならない。
【０００４】
従来は、レガシーデバイスのフェイルオーバを実現する方法として、レガシーデバイスに対するアクセスを行っているオペレーティングシステム（以下「ＯＳ」と記す）のモジュールを、他のモジュールに置き換える方法が用いられてきた。この方法では、置き換えられたモジュールが、ＯＳからレガシーデバイスに対して発行されるリクエストをトラップする。これにより、レガシーデバイスから不正なレスポンスが返却された場合にも、そのレスポンスをオペレーティングシステムに通知することなく処理を継続することが出来る。しかし、この方法にはいくつかの問題点がある。
【０００５】
１つ目の問題点は、通常、ＯＳのベンダーはソースコードを公開していないため、モジュールを置き換える為にはＯＳのベンダーからソースコードの提供を受ける必要がある点である。従って、ソースコードの提供を受けることの出来ないＯＳには対応することが出来ない。すなわち、フェイルオーバを実現できるオペレーティングシステムに制限が生じていた。
【０００６】
２つ目の問題点としては、ＯＳのモジュールを置き換えることにより、以降の保守性を著しく低下させる点である。オペレーティングシステムのベンダーは、出荷後に発見されたセキュリティホールに対するセキュリティパッチ等を随時リリースする。しかし、パッチを適用する前に、これらのパッチが置き換えられたモジュールに与える影響を考慮する必要がある。そのため、ユーザ側でのパッチ適用が困難になる。すなわち、オペレーティングシステムのモジュールを変更することにより、以降の保守性を大幅に低下させていた。
【０００７】
関連する技術として特開平１１−２３２２０６号公報に入出力制御回路が開示されている。この入出力制御回路は、マイクロプロセッサと入出力回路との間に位置し、上記マイクロプロセッサと上記入出力回路との間で行われる情報の伝達を制御する。ここでマイクロプロセッサは、メモリ制御線を介して所定のアクセスタイミングでアクセス動作を完了するメモリをアクセスする。この入出力制御回路は、（ａ）メモリインタフェース部、（ｂ）エミュレート部を備えることを特徴とする。メモリインタフェース部は、上記メモリ制御線に接続され、上記メモリ制御線より上記マイクロプロセッサから出力されるアクセス要求を入力する。エミュレート部は、上記メモリインタフェース部より入力したアクセス要求に対して、上記所定のアクセスタイミングと同じアクセスタイミングで上記マイクロプロセッサに応答を行う。
【０００８】
関連する技術として特開平９−１４６８５３号公報に二重化計算機及びその障害系復旧方法が開示されている。この二重化計算機は、二重化した処理装置（ＣＰＵ）、二重化した入出力装置（Ｉ／Ｏ）、これらを互いに接続する二重化したシステムバス、Ｉ／Ｏバスからなる。二重化したＣＰＵは同期動作する。二重化したＩ／Ｏは各々非同期に動作する。一方の系のＣＰＵ又はＩ／Ｏに障害が発生した時は他系のＣＰＵ及びＩ／Ｏが稼働状態を継続する。障害が発生した系のＣＰＵ及びＩ／Ｏの保守交換、再組込みが可能である。二重化計算機は、二重化計算機のそれぞれの系が自系の状態を記憶する状態記憶手段と、自系ＣＰＵと自系Ｉ／Ｏ又は他系Ｉ／Ｏとの接続を選択するＩ／Ｏバス接続選択手段を備える。保守交換時は各系において自系ＣＰＵと自系Ｉ／Ｏのみの接続が選択される。
【０００９】
【特許文献１】特開平１１−２３２２０６号
【特許文献２】特開平９−１４６８５３号
【発明の開示】
【発明が解決しようとする課題】
【００１０】
従って、本発明の目的は、オペレーティングシステムのモジュールを変更することなく、レガシーデバイスの多重化を実施することが可能な多重化装置及びレガシーデバイス多重化方法を提供することにある。
【００１１】
また、本発明の他の目的は、オペレーティングシステムのモジュールを変更することなく、タイマーのフェイルオーバを実施することが可能な多重化装置及びレガシーデバイス多重化方法を提供することにある。
【課題を解決するための手段】
【００１２】
以下に、発明を実施するための最良の形態で使用される番号・符号を用いて、課題を解決するための手段を説明する。これらの番号・符号は、特許請求の範囲の記載と発明を実施するための最良の形態との対応関係を明らかにするために括弧付きで付加されたものである。ただし、それらの番号・符号を、特許請求の範囲に記載されている発明の技術的範囲の解釈に用いてはならない。
【００１３】
従って、上記課題を解決するために、本発明の多重化装置は、複数のシステム（１０、２０）を具備する。複数のシステム（１０、２０）の各々（１０）は、ＣＰＵ（１０００）と、ＣＰＵ（１０００）と通信可能に接続された擬似レガシーデバイス（１３００）と、擬似レガシーデバイス（１３００）と通信可能に接続されたレガシーデバイス（１６００）とを備える。擬似レガシーデバイス（１３００）は、リクエストバッファ（１３０３）と、擬似動作部（１３０４）とを含む。リクエストバッファ（１３０３）は、ＣＰＵ（１０００）が擬似レガシーデバイス（１３００）を介してレガシーデバイス（１６００）へリクエストを送信するとき、そのリクエストを記憶する。擬似動作部（１３０４）は、そのリクエストに基づいてレガシーデバイス（１６００）に関するエミュレーションを実行して、そのエミュレーション結果としてのレガシーデバイス（１６００）の内部状態を記憶する。
リクエストに対してエミュレーションを行い内部状態を保持することで、フェイルオーバを行う際に必要となる情報を常に保持し、更新することができる。これにより、オペレーティングシステムのモジュールを変更することなく、レガシーデバイスの多重化を実施することが可能となる。
【００１４】
上記の多重化装置において、擬似レガシーデバイス（１３００）は、レスポンスバッファ（１３０５）と、比較エラー検出部（１３０６）と、動作部（１３０９＋１３０７）とを更に含むことが好ましい。その場合、レスポンスバッファ（１３０５）は、レガシーデバイス（１６００）からのレスポンスを記憶する。比較エラー検出部（１３０６）は、擬似動作部（１３０４）から出力されたそのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値と、レスポンスバッファ（１３０５）から出力されたそのレスポンスとを比較する。動作部（１３０９＋１３０７）は、その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、その期待値をレスポンスとしてＣＰＵ（１０００）へ出力する。
リクエストと期待値とが一致しない場合、障害が発生していることになるが、期待値をレスポンスとして返すことにより、オペレーティングシステムにレガシーデバイスの障害を通知することなく（システムを中断させること無く）、処理を一時的に継続することができる。
【００１５】
上記の多重化装置において、受信した割込み通知に基づいて、ＣＰＵ（１０００）へ割込みを出力する割込みコントローラ（１４００）を更に備えることが好ましい。その場合、動作部（１３０９＋１３０７）は、その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、割込みコントローラ（１４００）へ割込み通知を行う。
アクセス対象となるレガシーデバイスの障害を検出したとき、割込みを発生させることでレガシーデバイスのフェイルオーバを実現することができる。
【００１６】
上記の多重化装置において、擬似レガシーデバイス（１３００）は、レスポンスバッファ（１３０５）と、タイムアウト検出部（１３０８）と、動作部（１３０９＋１３０７）とを更に含むことが好ましい。その場合、レスポンスバッファ（１３０５）は、レガシーデバイス（１６００）からのレスポンスを記憶する。タイムアウト検出部（１３０８）は、そのリクエストをリクエストバッファ（１３０３）で受信してから予め設定された時間以内に、そのレスポンスをレスポンスバッファ（１３０５）受信できないタイムアウトを検出する。動作部（１３０９＋１３０７）は、そのタイムアウトに基づいて、擬似動作部（１３０４）から出力されたそのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値を、レスポンスとしてＣＰＵ（１０００）へ出力する。
タイムアウトが発生している場合、障害が発生していることになるが、期待値をレスポンスとして返すことにより、オペレーティングシステムにレガシーデバイスの障害を通知することなく（システムを中断させること無く）、処理を一時的に継続することができる。
【００１７】
上記の多重化装置において、受信した割込み通知に基づいて、ＣＰＵ（１０００）へ割込みを出力する割込みコントローラ（１４００）を更に備えることが好ましい。擬似レガシーデバイス（１３００）は、レスポンスバッファ（１３０５）と、比較エラー検出部（１３０６）とを更に含むことが好ましい。その場合、レスポンスバッファ（１３０５）は、レガシーデバイス（１６００）からのレスポンスを記憶する。比較エラー検出部（１３０６）は、擬似動作部（１３０４）から出力されたそのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値と、レスポンスバッファ（１３０５）から出力されたそのレスポンスとを比較する。動作部（１３０９＋１３０７）は、その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、割込みコントローラ（１４００）へ割込み通知を行う。
アクセス対象となるレガシーデバイスの障害を検出したとき、割込みを発生させることでレガシーデバイスのフェイルオーバを実現することができる。
【００１８】
上記の多重化装置において、擬似レガシーデバイス（１３００）は、動作部（１３０９＋１３０７）は、そのタイムアウトに基づいて、割込みコントローラ（１４００）へ割込み通知を行うことが好ましい。
アクセス対象となるレガシーデバイスの障害を検出したとき、割込みを発生させることでレガシーデバイスのフェイルオーバを実現することができる。
【００１９】
上記の多重化装置において、レガシーデバイス（１６００）は、タイマー（３６００）である。擬似レガシーデバイス（１３００）は、擬似タイマー（３３００）であることが好ましい。
アクセス対象となるタイマーの障害を検出した場合には、オペレーティングシステムに透過なシステム管理割込みを発行し、以降では擬似タイマーが擬似レスポンスを返す。システム管理割込みのハンドラは、擬似タイマーに格納されたフェイルオーバ元のタイマーの状態を元に、フェイルオーバ先のタイマーの設定を行うことにより、オペレーティングシステムにタイマーの障害を感知させること無く、処理を継続させることが出来る。
【００２０】
上記課題を解決するために、本発明の多重化装置におけるレガシーデバイス多重化方法は、（ａ）ＣＰＵ（１０００）が擬似レガシーデバイス（１３００）を介してレガシーデバイス（１６００）へリクエストを送信するとき、そのリクエストを記憶するステップと、（ｂ）そのリクエストに基づいてレガシーデバイス（１６００）に関するエミュレーションを実行するステップと、（ｃ）そのエミュレーション結果としてのレガシーデバイス（１６００）の内部状態を記憶するステップとを具備する。ここで、多重化装置は、複数のシステム（１０、２０）を備える。複数のシステム（１０、２０）の各々（１０）は、ＣＰＵ（１０００）と、ＣＰＵ（１０００）と通信可能に接続された擬似レガシーデバイス（１３００）と、擬似レガシーデバイス（１３００）と通信可能に接続されたレガシーデバイス（１６００）とを含む。
【００２１】
上記の多重化装置におけるレガシーデバイス多重化方法において、（ｄ）レガシーデバイス（１６００）からのレスポンスを記憶するステップと、（ｅ）そのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値と、記憶されたそのレスポンスとを比較するステップと、（ｆ）その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、その期待値をレスポンスとしてＣＰＵ（１０００）へ出力するステップとを更に具備する。
【００２２】
上記のレガシーデバイス多重化方法において、（ｇ）その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、割込みコントローラ（１４００）へ割込み通知を行うステップを更に具備する。
【００２３】
上記のレガシーデバイス多重化方法において、（ｈ）そのリクエストを記憶してから予め設定された時間以内に、レガシーデバイス（１６００）からのレスポンスを受信できないタイムアウトを検出するステップと、（ｉ）そのタイムアウトに基づいて、そのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値を、レスポンスとしてＣＰＵ（１０００）へ出力するステップとを更に具備する。
【００２４】
上記のレガシーデバイス多重化方法において、（ｊ）レガシーデバイス（１６００）からのレスポンスを記憶するステップと、（ｋ）そのエミュレーションにより得られるそのリクエストに対するレガシーデバイス（１６００）の期待値と、記憶されたそのレスポンスとを比較するステップと、（ｌ）その比較結果に基づいて、その期待値とそのレスポンスとが一致しない場合、割込みコントローラ（１４００）へ割込み通知を行うステップとを更に具備する。
【００２５】
上記のレガシーデバイス多重化方法において、（ｍ）そのタイムアウトに基づいて、割込みコントローラ（１４００）へ割込み通知を行うステップを更に具備する。
【００２６】
上記のレガシーデバイス多重化方法において、レガシーデバイス（１６００）は、タイマー（３６００）である。擬似レガシーデバイス（１３００）は、擬似タイマー（３３００）である。
【発明の効果】
【００２７】
本発明により、オペレーティングシステムのモジュールを変更することなく、レガシーデバイスの多重化を実施することができる。オペレーティングシステムのモジュールを変更することなく、タイマーのフェイルオーバを実施することが可能となる。
【発明を実施するための最良の形態】
【００２８】
（第１の実施の形態）
本発明の多重化装置及びレガシーデバイス多重化方法の第１の実施の形態について、添付図面を参照して説明する。
【００２９】
まず、本発明の多重化装置の第１の実施の形態の構成について説明する。
図１は、本発明の多重化装置の第１の実施の形態の構成を示すブロック図である。多重化装置は、第１システム１０及び第２システム２０を具備し、二重化（多重化の一例）されたコンピュータシステムに例示される。第１システム１０は、ＣＰＵ１０００、メモリコントローラ１１００、メモリ１２００、擬似レガシーデバイス１３００、割込みコントローラ１４００、Ｉ／Ｏコントローラ１５００、レガシーデバイス１６００を備える。同様に、第２システム２０は、ＣＰＵ２０００、メモリコントローラ２１００、メモリ２２００、擬似レガシーデバイス２３００、割込みコントローラ２４００、Ｉ／Ｏコントローラ２５００、レガシーデバイス２６００を備える。
【００３０】
ここでは、ロックステップ方式による多重化装置を基本として説明する。すなわち、図１においてＣＰＵ１０００とＣＰＵ２０００、メモリコントローラ１１００とメモリコントローラ２１００、メモリ１２００とメモリ２２００、擬似レガシーデバイス１３００と擬似レガシーデバイス２３００、割込みコントローラ１４００と割込みコントローラ２４００はロックステップ動作を行っている。レガシーデバイス１６００とレガシーデバイス２６００は、どちらか一方がアクティブ状態で動作しており、他方はスタンバイ状態で待機している。以下、第１システム１０について説明するが、第２システム２０についても同様である（ただし、符号は２０００番台）。
【００３１】
通常動作時には、ＣＰＵ１０００では、オペレーティングシステム（以下「ＯＳ」と記す）が動作している。ＯＳは、メモリ１２００、Ｉ／Ｏコントローラ１５００、Ｉ／Ｏコントローラ２５００配下のＩ／Ｏデバイスにアクセスを行う。また、システム管理割込み（ＳＭＩ）が通知されると、ＣＰＵ１０００は、しばらく後にＢＩＯＳ（図示されず）内部のシステム管理割込みハンドラに動作を切り替える。システム管理割込みハンドラの処理が終わると、ＣＰＵ１０００は、ＯＳに動作を切り替える。
【００３２】
メモリコントローラ１１００は、ＣＰＵ１０００で動作しているＯＳ又はＢＩＯＳからレガシーデバイスに対するリクエストが発行された場合、そのリクエストを擬似レガシーデバイス１３００に対して送信する。そして、そのリクエストに対するレスポンスを擬似レガシーデバイス１３００から受信する。また、レガシーデバイス１６００以外に対するリクエストの場合には、そのリクエストをＩ／Ｏコントローラ１５００に対して送信する。そして、そのリクエストに対するレスポンスをＩ／Ｏコントローラ１５００から受信する。
【００３３】
擬似レガシーデバイス１３００は、上位Ｉ／Ｆ部１３０１、下位Ｉ／Ｆ部１３０２、リクエストバッファ１３０３、擬似動作部１３０４、レスポンスバッファ１３０５、比較エラー検出部１３０６、レスポンスセレクタ１３０７、タイムアウト検出部１３０８、動作制御部１３０９を備える。
【００３４】
上位Ｉ／Ｆ部１３０１は、レガシーデバイス１６００に対するリクエストを受信し、そのリクエストをリクエストバッファ１３０３に送信する。また、レスポンスセレクタ１３０７経由でリクエストに対応するレスポンスを受信して、メモリコントローラ１１００へ送信する。
【００３５】
リクエストバッファ１３０３は、上位Ｉ／Ｆ部１３０１から送信されてきたリクエストを保持する。それとともに、下位Ｉ／Ｆ部１３０２に対してそのリクエストを送信する。
【００３６】
下位Ｉ／Ｆ部１３０２は、リクエストバッファ１３０３から送信されたリクエストをＩ／Ｏコントローラ１５００に送信する。それと共に、Ｉ／Ｏコントローラ１５００からのレスポンスを受信し、受信したレスポンスをレスポンスバッファ１３０５に受け渡す。
【００３７】
レスポンスバッファ１３０５は、Ｉ／Ｏコントローラ１５００から送信されたレスポンスを受け取ると、レスポンスを受信したことを擬似動作部１３０４に通知する。
【００３８】
擬似動作部１３０４は、レスポンスバッファ１３０５からレスポンスを受信したことを伝えられると、そのレスポンスに対応するリクエストをリクエストバッファ１３０３から取得する。そして、擬似動作部１３０４は、取得したリクエストに基づいて、レガシーデバイス１６００の内部状態をエミュレーションにより把握し、その内部状態を格納する（更新する）。それと共に、取得したリクエストに対するレスポンスの期待値をエミュレーションにより生成する。擬似動作部１３０４は、その期待値を比較エラー検出部１３０６に通知する。この際、取り出したリクエストはリクエストバッファ１３０３から削除する。
【００３９】
比較エラー検出部１３０６は、擬似動作部１３０４により生成された期待値とレガシーデバイスから受信したレスポンスとを比較し、不一致が発生していないかどうか確認する。不一致が発生した場合には、不一致が発生したことを動作制御部１３０９に通知する。
【００４０】
タイムアウト検出部１３０８は、リクエストバッファ１３０３とレスポンスバッファ１３０５を監視し、一定時間以上レスポンスが返ってこないリクエストを検出すると、動作制御部１３０９に通知を行う。
【００４１】
動作制御部１３０９は、比較エラー検出部１３０６と、タイムアウト検出部１３０８からの通知に基づいて、レガシーデバイス１６００に障害が発生したかどうかを判断し、動作モードの制御を行う。また、レガシーデバイスに障害が発生した場合には、割込みコントローラ１４００に対して通知を行う。
【００４２】
レスポンスセレクタ１３０７は、動作制御部１３０９の指示に基づいて、擬似動作部１３０４のレスポンス及びレスポンスバッファ１３０４のレスポンスのいずれかを上位Ｉ／Ｆ部１３０１へ出力する。
【００４３】
Ｉ／Ｏコントローラ１５００は、ＣＰＵ１０００又は擬似レガシーデバイス１３００により発行されたリクエストを、レガシーデバイス１６００又はレガシーデバイス２６００のうち、アクティブ状態にある側に送信する。また、レガシーデバイス１６００又はレガシーデバイス２６００からのレスポンスを、ＣＰＵ１０００又は擬似レガシーデバイス１３００に送信する。
【００４４】
割込みコントローラ１４００は、動作制御部１３０９からレガシーデバイスに発生した障害の通知を受信して、ＣＰＵ１０００へその障害に対応した割込みを行う。
【００４５】
次に、本発明のレガシーデバイス多重化方法の第１の実施の形態（擬似レガシーデバイスを適用した多重化装置の動作）について説明する。ここでは、レガシーデバイス１６００、レガシーデバイス２６００のうち、レガシーデバイス１６００がアクティブ状態で、レガシーデバイス２６００がスタンバイ状態である場合を考える。
【００４６】
なお、ここでは、動作に直接関係の無いクロスブリッジ及びＩ／Ｏバス（第３の実施の形態に記載）を省略している。
【００４７】
図２は、本発明のレガシーデバイス多重化方法の第１の実施の形態の動作を示すフロー図である。
【００４８】
まず、正常な動作について説明する。
【００４９】
時刻Ｔ１において、オペレーティングシステム（ＯＳ＝ＣＰＵ１０００）は、レガシーデバイス１６００に対するリクエスト１を生成する。ＯＳは、リクエスト１をメモリコントローラ１１００を介して、擬似レガシーデバイス１３００へ送信する。擬似レガシーデバイス１３００は、リクエスト１を受信する（ステップＳ０１）。
【００５０】
擬似レガシーデバイス１３００の上位Ｉ／Ｆ部１３０１は、受信したリクエスト１をリクエストバッファ１３０３へ送信する。リクエストバッファ１３０３は、リクエスト１を保持すると共に、下位Ｉ／Ｆ部１３０２へリクエスト１を送信する。下位Ｉ／Ｆ部１３０２は、リクエスト１をＩ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、リクエスト１をレガシーデバイス１６００に送信する（ステップＳ０２）。
【００５１】
レガシーデバイス１６００は、リクエスト１に対するレスポンス１を生成し、Ｉ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、受信したレスポンス１を擬似レガシーデバイス１３００に送信する（ステップＳ０３）。
【００５２】
擬似レガシーデバイス１３００の下位Ｉ／Ｆ部１３０２は、受信したレスポンス１をレスポンスバッファ１３０５へ送信する。レスポンスバッファ１３０５は、レスポンス１を保持する。レスポンスバッファ１３０５は、レスポンス１を受信したことを擬似動作部１３０４に通知する。擬似動作部１３０４は、レスポンスバッファ１３０５が受信したレスポンス１に対応するリクエスト１をリクエストバッファ１３０３より取り出し、レガシーデバイス１６００の擬似動作（エミュレーション）を行う。この擬似動作では、擬似動作部１３０４に格納されたレガシーデバイス１６００の内部状態を更新すると共に、リクエスト１に対するレスポンスの期待値１を生成する。比較エラー検出部１３０６は、擬似動作部１３０４により生成された期待値１とレスポンス１とを比較し、比較結果を動作制御部１３０９へ送信する。動作制御部１３０９は、期待値１とレスポンス１との間に不一致が発生していない場合、レガシーデバイス１６００からのレスポンス１（レスポンスバッファ１３０５内に格納されている）をＯＳに返却するように、レスポンスセレクタ１３０７に指示する。レスポンスセレクタ１３０７は、レスポンスバッファ１３０５からレスポンス１を受信し、上位Ｉ／Ｆ部１３０１を介してＯＳへ向けてレスポンス１を出力する（ステップＳ０４）。
【００５３】
レガシーデバイスが正常な場合、以上説明したように本発明のレガシーデバイス多重化方法が実行される。
【００５４】
次に、レガシーデバイス１６００に障害が発生した場合について説明する。
【００５５】
時刻Ｔ２において、ＯＳは、レガシーデバイス１６００に対するリクエスト２を生成する。ＯＳは、リクエスト２をメモリコントローラ１１００を介して、擬似レガシーデバイス１３００へ送信する。擬似レガシーデバイス１３００は、リクエスト２を受信する（ステップＳ０５）。
【００５６】
擬似レガシーデバイス１３００の上位Ｉ／Ｆ部１３０１は、受信したリクエスト２をリクエストバッファ１３０３へ送信する。リクエストバッファ１３０３は、リクエスト２を保持すると共に、下位Ｉ／Ｆ部１３０２へリクエスト２を送信する。下位Ｉ／Ｆ部１３０２は、リクエスト２をＩ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、リクエスト２をレガシーデバイス１６００に送信する（ステップＳ０６）。
【００５７】
レガシーデバイス１６００は、リクエスト２に対するレスポンス２を生成し、Ｉ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、受信したレスポンス２を擬似レガシーデバイス１３００に送信する（ステップＳ０７）。
【００５８】
擬似レガシーデバイス１３００の下位Ｉ／Ｆ部１３０２は、受信したレスポンス２をレスポンスバッファ１３０５へ送信する。レスポンスバッファ１３０５は、レスポンス２を保持する。レスポンスバッファ１３０５は、レスポンス２を受信したことを擬似動作部１３０４に通知する。擬似動作部１３０４は、レスポンスバッファ１３０５が受信したレスポンス２に対応するリクエスト２をリクエストバッファ１３０３より取り出し、擬似動作を行って、リクエスト２に対するレスポンスの期待値２を生成する。比較エラー検出部１３０６は、擬似動作部１３０４により生成された期待値２とレスポンス２とを比較し、比較結果を動作制御部１３０９へ送信する。動作制御部１３０９は、期待値２とレスポンス２との間に不一致が発生していることを認識する（ステップＳ０８）。
【００５９】
動作制御部１３０９は、割込みコントローラ１４００を経由して、ＣＰＵ１０００に対してシステム割込みを通知する（ステップＳ０９）。
【００６０】
それと並行して、動作制御部１３０９は、擬似動作部１３０４の期待値２をＯＳに返却するように、レスポンスセレクタ１３０７に指示する。レスポンスセレクタ１３０７は、擬似動作部１３０４から期待値２を受信し、上位Ｉ／Ｆ部１３０１を介してＯＳへ向けて期待値２をレスポンス２として出力する（ステップＳ１０）。
【００６１】
これ以降、時刻Ｔ３、Ｔ４にＯＳが発行するレガシーデバイス１６００に対するリクエスト３（ステップＳ１１）、リクエスト４（ステップＳ１３）は、レガシーデバイス１６００に対して送信は行われず、擬似レガシーデバイス１３００内部で生成される期待値３、期待値４がレスポンス３（ステップＳ１２）、レスポンス４（ステップＳ１４）としてＯＳに返却される。この間、擬似動作部１３０４はリクエスト３、リクエスト４の内容に基づき、レガシーデバイス１６００の内部状態のエミュレーションを行い、期待値３、期待値４を生成する。
【００６２】
時刻Ｔ５において、ＢＩＯＳは、フェイルオーバ処理を開始する（ステップＳ１５）。ＢＩＯＳは、擬似動作部１３０４に保持されているレガシーデバイス１６００の内部状態を参照する（ステップＳ１６、Ｓ１７）。ＢＩＯＳは、レガシーデバイス１６００の内部状態に基づいて、レガシーデバイス２６００の設定を行う（ステップＳ１８、Ｓ１９）。ＢＩＯＳは、フェイルオーバ処理を終了する（ステップＳ２０）。
【００６３】
フェイルオーバ処理が完了した後、レガシーデバイス２６００をアクティブ状態とした動作が開始される。時刻Ｔ６において、ＯＳがリクエスト５を生成し、擬似レガシーデバイス１３００経由（ステップＳ２１）で、レガシーデバイス２６００に送信される（ステップＳ２２）。レガシーデバイス２６００は、レスポンス５を生成し、擬似レガシーデバイス１３００経由（ステップＳ２３）で、ＯＳへレスポンス５として返却される（ステップＳ２４）。
【００６４】
レガシーデバイスに障害が発生した場合、以上説明したように本発明のレガシーデバイス多重化方法が実行される。
【００６５】
図３は、本発明のレガシーデバイス多重化方法の第１の実施の形態の他の動作を示すフロー図である。
【００６６】
次に、レスポンスのタイムアウトが発生した場合について説明する。
【００６７】
時刻Ｔ７において、ＯＳは、レガシーデバイス１６００に対するリクエスト６を生成する。ＯＳは、リクエスト６をメモリコントローラ１１００を介して、擬似レガシーデバイス１３００へ送信する。擬似レガシーデバイス１３００は、リクエスト６を受信する（ステップＳ３１）。擬似レガシーデバイス１３００は、上述と同様のステップで、リクエスト６をＩ／Ｏコントローラ１５００経由でレガシーデバイス１６００に送信する（ステップＳ３２）。
【００６８】
タイムアウト検出部１３０８は、リクエストバッファ１３０３とレスポンスバッファ１３０５を監視し、リクエスト６の受信後に所定の時間ΔＴ（＝時刻Ｔ８−時刻Ｔ７）経過してもレガシーデバイス１６００からレスポンス６が返却されないと判定する。タイムアウト検出部１３０８は、レスポンスのタイムアウトが発生したことを動作制御部１３０９へ通知する（ステップＳ３３）。
【００６９】
動作制御部１３０９は、レスポンスのタイムアウトが発生したことを認識する。動作制御部１３０９は、割込みコントローラ１４００を経由して、ＣＰＵ１０００に対してシステム管理割込みを通知する（ステップＳ３４）。
【００７０】
それと並行して、動作制御部１３０９は、擬似動作部１３０４のレスポンス６に対する期待値６をＯＳに返却するように、レスポンスセレクタ１３０７に指示する。レスポンスセレクタ１３０７は、擬似動作部１３０４から期待値６を受信し、上位Ｉ／Ｆ部１３０１を介してＯＳへ向けて期待値６をレスポンス６として出力する（ステップＳ３５）。これ以降は、レスポンスと期待値との間で不一致が発生した場合と同様に、レガシーデバイス１６００のフェイルオーバ処理（上述のステップＳ１５〜Ｓ２０）が開始される。
【００７１】
レスポンスのタイムアウトが発生した場合、以上説明したように本発明のレガシーデバイス多重化方法が実行される。
【００７２】
このように本発明においては、擬似レガシーデバイス１３００の機能によりオペレーティングシステムのモジュールを変更することなく、レガシーデバイスの多重化を実施することが可能となる。
【００７３】
（第２の実施の形態）
本発明の多重化装置及びレガシーデバイス多重化方法の第２の実施の形態について、添付図面を参照して説明する。
【００７４】
まず、本発明の多重化装置の第２の実施の形態の構成について説明する。
図４は、本発明の多重化装置の第２の実施の形態の構成を示すブロック図である。第１の実施の形態（図１）と比較すると、割込みコントローラ１４００、２４００がフェイルオーバコントローラ１７００、２７００に置き換えられている点が異なる。
【００７５】
第１の実施の形態（図１）では、ＣＰＵ１０００が、フェイルオーバ処理を実施している。しかし、本実施の形態（図４）では、フェイルオーバコントローラ１７００が、フェイルオーバ処理を実施する。すなわち、第１の実施の形態（図１）では、擬似レガシーデバイス１３００の擬似動作部１３０４の生成した期待値に誤りが生じた場合、ＣＰＵ１０００（＝オペレーティングシステム：ＯＳ）が誤動作する可能性も考えられる。本実施の形態（図４）では、擬似レガシーデバイスが生成した期待値をオペレーティングシステムに返すことがないため、ＯＳの誤動作を発生させることがない点で、第１の実施の形態（図１）よりも優れている。
【００７６】
その他の構成については、第１の実施の形態と同様であるのでその説明を省略する。
【００７７】
図５は、本発明のレガシーデバイス多重化方法の第２の実施の形態の動作を示すフロー図である。ここでも、レガシーデバイス１６００、レガシーデバイス２６００のうち、レガシーデバイス１６００がアクティブ状態で、レガシーデバイス２６００がスタンバイ状態である場合を考える。
【００７８】
時刻Ｔ９において、ＯＳ（＝ＣＰＵ１０００）は、レガシーデバイス１６００に対するリクエスト７を生成する。ＯＳは、リクエスト７をメモリコントローラ１１００を介して、擬似レガシーデバイス１３００へ送信する。擬似レガシーデバイス１３００は、リクエスト７を受信する（ステップＳ４１）。
【００７９】
擬似レガシーデバイス１３００の上位Ｉ／Ｆ部１３０１は、受信したリクエスト７をリクエストバッファ１３０３へ送信する。リクエストバッファ１３０３は、リクエスト７を保持すると共に、下位Ｉ／Ｆ部１３０２へリクエスト７を送信する。下位Ｉ／Ｆ部１３０２は、リクエスト７をＩ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、リクエスト７をレガシーデバイス１６００に送信する（ステップＳ４２）。
【００８０】
レガシーデバイス１６００は、リクエスト７に対するレスポンス７を生成し、Ｉ／Ｏコントローラ１５００に送信する。Ｉ／Ｏコントローラ１５００は、受信したレスポンス７を擬似レガシーデバイス１３００に送信する（ステップＳ４３）。
【００８１】
擬似レガシーデバイス１３００の下位Ｉ／Ｆ部１３０２は、受信したレスポンス７をレスポンスバッファ１３０５へ送信する。レスポンスバッファ１３０５は、レスポンス７を保持する。レスポンスバッファ１３０５は、レスポンス７を受信したことを擬似動作部１３０４に通知する。擬似動作部１３０４は、レスポンスバッファ１３０５が受信したレスポンス７に対応するリクエスト７をリクエストバッファ１３０３より取り出し、擬似動作を行って、リクエスト７に対するレスポンスの期待値７を生成する。比較エラー検出部１３０６は、擬似動作部１３０４により生成された期待値７とレスポンス７とを比較し、比較結果を動作制御部１３０９へ送信する。動作制御部１３０９は、期待値７とレスポンス７との間に不一致が発生していることを認識する（ステップＳ４４）。
【００８２】
動作制御部１３０９は、レスポンス７と期待値７との間に不一致が発生したことをフェイルオーバコントローラ１７００へ通知する（ステップＳ４５）。
【００８３】
フェイルオーバコントローラ１７００は、動作制御部１３０９からレガシーデバイスの障害の発生を通知されると、フェイルオーバ処理を開始する（ステップＳ４６）。フェイルオーバコントローラ１７００は、擬似動作部１３０４に保持されているレガシーデバイス１６００の内部状態を参照する（ステップＳ４７、Ｓ４８）。フェイルオーバコントローラ１７００は、レガシーデバイス１６００の内部状態に基づいて、レガシーデバイス２６００の設定を行う（ステップＳ４９、Ｓ５０）。フェイルオーバコントローラ１７００は、フェイルオーバ処理を終了する（ステップＳ５１）。
【００８４】
フェイルオーバ処理が完了した後、レガシーデバイス２６００をアクティブ状態とした動作が開始される。擬似レガシーデバイス１３００のリクエストバッファ１３０３は、下位Ｉ／Ｆ部１３０２を介して、リクエスト７をレガシーデバイス２６００に送信する（ステップＳ５２）。レガシーデバイス２６００は、リクエスト７に対するレスポンス７を生成し、擬似レガシーデバイス１３００へレスポンス７を返却する（ステップＳ５３）。この後、正常の場合のときと同様に、擬似レガシーデバイス１３００は、レスポンス７をＯＳに返却する。そして、これ以降の時刻Ｔ１０において、ＯＳが発行するレガシーデバイスに対するリクエスト８は、レガシーデバイス２６００に送信される。
【００８５】
本実施の形態の場合にも、第１の実施の形態と同様の効果を得ることができる。加えて、本実施の形態では、擬似レガシーデバイス１３００が生成した期待値をＯＳ（＝ＣＰＵ１０００）へ返すことがないため、ＯＳの誤動作を発生させることがない。
【００８６】
（第３の実施の形態）
本発明の多重化装置及びレガシーデバイス多重化方法の第３の実施の形態について、添付図面を参照して説明する。
【００８７】
まず、本発明の多重化装置の第３の実施の形態の構成について説明する。
図６は、本発明の多重化装置の第３の実施の形態の構成を示すブロック図である。多重化装置は、第１システム３０及び第２システム４０を具備し、二重化（多重化の一例）されたコンピュータシステムに例示される。第１システム３０は、ＣＰＵ３０００、メモリコントローラ３１００、メモリ３２００、擬似タイマー３３００、クロスブリッジ３４００、Ｉ／Ｏコントローラ３５００、タイマー３６００、割込みコントローラ３７００、Ｉ／Ｏバス３８００を備える。同様に、第２システム４０は、ＣＰＵ４０００、メモリコントローラ４１００、メモリ４２００、擬似タイマー４３００、クロスブリッジ４４００、Ｉ／Ｏコントローラ４５００、タイマー４６００、割込みコントローラ４７００、Ｉ／Ｏバス４８００を備える。
【００８８】
ここでは、ロックステップ方式による多重化装置を基本として説明する。すなわち、図６においてＣＰＵ３０００とＣＰＵ４０００、メモリコントローラ３１００とメモリコントローラ４１００、メモリ３２００とメモリ４２００、擬似タイマー３３００と擬似タイマー４３００はロックステップ動作を行っている。また、Ｉ／Ｏコントローラ３５００とＩ／Ｏコントローラ４５００、タイマー３６００とタイマー４６００、及び割込みコントローラ３７００と割込みコントローラ４７００は、どちらか一方がアクティブ状態で動作しており、他方はスタンバイ状態で待機している。以下、第１システム３０について説明するが、第２システム４０についても同様である（ただし、符号は４０００番台）。  
【００８９】
通常動作時には、ＣＰＵ３０００では、オペレーティングシステム（以下「ＯＳ」と記す）が動作している。ＯＳは、メモリ３２００、Ｉ／Ｏコントローラ３５００、Ｉ／Ｏコントローラ４５００配下のＩ／Ｏデバイスにアクセスを行う。また、システム管理割込み（ＳＭＩ）が通知されると、ＣＰＵ３０００は、しばらく後にＢＩＯＳ（図示されず）内部のシステム管理割込みハンドラに動作を切り替える。システム管理割込みハンドラの処理が終わると、ＣＰＵ３０００は、ＯＳに動作を切り替える。
【００９０】
メモリコントローラ３１００は、ＯＳ又はＢＩＯＳからＩ／Ｏデバイスに対するリクエストが発行された場合、そのリクエストを擬似タイマー３３００に対して送信する。そして、そのリクエストに対するレスポンスを擬似タイマー３３００から受信する。
【００９１】
なお、タイマー３６００以外に対するリクエストの場合には、そのリクエストをクロスブリッジ３４００へ送信するようにしても良い。その場合、そのリクエストに対するレスポンスをクロスブリッジ３４００から受信する。その際、メモリコントローラ３１００とクロスブリッジ３４００との間の配線（図示されず）を介して送受信を行う。
【００９２】
擬似タイマー３３００は、上位Ｉ／Ｆ部３３０１、リクエストバッファ３３０２、タイムアウト検出部３３０３、動作制御部３３０４、下位Ｉ／Ｆ部３３０５、タイマー割込み検出部３３０６、レスポンスバッファ３３０７、比較エラー検出部３３０８、レスポンスセレクタ３３０９、擬似動作部３３１０を備える。
【００９３】
上位Ｉ／Ｆ部３３０１は、Ｉ／Ｏデバイスに対するリクエストを受信し、そのリクエストを下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。また、ＣＰＵ３０００に対するレスポンス又はリクエストを受信すると、それらをメモリコントローラ３１００へ送信する。
【００９４】
リクエストバッファ３３０２は、上位Ｉ／Ｆ部３３０１から送信されてきたリクエストがタイマー３６００、タイマー４６００に対するアクセスかどうかを判断し、タイマー３６００、タイマー４６００に対するリクエストの場合には、そのリクエストのコピーを保持する。
【００９５】
下位Ｉ／Ｆ部３３０５は、上位Ｉ／Ｆ部３３０１から送信されたリクエストをクロスブリッジ３４００に送信する。それと共に、Ｉ／Ｏデバイスからのレスポンスをクロスブリッジ３４００経由で受信し、受信したレスポンスをレスポンスバッファ３３０７に送信する。
【００９６】
レスポンスバッファ３３０７は、下位Ｉ／Ｆ部３３０５からレスポンスデータを受信すると、レスポンスデータを受信したことを擬似動作部３３１０に通知する。
【００９７】
擬似動作部３３１０は、レスポンスバッファ３３０７からレスポンスを受信したことを伝えられると、そのレスポンスに対応するリクエストをリクエストバッファ３３０２から取得する。取得したリクエストに対するレスポンスの期待値を生成し、比較エラー検出部３３０８に通知する。この際、取り出したリクエストはリクエストバッファ３３０２から削除する。
【００９８】
比較エラー検出部３３０８は、擬似動作部３３１０により生成された期待値とタイマーから受信したレスポンスデータとを比較し、不一致が発生していないかどうか確認する。不一致が発生した場合には、不一致が発生したことを動作制御部３３０４に通知する。
【００９９】
タイムアウト検出部３３０３は、リクエストバッファ３３０２とレスポンスバッファ３３０７を監視し、一定時間以上レスポンスが返ってこないリクエストを検出すると、動作制御部３３０４に通知を行う。
【０１００】
動作制御部３３０４は、比較エラー検出部３３０８と、タイムアウト検出部３３０３からの通知に基づいて、タイマー３６００に障害が発生したかどうかを判断し、動作モードの制御を行う。また、タイマーに障害が発生した場合には、ＣＰＵ３０００に対して、ＯＳに透過なシステム管理割込みを発行する。このシステム管理割込みはＢＩＯＳにより処理され、ＯＳはシステム管理割込みが発生したことを感知しない。
【０１０１】
レスポンスセレクタ３３０９は、動作制御部３３０４の指示に基づいて、擬似動作部４３１０のレスポンス及びレスポンスバッファ３３０７のレスポンスのいずれかを上位Ｉ／Ｆ部３３０１へ出力する。
【０１０２】
タイマー割込み検出部３３０６は、割込みコントローラ３７００から出力された割込みリクエストを検出して、擬似動作部３３１０へ通知する。
【０１０３】
クロスブリッジ３４００は、擬似タイマー３３００により発行されたリクエストを、タイマー３６００又はタイマー４６００のうち、アクティブ状態にある側に送信する。また、タイマー３６００又はタイマー４６００からのレスポンスを、擬似タイマー３３００に送信する。また、Ｉ／Ｏコントローラ３５００、Ｉ／Ｏコントローラ４５００からのレスポンスと、割込みリクエストを受信し、擬似タイマー３３００に送信する。
【０１０４】
Ｉ／Ｏコントローラ３５００はクロスブリッジ３４００、クロスブリッジ４４００からのリクエストを、Ｉ／Ｏバス３８００に送信する。
【０１０５】
タイマー３６００は、Ｉ／Ｏバス３８００からリクエストを受信し、Ｉ／Ｏバス３８００にレスポンスを送信する。タイマー３６００は、少なくとも、カウンタモード設定、カウンタ値ロード、カウンタモードリード、カウンタ値リードの４つのリクエストを受け付けるものとする。
【０１０６】
カウンタモード設定リクエストは、カウンタの動作モードを設定するリクエストである。カウンタの動作モードには、割込みの種類が定周期割込みモードであるか、単一割込みモードであるかを少なくとも設定できるものとする。
カウンタ値ロードリクエストは、タイマー３６００のカウンタ値をロードするリクエストである。タイマー３６００は、カウンタ値がロードされると、その時点で設定されているカウンタモードで動作を開始する。タイマー３６００は、カウンタ値を１ずつ削減しカウンタ値が０になった時点で割込みを生成する。
割込みモードが定周期割込みモードの場合、カウンタ値が０になるとカウンタ値を最後にロードされた値に再設定し、再びカウントを開始する。単一割込みモードの場合には、カウンタ値が０になった時点で動作を停止する。
【０１０７】
割込みコントローラ３７００は、タイマー３６００からの割込みを受信し、割込みリクエストをＩ／Ｏバス３８００に送信する。
【０１０８】
図７は、擬似動作部３３１０を示すブロック図である。擬似動作部３３１０は、リクエストデコーダ３３１１、カウンタ値３３１２、ロード値３３１３、カウンタモード３３１４、割込みステータス３３１５、加算値３３１６、加算器３３１７、ＭＵＸ３３１８、ＭＵＸ３３１９を備える。
【０１０９】
リクエストデコーダ３３１１は、リクエストバッファ３３０２のリクエストをデコードし、擬似動作部３３１０のカウンタ値３３１２、ロード値３３１３、カウンタモード３３１４、割込みステータス３３１５を更新する。更新方法を以下に示す。
【０１１０】
カウンタ値３３１２は、タイマー３６００のカウンタ値をエミュレートする。具体的には、カウンタ値ロードリクエスト（リクエストバッファ３３０２から取得）が発行された場合、タイマー３６００にロードされる値でカウンタ値３３１２を更新する。
カウンタ値リードリクエスト（リクエストバッファ３３０２から取得）が発行された場合、タイマー３６００から受信したレスポンス（レスポンスバッファ３３０７から取得）の値でカウンタ値を更新する。
タイマー３６００が故障しているときに、カウンタ値リードリクエスト（リクエストバッファ３３０２から取得）が発行された場合、カウンタ値３３１２に加算値３３１６を加算した値を戻り値として返し、その戻り値でカウンタ値３３１２を更新する。ここで、加算値３３１６は正の値である必要は無く、負の値も設定可能であるものとする。
【０１１１】
ロード値３３１３は、タイマー３６００にロードされた値を保持する。具体的には、カウンタ値ロードリクエスト（リクエストバッファ３３０２から取得）によりタイマー３６００のカウンタに値がロードされた場合に、その値を保持する。ロード値３３１３は、タイマー３６００をフェイルオーバする際に使用される。
【０１１２】
カウンタモード３３１４は、タイマー３６００に設定されたモードを保持する。具体的には、カウンタモード設定リクエスト（リクエストバッファ３３０２から取得）によりカウンタのモードが設定される場合、その値を保持する。また、カウンタの割込みモードが周期割込みモードであるか、単一割込みモードであるかを示す信号を、割込みステータス３３１５に出力する。
【０１１３】
割込みステータス３３１５は、タイマー３６００から単一割込みが発生したかどうかを示す値を保持する。具体的には、カウンタモード設定リクエスト（リクエストバッファ３３０２から取得）によりタイマー３６００が単一割込みモードに設定された状態で、カウントが開始した時、１にセットされる。タイマー割込み検出部３３０６により、タイマー割込みが発生したことが通知されたら、０にリセットされる。タイマーが周期割込みモードである場合には、常に０である。
【０１１４】
加算値３３１６は、予め設定された値を保持している。ここで、その予め設定された値は正の値である必要は無く、負の値も設定可能である。
【０１１５】
ＭＵＸ３３１８は、リクエストのデコード結果に基づいて、適切な値をカウンタ値３３１２へ出力する。ＭＵＸ３３１９は、リクエストのデコード結果に基づいて、適切な期待値を比較エラー検出部へ出力する。
【０１１６】
次に、本発明のレガシーデバイス多重化方法の第３の実施の形態（擬似レガシーデバイスを適用した多重化装置の動作）について説明する。ただし、擬似レガシーデバイスは、擬似タイマーである。ここでは、Ｉ／Ｏコントローラ３５００、タイマー３６００、割込みコントローラ３７００がアクティブ状態で、Ｉ／Ｏコントローラ４５００、タイマー４６００、割込みコントローラ４７００がスタンバイ状態である場合を考える。
【０１１７】
図８は、本発明のレガシーデバイス多重化方法の第３の実施の形態の動作を示すフロー図である。タイマーの割込みモードが周期割込みモードである場合の動作を説明する。
【０１１８】
時刻Ｔ１において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト１を生成する。リクエスト１は、カウンタモード設定リクエストで、割込みモードは周期割込みモードである。ＯＳは、リクエスト１をメモリコントローラ３１００経由で、擬似レガシーデバイスとしての擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト１を受信する（ステップＳ７１）。
【０１１９】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト１を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト１をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト１のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト１を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト１をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ７２）。
【０１２０】
タイマー３６００は、リクエスト１に対するレスポンス１を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス１を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ７３）。
【０１２１】
下位Ｉ／Ｆ部３３０５は、レスポンス１をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス１を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０は、レスポンスバッファ３３０７が受信したレスポンス１に対応するリクエスト１をリクエストバッファ３３０２より取り出す。取り出されたリクエスト１は、リクエストデコーダ３３１１によりデコードされる。リクエスト１は、カウンタモード設定リクエストである。そのため、カウンタモード３３１４は、レスポンス１のモード（タイマー３６００に設定されたモード）を保持する（ステップＳ７４）。
【０１２２】
リクエスト１は、カウンタモード設定リクエストであるため、比較エラー検出部３３０８は、レスポンス１と期待値１との比較は行わず、その旨を動作制御部３３０４へ送信する。動作制御部３３０４は、レスポンスバッファ３３０７に格納されたタイマー３６００からのレスポンス１をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、レスポンス１を上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス１をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ７５）。
【０１２３】
次に、時刻Ｔ２において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト２を生成する。リクエスト２はカウンタ値ロードリクエストである。ＯＳは、リクエスト２をメモリコントローラ３１００経由で、擬似レガシーデバイスとしての擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト２を受信する（ステップＳ７６）。
【０１２４】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト２を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト２をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト２のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト２を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト２をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ７７）。
【０１２５】
タイマー３６００は、リクエスト２に対するレスポンス２を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス２を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ７８）。
【０１２６】
下位Ｉ／Ｆ部３３０５は、レスポンス２をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス２を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０のリクエストデコーダ３３１１は、レスポンスバッファ３３０７が受信したレスポンス２に対応するリクエスト２をリクエストバッファ３３０２より取り出す。取り出されたリクエスト２は、リクエストデコーダ３３１１によりデコードされる。リクエスト２は、カウンタ値ロードリクエストである。そのため、ロード値３３１３は、レスポンス２の値（タイマー３６００にロードされた値）でロード値を更新する（ステップＳ７９）。
【０１２７】
リクエスト２は、カウンタ値ロードリクエストであるため、比較エラー検出部３３０８は、レスポンス２と期待値２との比較は行わず、その旨を動作制御部３３０４へ送信する。動作制御部３３０４は、レスポンスバッファ３３０７に格納されたタイマー３６００からのレスポンス２をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、レスポンス２を上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス２をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ８０）。
【０１２８】
さらに、時刻Ｔ３において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト３を生成する。リクエスト３はカウンタ値リードリクエストである。ＯＳは、リクエスト３をメモリコントローラ３１００経由で、擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト３を受信する（ステップＳ８１）。
【０１２９】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト３を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト３をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト３のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト３を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト３をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ８２）。
【０１３０】
タイマー３６００は、リクエスト３に対するレスポンス３を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス３を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ８３）。
【０１３１】
下位Ｉ／Ｆ部３３０５は、レスポンス３をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス３を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０のリクエストデコーダ３３１１は、レスポンスバッファ３３０７が受信したレスポンス３に対応するリクエスト３をリクエストバッファ３３０２より取り出す。取り出されたリクエスト３は、リクエストデコーダ３３１１によりデコードされる。リクエスト３は、カウンタ値リードリクエストである。そのため、カウンタ値３３１２は、レスポンス３の値でカウンタ値３３１２を更新する（ステップＳ８４）。
【０１３２】
リクエスト３は、カウンタ値リードリクエストため、比較エラー検出部３３０８は、レスポンス３と期待値３との比較は行わず、その旨を動作制御部３３０４へ送信する。動作制御部３３０４は、レスポンスバッファ３３０７に格納されたタイマー３６００からのレスポンス２をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、レスポンス３を上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス１をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ８５）。
【０１３３】
また、時刻Ｔ４において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト４を生成する。リクエスト４はカウンタモードリードリクエストである。ＯＳは、リクエスト４をメモリコントローラ３１００経由で、擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト４を受信する（ステップＳ８６）。
【０１３４】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト４を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト４をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト４のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト４を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト４をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ８７）。
【０１３５】
タイマー３６００は、リクエスト４に対するレスポンス４を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス４を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ８８）。
【０１３６】
下位Ｉ／Ｆ部３３０５は、レスポンス４をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス４を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０のリクエストデコーダ３３１１は、レスポンスバッファ３３０７が受信したレスポンス４に対応するリクエスト４をリクエストバッファ３３０２より取り出す。取り出されたリクエスト４は、リクエストデコーダ３３１１によりデコードされる。リクエスト４は、カウンタモードリードリクエストである。リクエストデコーダ３３１１は、リクエスト４がモードリードリクエストであることを確認すると、タイマー３６００から返されるモード値として期待される期待値４をリクエスト４に基づいて作成し、比較エラー検出部３３０８へ出力する。比較エラー検出部３３０８は、レスポンスバッファ３３０７のレスポンス４と期待値４とを比較し、比較結果を動作制御部３３０４へ出力する。動作制御部１３０９は、期待値４とレスポンス１との間に不一致が発生しているか否かを判定する（ステップＳ８９）。
【０１３７】
動作制御部１３０９は、期待値４とレスポンス４との間に不一致が発生していない場合、タイマー３６００からのレスポンス４（レスポンスバッファ３３０７内に格納されている）をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、レスポンス４を上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス４をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ９０）。
【０１３８】
図９は、本発明のレガシーデバイス多重化方法の第３の実施の形態の他の動作を示すフロー図である。タイマーの割込みモードが単一割込みモードである場合の動作を説明する。
【０１３９】
時刻Ｔ５において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト５を生成する。リクエスト５は、モード設定リクエストで、割込みモードは単一割込みモードである。このリクエスト５は、図８におけるリクエスト１の処理（ステップＳ７１〜Ｓ７５）と同様に処理（ステップＳ１０１〜Ｓ１０５）される。
【０１４０】
次に、時刻Ｔ６において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト６を生成する。リクエスト６はカウンタ値ロードリクエストである。ＯＳは、リクエスト６をメモリコントローラ３１００経由で、擬似レガシーデバイスとしての擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト６を受信する（ステップＳ１０６）。
【０１４１】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト６を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト６をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト６のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト６を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト６をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ１０７）。
【０１４２】
タイマー３６００は、リクエスト６に対するレスポンス６を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス６を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ１０８）。
【０１４３】
下位Ｉ／Ｆ部３３０５は、レスポンス６をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス６を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０のリクエストデコーダ３３１１は、レスポンスバッファ３３０７が受信したレスポンス６に対応するリクエスト６をリクエストバッファ３３０２より取り出す。取り出されたリクエスト６は、リクエストデコーダ３３１１によりデコードされる。リクエスト６は、カウンタ値ロードリクエストである。そのため、ロード値３３１３は、レスポンス６の値（タイマー３６００にロードされた値）でロード値を更新する。また、時刻Ｔ５での処理（ステップＳ１０１〜Ｓ１０５）でタイマー３６００が単一割込みモードに設定されており、リクエスト６のカウンタ値ロードリクエストによりカウントが開始したので、割込みステータス３３１５は、その値を１にセットする。この割込みステータス３３１５の値＝１により、タイマー３６００が単一割込みモードで動作を開始した後に、まだ割込みが発生していないことを示す（ステップＳ１０９）。
【０１４４】
リクエスト６は、カウンタ値ロードリクエストであるため、比較エラー検出部３３０８は、レスポンス６と期待値６との比較は行わず、その旨を動作制御部３３０４へ送信する。動作制御部３３０４は、レスポンスバッファ３３０７に格納されたタイマー３６００からのレスポンス６をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、レスポンス６を上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス６をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ１１０）。
【０１４５】
時刻Ｔ７において、タイマー３６００内部でタイマー割込みが発生する。タイマー３６００は、タイマー割込みを割込みメッセージとして、Ｉ／Ｏコントローラ３５００経由で擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ１１１）。
【０１４６】
下位Ｉ／Ｆ部３３０５は、タイマー割込みをタイマー割込み検出部３３０６とレスポンスバッファ３３０７とへ送信する。タイマー割込み検出部３３０６は、このタイマー割込み（割込みメッセージ）がタイマー３６００により発行されたものであることを検出すると、擬似動作部３３１０へ通知する。擬似動作部３３１０の割込みステータス３３１５は、その値を０にクリアする。この割込みステータス３３１５の値＝０により、タイマー３６００が単一割込みモードで動作を開始した後に、割込みが発生したことを示す（ステップＳ１１２）。
【０１４７】
一方、レスポンスバッファ３３０７は、タイマー割込みを上位Ｉ／Ｆ部３３０１経由でＣＰＵ３０００へ送信する（ステップＳ１１３）。
【０１４８】
図１０は、本発明のレガシーデバイス多重化方法の第３の実施の形態の更に他の動作を示すフロー図である。ここでは、障害発生時の動作を説明する。
【０１４９】
時刻Ｔ８において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト８を生成する。リクエスト８はカウンタモードリードリクエストである。ＯＳは、リクエスト８をメモリコントローラ３１００経由で、擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト８を受信する（ステップＳ１２１）。
【０１５０】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト８を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。下位Ｉ／Ｆ部３３０５は、リクエスト８をクロスブリッジ３４００へ送信する。リクエストバッファ３３０２は、リクエスト８のコピーを保持する。クロスブリッジ３４００は、アクティブ状態であるＩ／Ｏコントローラ３５００へリクエスト８を送信する。Ｉ／Ｏコントローラ３５００は、リクエスト８をＩ／Ｏバス３８００経由でタイマー３６００へ送信する（ステップＳ１２２）。
【０１５１】
タイマー３６００は、リクエスト８に対するレスポンス８を生成し、Ｉ／Ｏコントローラ３５００へ送信する。Ｉ／Ｏコントローラ３５００は、受信したレスポンス８を擬似タイマー３３００の下位Ｉ／Ｆ部３３０５へ送信する（ステップＳ１２３）。
【０１５２】
下位Ｉ／Ｆ部３３０５は、レスポンス８をレスポンスバッファ３３０７へ送信する。レスポンスバッファ３３０７は、レスポンス８を保持すると共に、受信したことを擬似動作部３３１０へ通知する。擬似動作部３３１０のリクエストデコーダ３３１１は、レスポンスバッファ３３０７が受信したレスポンス８に対応するリクエスト８をリクエストバッファ３３０２より取り出す。取り出されたリクエスト８は、リクエストデコーダ３３１１によりデコードされる。リクエスト８は、カウンタモードリードリクエストである。リクエストデコーダ３３１１は、リクエスト８がカウンタモードリードリクエストであることを確認すると、タイマー３６００から返されるモード値として期待される期待値８をリクエスト８に基づいて生成し、比較エラー検出部３３０８へ出力する。比較エラー検出部３３０８は、レスポンスバッファ３３０７のレスポンス８と期待値８とを比較し、比較結果を動作制御部３３０４へ出力する。動作制御部１３０９は、期待値８とレスポンス８との間に不一致が発生しているか否かを判定する（ステップＳ１２４）。
【０１５３】
動作制御部１３０９は、期待値８とレスポンス８との間に不一致が発生している場合、時刻Ｔ９にシステム管理割込みを発行する（ステップＳ１２５）。それと共に、動作制御部１３０９は、擬似動作部３３１０が生成した期待値８をＣＰＵ３０００に返却するように、レスポンスセレクタ３３０９に指示する。レスポンスセレクタ３３０９は、期待値８をレスポンス８として上位Ｉ／Ｆ部３３０１へ出力する。上位Ｉ／Ｆ部３３０１は、メモリコントローラ３１００を介してレスポンス８をＣＰＵ３０００（ＯＳ）に返却する（ステップＳ１２６）。
【０１５４】
システム管理割込みを発行した後も、システム管理割込みのハンドラに処理が移行する時刻までに、ＯＳからタイマー３６００に対するリクエストが出力される場合がある。例えば、図１０において、時刻Ｔ１０にＯＳはリクエスト９を発行している。リクエスト９はカウンタ値リードコマンドである。しかし、タイマー３６００は障害が発生しているため、カウンタ値を返すことが出来ない。そのため、擬似タイマー３３００が擬似カウンタ値をレスポンスとして返す。擬似カウンタ値としては、擬似動作部３３１０のカウンタ値３３１２に加算値３３１６を加えた値が返される。これにより、オペレーティングシステム内部でカウンタ値が逆戻りする矛盾を発生させない。
【０１５５】
具体的には次のように行う。
時刻Ｔ１０において、ＯＳ（＝ＣＰＵ３０００）は、タイマー３６００に対するリクエスト９を生成する。リクエスト９はカウンタ値リードリクエストである。ＯＳは、リクエスト９をメモリコントローラ３１００経由で、擬似タイマー３３００へ送信する。擬似タイマー３３００は、リクエスト９を受信する（ステップＳ１２７）。
【０１５６】
擬似タイマー３３００の上位Ｉ／Ｆ部３３０１は、受信したリクエスト９を下位Ｉ／Ｆ部３３０５及びリクエストバッファ３３０２へ送信する。リクエストバッファ３３０２は、リクエスト３のコピーを保持する。下位Ｉ／Ｆ部３３０５は、リクエスト９をクロスブリッジ３４００へ送信する。しかし、タイマー３６００は障害が発生しているため、カウンタ値を返すことが出来ない。タイムアウト検出部３３０３は、リクエストバッファ３３０２とレスポンスバッファ３３０７を監視し、リクエスト９に対するレスポンス９が一定時間以上返ってこないことを動作制御部３３０４に通知を行う。動作制御部３３０４は、擬似動作部３３１０からカウンタ値３３１２に加算値３３１６を加算した値（擬似カウンタ値）を比較エラー検出部３３０８経由で取得する（ステップＳ１２８）。そして、動作制御部３３０４は、その値をレスポンス９としてＣＰＵ３０００に返却する（ステップＳ１２９）。
【０１５７】
次に、フェイルオーバ処理について説明する。
時刻Ｔ１１において、ＢＩＯＳのシステム管理割込みハンドラが動作を始め、フェイルオーバ処理を開始する（ステップＳ１３０）。フェイルオーバ処理では、システム管理割込みハンドラが擬似動作部３３１０に保持されているカウンタ値３３１２、ロード値３３１３、カウンタモード３３１４、割込みステータス３３１５を参照する（ステップＳ１３１、Ｓ１３２）。そして、それらカウンタ値３３１２、ロード値３３１３、カウンタモード３３１４、割込みステータス３３１５に基づいて、システム管理割込みハンドラは、スタンバイ状態であったタイマー４６００の状態を、アクティブ状態であったタイマー３６００の状態と同じ状態にする（ステップＳ１３３、Ｓ１３４）。フェイルオーバ処理が完了すると（ステップＳ１３５）、時刻Ｔ１２にシステム管理割込みハンドラからＯＳへ処理が戻る。そして、フェイルオーバ処理後のＴ１３以降に生成されるタイマーに対するリクエストは、クロスブリッジ３４００−Ｉ／Ｏコントローラ４５００−Ｉ／Ｏバス４８００経由で、新たにアクティブ状態になったタイマー４６００に送信される。図におけるステップＳ１３６〜Ｓ１４０は、タイマー４６００に対して、ステップＳ７１〜Ｓ７５のように処理される。
【０１５８】
続いて、フェイルオーバ処理について更に説明する。
図１１は、本発明のレガシーデバイス多重化方法の第３の実施の形態におけるフェイルオーバ処理を示すフロー図である。
【０１５９】
まず、ステップＳ１５１において、システム管理割込みハンドラは、カウンタモード３３１４を参照し、フェイルオーバ先のカウンタのモードを設定する。
次に、ステップＳ１５２において、システム管理割込みハンドラは、カウンタモード３３１４の割込みモードが周期割込みモードであるか、単一割込みモードであるかを確認する。割込みモードが単一割込みモードである場合、ステップＳ１５３に進む。割込みモードが周期割込みモードである場合、ステップＳ１５４に進む。
ステップＳ１５３では、システム管理割込みハンドラは、割込みステータス３３１５の値を確認する。そのとき、割込みステータス３３１５の値が１である場合、ステップＳ１５４に進む。割込みステータスの値が０である場合、ステップＳ１５５に進む。割込みステータスが０の場合、単一割込みモードが設定された後に、割込みが発生した状態である。そのため、ステップＳ１５４を実行すると再び割込みが発行されてしまい、オペレーティングシステムに矛盾が生じてしまうからである。
ステップＳ１５４では、システム管理割込みハンドラは、ロード値３３１３を参照し、フェイルオーバ先のタイマー（タイマー４６００）にカウンタ値をロードする。
ステップＳ１５５では、カウンタ値３３１２に保持されているカウンタ値より小さくなるまで、タイマー（タイマー４６００）のカウンタ値をリードする。
【０１６０】
本発明において、タイマー故障が発生してからフェイルオーバが完了するまで、擬似タイマーがオペレーティングシステムに対して矛盾の無い擬似レスポンスを返却するので、オペレーティングシステムのモジュールを変更することなく、タイマーのフェイルオーバが実施できる。
【０１６１】
擬似動作部３３１０は、次のような擬似動作部３３１０ａを用いることも可能である。
図１２は、擬似動作部３３１０ａを示すブロック図である。擬似動作部３３１０ａは、図７の擬似動作部３３１０と比較して、更に周波数比３３２１、加算器３３２２を備えている点で異なる。
【０１６２】
周波数比３３１８は、タイマー３６００が動作するクロック周波数と、擬似タイマー３３００が動作するクロックの周波数の比を保持している。周波数比は固定小数点で設定できるものとする。加算値３３１６は、擬似タイマー３３００が動作するクロック毎に周波数比３３１８の値を予め設定された値に加算する。加算値３３１６は、カウンタ値リードリクエストが完了すると、クリアされる。タイマー３６００に障害が発生した後に、カウンタ値リードリクエストが発行され、擬似タイマー３３００が擬似レスポンスを返す際、カウンタ値３３１２から加算値３３１６の整数部分を加えた値を返す。
【０１６３】
図７の擬似動作部３３１０は、タイマー３６００に障害が発生した後にカウンタ値リードリクエストが発行された際の擬似レスポンスとしては、カウンタ値３３１２に加算値３３１６を加えた値を返していたが、図１２の擬似動作部３３１０ａは、タイマー３６００と擬似タイマー３３００のクロック周波数比と、前回のカウンタ値リードリクエストとの時刻差を考慮し、より適切なカウンタ値を擬似レスポンスとして返すことが出来る。
【図面の簡単な説明】
【０１６４】
【図１】図１は、本発明の多重化装置の第１の実施の形態の構成を示すブロック図である。
【図２】図２は、本発明のレガシーデバイス多重化方法の第１の実施の形態の動作を示すフロー図である。
【図３】図３は、本発明のレガシーデバイス多重化方法の第１の実施の形態の他の動作を示すフロー図である。
【図４】図４は、本発明の多重化装置の第２の実施の形態の構成を示すブロック図である。
【図５】図５は、本発明のレガシーデバイス多重化方法の第２の実施の形態の動作を示すフロー図である。
【図６】図６は、本発明の多重化装置の第３の実施の形態の構成を示すブロック図である。
【図７】図７は、擬似動作部を示すブロック図である。
【図８】図８は、本発明のレガシーデバイス多重化方法の第３の実施の形態の動作を示すフロー図である。
【図９】図９は、本発明のレガシーデバイス多重化方法の第３の実施の形態の他の動作を示すフロー図である。
【図１０】図１０は、本発明のレガシーデバイス多重化方法の第３の実施の形態の更に他の動作を示すフロー図である。
【図１１】図１１は、本発明のレガシーデバイス多重化方法の第３の実施の形態におけるフェイルオーバ処理を示すフロー図である。
【図１２】図１２は、擬似動作部を示すブロック図である。
【符号の説明】
【０１６５】
１０、３０    第１システム
２０、４０    第２システム
１０００、２０００、３０００、４０００    ＣＰＵ
１１００、２１００、３１００、４１００    メモリコントローラ
１２００、２２００、３２００、４２００    メモリ
１３００、２３００    擬似レガシーデバイス
１３０１、２３０１    上位Ｉ／Ｆ部
１３０２、２３０２    下位Ｉ／Ｆ部
１３０３、２３０３    リクエストバッファ
１３０４、２３０４    擬似動作部
１３０５、２３０５    レスポンスバッファ
１３０６、２３０６    比較エラー検出部
１３０７、２３０７    レスポンスセレクタ
１３０８、２３０８    タイムアウト検出部
１３０９、２３０９    動作制御部
１４００、２４００    割込みコントローラ
１５００、２５００    Ｉ／Ｏコントローラ
１６００、２６００    レガシーデバイス
１７００、２７００    フェイルオーバコントローラ
３３００、４３００    擬似タイマー
３３０１、４３０１    上位Ｉ／Ｆ部
３３０２、４３０２    リクエストバッファ
３３０３、４３０３    タイムアウト検出部
３３０４、４３０４    動作制御部
３３０５、４３０５    下位Ｉ／Ｆ部
３３０６、４３０６    タイマー割込み検出部
３３０７、４３０７    レスポンスバッファ
３３０８、４３０８    比較エラー検出部
３３０９、４３０９    レスポンスセレクタ
３３１０、４３１０    擬似動作部
３３１１    リクエストデコーダ
３３１２    カウンタ値
３３１３    ロード値
３３１４    カウンタモード
３３１５    割込みステータス
３３１６    加算値
３３１７    加算器
３３１８、３３１９    ＭＵＸ
３３２１    周波数比
３３２２    加算器
３４００、４４００    クロスブリッジ
３５００、４５００    Ｉ／Ｏコントローラ
３６００、４６００    タイマー
３７００、４７００    割込みコントローラ
３８００、４８００    Ｉ／Ｏバス
【図１】
2006178688.tif 000003
【図２】
2006178688.tif 000004
【図３】
2006178688.tif 000005
【図４】
2006178688.tif 000006
【図５】
2006178688.tif 000007
【図６】
2006178688.tif 000008
【図７】
2006178688.tif 000009
【図８】
2006178688.tif 000010
【図９】
2006178688.tif 000011
【図１０】
2006178688.tif 000012
【図１１】
2006178688.tif 000013
【図１２】
2006178688.tif 000014