(57)【特許請求の範囲】
【請求項１】
複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置において、
監視対象のドライバプログラムに従って実行される処理の状況を監視する処理監視手段と、
前記処理監視手段によって、前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を不揮発性記憶部に登録するエラー処理手段と、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が再起動したときに前記不揮発性記憶部を参照し、前記不揮発性記憶部に登録されたドライバ情報が示すドライバプログラムの実行をスキップする実行制御手段と、
を有し、
ＯＳ（Operating System）プログラムの起動後には、前記ドライバプログラムに対応するデバイスを制御する別のドライバプログラムが実行され、実行された別のドライバプログラムに従って、前記対応するデバイスが制御されることを特徴とする情報処理装置。
【請求項２】
前記ドライバプログラムは、ＵＥＦＩ（United Extensible Firmware Interface）規格に従ったプログラムであり、
前記複数のデバイスのうち少なくとも一つのデバイスには、前記ＯＳプログラムを前記一つのデバイスから読み出して起動する処理手順を記述したブートローダのプログラムが格納され、
前記ブートローダのプログラムを前記一つのデバイスから読み出す際には、前記一つのデバイスに対応する前記ドライバプログラムが使われ、前記ＯＳプログラムの起動後には、前記一つのデバイスに対応する前記ドライバプログラムとは別のドライバプログラムが使われる、
ことを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記実行制御手段は、前記監視対象のドライバプログラムを呼び出すたびに、呼び出したドライバプログラムに従って実行される処理の監視を前記処理監視手段に依頼することを特徴とする請求項１または２記載の情報処理装置。
【請求項４】
前記監視対象のドライバプログラムのそれぞれに対応する監視用プログラムが記憶されたプログラム記憶部をさらに有し、
前記実行制御手段は、前記監視対象のドライバプログラムを呼び出す場合には、呼び出す対象のドライバプログラムに対応する前記監視用プログラムを呼び出し、呼び出した前記監視用プログラムに従って、当該監視用プログラムに対応するドライバプログラムを呼び出すとともに、呼び出したドライバプログラムに従って実行される処理の監視を前記処理監視手段に依頼する、
ことを特徴とする請求項３記載の情報処理装置。
【請求項５】
各ドライバプログラムは１つ以上のサブプログラムを含み、
前記監視用プログラムは、当該監視用プログラムに対応するドライバプログラムに含まれるサブプログラムにそれぞれ対応する監視用サブプログラムを含み、
前記実行制御手段は、前記監視対象のドライバプログラムに含まれるサブプログラムを呼び出す場合には、当該サブプログラムに対応する監視用サブプログラムを呼び出し、呼び出した監視用サブプログラムに従って、当該監視用サブプログラムに対応するサブプログラムを呼び出すとともに、呼び出したサブプログラムに従って実行される処理の監視を前記処理監視手段に依頼する、
ことを特徴とする請求項４記載の情報処理装置。
【請求項６】
各サブプログラムを示すサブプログラム情報と、各サブプログラムの呼び出しに用いる呼び出し情報とを対応付けてサブプログラムデータベースに登録する登録手段をさらに有し、
各ドライバプログラムは、各ドライバプログラムの初期設定処理の手順を記述した第１のサブプログラムと、各ドライバプログラムに対応するデバイスへアクセスする制御手順を記述した第２のサブプログラムとを含み、
前記初期設定処理は、設定処理対象のドライバプログラムに含まれるサブプログラムを示すサブプログラム情報と、当該サブプログラム情報に対応する呼び出し情報とを前記サブプログラムデータベースに登録する処理を、前記登録手段に要求する処理を含み、
前記実行制御手段は、
各ドライバプログラムを選択し、選択したドライバプログラムに含まれる第１のサブプログラムを呼び出し、呼び出した第１のサブプログラムに従って、選択したドライバプログラムの初期設定処理を実行する第１の処理と、
所望のドライバプログラムに含まれる第２のサブプログラムに対応する呼び出し情報を前記サブプログラムデータベースから取得し、取得した呼び出し情報に対応する第２のサブプログラムを呼び出し、呼び出した第２のサブプログラムに従って、当該第２のサブプログラムを含むドライバプログラムに対応するデバイスにアクセスする第２の処理と、
を実行し、
前記登録手段は、各ドライバプログラムの初期設定処理において登録を要求されたサブプログラム情報が示すサブプログラムが、前記監視対象のドライバプログラムに含まれるサブプログラムである場合には、登録を要求されたサブプログラム情報に対応するサブプログラムの呼び出しに用いる呼び出し情報の代わりに、当該サブプログラムに対応する監視用サブプログラムの呼び出しに用いる呼び出し情報を前記サブプログラムデータベースに登録する、
ことを特徴とする請求項５記載の情報処理装置。
【請求項７】
前記実行制御手段は、前記第１の処理において、前記複数のデバイスのそれぞれに対応するドライバプログラムのうち、前記不揮発性記憶部に登録されたドライバ情報に対応するドライバプログラムを除くドライバプログラムを選択することを特徴とする請求項６記載の情報処理装置。
【請求項８】
前記実行制御手段は、前記複数のデバイスのそれぞれに対応するドライバプログラムのうち、前記不揮発性記憶部にドライバ情報が登録されたドライバプログラムを除くドライバプログラムを呼び出し、呼び出したドライバプログラムに従って当該ドライバプログラムの初期設定処理を実行することを特徴とする請求項１〜４のいずれか１項に記載の情報処理装置。
【請求項９】
複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置において、
監視対象のドライバプログラムに従って実行される処理の状況を監視するように、外部の監視装置に依頼する監視依頼手段と、
前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが前記監視装置で検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記監視装置から受信するドライバ情報受信手段と、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が起動したとき、前記情報処理装置の過去の起動時に前記監視装置によって処理のエラーが検出されたドライバプログラムを前記監視装置から受信したドライバ情報に基づいて認識し、認識したドライバプログラムの実行をスキップする実行制御手段と、
を有し、
ＯＳプログラムの起動後には、前記ドライバプログラムに対応するデバイスを制御する別のドライバプログラムが実行され、実行された別のドライバプログラムに従って、前記対応するデバイスが制御されることを特徴とする情報処理装置。
【請求項１０】
複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置におけるドライバ実行制御方法であって、
前記情報処理装置が、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、
呼び出したドライバプログラムのうち監視対象のドライバプログラムに従って実行される処理の状況を監視し、
前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記情報処理装置が備える不揮発性記憶部に登録し、
前記情報処理装置が再起動したとき、前記不揮発性記憶部に登録されたドライバ情報が示すドライバプログラムの実行をスキップする、
処理を含み、
ＯＳプログラムの起動後には、前記ドライバプログラムに対応するデバイスを制御する別のドライバプログラムが実行され、実行された別のドライバプログラムに従って、前記対応するデバイスが制御されることを特徴とするドライバ実行制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置およびドライバ実行制御方法に関する。
【背景技術】
【０００２】
一般に、情報処理装置の起動時には、ＯＳ（Operating System）プログラムの実行前に、デバイスを認識し、認識したデバイスへのアクセスを可能にする処理が行われる。ＯＳの実行前においてデバイスへのアクセスを可能にする手順を規定したものの１つとして、ＵＥＦＩ（United Extensible Firmware Interface）規格がある。
【０００３】
ＵＥＦＩ規格に準拠した情報処理装置は、電源投入後に、自装置が備える記憶装置から“ブートマネージャ”と呼ばれる機能を実現する起動管理ファームウェアをロードして実行する。情報処理装置は、起動管理ファームウェアに従って、自装置に接続されたデバイスにそれぞれ対応する“ＵＥＦＩドライバ”と呼ばれるプログラムを、主記憶装置にロードする。ＵＥＦＩドライバは、対応するデバイスを制御する手順を記述したドライバプログラムであり、例えば、起動管理ファームウェアが記憶された記憶装置と同じ記憶装置、または、対応するデバイス内の記憶領域からロードされる。
【０００４】
なお、以下の説明において、“ＵＥＦＩドライバ”は、ＵＥＦＩ規格上の“ブート・サービス・ドライバ（Boot Service Driver）”を指すものとする。ブート・サービス・ドライバは、ＯＳプログラムの起動前に使用され、ＯＳプログラムの起動後には使用されない。
【０００５】
情報処理装置は、主記憶装置にロードしたＵＥＦＩドライバに従って、ロードしたＵＥＦＩドライバを用いた初期設定処理を実行する。ＵＥＦＩドライバを用いた初期設定処理は、例えば、ＵＥＦＩドライバがデバイスをサポートするか否かを検査する処理、制御対象のデバイスの初期化処理、デバイスの制御時に使用する制御データの初期化処理などを含む。
【０００６】
ＵＥＦＩドライバを用いた初期設定処理が正常に終了すると、このＵＥＦＩドライバを用いて制御対象のデバイスへのアクセスを制御することが可能になる。例えば、情報処理装置は、ＵＥＦＩドライバを用いた初期設定処理が終了した後、起動管理ファームウェアに従って、所望のデバイスに対応するＵＥＦＩドライバを呼び出し、呼び出したＵＥＦＩドライバに従って、対応するデバイスからＯＳブートローダを読み出す。情報処理装置は、読み出したＯＳブートローダを実行することで、ＯＳプログラムの起動処理を開始する。
【０００７】
なお、プログラム実行時の異常監視機能を有するコンピュータシステムの例として、ＯＳプログラムの立ち上がり時間と、プログラムごとの実行周期とを個別のタイマによって監視し、各タイマのオーバフロー出力の論理和に基づいてシステムリセットをかけるようにしたものがある。また、他の例として、ＯＳプログラムの実行時に障害発生により再起動したとき、再起動前とは異なるメモリ領域を使用してＯＳブートを行うことで、障害発生時にダンプしたメモリ情報を確実に保存できるようにしたものもある。
【０００８】
また、複数のフラッシュＲＯＭ（Read Only Memory）のそれぞれに記憶された起動プログラム（ＢＩＯＳ：Basic Input/Output System）の中から１つを選択して起動するコンピュータにおいて、起動プログラムの正当性を判断し、その判断結果に応じて起動プログラムの選択を変更するものがあった。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２００２−１８９６１５号公報
【特許文献２】特開２００６−７２９３１号公報
【特許文献３】特開２００３−３１６５８２号公報
【非特許文献】
【００１０】
【非特許文献１】"Unified Extensible Firmware Interface Specification Version 2.2"、Unified EFI, Inc.、２００８年９月、ｐ．１５〜１９，３０４〜３１３
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ところで、ＵＥＦＩの起動管理ファームウェアのポリシーとしては、次の２通りが考えられる。第１のポリシーは、ＯＳプログラムの起動のために必要十分なデバイスに対応するＵＥＦＩドライバを用いて初期設定処理を行い、これらのデバイスを使用可能な状態にするというものである。第２のポリシーは、情報処理装置に接続されているデバイスのうち、できるだけ多くのデバイスに対応するＵＥＦＩドライバを用いて初期設定処理を行い、これらのデバイスを使用可能な状態にするというものである。
【００１２】
サーバなどのように、様々なデバイスが接続される可能性がある、あるいは、複数のデバイスにそれぞれ記憶されたＯＳプログラムの中から実行するＯＳプログラムを選択できる、といった汎用性の高い機器では、第２のポリシーが採用されることが多い。なぜなら、汎用性の高い機器では、起動するたびに、接続されたデバイスの数や種類が変化して、実行するＯＳプログラムの読み出し元として選択可能なデバイスが変わることがあり得るからである。
【００１３】
ここで、情報処理装置は、バグなどの異常発生要因があるＵＥＦＩドライバを実行した場合には、ＵＥＦＩドライバの実行を正常に終了できない。例えば、情報処理装置は、ＵＥＦＩドライバを用いた初期設定処理を実行したとき、実行したＵＥＦＩドライバのバグが原因となって、初期設定処理を正常に終了できない可能性がある。また、情報処理装置は、初期設定処理が正常に終了したＵＥＦＩドライバに従って、対応するデバイスへのアクセス制御を行ったときでも、ＵＥＦＩドライバのバグが原因となって、デバイスへのアクセスができない、あるいはそのアクセス制御を正常に終了できないという可能性がある。
【００１４】
一方、前述のように、起動管理ファームウェアの実行によりロードされるＵＥＦＩドライバ（ブート・サービス・ドライバ）は、ＯＳプログラムが起動した後には使用されない。この場合、ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しなかったとしても、本来はＯＳプログラムが起動した後の処理には影響が及ばない。なぜなら、ＯＳプログラムの起動後には、ＵＥＦＩドライバとは別のＯＳプログラム用のデバイスドライバが使用されるからである。
【００１５】
しかしながら、ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しない場合には、実行したＵＥＦＩドライバに対応するデバイスがＯＳプログラムの起動に関係あるかないかに関係なく、ＯＳプログラムの起動までの処理が継続されないという問題があった。例えば、情報処理装置の処理がＵＥＦＩドライバの実行中に停止し、処理の停止を検知して情報処理装置が再起動した場合、情報処理装置の処理は、同じＵＥＦＩドライバの実行中に再度停止してしまう。この場合、情報処理装置は、ＯＳプログラムの起動までの処理を進めることなく再起動を繰り返す。また、情報処理装置の処理がＵＥＦＩドライバの実行中に停止したとき、情報処理装置が再起動せずに処理が停止したままになった場合には、当然ながらＯＳプログラムの起動までの処理は継続されない。
【００１６】
そして、このような「ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しない場合には、ＯＳプログラムの起動までの処理が継続されない」という問題は、デバイスへのアクセスを制御するプログラムとして使用可能な状態にするＵＥＦＩドライバが多いほど、発生しやすくなる。
【００１７】
また、このような問題は、ＵＥＦＩ規格に準拠した情報処理装置に限らず、ＯＳプログラムの起動前において、複数のデバイスのそれぞれに対応するドライバプログラムを使用可能状態にする他の種類の情報処理装置でも発生し得る。
【００１８】
本発明はこのような点に鑑みてなされたものであり、ドライバプログラムに異常発生要因があった場合でも処理が継続される確率を高めた情報処理装置およびドライバ実行制御方法を提供することを目的とする。
【課題を解決するための手段】
【００１９】
上記目的を達成するために、複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置が提供される。この情報処理装置は、監視対象のドライバプログラムに従って実行される処理の状況を監視する処理監視手段と、前記処理監視手段によって、前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を不揮発性記憶部に登録するエラー処理手段と、前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が再起動したときに前記不揮発性記憶部を参照し、前記不揮発性記憶部に登録されたドライバ情報が示すドライバプログラムの実行をスキップする実行制御手段と、を有する。
【００２０】
また、上記目的を達成するために、上記の情報処理装置と同様の処理を行うドライバ実行制御方法が提供される。
さらに、上記目的を達成するために、複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置が提供される。この情報処理装置は、監視対象のドライバプログラムに従って実行される処理の状況を監視するように、外部の監視装置に依頼する監視依頼手段と、前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが前記監視装置で検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記監視装置から受信するドライバ情報受信手段と、前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が起動したとき、前記情報処理装置の過去の起動時に前記監視装置によって処理のエラーが検出されたドライバプログラムを前記監視装置から受信したドライバ情報に基づいて認識し、認識したドライバプログラムの実行をスキップする実行制御手段と、を有する。
【００２１】
また、上記目的を達成するために、上記の情報処理装置と同様の処理を行うドライバ実行制御方法が提供される。
【発明の効果】
【００２２】
上記の情報処理装置およびドライバ実行制御方法では、ドライバプログラムに異常発生要因があった場合でも処理が継続される可能性が高まる。
【図面の簡単な説明】
【００２３】
【図１】第１の実施の形態に係る情報処理装置の構成例およびその動作を説明する図である。
【図２】再起動後の情報処理装置における処理例を示す図である。
【図３】第２の実施の形態に係るコンピュータのハードウェア構成例を示す図である。
【図４】コンピュータの起動処理シーケンスを示すフローチャートである。
【図５】ＵＥＦＩによる初期化処理時に実行されるプログラムの例を示す図である。
【図６】図５の各プログラムによって実現される処理機能を示すブロック図である。
【図７】ドライバイメージの構成例を示す図である。
【図８】監視用ドライバイメージの構成例を示す図である。
【図９】イメージＤＢおよびパブリックプロトコルＤＢの各データ構成例を示す図である。
【図１０】監視対象でないＵＥＦＩドライバに関連するイメージＤＢおよびパブリックプロトコルＤＢのエントリの例を示す図である。
【図１１】監視対象のＵＥＦＩドライバに関連するイメージＤＢおよびパブリックプロトコルＤＢのエントリの例を示す図である。
【図１２】サブプロトコルＤＢのデータ構成例を示す図である。
【図１３】デバイスリストのデータ構成例を示す図である。
【図１４】ＵＥＦＩによる初期化処理の全体の手順を示すフローチャートである。
【図１５】図１４のステップＳ３２における処理手順を示すフローチャートである。
【図１６】図１５のステップＳ５７における処理手順を示すシーケンス図である。
【図１７】図１５のステップＳ５９における処理手順を示すシーケンス図である。
【図１８】サブプロトコルＤＢ、ＵＥＦＩドライバおよび監視用ドライバとの関係を示す図である。
【図１９】監視用ドライバのメンバ関数が呼び出されたときに実行される処理手順を示すフローチャートである。
【図２０】スタックに登録されるプロトコル情報の例を示す図である。
【図２１】割り込み処理部における処理手順を示すフローチャートである。
【図２２】図１４のステップＳ３３における処理手順を示すフローチャート（その１）である。
【図２３】図１４のステップＳ３３における処理手順を示すフローチャート（その２）である。
【図２４】図２３のステップＳ１６４の処理手順を示すフローチャートである。
【図２５】図２３のステップＳ１６６の処理手順を示すフローチャートである。
【図２６】ＵＥＦＩドライバの関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出されたときの処理手順を示すフローチャートである。
【図２７】ＵＥＦＩドライバの関数Ｓｔａｒｔ（）が呼び出されたときの処理手順を示すシーケンス図である。
【図２８】ブートオーダテーブルのデータ構成例を示す図である。
【図２９】ＯＳブートローダの読み出し処理手順を示すフローチャートである。
【図３０】図２９のステップＳ２６６の処理手順を示すフローチャートである。
【図３１】ＵＥＦＩドライバの関数Ｒｅａｄ（）が呼び出されたときの処理手順を示すフローチャートである。
【図３２】第３の実施の形態に係るサーバシステムの構成例を示す図である。
【図３３】サーバシステムの各装置が備える処理機能の構成例を示す図である。
【図３４】第３の実施の形態において、監視用ドライバのメンバ関数が呼び出されたときに実行される処理手順を示すフローチャートである。
【図３５】管理ユニットの割り込み処理部における処理手順を示すフローチャートである。
【発明を実施するための形態】
【００２４】
以下、実施の形態を図面を参照して詳細に説明する。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る情報処理装置の構成例およびその動作を説明する図である。
【００２５】
図１に示す情報処理装置１には、複数のデバイスが接続されている。図１では例として、情報処理装置１には２つのデバイス１０，２０が接続されているものとする。情報処理装置１は、デバイス１０，２０にそれぞれ対応するドライバプログラム１１，１２を実行することで、デバイス１０，２０を制御する。ただし、ドライバプログラム１１，１２ともに、情報処理装置１の起動から、ＯＳプログラムが起動する前までの期間において実行されるものである。
【００２６】
また、情報処理装置１は、処理監視手段２１、エラー処理手段２２および実行制御手段２３を備える。
処理監視手段２１は、情報処理装置１に接続された各デバイスに対応するドライバプログラムのうち、監視対象のドライバプログラムに従って実行される処理の状況を監視し、処理のエラーを検出する。ここで、監視対象のドライバプログラムは、例えば、ユーザの操作入力によって選択される。また、監視対象のドライバプログラムとしては、例えば、ＯＳプログラムの起動に必要とならないデバイスを制御するドライバプログラムが選択される。なお、情報処理装置１に接続されたすべてのデバイスに対応するドライバプログラムが、監視対象とされてもよい。
【００２７】
図１の例では、ドライバプログラム１１，１２の両方とも、処理監視手段２１の監視対象とされる。なお、処理監視手段２１の処理は、例えば、情報処理装置１が備えるウォッチドッグタイマを用いて実現してもよい。あるいは、処理監視手段２１の処理は、情報処理装置１が備えるＣＰＵ（Central Processing Unit）によって所定のプログラムを実行することで実現してもよい。
【００２８】
エラー処理手段２２は、処理監視手段２１によって処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報２２ａを、情報処理装置１が備える不揮発性記憶部２４に登録する。エラー処理手段２２は、処理監視手段２１によって処理のエラーが検出されてドライバ情報２２ａを不揮発性記憶部２４に登録した後に、情報処理装置１を再起動する。
【００２９】
実行制御手段２３は、ドライバプログラム１１，１２をそれぞれ呼び出して実行する。また、実行制御手段２３は、情報処理装置１が起動したとき、不揮発性記憶部２４を参照する。実行制御手段２３は、不揮発性記憶部２４に登録されたドライバ情報２２ａが示すドライバプログラムの実行をスキップする。
【００３０】
なお、エラー処理手段２２および実行制御手段２３の処理は、例えば、情報処理装置１が備えるＣＰＵが所定のプログラムを実行することで実現される。
次に、図１を参照して、情報処理装置１がドライバプログラム１１，１２を実行したときの処理例について説明する。なお、以下の説明では、例として、デバイス２０は、ＯＳプログラムの起動に必要となるデバイスであるものとする。このようなデバイスとしては、ＯＳブートローダおよびＯＳプログラムを記憶した記憶装置、ＯＳブートローダおよびＯＳプログラムを記憶した記憶装置と情報処理装置が備えるＣＰＵとの間のパス上のデバイス（例えば、バスインタフェース、ネットワークインタフェースなど）がある。図１では、デバイス２０は、ＯＳブートローダ１３を記憶した記憶デバイスであるものとする。なお、ＯＳブートローダとは、ＯＳプログラムをデバイスから読み出して起動する処理手順を記述したプログラムである。一方、デバイス１０は、ＯＳプログラムの起動に必要とならないデバイスであるものとする。
【００３１】
情報処理装置１が起動すると、実行制御手段２３は、不揮発性記憶部２４にドライバ情報２２ａが登録されているか否かを判定する。ドライバ情報２２ａが不揮発性記憶部２４に登録されていない場合、実行制御手段２３は、例えば、あらかじめ決められた処理順に従って、ドライバプログラム１１，１２を適宜呼び出し、呼び出したドライバプログラムに従って次のような処理を実行する。実行制御手段２３がドライバプログラムに従って実行する処理としては、ドライバプログラムを用いた初期設定処理、ドライバプログラムの制御対象のデバイスに対するアクセス処理などがある。
【００３２】
ドライバプログラムを用いた初期設定処理とは、ドライバプログラムを用いて制御対象のデバイスを制御することを可能にする処理である。ドライバプログラムを用いた初期設定処理は、例えば、デバイスの初期化処理、デバイスの制御時に使用する制御データの初期化処理などを含んでもよい。
【００３３】
一方、デバイスに対するアクセス処理とは、ＯＳプログラムが起動していない期間において、ドライバプログラムを実行することで、デバイスと情報処理装置１のＣＰＵとの間でデータの入出力を行う処理である。デバイスからデータを出力させる処理の例としては、ＯＳブートローダ１３などのファイルを、デバイスに設けられた記憶領域から読み出す処理を挙げることができる。また、例えば、デバイスが表示装置である場合、デバイスへのアクセス処理は、表示装置に情報を表示させる処理であってもよい。
【００３４】
図１の例では、実行制御手段２３は、情報処理装置１の起動後、ドライバプログラム１２を用いた初期設定処理１２ａ、ドライバプログラム１１を用いた初期設定処理１１ａ、デバイス１０に対するアクセス処理１１ｂ、デバイス２０に対するアクセス処理１２ｂの順に処理を実行する。初期設定処理１２ａが完了すると、情報処理装置１は、ドライバプログラム１２を用いてデバイス２０にアクセスすることが可能な状態となる。また、初期設定処理１１ａが完了すると、情報処理装置１は、ドライバプログラム１１を用いてデバイス１０にアクセスすることが可能な状態になる。なお、初期設定処理１１ａ，１２ａの処理順は、情報処理装置１のＣＰＵがデバイス１０，２０を認識した順としてもよい。
【００３５】
その後、実行制御手段２３は、ドライバプログラム１１に従って、デバイス１０に対するアクセス処理１１ｂを実行する。実行制御手段２３は、さらに、ドライバプログラム１２に従って、デバイス２０に対するアクセス処理１２ｂを実行する。このアクセス処理１２ｂでは、デバイス２０から情報処理装置１のＣＰＵに対して、ＯＳブートローダ１３が読み出されるものとする。
【００３６】
処理監視手段２１は、実行制御手段２３によってドライバプログラム１１，１２が呼び出されたとき、呼び出されたドライバプログラムに従って実行される処理の状況を監視する。処理監視手段２１は、ドライバプログラム１２に従って実行される初期設定処理１２ａ、ドライバプログラム１１に従って実行される初期設定処理１１ａ、ドライバプログラム１１に従って実行されるアクセス処理１１ｂ、ドライバプログラム１２に従って実行されるアクセス処理１２ｂを、それぞれ監視する。処理監視手段２１は、監視対象の処理が正常に完了すると、処理の監視を終了する。
【００３７】
ここで、初期設定処理１２ａ、初期設定処理１１ａ、アクセス処理１１ｂ、アクセス処理１２ｂのいずれの実行時にも、処理監視手段２１によって処理のエラーが検出されなかった場合には、情報処理装置１のＣＰＵは、アクセス処理１２ｂの際にデバイス２０から読み出されたＯＳブートローダ１３を実行する。これにより、デバイス２０に記憶されたＯＳプログラムの起動処理が開始される。
【００３８】
次に、処理監視手段２１によって処理のエラーが検出された場合の処理例について説明する。ここでは例として、ドライバプログラム１１を用いた初期設定処理１１ａの実行時に、処理監視手段２１が処理のエラーを検出したものとする。このとき、エラー処理手段２２は、処理のエラーが検出されたドライバプログラム１１を示すドライバ情報２２ａを不揮発性記憶部２４に登録した後、情報処理装置１を再起動する。なお、情報処理装置１の再起動は、エラー処理手段２２の制御により実行するのでなく、例えば、処理エラーが検出されたことを認識したユーザの操作入力に応じて実行されてもよい。
【００３９】
再起動後の情報処理装置１における処理について、図２を用いて説明する。図２は、再起動後の情報処理装置における処理例を示す図である。
情報処理装置１が再起動すると、実行制御手段２３は、不揮発性記憶部２４を参照して、ドライバプログラム１１を示すドライバ情報２２ａが登録されていることを認識する。実行制御手段２３は、不揮発性記憶部２４にドライバ情報が登録されていないドライバプログラム１２を呼び出し、ドライバプログラム１２の初期設定処理１２ａを実行する。
【００４０】
初期設定処理１２ａが正常に完了した後、実行制御手段２３は、不揮発性記憶部２４にドライバ情報２２ａが登録されていたドライバプログラム１１に従った処理をスキップする。具体的には、実行制御手段２３は、ドライバプログラム１１の初期設定処理１１ａの実行をスキップし、さらに、デバイス１０へのアクセス処理１１ｂの実行もスキップする。
【００４１】
初期設定処理１１ａおよびアクセス処理１１ｂがスキップされた後、実行制御手段２３は、デバイス２０に対するアクセス処理１２ｂを実行する。デバイス２０から情報処理装置１のＣＰＵにＯＳブートローダが読み出され、ＣＰＵは、ＯＳブートローダを実行することで、ＯＳプログラムの起動処理を開始する。
【００４２】
なお、図２に示した再起動後の処理において、処理監視手段２１は、ドライバプログラム１２に従った初期設定処理１２ａおよびアクセス処理１２ｂを監視する。一方、初期設定処理１１ａおよびアクセス処理１１ｂはともにスキップされるので、処理監視手段２１は、これらの処理を監視しない。
【００４３】
以上の処理によれば、バグなどの異常発生要因を持つドライバプログラムの実行時に処理エラーが検出された場合、情報処理装置１の再起動後に、処理エラーが検出されたドライバプログラムの実行がスキップされ、再起動前に処理エラーが検出されていない正常なドライバプログラムのみ実行される。再起動後において、情報処理装置１は、正常なドライバプログラムを用いて起動処理を継続し、正常なドライバプログラムに対応するデバイスへのアクセスが可能な状態になる。再起動前に処理エラーが検出されたドライバプログラムに対応するデバイスが、ＯＳプログラムの起動に関係のないデバイスであった場合には、情報処理装置１は、再起動後において、正常なドライバプログラムに対応するいずれかのデバイスからＯＳブートローダを読み出して実行する。これにより、ＯＳプログラムが起動される。
【００４４】
このように、あるドライバプログラムの実行時に処理エラーが検出された場合でも、処理エラーが検出されたドライバプログラムがＯＳプログラムの起動に関係ないものであれば、情報処理装置１は、再起動後に、処理エラーが検出されたドライバプログラム以外のドライバプログラムを用いて起動処理を実行し、ＯＳプログラムを起動することができる。従って、全体として見ると、情報処理装置１が起動時に実行するドライバプログラムのいずれかに異常発生要因があった場合でも、情報処理装置１は、起動処理を継続してＯＳプログラムを起動できる可能性が高まる。
【００４５】
また、例えば、図１、図２において、デバイス１０，２０の両方にＯＳプログラムが記憶され、デバイス１０，２０のうちの一方からＯＳプログラムを読み出して実行できる場合には、以下のような効果が得られる。なお、アクセス処理１１ｂは、デバイス１０に記憶されたＯＳブートローダをデバイス１０から読み出す処理であるものとする。また、アクセス処理１２ｂは、デバイス２０に記憶されたＯＳブートローダをデバイス２０から読み出す処理であるものとする。
【００４６】
このような場合に、初期設定処理１１ａまたはアクセス処理１１ｂでエラーが検出されると、情報処理装置１の再起動後、初期設定処理１１ａおよびアクセス処理１１ｂはスキップされる。初期設定処理１１ａおよびアクセス処理１１ｂがスキップされることで、デバイス１０に記憶されたＯＳプログラムを読み出すことは不可能になる。しかし、情報処理装置１の再起動後には初期設定処理１２ａおよびアクセス処理１２ｂは正常に実行されるため、デバイス２０からＯＳブートローダが読み出され、読み出されたＯＳブートローダを用いて、デバイス２０に記憶されたＯＳプログラムの起動処理が開始される。このように、ＯＳプログラムが記憶されたデバイスを制御するドライバプログラムに異常発生要因があった場合でも、起動処理を継続し、別のデバイスに記憶されたＯＳプログラムを読み出して実行することができる。
【００４７】
なお、実行制御手段２３は、例えば、各ドライバプログラムを呼び出す直前に、その都度不揮発性記憶部２４を参照し、ドライバ情報２２ａが登録されているか否かを判定してもよい。あるいは、実行制御手段２３は、情報処理装置１の起動後、各ドライバプログラムの初期設定処理を実行する前までの期間に、不揮発性記憶部２４を参照してドライバ情報２２ａが登録されているか否かを判定してもよい。
【００４８】
後者の場合、実行制御手段２３は、不揮発性記憶部２４に登録されたドライバ情報２２ａに対応するドライバプログラムの初期設定処理をスキップする。初期設定処理の実行がスキップされたドライバプログラムは、デバイスを制御するプログラムとして使用できない。このため、実行制御手段２３は、初期設定処理がスキップされたドライバプログラムに対応するデバイスへのアクセス処理を実行しない。このような処理によれば、各ドライバプログラムを呼び出す直前にその都度不揮発性記憶部２４を参照する処理と比較して、実行制御手段２３による不揮発性記憶部２４への参照回数が減少し、実行制御手段２３の処理負荷が軽減される。
【００４９】
次に、情報処理装置として、ＵＥＦＩ規格を採用したコンピュータを適用した場合の実施の形態について説明する。
〔第２の実施の形態〕
図３は、第２の実施の形態に係るコンピュータのハードウェア構成例を示す図である。
【００５０】
図３に示すコンピュータ１００は、ＣＰＵ１０１、ウォッチドッグタイマ（ＷＤＴ：Watch Dog Timer）１０２、ＲＡＭ（Random Access Memory）１０３、ＩＯＨ（In/Out Hub）１０４、ＩＣＨ（In/Out Controller Hub）１０５、ＦＷＨ（FirmWare Hub）１０６、ＢＭＣ（Baseboard Management Controller）１０７、ＬＡＮ（Local Area Network）インタフェース（Ｉ／Ｆ）１０８、ＰＣＩｅ（PCIexpress, PCI:Peripheral Component Interconnect）スイッチ１０９，１１０およびＳＡＳ（Serial Attached SCSI, SCSI:Small Computer System Interface）インタフェース（Ｉ／Ｆ）１１１を備えている。
【００５１】
ＣＰＵ１０１は、ＦＷＨ１０６や後述するＨＤＤ（Hard Disk Drive）１１１ａなどの不揮発性記憶媒体に記憶された各種プログラムを実行することにより、コンピュータ１００全体を統括的に制御する。
【００５２】
ＷＤＴ１０２は、ＣＰＵ１０１によって実行される所定のプログラムの処理を監視し、一定時間以内に処理が終了しない場合には、ＣＰＵ１０１にエラーを通知する。なお、ＷＤＴ１０２の処理は、例えば、専用のハードウェアでなく、ＣＰＵ１０１が所定のプログラムを実行することにより実現されてもよい。
【００５３】
ＲＡＭ１０３は、コンピュータ１００の主記憶装置であり、ＣＰＵ１０１に実行させるプログラムの少なくとも一部や、プログラムによる処理に必要な各種データを一時的に記憶する。
【００５４】
ＩＯＨ１０４は、ＣＰＵ１０１、ＩＣＨ１０５およびＰＣＩｅスイッチ１０９のそれぞれの間で、データを中継する。ＩＣＨ１０５は、ＩＯＨ１０４、ＦＷＨ１０６およびＢＭＣ１０７のそれぞれの間で、データを中継する。
【００５５】
ＦＷＨ１０６は、ＵＥＦＩのファームウェアなどが格納された不揮発性メモリである。ＦＷＨ１０６は、例えば、フラッシュＲＯＭである。
ＢＭＣ１０７は、コンピュータ１００が備えるハードウェアを管理するマイクロコントローラである。ＢＭＣ１０７は、例えば、コンピュータ１００内のＬＳＩ（Large Scale Integration）やバスの故障検出、ＬＳＩへのクロックや電源の供給制御などの処理を実行する。また、ＢＭＣ１０７には、不揮発性メモリ１０７ａが搭載されている。不揮発性メモリ１０７ａには、例えば、エラーログなどが書き込まれる。なお、不揮発性メモリ１０７ａは、例えば、フラッシュＲＯＭである。
【００５６】
ＬＡＮインタフェース１０８は、ＬＡＮケーブルを介して外部装置との間で通信する。ＬＡＮインタフェース１０８には、例えば、コンピュータ１００のハードウェア状態を遠隔管理する管理装置が接続される。
【００５７】
ＰＣＩｅスイッチ１０９，１１０は、それぞれ複数のＰＣＩｅバスの間でデータを中継する。ＰＣＩｅスイッチ１１０には、例えば、各種のＩ／Ｏデバイス１１０ａが接続される。なお、Ｉ／Ｏデバイス１１０ａとしては、例えば、ファイバチャネルカード、モニタに接続するためのグラフィックインタフェースなどを適用可能である。
【００５８】
ＳＡＳインタフェース１１１には、例えば、ＨＤＤ１１１ａなどのＳＡＳデバイスが接続される。なお、ＳＡＳデバイスとしては、ＳＳＤ（Solid State Drive）などの他の種類のデバイスを適用することもできる。
【００５９】
次に、コンピュータ１００の起動処理について説明する。まず、図４は、コンピュータの起動処理シーケンスを示すフローチャートである。
図４に示す起動処理シーケンスは、コンピュータ１００に電源が投入されたとき、または、コンピュータ１００が再起動したときに開始される。コンピュータ１００が起動すると、まず、プラットフォームの初期化が行われる（ステップＳ１１）。プラットフォームの初期化では、例えば、コンピュータ１００に接続された各デバイスへの電源の投入およびクロックの供給などが行われる。
【００６０】
次に、ＵＥＦＩによる初期化処理が実行される（ステップＳ１２）。ＵＥＦＩによる初期化処理では、コンピュータ１００のＣＰＵ１０１は、ＦＷＨ１０６に格納されたＵＥＦＩファームウェアを実行することで、接続されたデバイスを使用可能な状態にし、必要なデバイスからＯＳプログラムを読み出して起動できる環境を整える。
【００６１】
ＵＥＦＩによる初期化処理の最終工程では、ＣＰＵ１０１は、デバイスからＯＳブートローダを読み出して実行する。これにより、ＯＳプログラムの起動が開始される（ステップＳ１３）。
【００６２】
次に、図４のステップＳ１２に示したＵＥＦＩによる初期化処理について説明する。ＵＥＦＩによる初期化処理に含まれる処理の１つとして、ＣＰＵ１０１は、ＵＥＦＩドライバを用いた初期設定処理を実行する。ＵＥＦＩドライバは、コンピュータ１００に接続されたデバイスを制御するドライバプログラムである。ＵＥＦＩドライバは、制御対象のデバイスごとに用意される。
【００６３】
ＵＥＦＩドライバを用いた初期設定処理とは、ＵＥＦＩドライバ自身が実行されることにより、このＵＥＦＩドライバを用いて制御対象のデバイスへのアクセスを制御できるようにする処理である。ＵＥＦＩドライバを用いた初期設定処理は、例えば、ＵＥＦＩドライバがデバイスをサポートするか否かを検査する処理、制御対象のデバイスの初期化処理、デバイスの制御時に使用する制御データの初期化処理などを含む。
【００６４】
なお、以下の説明において、“ＵＥＦＩドライバ”は“ブート・サービス・ドライバ”を指すものとする。ブート・サービス・ドライバは、ＯＳプログラムの起動前に使用され、ＯＳプログラムの起動後には使用されない。ＣＰＵ１０１は、図４のステップＳ１３でＯＳプログラムを起動した後、ＵＥＦＩドライバとは別の、ＯＳプログラム用のデバイスドライバを実行することで、デバイスを制御する。
【００６５】
ここで、本実施の形態のコンピュータ１００は、ステップＳ１２のＵＥＦＩによる初期化処理において、コンピュータ１００に接続されたすべてのデバイスを探索し、探索されたデバイスに対応するＵＥＦＩドライバを用いた初期設定処理を行う。このように、コンピュータ１００に接続されたすべてのデバイスを探索し、探索されたデバイスに対応するＵＥＦＩドライバを用いた初期設定処理を行うことは、様々なデバイスが接続される可能性がある、あるいは、複数のデバイスにそれぞれ記憶されたＯＳプログラムの中から実行するＯＳプログラムを選択できる、といった汎用性の高い機器に適するものである。なぜなら、汎用性の高い機器では、起動するたびに、接続されたデバイスの数や種類が変化して、実行するＯＳプログラムの読み出し元として選択可能なデバイスが変わることがあり得る。そして、このような汎用性の高い機器では、起動時に、機器に接続されたすべてのデバイスのうち、少なくとも、ＯＳプログラムの読み出し元として選択可能なすべてのデバイスへのアクセスを可能にする必要があるからである。
【００６６】
しかしながら、コンピュータに接続されたすべてのデバイスを探索し、探索されたデバイスに対応するＵＥＦＩドライバを用いた初期設定処理を行う場合には、次に説明するように、ＵＥＦＩドライバに存在するバグなどの異常発生原因に起因して、ＯＳプログラムの起動（図４のステップＳ１３）までの処理を継続できなくなる可能性が高くなる、という問題があった。
【００６７】
コンピュータは、バグなどの異常発生要因があるＵＥＦＩドライバを実行した場合には、ＵＥＦＩドライバの実行を正常に終了できない。また、コンピュータは、初期設定処理が正常に終了したＵＥＦＩドライバに従って、対応するデバイスへのアクセス制御を行ったときでも、ＵＥＦＩドライバのバグが原因となって、デバイスへのアクセスができない、あるいはそのアクセス制御を正常に終了できないという可能性がある。
【００６８】
一方、前述のように、ＵＥＦＩファームウェアの実行によりロードされるＵＥＦＩドライバ（ブート・サービス・ドライバ）は、ＯＳプログラムが起動した後には使用されない。この場合、ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しなかったとしても、本来はＯＳプログラムが起動した後の処理には影響が及ばない。なぜなら、ＯＳプログラムの起動後には、コンピュータは、ＵＥＦＩドライバとは別のＯＳプログラム用のデバイスドライバを使用してデバイスにアクセスするからである。
【００６９】
しかしながら、ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しない場合には、実行したＵＥＦＩドライバに対応するデバイスがＯＳプログラムの起動に関係あるかないかに関係なく、ＯＳプログラムの起動までの処理が継続されなくなってしまう。そして、このような「ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しない場合には、ＯＳプログラムの起動までの処理が継続されない」という問題は、デバイスへのアクセスを制御するプログラムとして使用可能な状態にするＵＥＦＩドライバが多いほど、発生しやすくなる。コンピュータに接続されたすべてのデバイスを探索し、探索されたデバイスに対応するＵＥＦＩドライバを用いた初期設定処理を行う場合には、探索されるデバイスが多くなり得ることから、ＯＳプログラムの起動までの処理が継続されなくなる可能性も高くなり得る。
【００７０】
このような「ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行が正常に終了しない場合には、ＯＳプログラムの起動までの処理が継続されない」という問題に対して、本実施の形態のコンピュータ１００は、次のような考え方を用いて対処する。ＯＳプログラムの起動に関係のないデバイスに対応するＵＥＦＩドライバの実行時に処理が停止したとき、その処理がスキップできるものであるならば、その処理をスキップして起動処理を継続することが望ましい。また、ＵＥＦＩファームウェアの最も重要な役割はＯＳプログラムを起動させることであるので、ＯＳプログラムの起動前の段階で、コンピュータ１００に接続されたすべてのデバイスを必ずしも使用可能にしなくてもよいと考えられる。
【００７１】
さらに、あるデバイスに対応するＵＥＦＩドライバに異常発生原因があった場合でも、ＯＳプログラムが起動した後には、そのデバイスに対応するＯＳプログラム用のデバイスドライバが実行される。このため、ＵＥＦＩファームウェアの制御下では使用できなかったデバイスも、ＯＳプログラムの制御下では使用できるようになる可能性が高い。
【００７２】
そこで、本実施の形態のコンピュータ１００は、ＵＥＦＩドライバに従って実行される処理を監視し、処理エラーが検出されたＵＥＦＩドライバを示す情報を不揮発性記憶媒体に登録する。そして、コンピュータ１００は、起動時に不揮発性記憶媒体を参照して、過去に処理エラーが検出されたＵＥＦＩドライバを認識し、そのＵＥＦＩドライバの実行をスキップして、ＵＥＦＩファームウェアによる起動処理を継続する。このような処理により、ＵＥＦＩドライバに異常発生原因が存在した場合でも、ＯＳプログラムの起動までの処理が続行される可能性を向上させる。
【００７３】
また、処理エラーが検出されたＵＥＦＩドライバの制御対象のデバイスは、ＯＳプログラムの起動前には使用可能にならないが、そのデバイスがＯＳプログラムの起動に関係のないものであれば、そのデバイスはＯＳプログラムの起動後に使用可能になる可能性が高い。従って、処理エラーが検出されたＵＥＦＩドライバの実行をスキップしても、ＯＳプログラムの起動後に、デバイスに関する処理エラーが発生する確率は低い。
【００７４】
図５は、ＵＥＦＩによる初期化処理時に実行されるプログラムの例を示す図である。
図５に示すＵＥＦＩコア１２０およびブート管理ファームウェア１３０は、ＵＥＦＩにおける“ブートマネージャ”と呼ばれる機能を実現するファームウェアである。ＵＥＦＩコア１２０およびブート管理ファームウェア１３０は、ＦＷＨ１０６にあらかじめ格納され、コンピュータ１００が起動してからＯＳプログラムが起動するまでの過程で、ＣＰＵ１０１によって実行される。
【００７５】
ＵＥＦＩコア１２０は、コンピュータ１００に接続された各デバイスへのアクセスを可能にする環境を整える処理の手順を記述したプログラムである。ブート管理ファームウェア１３０は、ＵＥＦＩコア１２０によって実現された環境の下でＯＳプログラムの起動を開始するまでに実行すべき処理の手順を記述したプログラムである。
【００７６】
ＵＥＦＩドライバ１４０は、コンピュータ１００に接続されたデバイスを制御するドライバプログラムである。ＵＥＦＩドライバ１４０は、制御対象のデバイスごとに用意され、基本的に、制御対象のデバイスのベンダから提供される。後述するように、ＵＥＦＩドライバ１４０は、複数のメンバ関数を含む。メンバ関数は、ＵＥＦＩドライバ１４０により実現される処理のうち一部の処理手順を記述したサブプログラムである。
【００７７】
なお、ＵＥＦＩドライバ１４０は、ＦＷＨ１０６に格納されていてもよいし、あるいは、制御対象のデバイス内の記憶領域に格納されていてもよい。
監視用ドライバ１５０は、ＵＥＦＩドライバ１４０のうち、監視対象のＵＥＦＩドライバ１４０ごとに対応して用意される。監視用ドライバ１５０は、対応するＵＥＦＩドライバ１４０に含まれるメンバ関数と同じ関数名を持つメンバ関数を有する。監視用ドライバ１５０のメンバ関数が呼び出されると、ＣＰＵ１０１は、呼び出されたメンバ関数に従って、対応するＵＥＦＩドライバ１４０に含まれるメンバ関数のうち、呼び出された関数名と同じ関数名を持つメンバ関数を呼び出して実行する。これとともに、ＣＰＵ１０１は、呼び出したＵＥＦＩドライバ１４０内のメンバ関数の実行状況を監視するように、ＷＤＴ１０２に依頼する。
【００７８】
監視用ドライバ１５０は、例えば、ＦＷＨ１０６にあらかじめ格納される。また、対応するＵＥＦＩドライバ１４０がデバイス内の記憶領域に格納されていた場合、監視用ドライバ１５０は、ＵＥＦＩドライバ１４０と同じ記憶領域に格納されていてもよい。
【００７９】
なお、監視対象のＵＥＦＩドライバ１４０は、例えば、ユーザの入力操作に応じて決定されればよい。監視対象のＵＥＦＩドライバ１４０としては、例えば、ＯＳプログラムの起動に関係のないデバイスを制御するＵＥＦＩドライバ１４０が選択される。
【００８０】
ここで、ＯＳプログラムの起動に関係のあるデバイスとは、ＯＳブートローダおよびＯＳプログラムを記憶した記憶装置、または、ＯＳブートローダおよびＯＳプログラムを記憶した記憶装置とＣＰＵ１０１との間のパス上のデバイスである。例えば、図３において、いずれかのＨＤＤ１１１ａにＯＳブートローダおよびＯＳプログラムが記憶されているものとすると、ＯＳプログラムの起動に関係のあるデバイスとしては、ＯＳブートローダおよびＯＳプログラムを記憶したＨＤＤ１１１ａ、ＳＡＳインタフェース１１１、ＰＣＩｅスイッチ１０９などが該当する。また、ＬＡＮインタフェース１０８に接続された外部装置にＯＳブートローダおよびＯＳプログラムが記憶されている場合には、ＯＳプログラムの起動に関係のあるデバイスとして、ＬＡＮインタフェース１０８などが挙げられる。
【００８１】
ＵＥＦＩアプリケーション１６０は、ＵＥＦＩコア１２０によって実現された環境の下で実行される種々の処理手順を記述したプログラムである。ＵＥＦＩアプリケーション１６０は、例えば、ブート管理ファームウェア１３０の実行時に呼び出される。また、ある１つのＵＥＦＩアプリケーション１６０の実行時に、他のＵＥＦＩアプリケーション１６０が呼び出される場合もある。ＵＥＦＩアプリケーション１６０は、デバイスの記憶領域に格納されていてもよいし、ＦＷＨ１０６に格納されていてもよい。
【００８２】
割り込みハンドラ１７０は、ＷＤＴ１０２によりＵＥＦＩドライバ１４０の実行エラーが検出されたときに呼び出される。ＣＰＵ１０１は、割り込みハンドラ１７０に従って、エラーが検出されたＵＥＦＩドライバ１４０を示す情報をＢＭＣ１０７の不揮発性メモリ１０７ａに記憶した後、コンピュータ１００をリセットする。
【００８３】
ここで、ＣＰＵ１０１は、コンピュータ１００の起動が要求されると、まず、ＵＥＦＩコア１２０を実行する。ＣＰＵ１０１は、不揮発性メモリ１０７ａを参照して、コンピュータ１００の以前の起動時にエラーが検出されたＵＥＦＩドライバ１４０を認識し、認識したＵＥＦＩドライバ１４０を使用可能にする処理をスキップする。これにより、コンピュータ１００の以前の起動時にエラーが検出されたＵＥＦＩドライバ１４０はＣＰＵ１０１によって実行されなくなり、ＯＳプログラムの起動までの処理が継続される可能性が高まる。例えば、起動処理の過程で使用可能にされなかったＵＥＦＩドライバ１４０があったとしても、ＯＳブートローダを記憶した記憶デバイスを制御するＵＥＦＩドライバ１４０と、この記憶デバイスとＣＰＵ１０１との間のパス上にあるデバイスを制御するＵＥＦＩドライバ１４０とが使用可能にされれば、ＯＳブートローダがデバイスから読み出され、ＯＳプログラムのブートが開始されるようになる。
【００８４】
図６は、図５の各プログラムによって実現される処理機能を示すブロック図である。
コンピュータ１００は、ドライバ設定部１２１、ドライバ実行制御部１２２、ブート管理部１３１、デバイス制御部１４１、監視制御部１５１、アプリケーション処理部１６１および割り込み処理部１７１を備える。
【００８５】
ドライバ設定部１２１およびドライバ実行制御部１２２の各処理は、ＣＰＵ１０１がＵＥＦＩコア１２０を実行することで実現される。ブート管理部１３１の処理は、ＣＰＵ１０１がブート管理ファームウェア１３０を実行することで実現される。デバイス制御部１４１の処理は、ＣＰＵ１０１がＵＥＦＩドライバ１４０を実行することで実現される。監視制御部１５１の処理は、ＣＰＵ１０１が監視用ドライバ１５０を実行することで実現される。アプリケーション処理部１６１の処理は、ＣＰＵ１０１がＵＥＦＩアプリケーション１６０を実行することで実現される。割り込み処理部１７１の処理は、ＣＰＵ１０１が割り込みハンドラ１７０を実行することで実現される。
【００８６】
ドライバ設定部１２１は、コンピュータ１００に接続されたすべてのデバイスに対応するＵＥＦＩドライバ１４０をＲＡＭ１０３にロードし、ロードしたＵＥＦＩドライバ１４０を用いて対応するデバイスを制御可能にする処理を実行する。ＲＡＭ１０３にロードされた状態のＵＥＦＩドライバ１４０は、ドライバイメージ１４２と呼ばれる。また、ドライバ設定部１２１は、ＵＥＦＩドライバ１４０をＲＡＭ１０３にロードする際に、監視対象リスト３１０を参照する。
【００８７】
監視対象リスト３１０には、監視対象とするＵＥＦＩドライバ１４０を示す情報があらかじめ登録される。本実施の形態では、監視対象リスト３１０には、監視対象とするＵＥＦＩドライバ１４０のファイルを一意に識別するファイルＧＵＩＤ（Globally Unique ID）が登録される。監視対象リスト３１０に登録されるファイルＧＵＩＤは、例えば、ユーザの操作入力に応じて適宜追加または削除されてよい。
【００８８】
監視対象リスト３１０は、不揮発性記憶媒体に登録される。監視対象リスト３１０が登録される不揮発性記憶媒体は、コンピュータ１００が起動した後にＵＥＦＩドライバ１４０の実行が可能になっていない状態でも、ＣＰＵ１０１がアクセス可能な記憶媒体であればよい。本実施の形態では、監視対象リスト３１０は、ＦＷＨ１０６に記憶される。
【００８９】
なお、以下の説明では、監視対象リスト３１０に登録されたファイルＧＵＩＤに対応するＵＥＦＩドライバ１４０を、“監視対象のＵＥＦＩドライバ１４０”と呼ぶ。また、監視対象リスト３１０に登録されていないファイルＧＵＩＤに対応するＵＥＦＩドライバ１４０を、“監視対象でないＵＥＦＩドライバ１４０”と呼ぶ。
【００９０】
ドライバ設定部１２１は、監視対象リスト３１０に基づき、監視対象のＵＥＦＩドライバ１４０をロードする際には、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０もＲＡＭ１０３にロードする。監視用ドライバ１５０とは、対応するＵＥＦＩドライバ１４０に従って実行される処理に対する監視処理を実現するものである。ＲＡＭ１０３にロードされた状態の監視用ドライバ１５０は、監視用ドライバイメージ１５２と呼ばれる。
【００９１】
また、ドライバ設定部１２１は、ＲＡＭ１０３上に、イメージＤＢ（データベース）２１０、パブリックプロトコルＤＢ２２０、サブプロトコルＤＢ２３０およびデバイスリスト２４０を生成する。イメージＤＢ２１０、パブリックプロトコルＤＢ２２０およびサブプロトコルＤＢ２３０は、デバイスリスト２４０の登録処理の過程で、ドライバ設定部１２１によって生成される。
【００９２】
デバイスリスト２４０は、コンピュータ１００に接続されたデバイスと、デバイスの制御に使用されるＵＥＦＩドライバ１４０とを結びつける情報を保持する。デバイスリスト２４０には、コンピュータ１００に接続されたデバイスごとにエントリが生成される。デバイスリスト２４０の各エントリには、デバイスのディレクトリを示すデバイスパスと、各デバイスに対応するＵＥＦＩドライバ１４０が備えるメンバ関数を示す関数名と、各メンバ関数の呼び出しに使用されるポインタとが、対応付けて登録される。コンピュータ１００は、デバイスリスト２４０に関数名およびポインタが登録されている場合に、登録されたポインタが指し示すメンバ関数を実行して、メンバ関数に対応するデバイスを制御することが可能になる。
【００９３】
ここで、デバイスリスト２４０においては、監視対象でないＵＥＦＩドライバ１４０に対応するデバイスのエントリには、ＵＥＦＩドライバ１４０が備えるメンバ関数の呼び出しに使用されるポインタが登録される。これに対して、監視対象のＵＥＦＩドライバ１４０に対応するデバイスのエントリには、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０が備えるメンバ関数の呼び出しに使用されるポインタが登録される。
【００９４】
ドライバ設定部１２１は、イメージＤＢ２１０に対して、ＲＡＭ１０３にロードしたＵＥＦＩドライバ１４０および監視用ドライバ１５０のそれぞれに対応するエントリを生成し、ＵＥＦＩドライバ１４０および監視用ドライバ１５０のそれぞれに関する情報を登録する。また、ドライバ設定部１２１は、イメージＤＢ２１０のエントリを１つずつ選択することで、ＲＡＭ１０３にロードされたＵＥＦＩドライバ１４０および監視用ドライバ１５０のそれぞれに含まれるプロトコルに関する情報を、パブリックプロトコルＤＢ２２０またはサブプロトコルＤＢ２３０に登録する。ここで、プロトコルとは、後述するように、ＵＥＦＩドライバ１４０および監視用ドライバ１５０によって実現されるサービスの単位である。
【００９５】
パブリックプロトコルＤＢ２２０には、監視対象でないＵＥＦＩドライバ１４０に含まれるプロトコルに関する情報と、監視対象のＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０に含まれるプロトコルに関する情報とが登録される。一方、サブプロトコルＤＢ２３０には、監視対象のＵＥＦＩドライバ１４０に含まれるプロトコルに関する情報が登録される。
【００９６】
ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０に登録されたプロトコルの情報を基に、登録されたプロトコルに含まれるメンバ関数についての関数名およびポインタを、デバイスリスト２４０に登録する。これにより、デバイスリスト２４０には、監視対象のＵＥＦＩドライバ１４０が備えるメンバ関数の呼び出しに使用されるポインタが登録されない代わりに、監視用ドライバ１５０が備えるメンバ関数の呼び出しに使用されるポインタが登録されるようになる。
【００９７】
一方、サブプロトコルＤＢ２３０に登録された情報は、デバイスリスト２４０に登録されたポインタに基づいて監視用ドライバ１５０に含まれるメンバ関数が実行された際に、後述する監視制御部１５１によって参照される。監視制御部１５１は、サブプロトコルＤＢ２３０に登録された情報を基に、実行されたメンバ関数に対応する、ＵＥＦＩドライバ１４０内のメンバ関数を呼び出す。これにより、ＵＥＦＩドライバ１４０内のメンバ関数が実行されるとともに、その処理状況が監視制御部１５１によって監視されるようになる。
【００９８】
なお、イメージＤＢ２１０、パブリックプロトコルＤＢ２２０、サブプロトコルＤＢ２３０およびデバイスリスト２４０に登録される情報の内容については、後に詳しく説明する。
【００９９】
ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１からデバイスへのアクセス要求を受け付けると、デバイスリスト２４０を参照して、ＵＥＦＩドライバ１４０のメンバ関数を呼び出す。
【０１００】
ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１から、デバイスへのアクセス要求を示す情報として、複数のデバイス間で共通化された名称の情報を受け付ける。例えば、ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１から、各デバイスへの同じ種類のアクセスの要求を受ける際には、アクセス先のデバイスにかかわらず共通の関数名を受け付ける。
【０１０１】
デバイスからデータを読み出す処理を例に挙げると、デバイスからデータを読み出す制御を実現するメンバ関数に記述された制御手順は、通常、デバイスごとに異なる。しかし、ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１からデバイスからのデータの読み出し要求を受ける際には、読み出し元のデバイスに関係なく“Ｒｅａｄ（）”という共通の関数名の指定を受ける。
【０１０２】
ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１から、上記のようにデバイス間で共通化された関数名の指定と、デバイスを指定する情報（例えばファイルパス）とを受け付けると、指定された関数名およびデバイスに対応するポインタをデバイスリスト２４０から取得する。ドライバ実行制御部１２２は、取得したポインタが指し示すメンバ関数に制御を移すことで、ポインタが指し示すメンバ関数を呼び出す。
【０１０３】
さらに、デバイスへのアクセス要求時にブート管理部１３１およびアプリケーション処理部１６１がドライバ実行制御部１２２に指定する情報については、関数名を共通化したことで、関数名以外の情報も関数名ごとに共通化することができる。例えば、デバイスにデータを書き込む際には、データの書き込み制御を実現するメンバ関数を示す共通の関数名“Ｗｒｉｔｅ（）”と、書き込み対象のデバイスを示す情報と、データの書き込み先のファイル名とが、ドライバ実行制御部１２２に指定されればよい。
【０１０４】
このように、デバイスへのアクセス要求時に指定する情報をデバイス間で共通化したことで、デバイスへのアクセスを要求するブート管理部１３１およびアプリケーション処理部１６１に対してデバイスに依存しないインタフェースを提供できることが、ＵＥＦＩコア１２０が実現する処理の大きな特徴である。
【０１０５】
デバイス制御部１４１は、ＲＡＭ１０３にロードされたＵＥＦＩドライバ１４０のメンバ関数が、ドライバ設定部１２１またはドライバ実行制御部１２２から呼び出されるたびに起動する。後述するように、デバイス制御部１４１は、ドライバ設定部１２１からのメンバ関数の呼び出しに応じて起動した際には、ＵＥＦＩドライバ１４０の初期設定処理を実行する。また、デバイス制御部１４１は、ドライバ実行制御部１２２からのメンバ関数の呼び出しに応じて起動した際には、デバイスへのアクセス制御を実行する。
【０１０６】
監視制御部１５１は、ドライバ設定部１２１またはドライバ実行制御部１２２が、監視用ドライバ１５０のメンバ関数を呼び出したときに起動する。ここで、ドライバ設定部１２１およびドライバ実行制御部１２２は、監視対象のＵＥＦＩドライバ１４０のメンバ関数を呼び出す際には、監視対象のＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０のメンバ関数を呼び出す。監視用ドライバ１５０のメンバ関数を呼び出した後、監視制御部１５１は、呼び出された監視用ドライバ１５０のメンバ関数に対応する、ＵＥＦＩドライバ１４０のメンバ関数を呼び出す。これによりデバイス制御部１４１が起動し、デバイス制御部１４１は、呼び出されたメンバ関数に従って処理を実行する。監視制御部１５１は、ＷＤＴ１０２と連携して、デバイス制御部１４１における処理の実行状況を監視する。
【０１０７】
ブート管理部１３１は、ドライバ設定部１２１によるデバイスリスト２４０への情報登録処理が完了した後に、ＣＰＵ１０１がブート管理ファームウェア１３０が実行することによって起動し、ＯＳプログラムの起動を開始するまでの処理シーケンスを制御する。ブート管理部１３１は、処理シーケンスの中で、ドライバ実行制御部１２２を通じて必要なデバイスにアクセスする。ＯＳプログラムの実行前において、ブート管理部１３１によって最後に実行されるデバイスアクセス処理は、ＯＳプログラムが格納されたデバイスからＯＳブートローダを読み出す処理である。
【０１０８】
ブート管理部１３１は、ＯＳブートローダを読み出すとき、例えば、関数名“Ｒｅａｄ（）”と、ＯＳブートローダのファイルのディレクトリを示すファイルパスとを、ドライバ実行制御部１２２に指定する。ＯＳブートローダのファイルパスには、ＯＳブートローダが格納されたデバイスのデバイスパスが含まれる。
【０１０９】
ドライバ実行制御部１２２は、ブート管理部１３１により指定されたデバイスパスおよび関数名に対応するメンバ関数のポインタをデバイスリスト２４０から取得し、ポインタが指し示すメンバ関数を呼び出す。これによりデバイス制御部１４１が起動し、デバイス制御部１４１は、目的のデバイスから、ファイルパスが示すＯＳブートローダを読み出す。ドライバ実行制御部１２２は、ＯＳブートローダの読み出しが完了すると、制御をブート管理部１３１に移す。ブート管理部１３１は、読み出されたＯＳブートローダを起動する。
【０１１０】
アプリケーション処理部１６１は、ＵＥＦＩアプリケーション１６０に従って、デバイスへのアクセスを伴う種々の処理を実行する。アプリケーション処理部１６１がデバイスにアクセスする際の処理手順は、ブート管理部１３１がデバイスにアクセスする際の処理手順と同じである。
【０１１１】
ブート管理部１３１の制御によって読み出されるＯＳブートローダは、ＵＥＦＩアプリケーション１６０の１つである。前述のように、アプリケーション処理部１６１の処理はＵＥＦＩアプリケーション１６０の実行により実現されるので、ＯＳブートローダがＣＰＵ１０１によって実行されると、アプリケーション処理部１６１が起動する。この場合、アプリケーション処理部１６１は、ＯＳプログラムが格納されたデバイスから、ＯＳに依存する起動プログラムであるＯＳローダを読み出すように、ドライバ実行制御部１２２に要求する。デバイスからＯＳローダが読み出されると、アプリケーション処理部１６１は、読み出されたＯＳローダを起動する。これにより、ＯＳプログラムの実行が開始される。
【０１１２】
割り込み処理部１７１は、監視制御部１５１およびＷＤＴ１０２による監視処理によって処理のエラーが検出されたときに起動する。より具体的には、ＵＥＦＩドライバ１４０のメンバ関数に従ったデバイス制御部１４１での処理が一定時間以内に正常に終了しない場合、ＷＤＴ１０２は、ＣＰＵ１０１に対して処理エラーを通知する。ＣＰＵ１０１は、処理エラーの通知を受けると、割り込みハンドラ１７０を実行する。これにより、割り込み処理部１７１が起動する。
【０１１３】
割り込み処理部１７１は、処理エラーが検出されたＵＥＦＩドライバ１４０を示す情報を、エラーリスト３２１に登録する。エラーリスト３２１には、処理エラーを検出したＵＥＦＩドライバ１４０を示す情報として、例えば、ＵＥＦＩドライバ１４０に含まれるプロトコルのプロトコルＧＵＩＤ、ＵＥＦＩドライバ１４０に対応するデバイスのデバイスパス、ＵＥＦＩドライバ１４０のファイルを識別するファイルＧＵＩＤなどを登録すればよい。
【０１１４】
なお、エラーリスト３２１は、不揮発性記憶媒体に登録される。エラーリスト３２１が登録される不揮発性記憶媒体は、コンピュータ１００が起動した後にＵＥＦＩドライバ１４０の実行が可能になっていない状態でも、ＣＰＵ１０１がアクセス可能な記憶媒体であればよい。本実施の形態では、エラーリスト３２１は、ＢＭＣ１０７の不揮発性メモリ１０７ａに登録される。
【０１１５】
また、割り込み処理部１７１は、エラーリスト３２１に対して処理エラーが検出されたＵＥＦＩドライバ１４０を示す情報を登録するとともに、エラーログ３２２に対して、次の情報を登録する。割り込み処理部１７１は、エラーログ３２２に対して、例えば、処理エラーが発生したＵＥＦＩドライバ１４０やデバイスを示す情報、処理エラーの内容および発生日時などを登録する。エラーログ３２２は、不揮発性記憶領域に登録されればよく、本実施の形態では、ＢＭＣ１０７の不揮発性メモリ１０７ａに登録される。
【０１１６】
割り込み処理部１７１は、エラーリスト３２１およびエラーログ３２２を登録した後、コンピュータ１００のリセットを要求する。
ここで、コンピュータ１００がリセットされ、ドライバ設定部１２１が起動すると、ドライバ設定部１２１は、エラーリスト３２１を参照し、コンピュータ１００のリセット前にエラーが検出されたＵＥＦＩドライバ１４０を認識する。リセット前にエラーが検出されたＵＥＦＩドライバ１４０がエラーリスト３２１に登録されていた場合、ドライバ設定部１２１は、エラーリスト３２１に登録されていたＵＥＦＩドライバ１４０が具備するメンバ関数の呼び出しに使用されるポインタを、デバイスリスト２４０に登録しない。ブート管理部１３１およびアプリケーション処理部１６１は、デバイスリスト２４０にポインタが登録されていないことから、リセット前にエラーが検出されたＵＥＦＩドライバ１４０を呼び出すことができなくなり、対応するデバイスに対するアクセス処理をスキップすることができる。
【０１１７】
また、後述するように、ドライバ設定部１２１は、デバイスリスト２４０にポインタを登録するまでの間にも、ＵＥＦＩドライバ１４０のメンバ関数を呼び出す。具体的には、ドライバ設定部１２１は、ＵＥＦＩドライバ１４０の初期設定処理の実行手順が記述されたメンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）を呼び出す。しかし、ドライバ設定部１２１は、エラーリスト３２１に基づき、リセット前にエラーが検出されたＵＥＦＩドライバ１４０に含まれるメンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）の実行はスキップする。
【０１１８】
以上の構成によれば、デバイス制御部１４１での処理のエラーが検出され、コンピュータ１００がリセットされた後には、処理エラーが検出されたＵＥＦＩドライバ１４０に含まれるメンバ関数の実行がすべてスキップされる。このように、処理エラーが検出されたＵＥＦＩドライバ１４０に含まれるメンバ関数の実行をスキップすることで、ＯＳプログラムの起動までの処理を継続できる可能性が高まる。すなわち、処理エラーが検出されたＵＥＦＩドライバ１４０がＯＳプログラムのロードに関係のないデバイスに対応するドライバである場合には、処理エラーが検出されたＵＥＦＩドライバ１４０の実行がスキップされたとしても、ＯＳプログラムの起動処理を完了することができる。
【０１１９】
また、ドライバ設定部１２１およびドライバ実行制御部１２２は、監視対象のＵＥＦＩドライバ１４０を呼び出す際には、対応する監視用ドライバ１５０のメンバ関数を呼び出す。このとき、監視制御部１５１は、呼び出された監視用ドライバ１５０のメンバ関数に対応する、ＵＥＦＩドライバ１４０のメンバ関数を呼び出す。このような処理により、監視対象のＵＥＦＩドライバ１４０のメンバ関数が実行された場合には、実行されたメンバ関数に従った処理が、監視制御部１５１およびＷＤＴ１０２によって監視されるようになる。
【０１２０】
次に、図６に示した各構成要素について詳細に説明する。まず、図７は、ドライバイメージの構成例を示す図である。
ＵＥＦＩドライバ１４０は、ドライバ設定部１２１によってＲＡＭ１０３にロードされる。図７のドライバイメージ１４２は、ＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた状態を示すものである。
【０１２１】
ＵＥＦＩドライバ１４０は、１つ以上のプロトコル１４３を含む。プロトコル１４３は、ＵＥＦＩドライバ１４０によって実現されるサービスの単位である。各プロトコルは、プロトコルＧＵＩＤによって一意に識別される。プロトコルＧＵＩＤは、例えば、ＵＥＦＩドライバ１４０内のプロトコル１４３の記憶領域のヘッダに記述される。
【０１２２】
１つのプロトコル１４３は、複数のメンバ１４４を含み、１つのメンバ１４４は、１つのメンバ関数１４５へのポインタを含む。メンバ１４４に含まれるポインタは、ドライバイメージ１４２内のアドレスのうち、対応するメンバ関数１４５が格納された領域の先頭アドレスを示す。
【０１２３】
メンバ関数１４５を呼び出す際には、まず、呼び出すメンバ関数に対応するメンバ１４４がＣＰＵ１０１によって読み出された後、読み出されたメンバ１４４に含まれるポインタが指し示すメンバ関数１４５が、ＣＰＵ１０１によって読み出されて実行される。
【０１２４】
また、ＵＥＦＩドライバ１４０は、さらに、プロトコル１４３の情報をパブリックプロトコルＤＢ２２０に登録する処理手順を記述した初期化プログラム１４６を含む。
図８は、監視用ドライバイメージの構成例を示す図である。なお、図８では、参考例として、監視用ドライバイメージに対応するＵＥＦＩドライバ１４０のドライバイメージも示す。
【０１２５】
監視用ドライバ１５０は、対応するＵＥＦＩドライバ１４０内に含まれるプロトコル１４３と同じ数のプロトコル１５３を含む。監視用ドライバ１５０に含まれるプロトコル１５３は、ＵＥＦＩドライバ１４０に含まれる対応するプロトコル１４３と同じプロトコルＧＵＩＤによって識別される。プロトコルＧＵＩＤは、例えば、監視用ドライバ１５０内のプロトコル１５３の記憶領域のヘッダに記述される。
【０１２６】
また、監視用ドライバ１５０のプロトコル１５３は、ＵＥＦＩドライバ１４０の対応するプロトコル１４３に含まれるメンバ１４４と同じ数のメンバ１５４を含む。さらに、監視用ドライバ１５０のプロトコル１５３は、ＵＥＦＩドライバ１４０の対応するプロトコル１４３に含まれるメンバ関数１４５と同じ数のメンバ関数１５５を含む。そして、監視用ドライバ１５０に含まれるメンバ関数１５５は、ＵＥＦＩドライバ１４０に含まれる対応するメンバ関数と同じ関数名を用いて呼び出される。
【０１２７】
なお、図８では、同じ関数名に対応するメンバ１４４とメンバ１５４との間、および、同じ関数名に対応するメンバ関数１４５とメンバ関数１５５との間を、それぞれ点線矢印で結んで示す。
【０１２８】
監視用ドライバ１５０に含まれる１つのメンバ１５４は、１つのメンバ関数１５５に対するポインタを含む。メンバ１５４に含まれるポインタは、監視用ドライバイメージ１５２内のアドレスのうち、対応するメンバ関数１５５が格納された領域の先頭アドレスを示す。
【０１２９】
メンバ関数１５５を呼び出す際には、まず、呼び出すメンバ関数に対応するメンバ１５４がＣＰＵ１０１によって読み出された後、読み出されたメンバ１５４に含まれるポインタが指し示すメンバ関数１５５が、ＣＰＵ１０１によって読み出されて実行される。ここで、メンバ関数１５５には、ＵＥＦＩドライバ１４０内の対応するメンバ関数１４５を呼び出すとともに、呼び出したメンバ関数１４５に従って実行される処理をＷＤＴ１０２を用いて監視する処理の手順が記述される。後述するように、監視用ドライバ１５０のメンバ関数１５５が実行されて対応するＵＥＦＩドライバ１４０のメンバ関数１４５が呼び出される際には、サブプロトコルＤＢ２３０が参照される。
【０１３０】
また、監視用ドライバ１５０は、さらに、プロトコル１５３の情報をパブリックプロトコルＤＢ２２０に登録する処理手順を記述した初期化プログラム１５６を含む。
図９は、イメージＤＢおよびパブリックプロトコルＤＢの各データ構成例を示す図である。
【０１３１】
イメージＤＢ２１０は、１つ以上のエントリ２１１を有し、各エントリ２１１は、リスト構造によって連結される。イメージＤＢ２１０の１つのエントリ２１１は、１つのＵＥＦＩドライバ１４０または１つの監視用ドライバ１５０に対応する。ドライバ設定部１２１は、ＲＡＭ１０３に１つのＵＥＦＩドライバ１４０をロードするたびに、イメージＤＢ２１０に１つのエントリ２１１を生成する。また、ドライバ設定部１２１は、監視対象のＵＥＦＩドライバ１４０をＲＡＭ１０３にロードした場合には、対応する監視用ドライバ１５０もＲＡＭ１０３にロードする。ドライバ設定部１２１は、１つの監視用ドライバ１５０をＲＡＭ１０３にロードするたびに、イメージＤＢ２１０に１つのエントリ２１１を生成する。
【０１３２】
パブリックプロトコルＤＢ２２０は、１つ以上のエントリ２２１を有し、各エントリ２２１は、リスト構造によって連結される。パブリックプロトコルＤＢ２２０の１つのエントリ２２１は、ＵＥＦＩドライバ１４０または監視用ドライバ１５０に含まれる１つのプロトコルに対応する。パブリックプロトコルＤＢ２２０に生成されるエントリ２２１には、次の２種類がある。１つは、監視対象でないＵＥＦＩドライバ１４０に含まれるプロトコル１４３に対応するエントリ２２１であり、もう１つは、監視対象のＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０に含まれるプロトコル１５３に対応するエントリ２２１である。ここで、監視対象のＵＥＦＩドライバ１４０に対応するエントリは、パブリックプロトコルＤＢ２２０に生成されない代わりに、サブプロトコルＤＢ２３０に生成される。
【０１３３】
なお、パブリックプロトコルＤＢ２２０のエントリ２２１には、イメージＤＢ２１０内の１つのエントリ２１１に対するポインタが登録される。また、イメージＤＢ２１０のエントリ２１１には、パブリックプロトコルＤＢ２２０内の１つ以上のエントリ２２１に対するポインタが登録される場合がある。
【０１３４】
図１０は、監視対象でないＵＥＦＩドライバに関連するイメージＤＢおよびパブリックプロトコルＤＢのエントリの例を示す図である。
図１０に示すエントリ２１１ａは、イメージＤＢ２１０に生成されたエントリ２１１のうち、ＵＥＦＩドライバ１４０に対応して生成されたものである。監視対象でないＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合、イメージＤＢ２１０には、ロードしたＵＥＦＩドライバ１４０に対応するエントリ２１１ａのみが生成される。
【０１３５】
ＵＥＦＩドライバ１４０に対応するエントリ２１１ａは、ポインタ２１２ａ、ファイルＧＵＩＤ２１３ａ、デバイスパス２１４ａ、イメージアドレス２１５ａ、イメージレングス２１６ａおよびポインタ２１７ａを含む。
【０１３６】
ポインタ２１２ａは、イメージＤＢ２１０の次のエントリ２１１を指し示すポインタである。ファイルＧＵＩＤ２１３ａは、エントリ２１１ａに対応するＵＥＦＩドライバ１４０のファイルを一意に識別する情報である。デバイスパス２１４ａは、エントリ２１１ａに対応するＵＥＦＩドライバ１４０のファイルが格納されたデバイスのディレクトリを示す。イメージアドレス２１５ａは、エントリ２１１ａに対応するドライバイメージ１４２の先頭を指し示すポインタである。イメージレングス２１６ａは、エントリ２１１ａに対応するドライバイメージ１４２がＲＡＭ１０３上で占めるアドレス範囲の大きさを示す。ポインタ２１７ａについては後で説明する。
【０１３７】
一方、監視対象でないＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合、パブリックプロトコルＤＢ２２０には、ロードされたＵＥＦＩドライバ１４０に含まれるプロトコル１４３に対応するエントリ２２１ａが生成される。エントリ２２１ａは、ポインタ２２２ａ、プロトコルＧＵＩＤ２２３ａ、プロトコルポインタ２２４ａおよびイメージハンドル２２５ａを含む。
【０１３８】
ポインタ２２２ａは、パブリックプロトコルＤＢ２２０の次のエントリ２２１を指し示すポインタである。プロトコルＧＵＩＤ２２３ａは、プロトコル１４３を一意に識別する識別情報である。プロトコルポインタ２２４ａは、ドライバイメージ１４２内の該当するプロトコル１４３の先頭を指し示すポインタである。イメージハンドル２２５ａは、イメージＤＢ２１０のエントリ２１１ａのうち、プロトコル１４３が含まれるＵＥＦＩドライバ１４０のエントリ２１１ａの先頭を指し示すポインタである。
【０１３９】
ここで、イメージＤＢ２１０のエントリ２１１ａのうち、監視対象でないＵＥＦＩドライバ１４０のエントリ２１１ａに含まれるポインタ２１７ａは、同じＵＥＦＩドライバ１４０に含まれるプロトコル１４３のパブリックプロトコルＤＢ２２０のエントリ２２１ａを指し示すポインタとされる。ポインタ２１７ａは、パブリックプロトコルＤＢ２２０上の対応するパブリックプロトコルＤＢ２２０のエントリ２２１ａへの情報登録が終了した後に、イメージＤＢ２１０のエントリ２１１ａに登録される。
【０１４０】
なお、監視対象でない１つのＵＥＦＩドライバ１４０に複数のプロトコル１４３が含まれる場合には、パブリックプロトコルＤＢ２２０には、各プロトコル１４３に対応する複数のエントリ２２１ａが生成される。そして、監視対象でない１つのＵＥＦＩドライバ１４０に複数のプロトコル１４３が含まれる場合には、イメージＤＢ２１０のエントリ２１１ａには、ポインタ２１７ａとして、複数のプロトコル１４３のそれぞれに対応するパブリックプロトコルＤＢ２２０のエントリ２２１ａを指し示す複数のポインタが登録される。
【０１４１】
ドライバ設定部１２１は、上記構成のイメージＤＢ２１０およびパブリックプロトコルＤＢ２２０を参照することで、次のような処理を行うことができる。ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１ａに登録されたイメージアドレス２１５ａに基づいて、対応するドライバイメージ１４２にアクセスする。また、ドライバ設定部１２１は、エントリ２２１ａに登録されたプロトコルポインタ２２４ａに基づいて、ドライバイメージ１４２内の対応するプロトコル１４３にアクセスする。
【０１４２】
図１１は、監視対象のＵＥＦＩドライバに関連するイメージＤＢおよびパブリックプロトコルＤＢのエントリの例を示す図である。
監視対象のＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合には、監視対象のＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０もＲＡＭ１０３にロードされる。そして、イメージＤＢ２１０には、監視対象のＵＥＦＩドライバ１４０に対応するエントリ２１１ａとともに、監視用ドライバ１５０に対応するエントリ２１１ｂも生成される。
【０１４３】
監視用ドライバ１５０に対応するエントリ２１１ｂは、ポインタ２１２ｂ、ファイルＧＵＩＤ２１３ｂ、デバイスパス２１４ｂ、イメージアドレス２１５ｂおよびイメージレングス２１６ｂを含む。なお、監視用ドライバ１５０に対応するエントリ２１１ｂには、パブリックプロトコルＤＢ２２０のエントリ２２１の先頭を指し示すポインタは登録されない。
【０１４４】
ポインタ２１２ｂは、イメージＤＢ２１０の次のエントリ２１１を指し示すポインタである。ファイルＧＵＩＤ２１３ｂは、エントリ２１１ｂに対応する監視用ドライバ１５０のファイルを一意に識別する情報である。デバイスパス２１４ｂは、エントリ２１１ｂに対応する監視用ドライバ１５０のファイルが格納されたデバイスのディレクトリを示す。イメージアドレス２１５ｂは、エントリ２１１ｂに対応する監視用ドライバイメージ１５２の先頭を指し示すポインタである。イメージレングス２１６ｂは、エントリ２１１ｂに対応する監視用ドライバイメージ１５２がＲＡＭ１０３上で占めるアドレス範囲の大きさを示す。
【０１４５】
一方、監視対象のＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合、パブリックプロトコルＤＢ２２０には、監視用ドライバ１５０に含まれるプロトコル１５３に対応するエントリ２２１ｂが生成される。パブリックプロトコルＤＢ２２０のエントリ２２１ｂは、ポインタ２２２ｂ、プロトコルＧＵＩＤ２２３ｂ、プロトコルポインタ２２４ｂおよびイメージハンドル２２５ｂを含む。
【０１４６】
ポインタ２２２ｂは、パブリックプロトコルＤＢ２２０の次のエントリ２２１を指し示すポインタである。プロトコルＧＵＩＤ２２３ｂは、プロトコル１５３を一意に識別する識別情報である。プロトコルポインタ２２４ｂは、監視用ドライバイメージ１５２内の該当するプロトコル１５３の先頭を指し示すポインタである。イメージハンドル２２５ｂは、イメージＤＢ２１０のエントリ２１１ｂのうち、プロトコル１５３が含まれる監視用ドライバ１５０のエントリ２１１ｂの先頭を指し示すポインタである。
【０１４７】
ここで、イメージＤＢ２１０のエントリ２１１ａのうち、監視対象のＵＥＦＩドライバのエントリ２１１ａに含まれるポインタ２１７ａは、対応する監視用ドライバ１５０内のプロトコル１５３のパブリックプロトコルＤＢ２２０のエントリ２２１ｂを指し示すポインタとされる。
【０１４８】
なお、監視対象の１つのＵＥＦＩドライバ１４０に複数のプロトコル１４３が含まれる場合には、監視対象のＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０にも同じ数のプロトコル１５３が含まれる。この場合、パブリックプロトコルＤＢ２２０には、各プロトコル１５３に対応する複数のエントリ２２１ｂが生成される。そして、イメージＤＢ２１０のエントリ２１１ａには、ポインタ２１７ａとして、複数のプロトコル１５３のそれぞれに対応するパブリックプロトコルＤＢ２２０のエントリ２２１ｂを指し示す複数のポインタが登録される。
【０１４９】
ドライバ設定部１２１は、上記構成のイメージＤＢ２１０およびパブリックプロトコルＤＢ２２０を参照することで、次のような処理を行うことができる。ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１ａに登録されたイメージアドレス２１５ａに基づいて、対応するドライバイメージ１４２にアクセスする。また、ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１ｂに登録されたイメージアドレス２１５ｂに基づいて、対応する監視用ドライバイメージ１５２にアクセスする。さらに、ドライバ設定部１２１は、エントリ２２１ｂに登録されたプロトコルポインタ２２４ｂに基づいて、監視用ドライバイメージ１５２内の対応するプロトコル１５３にアクセスする。
【０１５０】
図１２は、サブプロトコルＤＢのデータ構成例を示す図である。
サブプロトコルＤＢ２３０の基本的なデータ構造は、パブリックプロトコルＤＢ２２０と同じである。すなわち、サブプロトコルＤＢ２３０は、１つ以上のエントリを有し、各エントリは、リスト構造によって連結される。
【０１５１】
サブプロトコルＤＢ２３０には、監視対象のＵＥＦＩドライバ１４０に含まれるプロトコル１４３に対応するエントリ２３１が生成される。サブプロトコルＤＢ２３０の１つのエントリ２３１は、ＵＥＦＩドライバ１４０の１つのプロトコル１４３に対応する。従って、監視対象の１つのＵＥＦＩドライバ１４０に複数のプロトコル１４３が含まれる場合には、サブプロトコルＤＢ２３０には、各プロトコル１４３に対応する複数のエントリ２３１が生成される。
【０１５２】
サブプロトコルＤＢ２３０のエントリ２３１は、ポインタ２３２、プロトコルＧＵＩＤ２３３、プロトコルポインタ２３４およびイメージハンドル２３５を含む。ポインタ２３２は、サブプロトコルＤＢ２３０の次のエントリ２３１を指し示すポインタである。プロトコルＧＵＩＤ２３３は、プロトコル１４３を一意に識別する識別情報である。プロトコルポインタ２３４は、ドライバイメージ１４２内の該当するプロトコル１４３の先頭を指し示すポインタである。イメージハンドル２３５は、イメージＤＢ２１０のエントリ２１１ａのうち、プロトコル１４３が含まれるＵＥＦＩドライバ１４０のエントリ２１１ａの先頭を指し示すポインタである。
【０１５３】
前述のように、サブプロトコルＤＢ２３０に登録された情報は、デバイスリスト２４０に登録されたポインタに基づいて監視用ドライバ１５０に含まれるメンバ関数が実行された際に、監視制御部１５１によって参照される。監視制御部１５１は、サブプロトコルＤＢ２３０に登録された情報を基に、実行されたメンバ関数に対応する、ＵＥＦＩドライバ１４０内のメンバ関数を呼び出す。これにより、ＵＥＦＩドライバ１４０内のメンバ関数が実行されるとともに、その処理状況が監視制御部１５１によって監視されるようになる。なお、サブプロトコルＤＢ２３０を利用して監視対象のＵＥＦＩドライバ１４０のメンバ関数が呼び出される際の処理については、図１８において詳しく説明する。
【０１５４】
図１３は、デバイスリストのデータ構成例を示す図である。
デバイスリスト２４０には、デバイスごとにエントリ２４１が生成される。各エントリ２４１は、デバイスに対応したデバイスパス２４２、プロトコルＧＵＩＤ２４３、関数名２４４およびポインタ２４５が登録される。
【０１５５】
デバイスパス２４２は、エントリ２４１に対応するデバイスのディレクトリを示す情報である。プロトコルＧＵＩＤ２４３は、エントリ２４１に対応するデバイスを制御するＵＥＦＩドライバ１４０が含むプロトコル１４３の識別情報である。ＵＥＦＩドライバ１４０が複数のプロトコル１４３を含む場合、デバイスリスト２４０の１つのエントリ２４１には複数のプロトコル１４３をそれぞれ示すプロトコルＧＵＩＤ２４３が登録される。
【０１５６】
関数名２４４は、プロトコル１４３に含まれるメンバ関数１４５の名称を示す。通常、１つのプロトコルＧＵＩＤ２４３に対して複数の関数名２４４が登録される。ポインタ２４５は、ドライバイメージ１４２または監視用ドライバイメージ１５２における、関数名２４４に対応するメンバへのポインタである。ポインタ２４５は、関数名２４４に対応するＵＥＦＩドライバ１４０内のメンバ関数１４５の呼び出しに用いるポインタである。
【０１５７】
なお、ＵＥＦＩドライバ１４０が複数のプロトコル１４３を含む場合、関数名２４４およびポインタ２４５は、複数のプロトコル１４３にそれぞれ対応するプロトコルＧＵＩＤ２４３ごとに、個別に対応付けて登録される。
【０１５８】
ところで、ポインタ２４５として登録される情報は、ポインタ２４５が属するエントリ２４１が、監視対象のＵＥＦＩドライバ１４０に対応するデバイスのものであるか否かによって異なる。監視対象でないＵＥＦＩドライバ１４０に対応するデバイスのエントリ２４１では、ポインタ２４５として、ドライバイメージ１４２における、関数名２４４に対応するメンバ１４４へのポインタが登録される。一方、監視対象のＵＥＦＩドライバ１４０に対応するデバイスのエントリ２４１では、ポインタ２４５として、監視用ドライバイメージ１５２における、関数名２４４に対応するメンバ１５４へのポインタが登録される。図１３の例では、“デバイスＤ０”に対応するＵＥＦＩドライバ１４０は監視対象ではなく、“デバイスＤ１”に対応するＵＥＦＩドライバ１４０は監視対象であるものとする。
【０１５９】
ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１から、所望のＵＥＦＩドライバ１４０が備えるメンバ関数１４５の呼び出し要求を受ける。呼び出し要求は、ブート管理部１３１またはアプリケーション処理部１６１が、ドライバ実行制御部１２２に対してデバイスパスおよび関数名を指定することで行われる。ドライバ実行制御部１２２は、指定されたデバイスパスおよび関数名に対応するメンバ１４４へのポインタを、デバイスリスト２４０から取得し、ポインタに基づいてメンバ関数１４５を呼び出す。
【０１６０】
呼び出しを要求されたメンバ関数１４５が監視対象でないＵＥＦＩドライバ１４０に含まれるものである場合、ドライバ実行制御部１２２は、デバイスリスト２４０のポインタ２４５を基にＵＥＦＩドライバ１４０のメンバ関数１４５を直接呼び出す。これによって、デバイス制御部１４１が起動する。
【０１６１】
一方、呼び出しを要求されたメンバ関数１４５が監視対象のＵＥＦＩドライバ１４０に含まれるものである場合、ドライバ実行制御部１２２は、デバイスリスト２４０のポインタ２４５を基に、監視用ドライバ１５０内の同じ関数名のメンバ関数１５５を呼び出す。これによって、監視制御部１５１が起動する。監視制御部１５１は、ＷＤＴ１０２にカウント動作を開始させるとともに、サブプロトコルＤＢ２３０を参照する。監視制御部１５１は、サブプロトコルＤＢ２３０から、呼び出されたメンバ関数１５５が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。監視制御部１５１は、選択したエントリ２３１に登録されたプロトコルポインタ２３４を基に、ＵＥＦＩドライバ１４０の対応するメンバ関数１４５を呼び出す。これにより、デバイス制御部１４１が起動する。
【０１６２】
以上のように、デバイスリスト２４０内のポインタ２４５は、ポインタ２４５が属するエントリ２４１が監視対象のＵＥＦＩドライバ１４０に対応するデバイスであった場合、監視用ドライバ１５０内のメンバ関数１５５を指し示す情報とされる。これにより、監視対象のＵＥＦＩドライバ１４０が備えるメンバ関数１４５が呼び出される場合には、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５とともに、監視用ドライバ１５０内のメンバ関数１５５も呼び出される。従って、監視対象のＵＥＦＩドライバ１４０がドライバ実行制御部１２２を通じて呼び出されたときには、呼び出されたＵＥＦＩドライバ１４０の実行状況が、監視制御部１５１およびＷＤＴ１０２によって監視されるようになる。
【０１６３】
なお、ドライバ設定部１２１は、エラーリスト３２１に登録されたデバイスパスが示すデバイスのエントリ２４１に対するポインタ２４５の欄に何も登録しない。ポインタ２４５の初期値は“ＮＵＬＬ”であり、ドライバ設定部１２１からのポインタの登録が行われない場合、ポインタ２４５の値は“ＮＵＬＬ”のままとなる。
【０１６４】
次に、ＵＥＦＩによる初期化処理について、フローチャートおよびシーケンス図を用いて説明する。図１４は、ＵＥＦＩによる初期化処理の全体の手順を示すフローチャートである。
【０１６５】
［ステップＳ３１］図４のステップＳ１１の処理が終了すると、コンピュータ１００のＣＰＵ１０１は、ＵＥＦＩコア１２０を実行する。これにより、ドライバ設定部１２１とドライバ実行制御部１２２とが起動する。
【０１６６】
ドライバ設定部１２１は、コンピュータ１００に接続されたデバイスをサーチし、認識したデバイスを示す情報をＲＡＭ１０３に登録する。デバイスとしては、例えば、ＬＡＮインタフェース１０８、ＰＣＩｅスイッチ１０９，１１０、Ｉ／Ｏデバイス１１０ａ、ＳＡＳインタフェース１１１、ＨＤＤ１１１ａなどが認識される。このとき、ドライバ設定部１２１は、認識されたデバイスのデバイスパスを、デバイスリスト２４０に登録する。
【０１６７】
［ステップＳ３２］ドライバ設定部１２１は、ステップＳ３１で認識した各デバイスに対応するＵＥＦＩドライバ１４０をＲＡＭ１０３にロードし、ドライバイメージ１４２を生成する。ドライバ設定部１２１は、ＵＥＦＩドライバ１４０をＲＡＭ１０３にロードするたびに、イメージＤＢ２１０に対して、ロードしたＵＥＦＩドライバ１４０に対応するエントリ２１１ａを生成する。
【０１６８】
また、ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０のファイルＧＵＩＤが監視対象リスト３１０に登録されたファイルＧＵＩＤと一致した場合には、ロードしたＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０をＲＡＭ１０３にロードする。これにより、監視用ドライバイメージ１５２がＲＡＭ１０３に生成される。ドライバ設定部１２１は、監視用ドライバ１５０をＲＡＭ１０３にロードするたびに、イメージＤＢ２１０に対して、ロードした監視用ドライバ１５０に対応するエントリ２１１ｂを生成する。
【０１６９】
ドライバ設定部１２１は、さらに、ＲＡＭ１０３にロードしたＵＥＦＩドライバ１４０に含まれるプロトコル１４３の情報を、パブリックプロトコルＤＢ２２０またはサブプロトコルＤＢ２３０のいずれかに登録する。
【０１７０】
ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象でない場合には、ＵＥＦＩドライバ１４０に含まれるプロトコル１４３の情報を、パブリックプロトコルＤＢ２２０に登録する。
【０１７１】
一方、ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象である場合には、ＵＥＦＩドライバ１４０に含まれるプロトコル１４３の情報を、サブプロトコルＤＢ２３０に登録する。これとともに、ドライバ設定部１２１は、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０に含まれるプロトコル１５３の情報を、パブリックプロトコルＤＢ２２０に登録する。
【０１７２】
以上のパブリックプロトコルＤＢ２２０およびサブプロトコルＤＢ２３０へ情報登録処理を、“プロトコルのインストール”と呼ぶ。
［ステップＳ３３］ドライバ設定部１２１は、ＲＡＭ１０３にロードされたＵＥＦＩドライバ１４０を、対応するデバイスへのアクセス制御を実行可能な状態とする“コネクト処理”を実行する。ドライバ設定部１２１は、コネクト処理において、ＵＥＦＩドライバ１４０が備えるメンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）を呼び出し、デバイス制御部１４１を起動させる。
【０１７３】
デバイス制御部１４１は、メンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）に従って、ＵＥＦＩドライバ１４０の初期設定処理を実行する。デバイス制御部１４１は、初期設定処理の最終工程として、ドライバ設定部１２１に対して、ＵＥＦＩドライバ１４０が備えるすべてのメンバ１４４を指し示すポインタを、デバイスリスト２４０のポインタ２４５の欄へ登録するように要求する。
【０１７４】
ドライバ設定部１２１は、監視対象のＵＥＦＩドライバ１４０のメンバ関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出す場合には、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０が備えるメンバ関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出す。また、ドライバ設定部１２１は、同様に、監視対象のＵＥＦＩドライバ１４０のメンバ関数Ｓｔａｒｔ（）を呼び出す場合には、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０が備えるメンバ関数Ｓｔａｒｔ（）を呼び出す。
【０１７５】
監視用ドライバ１５０が備えるメンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）が呼び出されると、監視制御部１５１が起動する。監視制御部１５１は、メンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）に従って、ＷＤＴ１０２にカウント動作を開始させるとともに、監視用ドライバ１５０に対応するＵＥＦＩドライバ１４０が備えるメンバ関数Ｓｕｐｐｏｒｔｅｄ（），Ｓｔａｒｔ（）をそれぞれ呼び出す。
【０１７６】
また、ドライバ設定部１２１は、エラーリスト３２１に登録されたデバイスパスが示すデバイスに対応するＵＥＦＩドライバ１４０については、コネクト処理をスキップする。デバイスリスト２４０のエントリ２４１のうち、コネクト処理がスキップされたＵＥＦＩドライバ１４０に対応するデバイスのエントリ２４１では、ポインタ２４５の値が“ＮＵＬＬ”となる。
【０１７７】
［ステップＳ３４］ドライバ設定部１２１は、ブート管理ファームウェア１３０を呼び出し、ブート管理部１３１を起動させる。ブート管理部１３１は、ドライバ実行制御部１２２に対して、ＯＳブートローダの読み出しを要求する。
【０１７８】
ブート管理部１３１は、関数名“Ｒｅａｄ（）”と、ＯＳブートローダのファイルパスとを、ドライバ実行制御部１２２に指定する。ドライバ実行制御部１２２は、ファイルパスに含まれるデバイスパスと関数名とに対応するメンバ１４４のポインタを、デバイスリスト２４０のポインタ２４５の欄から取得し、取得したポインタが指し示すメンバ関数を呼び出す。ただし、呼び出されるメンバ関数は、ＵＥＦＩドライバ１４０が備えるメンバ関数１４５である場合と、監視用ドライバ１５０が備えるメンバ関数１５５である場合とがある。
【０１７９】
ＵＥＦＩドライバ１４０が備えるメンバ関数１４５が呼び出されると、デバイス制御部１４１が起動する。起動したデバイス制御部１４１は、目的のデバイスから、ファイルパスが示すＯＳブートローダを読み出す。
【０１８０】
一方、監視用ドライバ１５０が備えるメンバ関数１５５が呼び出されると、監視制御部１５１が起動する。起動した監視制御部１５１は、ＷＤＴ１０２のカウント動作を開始させた後、対応するＵＥＦＩドライバ１４０が備える関数Ｒｅａｄ（）を呼び出す。これにより、デバイス制御部１４１が起動し、デバイス制御部１４１は、目的のデバイスからＯＳブートローダを読み出す。
【０１８１】
ドライバ実行制御部１２２は、ＯＳブートローダの読み出しが完了すると、制御をブート管理部１３１に戻す。ブート管理部１３１は、読み出されたＯＳブートローダを起動し、これによりアプリケーション処理部１６１が起動する。
【０１８２】
アプリケーション処理部１６１は、ＯＳプログラムが格納されたデバイスからＯＳローダを読み出すように、ドライバ実行制御部１２２に要求する。デバイスからＯＳローダが読み出されると、アプリケーション処理部１６１は、読み出されたＯＳローダを起動する。これにより、ＯＳプログラムが起動する。
【０１８３】
なお、ブート管理部１３１は、ＯＳブートローダを起動する前に、ＯＳブートローダ以外の様々なＵＥＦＩアプリケーション１６０を呼び出してもよい。呼び出されるＵＥＦＩアプリケーション１６０の例としては、外部の制御端末からの要求に応じて、デバイスの制御情報を制御端末に出力する処理や、デバイスの制御情報の設定変更処理を実現するものが考えられる。この場合、制御端末との通信は、例えば、ＬＡＮインタフェース１０８を通じて行われる。従って、制御端末との通信処理を実現するＵＥＦＩアプリケーション１６０が実行されると、ＬＡＮインタフェース１０８に対応するＵＥＦＩドライバ１４０が、アプリケーション処理部１６１によって呼び出される。
【０１８４】
また、ドライバ実行制御部１２２は、ブート管理部１３１またはアプリケーション処理部１６１から関数名の指定を受けた際に、指定された関数名のメンバ関数を指し示すポインタがデバイスリスト２４０に登録されていない場合には、指定元に対して“ＮＵＬＬ”を返信する。ブート管理部１３１またはアプリケーション処理部１６１は、ドライバ実行制御部１２２から“ＮＵＬＬ”を受信したとき、次に実行できる処理がある場合には、その処理を実行する。
【０１８５】
例えば、ブート管理部１３１は、あるデバイスからのＯＳブートローダの読み出しをドライバ実行制御部１２２に要求したとき、ドライバ実行制御部１２２から“ＮＵＬＬ”を受信する。このとき、ブート管理部１３１は、ＯＳブートローダが記憶された他のデバイスがある場合には、他のデバイスからのＯＳブートローダの読み出しをドライバ実行制御部１２２に要求する。
【０１８６】
図１５は、図１４のステップＳ３２における処理手順を示すフローチャートである。
［ステップＳ５１］ドライバ設定部１２１は、デバイスリスト２４０のエントリ２４１を１つ選択することで、コンピュータ１００に接続されたデバイスを１つ選択する。
【０１８７】
［ステップＳ５２］ドライバ設定部１２１は、ステップＳ５１で選択したデバイスに対応するＵＥＦＩドライバ１４０を、ＲＡＭ１０３にロードする。ドライバ設定部１２１は、例えば、ステップＳ５１で選択したデバイスのデバイスパスを含むファイルパスを有するＵＥＦＩドライバ１４０を、ＲＡＭ１０３にロードする。ＲＡＭ１０３には、ロードしたＵＥＦＩドライバ１４０のドライバイメージ１４２が生成される。
【０１８８】
［ステップＳ５３］ドライバ設定部１２１は、イメージＤＢ２１０に対して、ロードしたＵＥＦＩドライバ１４０に対応するエントリ２１１ａを１つ生成する。ドライバ設定部１２１は、生成したエントリ２１１ａに、ステップＳ５２でロードしたＵＥＦＩドライバ１４０についてのファイルＧＵＩＤ２１３ａ、デバイスパス２１４ａ、イメージアドレス２１５ａおよびイメージレングス１２６ａを登録する。
【０１８９】
［ステップＳ５４］ドライバ設定部１２１は、監視対象リスト３１０に登録された情報に基づいて、ステップＳ５２でロードしたＵＥＦＩドライバ１４０が監視対象であるか否かを判定する。ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０のファイルＧＵＩＤが、監視対象リスト３１０に登録されたファイルＧＵＩＤと一致した場合に、ロードしたＵＥＦＩドライバ１４０が監視対象であると判定する。
【０１９０】
ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象である場合（Ｓ５４：Ｙｅｓ）には、ステップＳ５５の処理を実行し、監視対象でない場合（Ｓ５４：Ｎｏ）には、ステップＳ５７の処理を実行する。
【０１９１】
［ステップＳ５５］ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０を、ＲＡＭ１０３にロードする。ＲＡＭ１０３には、ロードした監視用ドライバ１５０の監視用ドライバイメージ１５２が生成される。
【０１９２】
［ステップＳ５６］ドライバ設定部１２１は、イメージＤＢ２１０に対してロードした監視用ドライバ１５０に対応するエントリ２１１ｂを１つ生成する。ドライバ設定部１２１は、生成したエントリ２１１ｂに、ステップＳ５５でロードした監視用ドライバ１５０についてのファイルＧＵＩＤ２１３ｂ、デバイスパス２１４ｂ、イメージアドレス２１５ｂおよびイメージレングス１２６ｂを登録する。
【０１９３】
なお、ドライバ設定部１２１は、上記のステップＳ５１〜Ｓ５６の処理を、ＵＥＦＩコア１２０に含まれる関数ＬｏａｄＩｍａｇｅ（）の記述に従って実行する。次に、ドライバ設定部１２１は、ＵＥＦＩコア１２０に含まれる関数Ｄｉｓｐａｔｃｈ（）に従って処理を続ける。これにより、以下のステップＳ５７〜Ｓ６０の処理が実行される。
【０１９４】
［ステップＳ５７］コンピュータ１００は、ＲＡＭ１０３にロードしたＵＥＦＩドライバ１４０に含まれるプロトコル１４３のインストール処理を開始する。なお、プロトコル１４３のインストール処理の手順については、図１６において説明する。
【０１９５】
［ステップＳ５８］ドライバ設定部１２１は、監視対象リスト３１０に登録された情報に基づいて、ステップＳ５２でロードしたＵＥＦＩドライバ１４０が監視対象であるか否かを判定する。ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０のファイルＧＵＩＤが、監視対象リスト３１０に登録されたファイルＧＵＩＤと一致した場合に、ロードしたＵＥＦＩドライバ１４０が監視対象であると判定する。
【０１９６】
ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象である場合（Ｓ５８：Ｙｅｓ）には、ステップＳ５９の処理を実行し、監視対象でない場合（Ｓ５８：Ｎｏ）には、ステップＳ６０の処理を実行する。
【０１９７】
なお、ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象であるか否かを、ステップＳ５５で監視用ドライバ１５０をロードしたか否か、または、ステップＳ５６でエントリ２１１ｂを生成したか否かによって判定してもよい。
【０１９８】
［ステップＳ５９］コンピュータ１００は、ＲＡＭ１０３にロードした監視用ドライバ１５０に含まれるプロトコル１５３のインストール処理を開始する。なお、プロトコル１５３のインストール処理の手順については、図１７において説明する。
【０１９９】
［ステップＳ６０］ドライバ設定部１２１は、デバイスリスト２４０を参照し、未選択のデバイスがあるか否かを判定する。ドライバ設定部１２１は、未選択のデバイスがあると判定した場合には、ステップＳ５１の処理を実行し、未選択のデバイスがないと判定した場合には、図１４のステップＳ３３の処理を実行する。
【０２００】
図１６は、図１５のステップＳ５７における処理手順を示すシーケンス図である。
［ステップＳ７１］ドライバ設定部１２１は、ステップＳ５２でロードしたＵＥＦＩドライバ１４０に含まれる初期化プログラム１４６を呼び出す。初期化プログラム１４６の呼び出しは、イメージＤＢ２１０のエントリ２１１ａに登録されたイメージアドレス２１５ａに基づいて、ドライバイメージ１４２の先頭に制御を移すことによって行われる。呼び出された初期化プログラム１４６がＣＰＵ１０１によって実行されると、デバイス制御部１４１が起動する。
【０２０１】
［ステップＳ７２］デバイス制御部１４１は、初期化プログラム１４６に従って、ＵＥＦＩコア１２０が備える関数ＩｎｓｔａｌｌＰｒｏｔｏｃｏｌ（）を呼び出す。このとき、デバイス制御部１４１は、引数として、ＵＥＦＩドライバ１４０に含まれる１つのプロトコル１４３のプロトコルＧＵＩＤを、ドライバ設定部１２１に通知する。
【０２０２】
ドライバ設定部１２１は、関数ＩｎｓｔａｌｌＰｒｏｔｏｃｏｌ（）の記述に従って、次のステップＳ７３〜Ｓ７５の処理を実行する。
［ステップＳ７３］ドライバ設定部１２１は、監視対象リスト３１０に登録された情報に基づいて、ステップＳ５２でロードしたＵＥＦＩドライバ１４０が監視対象であるか否かを判定する。ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０のファイルＧＵＩＤが、監視対象リスト３１０に登録されたファイルＧＵＩＤと一致した場合に、ロードしたＵＥＦＩドライバ１４０が監視対象であると判定する。
【０２０３】
ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象である場合（Ｓ７３：Ｙｅｓ）には、ステップＳ７４の処理を実行し、監視対象でない場合（Ｓ７３：Ｎｏ）には、ステップＳ７５の処理を実行する。
【０２０４】
なお、ドライバ設定部１２１は、ロードしたＵＥＦＩドライバ１４０が監視対象であるか否かを、ステップＳ５５で監視用ドライバ１５０をロードしたか否か、または、ステップＳ５６でエントリ２１１ｂを生成したか否かによって判定してもよい。
【０２０５】
［ステップＳ７４］ドライバ設定部１２１は、サブプロトコルＤＢ２３０に、ロードしたＵＥＦＩドライバ１４０に対応するエントリ２３１を１つ生成する。ドライバ設定部１２１は、生成したエントリ２３１内のプロトコルＧＵＩＤ２４３の欄に、ステップＳ７２においてデバイス制御部１４１から通知されたプロトコルＧＵＩＤを登録する。また、ドライバ設定部１２１は、プロトコルＧＵＩＤに対応するプロトコル１４３についてのプロトコルポインタ２３４およびイメージハンドル２３５を、エントリ２３１に登録する。
【０２０６】
［ステップＳ７５］ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０に、ＵＥＦＩドライバ１４０のエントリ２２１ａを１つ生成する。ドライバ設定部１２１は、生成したエントリ２２１ａ内のプロトコルＧＵＩＤ２２３ａの欄に、ステップＳ７２においてデバイス制御部１４１から通知されたプロトコルＧＵＩＤを登録する。また、ドライバ設定部１２１は、プロトコルＧＵＩＤに対応する、ＵＥＦＩドライバ１４０内のプロトコル１４３を指し示すポインタを、エントリ２２１ａのプロトコルポインタ２２４ａの欄に登録する。さらに、ドライバ設定部１２１は、ステップＳ５３で生成したイメージＤＢ２１０内のエントリ２１１ａを指し示すポインタを、エントリ２２１ａのイメージハンドル２２５ａの欄に登録する。また、ドライバ設定部１２１は、生成したエントリ２２１ｂの先頭を示すポインタを、ステップＳ５３で生成したエントリ２１１ａ内のポインタ２１７ａの欄に登録する。
【０２０７】
［ステップＳ７６］ドライバ設定部１２１は、デバイス制御部１４１に対して、パブリックプロトコルＤＢ２２０への登録処理が完了したことを通知する。
ここで、ステップＳ５２でＲＡＭ１０３にロードされたＵＥＦＩドライバ１４０に複数のプロトコル１４３が含まれる場合には、デバイス制御部１４１は、ＵＥＦＩドライバ１４０に含まれるプロトコル１４３の数だけ、ステップＳ７２の処理を繰り返し実行する。デバイス制御部１４１は、ステップＳ７２を実行するたびに、ＵＥＦＩドライバ１４０に含まれる異なるプロトコル１４３のプロトコルＧＵＩＤを、ドライバ設定部１２１に通知する。これにより、ＵＥＦＩドライバ１４０に含まれるすべてのプロトコル１４３についての情報が、パブリックプロトコルＤＢ２２０またはサブプロトコルＤＢ２３０に登録される。
【０２０８】
［ステップＳ７７］デバイス制御部１４１は、インストール処理が完了したことをドライバ設定部１２１に通知する。この後、図１５のステップＳ５８の処理が実行される。
図１７は、図１５のステップＳ５９における処理手順を示すシーケンス図である。
【０２０９】
［ステップＳ９１］ドライバ設定部１２１は、ステップＳ５５でロードした監視用ドライバ１５０に含まれる初期化プログラム１５６を呼び出す。初期化プログラム１５６の呼び出しは、イメージＤＢ２１０のエントリ２１１ｂに登録されたイメージアドレス２１５ｂに基づいて、監視用ドライバイメージ１５２の先頭に制御を移すことによって行われる。呼び出された初期化プログラム１５６がＣＰＵ１０１によって実行されると、監視制御部１５１が起動する。
【０２１０】
［ステップＳ９２］監視制御部１５１は、初期化プログラム１５６に従って、ＵＥＦＩコア１２０が備える関数ＩｎｓｔａｌｌＰｒｏｔｏｃｏｌＷｒａｐ（）を呼び出す。このとき、監視制御部１５１は、引数として、監視用ドライバ１５０に含まれる１つのプロトコル１５３のプロトコルＧＵＩＤを、ドライバ設定部１２１に通知する。
【０２１１】
ドライバ設定部１２１は、関数ＩｎｓｔａｌｌＰｒｏｔｏｃｏｌＷｒａｐ（）の記述に従って、次のステップＳ９３の処理を実行する。
［ステップＳ９３］ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０に、監視用ドライバ１５０のエントリ２２１ｂを１つ生成する。ドライバ設定部１２１は、生成したエントリ２２１ｂ内のプロトコルＧＵＩＤ２２３ｂの欄に、ステップＳ９２においてデバイス制御部１４１から通知されたプロトコルＧＵＩＤを登録する。また、ドライバ設定部１２１は、プロトコルＧＵＩＤに対応する、監視用ドライバ１５０内のプロトコル１５３を指し示すポインタを、エントリ２２１ｂ内のプロトコルポインタ２２４ｂの欄に登録する。さらに、ドライバ設定部１２１は、ステップＳ５６で生成したイメージＤＢ２１０内のエントリ２１１ｂを指し示すポインタを、エントリ２２１ｂのイメージハンドル２２５ｂの欄に登録する。
【０２１２】
［ステップＳ９４］ドライバ設定部１２１は、監視制御部１５１に対して、パブリックプロトコルＤＢ２２０への登録処理が完了したことを通知する。
ここで、ステップＳ５５でＲＡＭ１０３にロードされた監視用ドライバ１５０に複数のプロトコル１５３が含まれる場合には、監視制御部１５１は、監視用ドライバ１５０に含まれるプロトコル１５３の数だけ、ステップＳ９２の処理を繰り返し実行する。監視制御部１５１は、ステップＳ９２を実行するたびに、監視用ドライバ１５０に含まれる異なるプロトコル１５３のプロトコルＧＵＩＤを、ドライバ設定部１２１に通知する。これにより、監視用ドライバ１５０に含まれるすべてのプロトコル１５３についての情報が、パブリックプロトコルＤＢ２２０に登録される。
【０２１３】
［ステップＳ９５］監視制御部１５１は、インストール処理が完了したことをドライバ設定部１２１に通知する。この後、図１５のステップＳ６０の処理が実行される。
以上の図１５〜図１７の処理により、イメージＤＢ２１０、パブリックプロトコルＤＢ２２０およびサブプロトコルＤＢ２３０に対する情報登録が完了する。監視対象でないＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合、パブリックプロトコルＤＢ２２０には、ロードされたＵＥＦＩドライバ１４０に含まれるプロトコル１５３に対応するエントリ２２０ａが生成される。エントリ２２０ａには、ロードされたＵＥＦＩドライバ１４０に含まれるプロトコル１４３を指し示すプロトコルポインタ２２４ａが登録される。
【０２１４】
一方、監視対象のＵＥＦＩドライバ１４０がＲＡＭ１０３にロードされた場合、パブリックプロトコルＤＢ２２０には、監視用ドライバ１５０に含まれるプロトコル１５３に対応するエントリ２２１ｂが生成される。エントリ２２１ｂには、ロードされたＵＥＦＩドライバ１４０に含まれるプロトコル１４３を指し示すプロトコルポインタ２２４ａの代わりに、対応する監視用ドライバ１５０に含まれるプロトコル１５３を指し示すプロトコルポインタ２２４ｂが登録される。
【０２１５】
また、監視対象のＵＥＦＩドライバ１４０に含まれるプロトコル１４３に対応するエントリは、パブリックプロトコルＤＢ２２０に生成されない代わりに、サブプロトコルＤＢ２３０に対して生成される。サブプロトコルＤＢ２３０のエントリ２３１には、監視対象のＵＥＦＩドライバ１４０に含まれるプロトコル１４３を指し示すプロトコルポインタ２３４が登録される。
【０２１６】
ドライバ設定部１２１は、次に、図１４のステップＳ３３に示したコネクト処理を実行する。ところで、コネクト処理以降、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す前に、ＵＥＦＩドライバ１４０に対応する監視用ドライバ１５０のメンバ関数１５５が呼び出される。そこで、コネクト処理について説明する前に、監視用ドライバ１５０のメンバ関数１５５が呼び出されたときの処理手順について説明する。
【０２１７】
監視用ドライバ１５０のメンバ関数１５５が呼び出されると、監視制御部１５１が起動する。起動した監視制御部１５１は、呼び出された監視用ドライバ１５０のメンバ関数１５５に対応する、ＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す。このような処理により、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５に従って実行される処理は、監視制御部１５１およびＷＤＴ１０２によって監視されるようになる。
【０２１８】
監視制御部１５１は、サブプロトコルＤＢ２３０に登録された情報に基づいて、ＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す。ここで、図１８は、サブプロトコルＤＢ、ＵＥＦＩドライバおよび監視用ドライバとの関係を示す図である。
【０２１９】
監視制御部１５１は、監視用ドライバ１５０に含まれる１つのメンバ関数１５５の呼び出しに応じて起動すると、サブプロトコルＤＢ２３０を参照する。監視制御部１５１は、サブプロトコルＤＢ２３０から、呼び出されたメンバ関数１５５が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。監視制御部１５１は、選択したエントリ２３１に含まれるプロトコルポインタ２３４に基づいて、監視用ドライバ１５０に対応するＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスし、呼び出されたメンバ関数１５５と同じ関数名に対応するメンバ１４４に制御を移す。これにより、呼び出されたメンバ関数１５５に対応するＵＥＦＩドライバ１４０のメンバ関数１４５が実行される。このように、監視制御部１５１は、サブプロトコルＤＢ２３０を参照することで、対応するＵＥＦＩドライバ１４０のメンバ関数１５５を簡単に呼び出すことができる。
【０２２０】
図１９は、監視用ドライバのメンバ関数が呼び出されたときに実行される処理手順を示すフローチャートである。
［ステップＳ１１１］監視用ドライバ１５０のメンバ関数１５５が呼び出されると、監視制御部１５１が起動する。監視制御部１５１は、図１８で説明したように、サブプロトコルＤＢ２３０から、呼び出されたメンバ関数１５５が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。そして、監視制御部１５１は、選択したエントリ２３１に含まれるプロトコルポインタ２３４を取得する。
【０２２１】
［ステップＳ１１２］監視制御部１５１は、ステップＳ１１１で選択したエントリ２３１に対応するプロトコルに関する情報であるプロトコル情報を、ＲＡＭ１０３に生成されたスタックにプッシュする。なお、プロトコル情報およびスタックについては、図２０で説明する。
【０２２２】
［ステップＳ１１３］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を開始させる。例えば、カウント値がリセットされた状態でＷＤＴ１０２が停止しているものとすると、監視制御部１５１は、ＷＤＴ１０２にカウント動作を開始させる。
【０２２３】
［ステップＳ１１４］監視制御部１５１は、ステップＳ１１１で取得したプロトコルポインタ２３４を基にＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスする。そして、監視制御部１５１は、呼び出されたメンバ関数１５５と同じ関数名に対応するメンバ１４４に制御を移すことで、メンバ１４４に対応するＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す。これにより、ＵＥＦＩドライバ１４０のメンバ関数１４５が実行され、デバイス制御部１４１は、メンバ関数１４５に従って処理を行う。
【０２２４】
［ステップＳ１１５］監視制御部１５１は、呼び出したメンバ関数１４５に従ったデバイス制御部１４１の処理が、正常に終了したか否かを判定する。デバイス制御部１４１は、メンバ関数１４５に従った処理を正常に終了すると（Ｓ１１５：Ｙｅｓ）、メンバ関数１４５の呼び出し元である監視制御部１５１に対して、処理が正常に終了したことを通知する。監視制御部１５１は、ステップＳ１１３の実行から一定時間以内に、デバイス制御部１４１から処理が正常に終了したことの通知を受けると、ステップＳ１１６の処理を実行する。
【０２２５】
なお、ステップＳ１１３の実行から一定時間以内にデバイス制御部１４１の処理が終了しない場合には、ＷＤＴ１０２においてタイムアウトが発生する。このとき、ＣＰＵ１０１は、割り込みハンドラ１７０を実行し、これにより割り込み処理部１７１が起動する。割り込み処理部１７１による処理については、図２１において説明する。
【０２２６】
［ステップＳ１１６］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を終了させる。例えば、監視制御部１５１は、ＷＤＴ１０２にカウント動作を停止させるとともに、カウント値をリセットする。
【０２２７】
［ステップＳ１１７］監視制御部１５１は、ＲＡＭ１０３に生成されたスタックから、ステップＳ１１２でプッシュしたプロトコル情報をポップする。
以上の図１９の処理によれば、監視用ドライバ１５０のメンバ関数１５５が呼び出されると、ＵＥＦＩドライバ１４０内の対応するメンバ関数１４５が呼び出される。これとともに、呼び出されたメンバ関数１４５に従って実行される処理が、ＷＤＴ１０２によって監視される。従って、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５に異常発生要因があるか否かを、確実に検出できるようになる。
【０２２８】
図２０は、スタックに登録されるプロトコル情報の例を示す図である。
ステップＳ１１２では、プロトコル情報３３０が、ＲＡＭ１０３に生成されたスタック３４０にプッシュされる。プロトコル情報３３０は、ＷＤＴ１０２が監視対象とするＵＥＦＩドライバを識別可能であればよい。本実施の形態では、プロトコル情報３３０は、ステップＳ１１１で選択したエントリ２３１に対応するプロトコルに関する情報であり、プロトコルＧＵＩＤ３３１、デバイスパス３３２およびファイルＧＵＩＤ３３３を含む。
【０２２９】
この場合、ステップＳ１１２において、監視制御部１５１は、ステップＳ１１１で選択したエントリ２３１に登録されているプロトコルＧＵＩＤ２３３を、プロトコルＧＵＩＤ３３１としてプロトコル情報３３０に登録する。また、監視制御部１５１は、ステップＳ１１１で選択したエントリ２３１に登録されているイメージハンドル２３５を基に、イメージＤＢ２１０のエントリ２１１ａを参照する。そして、監視制御部１５１は、イメージＤＢ２１０のエントリ２１１ａに登録されているデバイスパス２１４ａおよびファイルＧＵＩＤ２１３ａを、デバイスパス３３２およびファイルＧＵＩＤ３３３としてプロトコル情報３３０に登録する。
【０２３０】
ところで、スタック３４０は、ＷＤＴ１０２が監視する処理の情報を保持する記憶領域の一実施形態であり、ＲＡＭ１０３に用意される。図２１で説明するように、ＷＤＴ１０２でタイムアウトが発生したとき、割り込み処理部１７１は、スタック３４０に登録されたプロトコル情報３３０を読み出して、エラーリスト３２１に登録する。
【０２３１】
なお、スタック３４０は、例えば、ＣＰＵ１０１が実行する処理を管理するための記憶領域として利用されてもよい。この場合、プロトコル情報３３０がスタック３４０にプッシュされるとき、スタック３４０には、プロトコル情報３３０に対応するメンバ関数１４５の呼び出し元のプログラムに関する情報がすでに登録されていてもよい。
【０２３２】
図２１は、割り込み処理部における処理手順を示すフローチャートである。ＷＤＴ１０２においてタイムアウトが発生すると、割り込み処理部１７１は次の処理を実行する。
［ステップＳ１３１］割り込み処理部１７１は、スタック３４０のトップエントリに登録されたプロトコル情報３３０を読み出し、エラーリスト３２１に登録する。
【０２３３】
なお、エラーリスト３２１に登録される情報は、エラーが検出されたＵＥＦＩドライバを識別可能な情報であればよい。また、エラーリスト３２１に登録される情報は、デバイスリスト２４０に登録された情報と直接照合できる情報であることが望ましい。このため、例えば、プロトコル情報３３０に含まれる情報のうち、デバイスパス３３２のみがエラーリスト３２１に登録されてもよい。
【０２３４】
［ステップＳ１３２］割り込み処理部１７１は、エラーログ３２２に対して、処理エラーが発生したＵＥＦＩドライバ１４０やデバイスを示す情報、処理エラーの内容および発生日時などを登録する。
【０２３５】
［ステップＳ１３３］割り込み処理部１７１は、コンピュータ１００をリセットする。なお、エラーリスト３２１およびエラーログ３２２に登録された情報は、コンピュータ１００のリセット後にも保持される。
【０２３６】
以上の図２１の処理によれば、ＵＥＦＩドライバ１４０のメンバ関数１４５に従った処理の実行中に、ＷＤＴ１０２によってエラーが検出されると、エラーの原因と考えられるＵＥＦＩドライバ１４０を識別する情報がエラーリスト３２１に登録される。従って、コンピュータ１００が再起動した後、エラーリスト３２１に登録された情報に対応するＵＥＦＩドライバ１４０の実行を確実に回避できるようになる。
【０２３７】
また、割り込み処理部１７１は、エラーリスト３２１およびエラーログ３２２を登録した後、コンピュータ１００を再起動する。このため、処理エラーが検出された場合でも、ユーザが特に何も操作することなく、コンピュータ１００の処理を続行でき、処理エラーの発生時におけるＯＳプログラムの起動までの処理時間を短縮することができる。
【０２３８】
なお、処理エラーが検出されたＵＥＦＩドライバ１４０がＯＳプログラムの起動に関係するものであった場合、コンピュータ１００は起動処理を続行できなくなることがある。このような場合には、コンピュータ１００の管理者は、エラーログ３２２を解析することで、異常発生要因が存在するＵＥＦＩドライバ１４０を更新するなどの措置を講じ、コンピュータ１００を復旧させることができる。
【０２３９】
次に、イメージＤＢ２１０、パブリックプロトコルＤＢ２２０およびサブプロトコルＤＢ２３０に対する情報登録が完了した後の処理について、あらためて説明する。図２２，図２３は、図１４のステップＳ３３における処理手順を示すフローチャートである。
【０２４０】
［ステップＳ１５１］ドライバ設定部１２１は、デバイスリスト２４０のエントリ２３１を１つ選択することで、デバイスを選択する。
［ステップＳ１５２］ドライバ設定部１２１は、ステップＳ１５１で選択したエントリ２３１に登録されたデバイスパス２４２が、エラーリスト３２１に登録されているデバイスパス３３２の１つと一致するか否かを判定する。ドライバ設定部１２１は、デバイスパス同士が一致した場合（Ｓ１５２：Ｙｅｓ）には、ステップＳ１６１の処理を実行し、デバイスパスが一致しない場合(Ｓ１５２：Ｎｏ）には、ステップＳ１５３の処理を実行する。
【０２４１】
なお、ステップＳ１５１では、ドライバ設定部１２１は、デバイスリスト２４０のエントリ２３１の代わりに、イメージＤＢ２１０に生成されたＵＥＦＩドライバ１４０のエントリ２１１ａを１つ選択することで、デバイスを選択してもよい。この場合、ステップＳ１５２では、ドライバ設定部１２１は、選択したエントリ２１１ａに登録されたファイルＧＵＩＤ２１３ａが、エラーリスト３２１に登録されているファイルＧＵＩＤ３３３の１つと一致するか否かを判定する。
【０２４２】
［ステップＳ１５３］ドライバ設定部１２１は、イメージＤＢ２１０に生成されたエントリ２１１の中から、ステップＳ１５１で選択したデバイスに対応するＵＥＦＩドライバ１４０のエントリ２１１ａを選択する。具体的には、ドライバ設定部１２１は、ステップＳ１５１で選択したデバイスリスト２４０のエントリ２４１から、デバイスパス２４２を取得する。ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１のうち、エントリ２１１内のデバイスパス２１４が、デバイスリスト２４０から取得したデバイスパス２４２と同じであるエントリ２１１を選択する。
【０２４３】
［ステップＳ１５４］ステップＳ１５１で選択したデバイスに対応するＵＥＦＩドライバ１４０が監視対象であるか否かが判別される。ステップＳ１５１で選択したデバイスに対応するＵＥＦＩドライバ１４０が監視対象である場合（Ｓ１５４：Ｙｅｓ）には、ステップＳ１６２の処理が実行され、監視対象でない場合（Ｓ１５４：Ｎｏ）には、ステップＳ１５５の処理が実行される。具体的には、ステップＳ１５３で選択されたエントリ２４１内のポインタ２１７ａが、パブリックプロトコルＤＢ２２０のエントリ２２１のうち、監視用ドライバ１５０のプロトコル１５３に対応するエントリ２２１ｂを指し示す場合には、ステップＳ１６２の処理が実行される。一方、ステップＳ１５３で選択されたエントリ２４１内のポインタ２１７ａが、パブリックプロトコルＤＢ２２０のエントリ２２１のうち、ＵＥＦＩドライバ１４０のプロトコル１４３に対応するエントリ２２１ａを指し示す場合には、ステップＳ１５５の処理が実行される。
【０２４４】
［ステップＳ１５５］ドライバ設定部１２１は、ステップＳ１５１で選択したデバイスに対応するプロトコル１４３を選択する。具体的には、ドライバ設定部１２１は、ステップＳ１５３で選択したイメージＤＢ２１０のエントリ２１１ａからポインタ２１７ａを１つ取得し、取得したポインタ２１７ａが指し示すパブリックプロトコルＤＢ２２０内のエントリ２２１ａを選択する。
【０２４５】
［ステップＳ１５６］ドライバ設定部１２１は、ステップＳ１５５で選択したプロトコル１４３に含まれるメンバ関数１４５のうち、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の情報を、デバイスリスト２４０に登録する。関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）は、プロトコル１４３の初期設定処理の手順を記述したものである。
【０２４６】
ステップＳ１５６では、ドライバ設定部１２１は、まず、ステップＳ１５５で選択したパブリックプロトコルＤＢ２２０のエントリ２２１ａから、プロトコルＧＵＩＤ２２３ａとプロトコルポインタ２２４ａとを取得する。ドライバ設定部１２１は、取得したプロトコルポインタ２２４ａに基づいて、ドライバイメージ１４２上のプロトコル１４３の領域にアクセスする。
【０２４７】
ドライバ設定部１２１は、アクセスしたプロトコル１４３の領域に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）のそれぞれに対応するメンバ１４４へのポインタを生成する。ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０のエントリ２２１ａから取得したプロトコルＧＵＩＤ２２３ａと、関数Ｓｕｐｐｏｒｔｅｄ（）、関数Ｓｔａｒｔ（）のそれぞれの関数名と、各関数に対応するメンバ１４４へのポインタとを、デバイスリスト２４０のプロトコルＧＵＩＤ２４３、関数名２４４およびポインタ２４５の各欄に登録する。
【０２４８】
［ステップＳ１５７］ドライバ設定部１２１は、ステップＳ１５５で選択したプロトコル１４３内の関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出す。これによりデバイス制御部１４１が起動する。起動したデバイス制御部１４１は、プロトコル１４３を含むＵＥＦＩドライバ１４０が、対象のデバイスをサポートするか否かを判定する。
【０２４９】
なお、このステップＳ１５７の処理については、図２６において説明する。
［ステップＳ１５８］ドライバ設定部１２１は、ステップＳ１５７でのデバイス制御部１４１による判定結果に基づき、ＵＥＦＩドライバ１４０が対象のデバイスをサポートするか否かを判定する。ＵＥＦＩドライバ１４０が対象のデバイスをサポートする場合（Ｓ１５８：Ｙｅｓ）には、ステップＳ１５９の処理を実行する。一方、ドライバ設定部１２１は、ＵＥＦＩドライバ１４０が対象のデバイスをサポートしない場合（Ｓ１５８：Ｎｏ）には、ステップＳ１６０の処理を実行する。
【０２５０】
［ステップＳ１５９］ドライバ設定部１２１は、ステップＳ１５５で選択したプロトコル１４３内の関数Ｓｔａｒｔ（）を呼び出す。これによりデバイス制御部１４１が起動する。デバイス制御部１４１は、対象のデバイスの初期化、デバイスの制御に用いる制御情報の初期化を行う。その後、デバイス制御部１４１は、ステップＳ１５５で選択したプロトコル１４３内の残りのメンバ関数１４５についての情報をデバイスリスト２４０に登録するように、ドライバ設定部１２１に依頼する。ドライバ設定部１２１は、デバイス制御部１４１からの依頼に応じて、残りのメンバ関数１４５の関数名と、各関数に対応するメンバ１４４へのポインタとを、デバイスリスト２４０の関数名２４４およびポインタ２４５の欄にそれぞれ登録する。このような処理により、ステップＳ１５５で選択したプロトコル１４３は、対応するデバイスの制御に用いるプログラムとして利用可能な状態になる。
【０２５１】
なお、このステップＳ１５９の処理については、図２７において説明する。
［ステップＳ１６０］ドライバ設定部１２１は、ステップＳ１５１で選択したデバイスに対応するプロトコル１４３のうち、未選択のプロトコル１４３があるか否かを判定する。具体的には、ドライバ設定部１２１は、ステップＳ１５３において選択したイメージＤＢ２１０のエントリ２１１ａから、すべてのポインタ２１７ａを選択したか否かを判定する。
【０２５２】
ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１ａ内に未選択のポインタ２１７ａがある場合（Ｓ１６０：Ｙｅｓ）、ステップＳ１５５の処理を実行する。この場合、ステップＳ１５５では、イメージＤＢ２１０のエントリ２１１ａから未選択のポインタ２１７ａが選択され、選択されたポインタ２１７ａが指し示すパブリックプロトコルＤＢ２２０のエントリ２２１ａが選択される。一方、ドライバ設定部１２１は、イメージＤＢ２１０のエントリ２１１ａ内のポインタ２１７ａがすべて選択済みである場合（Ｓ１６０：Ｎｏ）には、ステップＳ１６１の処理を実行する。
【０２５３】
［ステップＳ１６１］ドライバ設定部１２１は、コンピュータ１００に接続されたデバイスの中に、ステップＳ１５１で選択されていないデバイスがあるか否かを判定する。この判定処理は、デバイスリスト２４０の中に未選択のエントリ２３１があるか否かを判定することで実行される。ドライバ設定部１２１は、未選択のデバイスがある場合（Ｓ１６１：Ｙｅｓ）には、ステップＳ１５１の処理を実行する。この場合、ステップＳ１５１では、デバイスリスト２４０から未選択のエントリ２３１が選択される。一方、ドライバ設定部１２１は、すべてのデバイスが選択済みである場合（Ｓ１６１：Ｎｏ）には、コネクト処理を終了し、図１４のステップＳ３４の処理を実行する。
【０２５４】
［ステップＳ１６２］ドライバ設定部１２１は、ステップＳ１５１で選択したデバイスに対応する、監視用ドライバ１５０のプロトコル１５３を選択する。具体的には、ドライバ設定部１２１は、ステップＳ１５３で選択したイメージＤＢ２１０のエントリ２１１ａからポインタ２１７ａを１つ取得し、取得したポインタ２１７ａが指し示すパブリックプロトコルＤＢ２２０内のエントリ２２１ｂを選択する。
【０２５５】
［ステップＳ１６３］ドライバ設定部１２１は、ステップＳ１６２で選択したプロトコル１５３に含まれるメンバ関数１５５のうち、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の各情報を、デバイスリスト２４０に登録する。
【０２５６】
ステップＳ１６３では、ドライバ設定部１２１は、まず、ステップＳ１６２で選択したパブリックプロトコルＤＢ２２０のエントリ２２１ｂから、プロトコルＧＵＩＤ２２３ｂとプロトコルポインタ２２４ｂとを取得する。ドライバ設定部１２１は、取得したプロトコルポインタ２２４ｂに基づいて、監視用ドライバイメージ１５２上のプロトコル１５３の領域にアクセスする。
【０２５７】
ドライバ設定部１２１は、アクセスしたプロトコル１５３の領域に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）のそれぞれに対応するメンバ１５４へのポインタを生成する。ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０のエントリ２２１ｂから取得したプロトコルＧＵＩＤ２２３ｂと、関数Ｓｕｐｐｏｒｔｅｄ（）、関数Ｓｔａｒｔ（）のそれぞれの関数名と、各関数に対応するメンバ１５４へのポインタとを、デバイスリスト２４０のプロトコルＧＵＩＤ２４３、関数名２４４およびポインタ２４５の各欄に登録する。
【０２５８】
［ステップＳ１６４］ドライバ設定部１２１は、ステップＳ１６２で選択したプロトコル１５３内の関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出す。これにより監視制御部１５１が起動する。監視制御部１５１は、対応するＵＥＦＩドライバ１４０の関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出すとともに、ＵＥＦＩドライバ１４０に従って実行される処理の監視をＷＤＴ１０２に依頼する。ここで、ＵＥＦＩドライバ１４０の関数Ｓｕｐｐｏｒｔｅｄ（）に従った処理では、ＵＥＦＩドライバ１４０が対象のデバイスをサポートするか否かを示す判定結果が出力される。
【０２５９】
なお、このステップＳ１６４の処理については、図２４において説明する。
［ステップＳ１６５］ドライバ設定部１２１は、ステップＳ１６４で得られた判定結果に基づき、ＵＥＦＩドライバ１４０が対象のデバイスをサポートするか否かを判定する。ＵＥＦＩドライバ１４０が対象のデバイスをサポートする場合（Ｓ１６５：Ｙｅｓ）には、ステップＳ１６６の処理を実行する。一方、ドライバ設定部１２１は、ＵＥＦＩドライバ１４０が対象のデバイスをサポートしない場合（Ｓ１６５：Ｎｏ）には、ステップＳ１６１の処理を実行する。
【０２６０】
［ステップＳ１６６］ドライバ設定部１２１は、ステップＳ１６２で選択したプロトコル１５３内の関数Ｓｔａｒｔ（）を呼び出す。これにより監視制御部１５１が起動する。監視制御部１５１は、対応するＵＥＦＩドライバ１４０の関数Ｓｔａｒｔ（）を呼び出すとともに、ＵＥＦＩドライバ１４０に従って実行される処理の監視をＷＤＴ１０２に依頼する。
【０２６１】
なお、このステップＳ１６６の処理については、図２５において説明する。ステップＳ１６６の処理が終了すると、ドライバ設定部１２１は、ステップＳ１６１の処理を実行する。
【０２６２】
以上の図２２，図２３の処理では、ドライバ設定部１２１は、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）を実行させるプロトコルを選択する際に、パブリックプロトコルＤＢ２２０のエントリ２２１を１つずつ選択する（ステップＳ１５５またはステップＳ１６２）。前述のように、パブリックプロトコルＤＢ２２０には、監視対象のＵＥＦＩドライバ１４０のプロトコル１４３に対応するエントリが登録されない代わりに、監視用ドライバ１５０のプロトコル１５３に対応するエントリ２２０ｂが登録される。このため、ドライバ設定部１２１は、ステップＳ１６２において、パブリックプロトコルＤＢ２２０内のエントリ２２１ｂを選択することで、ステップＳ１６３において、監視用ドライバ１５０のプロトコル１５３に自動的にアクセスすることになる。
【０２６３】
従って、ドライバ設定部１２１は、監視対象のＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）を呼び出す前に、対応する監視用ドライバ１５０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）を呼び出す。これにより、監視対象のＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の実行状況が、ＷＤＴ１０２によって監視される。
【０２６４】
すなわち、ドライバ設定部１２１がパブリックプロトコルＤＢ２２０のエントリ２２１を順次選択するという簡単な処理により、監視対象のＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の実行状況が確実に監視されるようになる。そして、監視対象のＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）または関数Ｓｔａｒｔ（）の実行時にエラーが検出された場合には、コンピュータ１００がリセットされた後、リセット前にエラーが検出されたＵＥＦＩドライバ１４０が実行されなくなる。
【０２６５】
例えば、図２２の処理では、ステップＳ１５１で選択されたデバイスのデバイスパスが、エラーリスト３２１に登録されたデバイスパスと一致する場合には、選択されたデバイスに対応するＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の実行がスキップされる。従って、監視対象のＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）または関数Ｓｔａｒｔ（）に異常発生要因があった場合でも、起動処理を続行できる。
【０２６６】
特に、監視対象とされたすべてのＵＥＦＩドライバ１４０に含まれる関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）は、起動処理の過程でドライバ設定部１２１によって必ず呼び出される。このため、起動処理を続行するという効果を奏する上で、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）の実行状況を確実に監視できることの重要性は高い。
【０２６７】
図２４は、図２３のステップＳ１６４の処理手順を示すフローチャートである。この図２４の処理は、図１９に示した処理において、メンバ関数として関数Ｓｕｐｐｏｒｔｅｄ（）を適用した場合に対応する。
【０２６８】
［ステップＳ１８１］監視用ドライバ１５０の関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出されると、監視制御部１５１が起動する。監視制御部１５１は、サブプロトコルＤＢ２３０から、関数Ｓｕｐｐｏｒｔｅｄ（）が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。そして、監視制御部１５１は、選択したエントリ２３１に含まれるプロトコルポインタ２３４を取得する。
【０２６９】
［ステップＳ１８２］監視制御部１５１は、ステップＳ１８１で選択したエントリ２３１に対応するプロトコルに関する情報であるプロトコル情報を、ＲＡＭ１０３に生成されたスタックにプッシュする。
【０２７０】
［ステップＳ１８３］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を開始させる。
［ステップＳ１８４］監視制御部１５１は、ステップＳ１８１で取得したプロトコルポインタ２３４を基にＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスする。そして、監視制御部１５１は、ドライバイメージ１４２内の関数Ｓｕｐｐｏｒｔｅｄ（）に対応するメンバ１４４に制御を移すことで、関数Ｓｕｐｐｏｒｔｅｄ（）を呼び出す。これにより、ＵＥＦＩドライバ１４０の関数Ｓｕｐｐｏｒｔｅｄ（）が実行され、デバイス制御部１４１は、関数Ｓｕｐｐｏｒｔｅｄ（）に従って処理を行う。
【０２７１】
なお、このステップＳ１８４の処理については、図２６において説明する。
［ステップＳ１８５］監視制御部１５１は、関数Ｓｕｐｐｏｒｔｅｄ（）に従ったデバイス制御部１４１の処理が、正常に終了したか否かを判定する。デバイス制御部１４１は、関数Ｓｕｐｐｏｒｔｅｄ（）に従った処理を正常に終了すると、関数Ｓｕｐｐｏｒｔｅｄ（）の呼び出し元である監視制御部１５１に対して、処理が正常に終了したことを通知する。監視制御部１５１は、ステップＳ１８３の実行から一定時間以内に、デバイス制御部１４１から処理が正常に終了したことの通知を受けると（Ｓ１８５：Ｙｅｓ）、ステップＳ１８６の処理を実行する。
【０２７２】
［ステップＳ１８６］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を終了させる。
［ステップＳ１８７］監視制御部１５１は、ＲＡＭ１０３に生成されたスタックから、ステップＳ１８２で登録したプロトコル情報をポップする。
【０２７３】
以上の図２４の処理によれば、監視用ドライバ１５０の関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出されると、監視制御部１５１の処理により、ＵＥＦＩドライバ１４０内の関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出される。これとともに、呼び出された関数Ｓｕｐｐｏｒｔｅｄ（）に従って実行される処理が、ＷＤＴ１０２によって監視される。従って、監視対象のＵＥＦＩドライバ１４０の関数Ｓｕｐｐｏｒｔｅｄ（）に異常発生要因があるか否かを、確実に検出できるようになる。
【０２７４】
図２５は、図２３のステップＳ１６６の処理手順を示すフローチャートである。この図２５の処理は、図１９に示した処理において、メンバ関数として関数Ｓｔａｒｔ（）を適用した場合に対応する。
【０２７５】
［ステップＳ２０１］監視用ドライバ１５０の関数Ｓｔａｒｔ（）が呼び出されると、監視制御部１５１が起動する。監視制御部１５１は、サブプロトコルＤＢ２３０から、関数Ｓｔａｒｔ（）が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。そして、監視制御部１５１は、選択したエントリ２３１に含まれるプロトコルポインタ２３４を取得する。
【０２７６】
［ステップＳ２０２］監視制御部１５１は、ステップＳ２０１で選択したエントリ２３１に対応するプロトコルに関する情報であるプロトコル情報を、ＲＡＭ１０３に生成されたスタックにプッシュする。
【０２７７】
［ステップＳ２０３］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を開始させる。
［ステップＳ２０４］監視制御部１５１は、ステップＳ２０１で取得したプロトコルポインタ２３４を基にＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスする。そして、監視制御部１５１は、ドライバイメージ１４２内の関数Ｓｔａｒｔ（）に対応するメンバ１４４に制御を移すことで、関数Ｓｔａｒｔ（）を呼び出す。これにより、ＵＥＦＩドライバ１４０の関数Ｓｔａｒｔ（）が実行され、デバイス制御部１４１は、関数Ｓｔａｒｔ（）に従って処理を行う。
【０２７８】
なお、このステップＳ２０４の処理については、図２７において説明する。
［ステップＳ２０５］監視制御部１５１は、関数Ｓｔａｒｔ（）に従ったデバイス制御部１４１の処理が、正常に終了したか否かを判定する。デバイス制御部１４１は、関数Ｓｔａｒｔ（）に従った処理を正常に終了すると、関数Ｓｔａｒｔ（）の呼び出し元である監視制御部１５１に対して、処理が正常に終了したことを通知する。監視制御部１５１は、ステップＳ２０３の実行から一定時間以内に、デバイス制御部１４１から処理が正常に終了したことの通知を受けると（Ｓ２０５：Ｙｅｓ）、ステップＳ２０６の処理を実行する。
【０２７９】
［ステップＳ２０６］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を終了させる。
［ステップＳ２０７］監視制御部１５１は、ＲＡＭ１０３に生成されたスタックから、ステップＳ２０２で登録したプロトコル情報をポップする。
【０２８０】
以上の図２５の処理によれば、監視用ドライバ１５０の関数Ｓｔａｒｔ（）が呼び出されると、監視制御部１５１の処理により、ＵＥＦＩドライバ１４０内の関数Ｓｔａｒｔ（）が呼び出される。これとともに、呼び出された関数Ｓｔａｒｔ（）に従って実行される処理が、ＷＤＴ１０２によって監視される。従って、監視対象のＵＥＦＩドライバ１４０の関数Ｓｔａｒｔ（）に異常発生要因があるか否かを、確実に検出できるようになる。
【０２８１】
図２６は、ＵＥＦＩドライバの関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出されたときの処理手順を示すフローチャートである。この図２６の処理は、図２２のステップＳ１５７および図２４のステップＳ１８４の処理に対応する。
【０２８２】
［ステップＳ２２１］デバイス制御部１４１は、関数Ｓｕｐｐｏｒｔｅｄ（）の呼び出しに応じて起動する。図２２のステップＳ１５７の場合、関数Ｓｕｐｐｏｒｔｅｄ（）はドライバ設定部１２１から呼び出される。また、図２４のステップＳ１８４の場合、関数Ｓｕｐｐｏｒｔｅｄ（）は監視制御部１５１から呼び出される。
【０２８３】
［ステップＳ２２２］デバイス制御部１４１は、対応するデバイスから属性情報を読み出す。属性情報は、デバイスが備える不揮発性記憶領域にあらかじめ記憶されている。
例えば、ＰＣＩ（Peripheral Component Interconnect）バスに接続されるインタフェースコントローラには、ＰＣＩコンフィギュレーションレジスタと呼ばれる不揮発性記憶領域が設けられている。ＰＣＩコンフィギュレーションレジスタには、デバイスについての各種の属性情報が格納されている。属性情報としては、例えば、ベンダＩＤ、デバイスＩＤ、リビジョンＩＤ、クラスコードなどがある。
【０２８４】
［ステップＳ２２３］デバイス制御部１４１は、ステップＳ２２２で読み出した属性情報と、ＵＥＦＩドライバ１４０に含まれる、ＵＥＦＩドライバ１４０の属性情報とを比較する。デバイス制御部１４１は、属性情報の比較結果に基づき、ＵＥＦＩドライバ１４０が対象のデバイスをサポートしているか否かを判定する。
【０２８５】
上記のＰＣＩコンフィギュレーションレジスタから得られる情報を例にとると、クラスコードの中には、基本クラス、サブクラス、プログラムインタフェースという情報が含まれる。基本クラスの値が０１ｈ、サブクラスの値が０６ｈ、プログラムインタフェースの値が０１ｈの場合、デバイスはシリアルＡＴＡ（Advanced Technology Attachment）のインタフェースコントローラである。
【０２８６】
デバイス制御部１４１は、例えば、クラスコード内の基本クラス、サブクラス、プログラムインタフェースの各値、リビジョンＩＤなどを基に、ＵＥＦＩドライバ１４０が対象のデバイスをサポートしているか否かを判定する。
【０２８７】
［ステップＳ２２４］デバイス制御部１４１は、ステップＳ２２３での判定結果を、呼び出し元に対して通知する。図２２のステップＳ１５７において関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出された場合、判定結果はドライバ設定部１２１に通知される。また、図２４のステップＳ１８４において関数Ｓｕｐｐｏｒｔｅｄ（）が呼び出された場合、判定結果は監視制御部１５１に通知される。
【０２８８】
図２７は、ＵＥＦＩドライバの関数Ｓｔａｒｔ（）が呼び出されたときの処理手順を示すシーケンス図である。この図２７の処理は、図２２のステップＳ１５９および図２５のステップＳ２０４の処理に対応する。
【０２８９】
［ステップＳ２４１］デバイス制御部１４１は、関数Ｓｔａｒｔ（）の呼び出しに応じて起動する。図２２のステップＳ１５９の場合、関数Ｓｔａｒｔ（）はドライバ設定部１２１から呼び出される。また、図２５のステップＳ２０４の場合、関数Ｓｔａｒｔ（）は監視制御部１５１から呼び出される。
【０２９０】
［ステップＳ２４２］デバイス制御部１４１は、対象のデバイスを初期化する。例えば、デバイス制御部１４１は、デバイスが備えるレジスタの値を初期化する。
［ステップＳ２４３］デバイス制御部１４１は、デバイスの制御時に使用する制御情報を初期化する。例えば、デバイス制御部１４１は、制御情報を格納する領域をＲＡＭ１０３に設定し、設定した各領域に制御情報の初期値を格納する。
【０２９１】
［ステップＳ２４４］デバイス制御部１４１は、ドライバ設定部１２１に対して、デバイスリスト２４０の登録処理を依頼する。このとき、デバイス制御部１４１は、処理対象のプロトコル１４３のプロトコルＧＵＩＤと、処理対象のプロトコル１４３が属するＵＥＦＩドライバ１４０のファイルＧＵＩＤとを、ドライバ設定部１２１に対して通知する。
【０２９２】
［ステップＳ２４５］ドライバ設定部１２１は、処理対象のプロトコル１４３が属するＵＥＦＩドライバ１４０が、監視対象であるか否かを判定する。ドライバ設定部１２１は、ステップＳ２４４で通知されたファイルＧＵＩＤが、監視対象リスト３１０に登録されたＧＵＩＤと一致した場合に、ＵＥＦＩドライバ１４０が監視対象であると判定する。
【０２９３】
ドライバ設定部１２１は、プロトコル１４３が属するＵＥＦＩドライバ１４０が監視対象である場合（Ｓ２４５：Ｙｅｓ）には、ステップＳ２４６の処理を実行する。一方、ドライバ設定部１２１は、プロトコル１４３が属するＵＥＦＩドライバ１４０が監視対象でない場合（Ｓ２４５：Ｎｏ）には、ステップＳ２４７の処理を実行する。
【０２９４】
［ステップＳ２４６］ドライバ設定部１２１は、監視用ドライバ１５０内のプロトコル１５３に含まれるメンバ関数１５５のうち、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）以外の情報を、デバイスリスト２４０に登録する。
【０２９５】
この処理では、ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０のエントリ２２１ｂのうち、ステップＳ２４４でデバイス制御部１４１から通知されたプロトコルＧＵＩＤが登録されたエントリ２２１ｂを選択する。ドライバ設定部１２１は、選択したエントリ２２１ｂに登録されたプロトコルポインタ２２４ｂに基づいて、監視用ドライバイメージ１５２上のプロトコル１５３の領域にアクセスする。
【０２９６】
ドライバ設定部１２１は、アクセスしたプロトコル１５３の領域に含まれる、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）以外のメンバ関数１５５にそれぞれ対応するメンバ１５４へのポインタを生成する。ドライバ設定部１２１は、生成したポインタと、各ポインタに対応する関数名とを、デバイスリスト２４０の関数名２４４およびポインタ２４５の各欄に登録する。
【０２９７】
この後、ステップＳ２４８の処理が実行される。
［ステップＳ２４７］ドライバ設定部１２１は、ＵＥＦＩドライバ１４０内のプロトコル１４３に含まれるメンバ関数１４５のうち、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）以外の情報を、デバイスリスト２４０に登録する。
【０２９８】
この処理では、ドライバ設定部１２１は、パブリックプロトコルＤＢ２２０のエントリ２２１ａのうち、ステップＳ２４４でデバイス制御部１４１から通知されたプロトコルＧＵＩＤが登録されたエントリ２２１ａを選択する。ドライバ設定部１２１は、選択したエントリ２２１ａに登録されたプロトコルポインタ２２４ａに基づいて、ドライバイメージ１４２上のプロトコル１４３の領域にアクセスする。
【０２９９】
ドライバ設定部１２１は、アクセスしたプロトコル１４３の領域に含まれる、関数Ｓｕｐｐｏｒｔｅｄ（）および関数Ｓｔａｒｔ（）以外のメンバ関数１４５にそれぞれ対応するメンバ１４４へのポインタを生成する。ドライバ設定部１２１は、生成したポインタと、各ポインタに対応する関数名とを、デバイスリスト２４０の関数名２４４およびポインタ２４５の各欄に登録する。
【０３００】
この後、ステップＳ２４８の処理が実行される。
［ステップＳ２４８］ドライバ設定部１２１は、デバイスリスト２４０への登録処理が正常に完了したことを、デバイス制御部１４１に通知する。
【０３０１】
［ステップＳ２４９］デバイス制御部１４１は、関数Ｓｔａｒｔ（）の実行が正常に完了したことを、呼び出し元に通知する。図２２のステップＳ１５９において関数Ｓｔａｒｔ（）が呼び出された場合、ドライバ設定部１２１に対して実行完了が通知される。また、図２５のステップＳ２０４において関数Ｓｔａｒｔ（）が呼び出された場合、監視制御部１５１に対して実行完了が通知される。
【０３０２】
以上の図２７の処理では、デバイスリスト２４０のエントリ２４１が監視対象のＵＥＦＩドライバ１４０に対応するものである場合、エントリ２４１内のポインタ２４５には、監視用ドライバ１５０内のメンバ１５４を指し示す情報が登録される。このため、ドライバ実行制御部１２２は、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す際、デバイスリスト２４０に登録されたポインタ２４５に基づき、監視用ドライバ１５０内の対応するメンバ関数１５５を呼び出す。
【０３０３】
これにより、ドライバ実行制御部１２２によって監視対象のＵＥＦＩドライバ１４０が呼び出された際、呼び出し先が監視対象であることをドライバ実行制御部１２２が何も意識することなく、呼び出されたＵＥＦＩドライバ１４０の実行状況が監視される。そして、呼び出されたＵＥＦＩドライバ１４０の実行時にエラーが検出された場合には、コンピュータ１００がリセットされた後、リセット前にエラーが検出されたＵＥＦＩドライバ１４０が実行されなくなる。
【０３０４】
ところで、前述の図２２の処理では、ステップＳ１５１で選択されたデバイスのデバイスパスが、エラーリスト３２１に登録されたデバイスパスと一致する場合には、デバイスに対応するデバイスリスト２４０内のエントリ２４１へのポインタ２４５の登録がスキップされる。ドライバ実行制御部１２２は、デバイスリスト２４０内のエントリ２４１にポインタ２４５が登録されていないことから、リセット前に処理エラーが検出されたＵＥＦＩドライバ１４０に含まれるメンバ関数１４５を呼び出すことができない。
【０３０５】
このように、リセット前に処理エラーが検出されたＵＥＦＩドライバ１４０に含まれるメンバ関数１４５が呼び出されなくなることから、ブート管理部１３１またはアプリケーション処理部１６１がデバイスにアクセスしようとする際に、デバイスに対応するＵＥＦＩドライバ１４０が原因となってアクセス制御処理に異常が発生し、処理が進まなくなるという事態が回避される。従って、コンピュータ１００に接続された複数のデバイスにそれぞれ対応するＵＥＦＩドライバ１４０の中に、異常発生要因を持つものがあった場合でも、ＯＳプログラムが起動するまでの処理を続行できる可能性が高まる。
【０３０６】
ドライバ実行制御部１２２は、例えば、アプリケーション処理部１６１がデバイスにアクセスしようとする際に、アプリケーション処理部１６１からの要求に応じて、ＵＥＦＩドライバ１４０に含まれるメンバ関数１４５を呼び出す。しかし、ドライバ実行制御部１２２は、メンバ関数１４５を呼び出すことができない場合には、呼び出しが不可能であることをアプリケーション処理部１６１に通知する。アプリケーション処理部１６１は、デバイスへのアクセスがＯＳプログラムの起動に関係ない場合には、デバイスへのアクセスをスキップする。この場合、コンピュータ１００の起動処理が継続されることになる。
【０３０７】
また、ドライバ実行制御部１２２は、ブート管理部１３１がデバイスにアクセスしようとする際に、ブート管理部１３１からの要求に応じて、ＵＥＦＩドライバ１４０に含まれるメンバ関数１４５を呼び出す。しかし、ドライバ実行制御部１２２は、アプリケーション処理部１６１から要求された場合と同様に、メンバ関数１４５を呼び出すことができない場合には、呼び出しが不可能であることをブート管理部１３１に通知する。
【０３０８】
ブート管理部１３１は、デバイスへのアクセスがＯＳプログラムの起動に関係ない場合には、デバイスへのアクセスをスキップする。この場合、コンピュータ１００の起動処理が継続されることになる。また、ブート管理部１３１は、デバイスへのアクセスがＯＳブートローダをデバイスから読み出すものであった場合でも、他のデバイスからＯＳブートローダを読み出すことが可能であれば、現在のデバイスへのアクセスをスキップすることができる。従って、この場合でも、コンピュータ１００の起動処理が継続される。
【０３０９】
ここで、ドライバ実行制御部１２２がＵＥＦＩドライバ１４０のメンバ関数１４５を呼び出す処理の例として、ＯＳブートローダの読み出し処理を挙げる。以下の処理例では、複数のデバイスのそれぞれにＯＳプログラムおよびＯＳブートローダが記憶され、それらのデバイスから優先度に従って１つを選択し、選択したデバイスに記憶されたＯＳプログラムを起動することができるものとする。
【０３１０】
まず、図２８は、ブートオーダテーブルのデータ構成例を示す図である。
図２８に示すブートオーダテーブル３５０は、ＯＳプログラムの読み出し元として選択可能なデバイスを少なくとも示す情報が、優先度順に登録されたテーブルである。ブートオーダテーブル３５０は、ブート管理部１３１がアクセス可能な不揮発性記憶領域にあらかじめ格納されていればよく、本実施の形態では、ＦＷＨ１０６に格納されているものとする。
【０３１１】
図２８の例では、ブートオーダテーブル３５０には、ＯＳブートローダのファイルパスが、優先度が高い順に登録される。ファイルパスは、ＯＳブートローダが記憶されたデバイスのディレクトリ情報と、デバイス内のＯＳブートローダのディレクトリ情報とを含む。例えば、図２８では、最も優先度が高い処理として、ファイバチャネルコントローラに対してファイバケーブルを通じて接続されたＨＤＤから、ファイル名“ｂｏｏｔ”のＯＳブートローダを読み出すことが登録されている。また、２番目に優先度が高い処理として、ＳＡＳコントローラのスロット０に接続されたＨＤＤから、ファイル名“ｂｏｏｔ”のＯＳブートローダを読み出すことが登録されている。ブート管理部１３１は、このようなブートオーダテーブル３５０の登録情報に従って、ＯＳブートローラの読み出し元を選択する。
【０３１２】
図２９は、ＯＳブートローダの読み出し処理手順を示すフローチャートである。
［ステップＳ２６１］ブート管理部１３１は、ブートオーダテーブル３５０に登録された未選択のファイルパスのうち、最も優先度の高いファイルパスを選択する。
【０３１３】
［ステップＳ２６２］ブート管理部１３１は、選択したファイルパスと、関数名“Ｒｅａｄ（）”とを、ドライバ実行制御部１２２に指定し、デバイスからのＯＳブートローダの読み出しを要求する。
【０３１４】
［ステップＳ２６３］ドライバ実行制御部１２２は、デバイスリスト２４０のエントリ２４１の中から、指定されたファイルパス内のデバイスパスが登録されたエントリ２４１を選択する。ドライバ実行制御部１２２は、選択したエントリ２４１内のポインタ２４５のうち、関数名“Ｒｅａｄ（）”に対応するポインタ２４５の値を読み出す。
【０３１５】
［ステップＳ２６４］ドライバ実行制御部１２２は、読み出したポインタ２４５の値がＮＵＬＬであるか否かを判定する。ドライバ実行制御部１２２は、読み出したポインタ２４５の値がＮＵＬＬの場合（Ｓ２６４：Ｙｅｓ）には、ステップＳ２６９の処理を実行する。また、ドライバ実行制御部１２２は、読み出したポインタ２４５の値がＮＵＬＬでない場合（Ｓ２６４：Ｎｏ）には、ステップＳ２６５の処理を実行する。
【０３１６】
［ステップＳ２６５］アクセス先のデバイスに対応するＵＥＦＩドライバ１４０が監視対象であるか否かが判定される。アクセス先のデバイスに対応するＵＥＦＩドライバ１４０が監視対象である場合（Ｓ２６５：Ｙｅｓ）には、ステップＳ２６６の処理が実行され、ＵＥＦＩドライバ１４０が監視対象でない場合（Ｓ２６５：Ｎｏ）には、ステップＳ２６７の処理が実行される。
【０３１７】
このステップＳ２６５では、ステップＳ２６３で読み出されたポインタ２４５が、監視用ドライバ１５０内のメンバ１５４を指し示す場合には、ステップＳ２６６の処理が実行される。一方、ステップＳ２６３で読み出されたポインタ２４５が、ＵＥＦＩドライバ１４０内のメンバ１４４を指し示す場合には、ステップＳ２６７の処理が実行される。
【０３１８】
［ステップＳ２６６］ドライバ実行制御部１２２は、ステップＳ２６３で読み出したポインタ２４５が指し示す、監視用ドライバイメージ１５２内のメンバ１５４に制御を移すことで、監視用ドライバ１５０の関数Ｒｅａｄ（）を呼び出す。これにより、監視制御部１５１が起動し、監視制御部１５１は、関数Ｒｅａｄ（）に従って、ＵＥＦＩドライバ１４０の関数Ｒｅａｄ（）を呼び出すとともに、ＵＥＦＩドライバ１４０の関数Ｒｅａｄ（）に従った処理の監視をＷＤＴ１０２に依頼する。
【０３１９】
なお、このステップＳ２６６の処理については、図３０において説明する。
［ステップＳ２６７］ドライバ実行制御部１２２は、ステップＳ２６３で読み出したポインタ２４５が指し示す、ドライバイメージ１４２内のメンバ１４４に制御を移すことで、ＵＥＦＩドライバ１４０の関数Ｒｅａｄ（）を呼び出す。これにより、デバイス制御部１４１が起動し、デバイス制御部１４１は、関数Ｒｅａｄ（）に従って、対応するデバイスからＯＳブートローダを読み出す。
【０３２０】
なお、このステップＳ２６７の処理については、図３１において説明する。
［ステップＳ２６８］ドライバ実行制御部１２２は、ブート管理部１３１に対して、ＯＳブートローダの読み出しが正常に実行されたことを通知する。
【０３２１】
［ステップＳ２６９］ドライバ実行制御部１２２は、ブート管理部１３１に対して、読み出しエラーが発生したことを通知する。
［ステップＳ２７０］ブート管理部１３１は、ブートオーダテーブル３５０の中に未選択のファイルパスがあるか否かを判定する。ブート管理部１３１は、未選択のファイルパスがある場合（Ｓ２７０：Ｙｅｓ）には、ステップＳ２６１の処理を実行する。また、ブート管理部１３１は、ブートオーダテーブル３５０内のすべてのファイルパスを選択済みである場合（Ｓ２７０：Ｎｏ）には、処理を終了する。この場合、ＯＳプログラムの起動が不可能な状態となるが、ユーザは、エラーログ３２２の内容を解析することで、起動が不可能になった原因がＵＥＦＩドライバ１４０にあることを認識することができる。
【０３２２】
図３０は、図２９のステップＳ２６６の処理手順を示すフローチャートである。この図３０の処理は、図１９に示した処理において、メンバ関数として関数Ｒｅａｄ（）を適用した場合に対応する。
【０３２３】
［ステップＳ２８１］監視用ドライバ１５０の関数Ｒｅａｄ（）が呼び出されると、監視制御部１５１が起動する。監視制御部１５１は、サブプロトコルＤＢ２３０から、関数Ｒｅａｄ（）が属するプロトコル１５３のプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。そして、監視制御部１５１は、選択したエントリ２３１に含まれるプロトコルポインタ２３４を取得する。
【０３２４】
［ステップＳ２８２］監視制御部１５１は、ステップＳ２８１で選択したエントリ２３１に対応するプロトコルに関する情報であるプロトコル情報を、ＲＡＭ１０３に生成されたスタックにプッシュする。
【０３２５】
［ステップＳ２８３］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を開始させる。
［ステップＳ２８４］監視制御部１５１は、ステップＳ２８１で取得したプロトコルポインタ２３４を基にＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスする。そして、監視制御部１５１は、ドライバイメージ１４２内の関数Ｒｅａｄ（）に対応するメンバ１４４に制御を移すことで、関数Ｒｅａｄ（）を呼び出す。これにより、ＵＥＦＩドライバ１４０の関数Ｒｅａｄ（）が実行され、デバイス制御部１４１は、関数Ｒｅａｄ（）に従って、デバイスからＯＳブートローダを読み出す。
【０３２６】
なお、このステップＳ２８４の処理については、図３１において説明する。
［ステップＳ２８５］監視制御部１５１は、関数Ｒｅａｄ（）に従ったデバイス制御部１４１の処理が、正常に終了したか否かを判定する。デバイス制御部１４１は、関数Ｒｅａｄ（）に従った処理を正常に終了すると、関数Ｒｅａｄ（）の呼び出し元である監視制御部１５１に対して、処理が正常に終了したことを通知する。監視制御部１５１は、ステップＳ２８３の実行から一定時間以内に、デバイス制御部１４１から処理が正常に終了したことの通知を受けると（Ｓ２８５：Ｙｅｓ）、ステップＳ２８６の処理を実行する。
【０３２７】
［ステップＳ２８６］監視制御部１５１は、ＷＤＴ１０２に処理の監視動作を終了させる。
［ステップＳ２８７］監視制御部１５１は、ＲＡＭ１０３に生成されたスタックから、ステップＳ２８２で登録したプロトコル情報をポップする。
【０３２８】
図３１は、ＵＥＦＩドライバの関数Ｒｅａｄ（）が呼び出されたときの処理手順を示すフローチャートである。この図３１の処理は、図２９のステップＳ２６７および図３０のステップＳ２８４の処理に対応する。
【０３２９】
［ステップＳ３０１］デバイス制御部１４１は、関数Ｒｅａｄ（）の呼び出しに応じて起動する。図２９のステップＳ２６７の場合、関数Ｒｅａｄ（）はドライバ実行制御部１２２から呼び出される。また、図３０のステップＳ２８４の場合、関数Ｒｅａｄ（）は監視制御部１５１から呼び出される。このとき、デバイス制御部１４１は、呼び出し元からファイルパスの通知を受ける。
【０３３０】
［ステップＳ３０２］デバイス制御部１４１は、デバイスから、ファイルパスで指定されるＯＳブートローダを読み出し、ＲＡＭ１０３に記憶する。
［ステップＳ３０３］デバイス制御部１４１は、呼び出し元に対して、読み出し処理が正常に終了したことを通知する。図２９のステップＳ２６７において関数Ｒｅａｄ（）が呼び出された場合、ドライバ実行制御部１２２に対して処理の終了が通知される。また、図３０のステップＳ２８４において関数Ｒｅａｄ（）が呼び出された場合、監視制御部１５１に対して処理の終了が通知される。
【０３３１】
以上の図２９〜図３１の処理では、あるデバイスからのＯＳブートローダの読み出しが不可能であった場合、そのデバイスからのＯＳブートローダの読み出し処理がスキップされる。このとき、より優先度の低い他のデバイスからＯＳブートローダを読み出すことができるのであれば、ＯＳプログラムの起動処理を継続できる。従って、ＵＥＦＩドライバ１４０に異常発生要因がある場合でも、ＯＳプログラムを起動できる可能性が高まる。
【０３３２】
なお、ブートオーダテーブル３５０に登録されたすべてのデバイスからのＯＳブートローラの読み出しに失敗した場合には、コンピュータ１００の起動処理は停止する。しかし、このとき、ＯＳブートローラの読み出しに失敗した原因を示す情報がエラーログ３２２に記録された状態となっている。このため、コンピュータ１００の管理者は、エラーログ３２２を解析することで、異常発生要因が存在するＵＥＦＩドライバ１４０を更新するなどの措置を講じることができる。
【０３３３】
以上説明した第２の実施の形態では、監視対象のＵＥＦＩドライバ１４０に含まれるメンバ関数１４５の実行時には、その実行状況が監視される。そして、メンバ関数１４５の実行時にエラーが検出された場合には、コンピュータ１００がリセットされた後、エラーが検出されたメンバ関数１４５が属するＵＥＦＩドライバ１４０に含まれるすべてのメンバ関数１４５の実行が、スキップされる。従って、ＵＥＦＩドライバ１４０に異常発生要因がある場合でも、ＯＳプログラムを起動できる可能性が高まる。すなわち、エラーが検出されたＵＥＦＩドライバ１４０がＯＳプログラムの起動に関係ないものである場合には、エラーが検出されたＵＥＦＩドライバ１４０の実行をスキップすることで、他のＵＥＦＩドライバ１４０の実行によりＯＳプログラムを正常に起動できる。
【０３３４】
特に、拡張性の高いコンピュータでは、接続されるデバイスが多くなり得ることから、ＲＡＭ１０３に読み込んで使用可能状態にするＵＥＦＩドライバ１４０の数も多くなる。ＲＡＭ１０３に読み込んで使用可能状態にするＵＥＦＩドライバ１４０の数が多くなるほど、いずれかのＵＥＦＩドライバ１４０の中にバグなどの異常発生要因が存在する確率が高まる。しかしながら、上記のコンピュータ１００では、このようにＵＥＦＩドライバ１４０に異常発生要因が存在する確率が高いと考えられる場合でも、起動処理を続行できる可能性が高くなる。
【０３３５】
〔第３の実施の形態〕
図３２は、第３の実施の形態に係るサーバシステムの構成例を示す図である。
図３２に示すサーバシステム４００は、１つ以上の情報処理ユニット１００ａと、管理ユニット４１０とが、同一の筐体内に配置された構成を有している。情報処理ユニット１００ａと管理ユニット４１０との間は、例えば、ＬＡＮ４２０によって接続されている。
【０３３６】
情報処理ユニット１００ａは、サーバとしての各種の処理を実行するユニットである。各情報処理ユニット１００ａは、図３に示したコンピュータ１００と同様のハードウェア構成を有する。情報処理ユニット１００ａは、例えば、サーバシステム４００の筐体に対して挿抜可能になっている。
【０３３７】
管理ユニット４１０は、筐体内の各情報処理ユニット１００ａを管理する。管理ユニット４１０は、例えば、各情報処理ユニット１００ａにおけるハードウェア状態の監視、各情報処理ユニット１００ａに対する電源の投入／切断制御などを行う。本実施の形態では、管理ユニット４１０は、各情報処理ユニット１００ａにおけるＵＥＦＩドライバの実行状況を監視するウォッチドッグタイマの機能と、処理エラーを検出したＵＥＦＩドライバの情報を情報処理ユニット１００ａに記録する機能とを備える。
【０３３８】
管理ユニット４１０は、ＣＰＵ４１１、ＲＡＭ４１２、不揮発性メモリ４１３、ＬＡＮインタフェース（Ｉ／Ｆ）４１４およびウォッチドッグタイマ（ＷＤＴ）４１５を備える。ＣＰＵ４１１は、不揮発性メモリ４１３に記憶された各種のファームウェアプログラムを実行することにより、管理ユニット４１０全体を統括的に制御する。ＲＡＭ４１２は、ＣＰＵ４１１に実行させるプログラムの少なくとも一部や、プログラムによる処理に必要な各種データを一時的に記憶する。
【０３３９】
不揮発性メモリ４１３には、ＣＰＵ４１１が実行するプログラムや各種データが記憶される。ＬＡＮインタフェース４１４は、ＬＡＮ４２０に接続し、情報処理ユニット１００ａとの間で通信を行う。ＷＤＴ４１５は、ＣＰＵ４１１からの要求に応じて所定の処理の実行状況を監視する。本実施の形態では、ＣＰＵ４１１は、情報処理ユニット１００ａからの要求に応じて、ＷＤＴ４１５のカウント動作を制御できるようになっている。なお、ＷＤＴ４１５の処理は、例えば、専用のハードウェアでなく、ＣＰＵ４１１が所定のプログラムを実行することにより実現されてもよい。
【０３４０】
図３３は、サーバシステムの各装置が備える処理機能の構成例を示す図である。なお、以下の説明では、上記の第２の実施の形態と共通する構成要素を、同じ符号を用いて示す。
【０３４１】
情報処理ユニット１００ａは、図６に示したコンピュータ１００が備える処理機能のうち、ドライバ設定部１２１、ドライバ実行制御部１２２、ブート管理部１３１、デバイス制御部１４１およびアプリケーション処理部１６１を有する。さらに、情報処理ユニット１００ａは、監視制御部１５１ａおよびエラー処理部１８１を備える。
【０３４２】
監視制御部１５１ａは、監視用ドライバ１５０ａに従って処理を実行する。監視用ドライバ１５０ａは、図６の監視用ドライバ１５０と同様に、監視対象のＵＥＦＩドライバ１４０に対応して用意される。監視用ドライバ１５０ａは、例えば、情報処理ユニット１００ａのＦＷＨ１０６にあらかじめ記憶される。なお、ドライバ設定部１２１は、監視用ドライバ１５０ａをロードし、ＲＡＭ１０３上に監視用ドライバイメージ１５２ａを生成する。
【０３４３】
監視用ドライバ１５０ａが含む情報の構成は、基本的に図６の監視用ドライバ１５０と同じである。すなわち、監視用ドライバ１５０ａは、対応するＵＥＦＩドライバ１４０内に含まれるプロトコル１４３と同じ数のプロトコルを含む。監視用ドライバ１５０ａのプロトコルは、ＵＥＦＩドライバ１４０の対応するプロトコル１４３に含まれるメンバ１４４と同じ数のメンバを含む。また、監視用ドライバ１５０ａのプロトコルは、ＵＥＦＩドライバ１４０の対応するプロトコル１４３に含まれるメンバ関数１４５と同じ数のメンバ関数を含む。監視用ドライバ１５０ａに含まれるメンバ関数は、ＵＥＦＩドライバ１４０に含まれる対応するメンバ関数と同じ関数名を用いて呼び出される。監視用ドライバ１５０ａに含まれる１つのメンバは、１つのメンバ関数に対するポインタを含む。ただし、次に説明するように、監視用ドライバ１５０ａ内の各メンバ関数に記述される処理手順には、図６の監視用ドライバ１５０内の各メンバ関数に記述される処理手順とは異なる点がある。
【０３４４】
監視制御部１５１ａが監視用ドライバ１５０ａに従って実行する処理は、次に示す処理以外は、図６の監視制御部１５１が実行する処理と同じである。監視制御部１５１ａは、情報処理ユニット１００ａの内部のＷＤＴではなく、管理ユニット４１０が備えるＷＤＴ４１５に対して、カウント動作の開始および停止を要求する。また、監視制御部１５１ａは、ＷＤＴ４１５にカウント動作を開始させる際、管理ユニット４１０のＲＡＭ４１２に生成されたスタック４１６にプロトコル情報３３０をプッシュするように、管理ユニット４１０に要求する。そして、監視制御部１５１ａは、ＷＤＴ４１５にカウント動作を停止させる際、管理ユニット４１０のスタック４１６からプロトコル情報３３０をポップするように、管理ユニット４１０に要求する。なお、スタック４１６は、図２０に示したスタック３４０と同様に、ＷＤＴ４１５が監視する処理の情報を保持する記憶領域の一実施形態であり、管理ユニット４１０のＲＡＭ４１２に用意される。
【０３４５】
エラー処理部１８１は、管理ユニット４１０によって処理エラーが検出されたときに、管理ユニット４１０から送信される情報を、エラーリスト３２１およびエラーログ３２２に登録する。また、エラー処理部１８１は、管理ユニット４１０からの要求に応じて、情報処理ユニット１００ａをリセットする。なお、エラー処理部１８１の処理は、例えば、ＢＭＣ１０７が所定のファームウェアを実行することにより実現される。
【０３４６】
一方、管理ユニット４１０は、割り込み処理部４１７を備える。割り込み処理部４１７の処理は、例えば、管理ユニット４１０のＣＰＵ４１１によって所定のプログラムが実行されることで実現される。割り込み処理部４１７は、基本的に、図６に示した割り込み処理部１７１に対応する処理を実行する。
【０３４７】
割り込み処理部４１７は、ＷＤＴ４１５により、ＵＥＦＩドライバ１４０に従った処理のエラーが検出されたとき、スタック４１６に登録されたプロトコル情報３３０を基に、エラーリスト３２１およびエラーログ３２２にそれぞれ登録する情報を生成する。割り込み処理部４１７は、生成した情報を情報処理ユニット１００ａのエラー処理部１８１に送信し、エラーリスト３２１およびエラーログ３２２への登録を要求する。なお、エラーリスト３２１およびエラーログ３２２に登録される情報は、上記のコンピュータ１００の場合と同じでよい。
【０３４８】
割り込み処理部４１７は、さらに、エラーリスト３２１およびエラーログ３２２への登録を要求した後、エラー処理部１８１に対して情報処理ユニット１００ａのリセットを要求する。
【０３４９】
図３４は、第３の実施の形態において、監視用ドライバのメンバ関数が呼び出されたときに実行される処理手順を示すフローチャートである。
［ステップＳ３２１］監視用ドライバ１５０ａのメンバ関数が呼び出されると、監視制御部１５１ａが起動する。監視制御部１５１ａは、サブプロトコルＤＢ２３０から、呼び出されたメンバ関数が属するプロトコルのプロトコルＧＵＩＤ２３３が登録されたエントリ２３１を選択する。そして、監視制御部１５１ａは、選択したエントリ２３１に含まれるプロトコルポインタ２３４を取得する。
【０３５０】
［ステップＳ３２２］監視制御部１５１ａは、ステップＳ３２１で選択したエントリ２３１に対応するプロトコルに関する情報であるプロトコル情報３３０を、管理ユニット４１０へ送信し、スタック４１６へプッシュするように要求する。これにより、管理ユニット４１０のＲＡＭ４１２に生成されたスタック４１６に、プロトコル情報３３０が格納される。
【０３５１】
［ステップＳ３２３］監視制御部１５１ａは、ＷＤＴ４１５による処理の監視動作を開始させるように、管理ユニット４１０に要求する。例えば、ＷＤＴ４１５が、カウント値がリセットされた状態で停止しているものとすると、監視制御部１５１ａは、ＷＤＴ４１５にカウント動作を開始させるように、管理ユニット４１０に要求する。これにより、管理ユニット４１０のＷＤＴ４１５は、カウント動作を開始する。
【０３５２】
［ステップＳ３２４］監視制御部１５１ａは、ステップＳ３２１で取得したプロトコルポインタ２３４を基にＵＥＦＩドライバ１４０のドライバイメージ１４２にアクセスし、ＵＥＦＩドライバ１４０内の対応するメンバ関数１４５を呼び出す。これにより、メンバ関数１４５が実行され、デバイス制御部１４１は、メンバ関数１４５に従って処理を行う。
【０３５３】
［ステップＳ３２５］監視制御部１５１ａは、呼び出したメンバ関数１４５に従ったデバイス制御部１４１の処理が、正常に終了したか否かを判定する。監視制御部１５１ａは、ステップＳ３２３の実行から一定時間以内に、デバイス制御部１４１から処理が正常に終了したことの通知を受けると（Ｓ３２５：Ｙｅｓ）、ステップＳ３２６の処理を実行する。
【０３５４】
なお、ステップＳ３２３の実行から一定時間以内にデバイス制御部１４１の処理が終了しない場合には、管理ユニット４１０のＷＤＴ４１５においてタイムアウトが発生する。このとき、管理ユニット４１０では、割り込み処理部４１７が起動する。割り込み処理部４１７による処理については、図３５において説明する。
【０３５５】
［ステップＳ３２６］監視制御部１５１ａは、ＷＤＴ４１５に処理の監視動作を終了させるように、管理ユニット４１０に要求する。例えば、監視制御部１５１ａは、ＷＤＴ４１５にカウント動作を停止させるとともに、カウント値をリセットするように、管理ユニット４１０に要求する。
【０３５６】
［ステップＳ３２７］監視制御部１５１ａは、スタック４１６からステップＳ３２２で登録したプロトコル情報３３０をポップするように、管理ユニット４１０に対して要求する。これにより、管理ユニット４１０のスタック４１６からプロトコル情報３３０が削除される。
【０３５７】
図３５は、管理ユニットの割り込み処理部における処理手順を示すフローチャートである。ＷＤＴ４１５においてタイムアウトが発生すると、割り込み処理部４１７は次の処理を実行する。
【０３５８】
［ステップＳ３４１］割り込み処理部４１７は、スタック４１６のトップエントリに登録されたプロトコル情報３３０を読み出す。割り込み処理部４１７は、読み出したプロトコル情報３３０を情報処理ユニット１００ａに送信し、プロトコル情報３３０をエラーリスト３２１に登録するように要求する。情報処理ユニット１００ａのエラー処理部１８１は、管理ユニット４１０から送信されたプロトコル情報３３０を、エラーリスト３２１に登録する。
【０３５９】
［ステップＳ３４２］割り込み処理部４１７は、処理エラーが発生したＵＥＦＩドライバ１４０やデバイスを示す情報、処理エラーの内容および発生日時などを情報処理ユニット１００ａに送信し、送信した情報をエラーログ３２２に登録するように要求する。情報処理ユニット１００ａのエラー処理部１８１は、管理ユニット４１０から送信された情報を、エラーログ３２２に登録する。
【０３６０】
［ステップＳ３４３］割り込み処理部４１７は、情報処理ユニット１００ａに対してリセット要求を送信する。情報処理ユニット１００ａのエラー処理部１８１は、管理ユニット４１０からのリセット要求に応じて、情報処理ユニット１００ａをリセットする。なお、エラーリスト３２１およびエラーログ３２２に登録された情報は、情報処理ユニット１００ａのリセット後にも保持される。
【０３６１】
以上の第３の実施の形態では、監視用ドライバ１５０ａのメンバ関数が呼び出されると、ＵＥＦＩドライバ１４０内の対応するメンバ関数１４５が呼び出される。これとともに、呼び出されたメンバ関数１４５に従って実行される処理が、管理ユニット４１０のＷＤＴ４１５によって監視される。従って、監視対象のＵＥＦＩドライバ１４０のメンバ関数１４５に異常発生要因があるか否かを、確実に検出できるようになる。
【０３６２】
また、ＵＥＦＩドライバ１４０のメンバ関数１４５に従った処理の実行中に、ＷＤＴ４１５によってエラーが検出されると、エラーの原因と考えられるＵＥＦＩドライバ１４０を識別する情報が、エラーリスト３２１に登録される。従って、情報処理ユニット１００ａが再起動した後、エラーリスト３２１に登録された情報に対応するＵＥＦＩドライバ１４０の実行を確実に回避できるようになる。
【０３６３】
なお、上記の第３の実施の形態において、割り込み処理部４１７は、ＷＤＴ４１５によってＵＥＦＩドライバ１４０の処理エラーが検出されると、情報処理ユニット１００ａのリセットを要求する前に、エラーリスト３２１およびエラーログ３２２への情報登録を要求した。しかし、他の例として、割り込み処理部４１７は、ＷＤＴ４１５によってＵＥＦＩドライバ１４０の処理エラーが検出されると、エラーリスト３２１およびエラーログ３２２へ登録する情報を送信する前に、情報処理ユニット１００ａのリセットを要求してもよい。
【０３６４】
この場合、情報処理ユニット１００ａのエラー処理部１８１は、例えば、情報処理ユニット１００ａが再起動すると、管理ユニット４１０の割り込み処理部４１７から、エラーリスト３２１およびエラーログ３２２へ登録する情報を受信する。そして、エラー処理部１８１は、受信した情報をエラーリスト３２１およびエラーログ３２２へ登録する。ドライバ設定部１２１は、エラーリスト３２１への情報登録処理が終了したことの通知をエラー処理部１８１から受けた後、ＵＥＦＩドライバ１４０のロード処理を開始する。このような処理により、第３の実施の形態と同様の効果が得られる。
【０３６５】
なお、以上の第２，第３の実施の形態では、ＵＥＦＩドライバ１４０がブート・サービス・ドライバであるものとして説明したが、ＵＥＦＩドライバ１４０として、ブート・サービス・ドライバと、ＵＥＦＩ規格上の“ランタイム・ドライバ（Runtime Driver）”とが混在していてもよい。ただし、この場合には、ランタイム・ドライバは、監視対象リスト３１０に登録されないことが望ましい。
【０３６６】
また、上記各実施の形態で示した装置の処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ＨＤＤ、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc−Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０３６７】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０３６８】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【０３６９】
また、上記の処理機能の少なくとも一部を、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【０３７０】
以上の各実施の形態に関し、さらに以下の付記を開示する。
（付記１）  複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置において、
監視対象のドライバプログラムに従って実行される処理の状況を監視する処理監視手段と、
前記処理監視手段によって、前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を不揮発性記憶部に登録するエラー処理手段と、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が再起動したときに前記不揮発性記憶部を参照し、前記不揮発性記憶部に登録されたドライバ情報が示すドライバプログラムの実行をスキップする実行制御手段と、
を有することを特徴とする情報処理装置。
【０３７１】
（付記２）  前記実行制御手段は、前記監視対象のドライバプログラムを呼び出すたびに、呼び出したドライバプログラムに従って実行される処理の監視を前記処理監視手段に依頼することを特徴とする付記１記載の情報処理装置。
【０３７２】
（付記３）  前記監視対象のドライバプログラムのそれぞれに対応する監視用プログラムが記憶されたプログラム記憶部をさらに有し、
前記実行制御手段は、前記監視対象のドライバプログラムを呼び出す場合には、呼び出す対象のドライバプログラムに対応する前記監視用プログラムを呼び出し、呼び出した前記監視用プログラムに従って、当該監視用プログラムに対応するドライバプログラムを呼び出すとともに、呼び出したドライバプログラムに従って実行される処理の監視を前記処理監視手段に依頼する、
ことを特徴とする付記２記載の情報処理装置。
【０３７３】
（付記４）  各ドライバプログラムは１つ以上のサブプログラムを含み、
前記監視用プログラムは、当該監視用プログラムに対応するドライバプログラムに含まれるサブプログラムにそれぞれ対応する監視用サブプログラムを含み、
前記実行制御手段は、前記監視対象のドライバプログラムに含まれるサブプログラムを呼び出す場合には、当該サブプログラムに対応する監視用サブプログラムを呼び出し、呼び出した監視用サブプログラムに従って、当該監視用サブプログラムに対応するサブプログラムを呼び出すとともに、呼び出したサブプログラムに従って実行される処理の監視を前記処理監視手段に依頼する、
ことを特徴とする付記３記載の情報処理装置。
【０３７４】
（付記５）  各サブプログラムを示すサブプログラム情報と、各サブプログラムの呼び出しに用いる呼び出し情報とを対応付けてサブプログラムデータベースに登録する登録手段をさらに有し、
各ドライバプログラムは、各ドライバプログラムの初期設定処理の手順を記述した第１のサブプログラムと、各ドライバプログラムに対応するデバイスへアクセスする制御手順を記述した第２のサブプログラムとを含み、
前記初期設定処理は、設定処理対象のドライバプログラムに含まれるサブプログラムを示すサブプログラム情報と、当該サブプログラム情報に対応する呼び出し情報とを前記サブプログラムデータベースに登録する処理を、前記登録手段に要求する処理を含み、
前記実行制御手段は、
各ドライバプログラムを選択し、選択したドライバプログラムに含まれる第１のサブプログラムを呼び出し、呼び出した第１のサブプログラムに従って、選択したドライバプログラムの初期設定処理を実行する第１の処理と、
所望のドライバプログラムに含まれる第２のサブプログラムに対応する呼び出し情報を前記サブプログラムデータベースから取得し、取得した呼び出し情報に対応する第２のサブプログラムを呼び出し、呼び出した第２のサブプログラムに従って、当該第２のサブプログラムを含むドライバプログラムに対応するデバイスにアクセスする第２の処理と、
を実行し、
前記登録手段は、各ドライバプログラムの初期設定処理において登録を要求されたサブプログラム情報が示すサブプログラムが、前記監視対象のドライバプログラムに含まれるサブプログラムである場合には、登録を要求されたサブプログラム情報に対応するサブプログラムの呼び出しに用いる呼び出し情報の代わりに、当該サブプログラムに対応する監視用サブプログラムの呼び出しに用いる呼び出し情報を前記サブプログラムデータベースに登録する、
ことを特徴とする付記４記載の情報処理装置。
【０３７５】
（付記６）  前記実行制御手段は、前記第１の処理において、前記複数のデバイスのそれぞれに対応するドライバプログラムのうち、前記不揮発性記憶部に登録されたドライバ情報に対応するドライバプログラムを除くドライバプログラムを選択することを特徴とする付記５記載の情報処理装置。
【０３７６】
（付記７）  前記実行制御手段は、
前記複数のデバイスのそれぞれに対応するドライバプログラムごとに、各ドライバプログラムの呼び出しに用いる呼び出し情報を対応付けてドライバデータベースに登録し、前記複数のデバイスのそれぞれに対応するドライバプログラムのうち前記監視対象のドライバプログラムについては、当該ドライバプログラムの呼び出しに用いる呼び出し情報の代わりに、当該ドライバプログラムに対応する監視用プログラムの呼び出しに用いる呼び出し情報を前記ドライバデータベースに登録し、
前記第１の処理においては、前記ドライバデータベースから呼び出し情報を選択し、選択した呼び出し情報を基に、ドライバプログラム内の第１のサブプログラムまたは当該第１のサブプログラムに対応する監視用サブプログラムを呼び出す、
ことを特徴とする付記５または６記載の情報処理装置。
【０３７７】
（付記８）  前記実行制御手段は、
前記監視対象のドライバプログラムの呼び出しに用いる呼び出し情報を監視対象ドライバデータベースに登録し、
前記監視対象のドライバプログラムに含まれるサブプログラムを呼び出す場合には、当該サブプログラムに対応する監視用サブプログラムを呼び出し、呼び出した監視用サブプログラムに従って、当該監視用サブプログラムの呼び出しに用いる呼び出し情報を前記監視対象ドライバデータベースから取得し、取得した呼び出し情報を基に、当該監視用サブプログラムに対応するサブプログラムを呼び出す、
ことを特徴とする付記４〜７のいずれか１つに記載の情報処理装置。
【０３７８】
（付記９）  前記実行制御手段は、前記複数のデバイスのそれぞれに対応するドライバプログラムのうち、前記不揮発性記憶部にドライバ情報が登録されたドライバプログラムを除くドライバプログラムを呼び出し、呼び出したドライバプログラムに従って当該ドライバプログラムの初期設定処理を実行することを特徴とする付記１〜３のいずれか１つに記載の情報処理装置。
【０３７９】
（付記１０）  前記エラー処理手段は、前記処理監視手段によって処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記不揮発性記憶部に登録した後、前記情報処理装置を再起動することを特徴とする付記１〜９のいずれか１つに記載の情報処理装置。
【０３８０】
（付記１１）  前記実行制御手段は、前記情報処理装置の起動からＯＳ（Operating System）プログラムが起動される前の期間において、前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、
前記処理監視手段は、前記実行制御手段により前記監視対象のドライバプログラムに従って実行される処理の状況を監視する、
ことを特徴とする付記１〜１０のいずれか１つに記載の情報処理装置。
【０３８１】
（付記１２）  複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置において、
監視対象のドライバプログラムに従って実行される処理の状況を監視するように、外部の監視装置に依頼する監視依頼手段と、
前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが前記監視装置で検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記監視装置から受信するドライバ情報受信手段と、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、前記情報処理装置が起動したとき、前記情報処理装置の過去の起動時に前記監視装置によって処理のエラーが検出されたドライバプログラムを前記監視装置から受信したドライバ情報に基づいて認識し、認識したドライバプログラムの実行をスキップする実行制御手段と、
を有することを特徴とする情報処理装置。
【０３８２】
（付記１３）  前記ドライバ情報受信手段は、前記監視装置によって処理のエラーが検出されたとき、前記監視装置からドライバ情報を受信し、受信したドライバ情報を、前記情報処理装置が備える不揮発性記憶部に登録した後、前記監視装置からの要求に応じて前記情報処理装置を再起動することを特徴とする付記１２記載の情報処理装置。
【０３８３】
（付記１４）  複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置におけるドライバ実行制御方法であって、
前記情報処理装置が、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、
呼び出したドライバプログラムのうち監視対象のドライバプログラムに従って実行される処理の状況を監視し、
前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記情報処理装置が備える不揮発性記憶部に登録し、
前記情報処理装置が再起動したとき、前記不揮発性記憶部に登録されたドライバ情報が示すドライバプログラムの実行をスキップする、
ことを特徴とするドライバ実行制御方法。
【０３８４】
（付記１５）  複数のデバイスが接続され、前記複数のデバイスのそれぞれに対応するドライバプログラムを実行することで前記複数のデバイスを制御する情報処理装置におけるドライバ実行制御方法であって、
前記情報処理装置が、
前記複数のデバイスのそれぞれに対応するドライバプログラムを呼び出して実行し、
呼び出したドライバプログラムのうち監視対象のドライバプログラムに従って実行される処理の状況を監視するように、外部の監視装置に依頼し、
前記監視対象のドライバプログラムのうちのいずれかに従って実行される処理のエラーが前記監視装置で検出されると、エラーが検出されたドライバプログラムを示すドライバ情報を前記監視装置から受信し、
前記情報処理装置が再起動したとき、再起動前に前記監視装置によって処理のエラーが検出されたドライバプログラムを前記監視装置から受信したドライバ情報に基づいて認識し、認識したドライバプログラムの実行をスキップする、
ことを特徴とするドライバ実行制御方法。
【符号の説明】
【０３８５】
１  情報処理装置
１０，２０  デバイス
１１，１２  ドライバプログラム
１１ａ，１２ａ  初期設定処理
１１ｂ，１２ｂ  アクセス処理
２１  処理監視手段
２２  エラー処理手段
２２ａ  ドライバ情報
２３  実行制御手段
２４  不揮発性記憶部
【図１】
0005593856.tif 000002
【図２】
0005593856.tif 000003
【図３】
0005593856.tif 000004
【図４】
0005593856.tif 000005
【図５】
0005593856.tif 000006
【図６】
0005593856.tif 000007
【図７】
0005593856.tif 000008
【図８】
0005593856.tif 000009
【図９】
0005593856.tif 000010
【図１０】
0005593856.tif 000011
【図１１】
0005593856.tif 000012
【図１２】
0005593856.tif 000013
【図１３】
0005593856.tif 000014
【図１４】
0005593856.tif 000015
【図１５】
0005593856.tif 000016
【図１６】
0005593856.tif 000017
【図１７】
0005593856.tif 000018
【図１８】
0005593856.tif 000019
【図１９】
0005593856.tif 000020
【図２０】
0005593856.tif 000021
【図２１】
0005593856.tif 000022
【図２２】
0005593856.tif 000023
【図２３】
0005593856.tif 000024
【図２４】
0005593856.tif 000025
【図２５】
0005593856.tif 000026
【図２６】
0005593856.tif 000027
【図２７】
0005593856.tif 000028
【図２８】
0005593856.tif 000029
【図２９】
0005593856.tif 000030
【図３０】
0005593856.tif 000031
【図３１】
0005593856.tif 000032
【図３２】
0005593856.tif 000033
【図３３】
0005593856.tif 000034
【図３４】
0005593856.tif 000035
【図３５】
0005593856.tif 000036