(57)【要約】【課題】デバイスへのアクセス停止時間を短縮すること。【解決手段】処理部１ｂは、現デバイスドライバ４によるデバイス２へのアクセス許可中に、現デバイスドライバ４に対応する現デバイスファイル５を取得し、現デバイスファイル５に基づいて新デバイスドライバ７に対する仮デバイスファイルを作成し、現デバイスドライバ４によるデバイス２へのアクセス不許可中に、現デバイスドライバ４における設定情報６と新デバイスドライバ７における設定情報６ａとの差分の設定情報を仮デバイスファイルに反映させて新デバイスファイル８ａとすることで初期化処理を行う。処理部１ｂは、新デバイスファイル８ａにより新デバイスドライバ７を起動し、現デバイスドライバ４から新デバイスドライバ７への切り替えを行う。【選択図】図１
2019016277.tif 000002
【特許請求の範囲】
【請求項１】
デバイスへのアクセスに用いられる現デバイスドライバのプログラムおよび前記現デバイスドライバの更新版である新デバイスドライバのプログラムを記憶する記憶部と、
前記現デバイスドライバによる前記デバイスへのアクセス許可中に、前記現デバイスドライバに対応する現デバイスファイルを取得し、前記現デバイスファイルに基づいて前記新デバイスドライバに対する仮デバイスファイルを作成し、前記現デバイスドライバによる前記デバイスへのアクセス不許可中に、前記現デバイスドライバにおける設定情報と前記新デバイスドライバにおける設定情報との差分の設定情報を前記仮デバイスファイルに反映させて新デバイスファイルとすることで初期化処理を行い、前記新デバイスファイルにより前記新デバイスドライバを起動し、前記現デバイスドライバから前記新デバイスドライバへの切り替えを行う処理部と、
を有する情報処理装置。
【請求項２】
前記現デバイスドライバは、前記現デバイスドライバにおける設定情報を応答する第１の関数を含み、
前記処理部は、前記アクセス許可中に、前記仮デバイスファイルを介して前記第１の関数を実行し、前記現デバイスドライバにおける設定情報を取得する、
請求項１記載の情報処理装置。
【請求項３】
前記新デバイスドライバは、前記新デバイスドライバにおける設定情報を応答する第２の関数を含み、
前記処理部は、前記切り替えの際に、前記現デバイスファイルに前記第２の関数の前記記憶部におけるアドレスを設定する、
請求項１または２記載の情報処理装置。
【請求項４】
前記処理部は、前記仮デバイスファイルを介した前記デバイスに対するアクセス要求に対して、前記新デバイスドライバからビジー応答を取得する、請求項１乃至３の何れか１項に記載の情報処理装置。
【請求項５】
前記処理部は、前記現デバイスドライバによる既存のアクセスが完了すると、前記現デバイスドライバを停止させ、前記切り替えを行う、請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
前記処理部は、前記現デバイスドライバの処理に用いられる複数のテーブルそれぞれの更新有無を複数のタイミングで監視し、前回のタイミングから今回のタイミングまでに更新の無いテーブルを前記新デバイスドライバの参照先の記憶領域にコピーする処理を各タイミングで行い、前記複数のテーブルの全てのコピーが完了すると、前記切り替えを行う、請求項１乃至５の何れか１項に記載の情報処理装置。
【請求項７】
デバイスへのアクセスに用いられる現デバイスドライバによる前記デバイスへのアクセス許可中に、前記現デバイスドライバに対応する現デバイスファイルを取得し、前記現デバイスファイルに基づいて前記現デバイスドライバの更新版である新デバイスドライバに対する仮デバイスファイルを作成し、前記現デバイスドライバによる前記デバイスへのアクセス不許可中に、前記現デバイスドライバにおける設定情報と前記新デバイスドライバにおける設定情報との差分の設定情報を前記仮デバイスファイルに反映させて新デバイスファイルとすることで初期化処理を行い、
前記新デバイスファイルにより前記新デバイスドライバを起動し、前記現デバイスドライバから前記新デバイスドライバへの切り替えを行う、
処理をコンピュータに実行させるプログラム。
【請求項８】
コンピュータが、
デバイスへのアクセスに用いられる現デバイスドライバによる前記デバイスへのアクセス許可中に、前記現デバイスドライバに対応する現デバイスファイルを取得し、前記現デバイスファイルに基づいて前記現デバイスドライバの更新版である新デバイスドライバに対する仮デバイスファイルを作成し、前記現デバイスドライバによる前記デバイスへのアクセス不許可中に、前記現デバイスドライバにおける設定情報と前記新デバイスドライバにおける設定情報との差分の設定情報を前記仮デバイスファイルに反映させて新デバイスファイルとすることで初期化処理を行い、
前記新デバイスファイルにより前記新デバイスドライバを起動し、前記現デバイスドライバから前記新デバイスドライバへの切り替えを行う、
ドライバ切り替え方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置、プログラムおよびドライバ切り替え方法に関する。
【背景技術】
【０００２】
コンピュータなどの情報処理装置には種々のデバイスが接続され得る。デバイスに対するアクセスには、デバイスドライバと呼ばれるソフトウェアが用いられる。デバイスドライバは、機能改善や不具合修正のために更新されることがある。そこで、システムへの影響を抑えてデバイスドライバを更新する方法が考えられている。
【０００３】
例えば、更新前に動作している旧デバイスドライバに対して発行される入出力リクエストの頻度を監視し、安全に新デバイスドライバへの更新が可能なタイミングを検出する情報処理装置の提案がある。この提案では、情報処理装置は、旧デバイスドライバにて既に受け付け済みの入出力リクエストの終了を監視すると共に、新規の入出力リクエストをペンディング状態とする。そして、旧デバイスドライバをアンロード後、新デバイスドライバをオペレーティングシステムに組み込んで初期化する。更に、新デバイスドライバにてペンディング中の入出力リクエストを実行し、その後、通常の入出力処理を再開する。
【０００４】
また、オペレーティングシステムへ接続するためのシステム・ドライバ・インタフェースを与えるシェル・デバイス・ドライバと、物理デバイスへ接続するための物理層デバイス・ドライバとに分割したデバイスドライバの構造が提案されている。この提案では、物理層デバイス・ドライバの置き換え時、シェル・デバイス・ドライバにより物理デバイスの現行デバイス状態を保持し、置き換え後の物理層デバイス・ドライバに引き継ぐ。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−２０３１２０号公報
【特許文献２】特開２００１−３１８８７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記のように、デバイスドライバの更新では、現在のデバイスドライバによるデバイスアクセスの停止後に、新しいデバイスドライバによるデバイスへのアクセスを開始することがある。この場合、切り替えのタイミングで、新しいデバイスドライバの初期化処理に時間を要し、デバイスにアクセスできない時間が発生する。デバイスにアクセスできない時間が長引くと、当該デバイスを使用するアプリケーションやミドルウェアなどの処理においてタイムアウトを発生させるなどの悪影響を及ぼす可能性がある。
【０００７】
１つの側面では、本発明は、デバイスへのアクセス停止時間を短縮することを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、情報処理装置が提供される。この情報処理装置は、記憶部と処理部とを有する。記憶部は、デバイスへのアクセスに用いられる現デバイスドライバのプログラムおよび現デバイスドライバの更新版である新デバイスドライバのプログラムを記憶する。処理部は、現デバイスドライバによるデバイスへのアクセス許可中に、現デバイスドライバに対応する現デバイスファイルを取得し、現デバイスファイルに基づいて新デバイスドライバに対する仮デバイスファイルを作成し、現デバイスドライバによるデバイスへのアクセス不許可中に、現デバイスドライバにおける設定情報と新デバイスドライバにおける設定情報との差分の設定情報を仮デバイスファイルに反映させて新デバイスファイルとすることで初期化処理を行い、新デバイスファイルにより新デバイスドライバを起動し、現デバイスドライバから新デバイスドライバへの切り替えを行う。
【発明の効果】
【０００９】
１つの側面では、デバイスへのアクセス停止時間を短縮できる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態のサーバのハードウェア例を示す図である。
【図３】サーバのソフトウェア例を示す図である。
【図４】ｄｅｖ＿ｐｒｏｘｙ関数の例を示す図である。
【図５】デバイス初期化テーブルの例を示す図である。
【図６】ドライバ初期化完了コードの例を示す図である。
【図７】ドライバ構成ファイルの例を示す図である。
【図８】ドライバ属性ファイルの例を示す図である。
【図９】互換性ファイルの例を示す図である。
【図１０】実デバイスファイルの例を示す図である。
【図１１】仮デバイスファイルの例を示す図である。
【図１２】ドライバ制御部の新ドライバ読込処理の例を示すフローチャートである。
【図１３】オフライン更新処理の例を示すフローチャートである。
【図１４】ＩＯ要求処理の例を示すフローチャートである。
【図１５】新ドライバ読込処理の例を示すシーケンスである。
【図１６】第３の実施の形態の内部テーブルの例を示す図である。
【図１７】新ドライバ読込処理の例を示すフローチャートである。
【図１８】新ドライバ読込処理の例（続き）を示すフローチャートである。
【図１９】ｄｅｖ＿ｐｒｏｘｙ関数の処理例を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、デバイス２に接続されている。デバイス２は、情報処理装置１に外付けまたは内蔵されるハードウェアである。デバイス２の一例としては、プリンタやスキャナなどの入出力デバイス、ＮＩＣ（Network Interface Card）などの通信デバイス、モニタなどの表示デバイス、マイクやスピーカなどのサウンドデバイスなどが挙げられる。
【００１２】
情報処理装置１は、ソフトウェア３を実行する。ソフトウェア３は、アプリケーションやミドルウェアなどである。ソフトウェア３は、デバイス２へのアクセスにデバイスドライバ４を利用する。ソフトウェア３によりデバイスドライバ４を利用するためのインタフェースとして、情報処理装置１のオペレーティングシステム（ＯＳ：Operating System）は、デバイスファイル５を提供する。「デバイスファイル」は、スペシャルファイルと呼ばれることもある。ソフトウェア３は、デバイスファイル５に基づいて、デバイスドライバ４に対する特定の関数を呼び出し、デバイスドライバ４によるデバイス２へのアクセスを指示する。デバイスファイル５は、デバイスドライバ４の処理に用いられる設定情報６へのリンクも含む。例えば、設定情報６は、デバイス２のメモリやレジスタに保持される所定のパラメータに対する設定値を含む。また、設定情報６は、デバイスドライバ４の動作制御に用いられる所定のパラメータに対する設定値を含む。
【００１３】
デバイスドライバ４は、機能改善や不具合修正などのために配布元により更新されることがある。例えば、デバイスドライバ４は、更新されてデバイスドライバ７にバージョンアップされる。情報処理装置１において、デバイス２へのアクセスに用いるデバイスドライバ４をデバイスドライバ７に切り替える直前のタイミングでは、デバイスドライバ４は停止される。このため、デバイス２にアクセスできない時間（アクセス停止時間）が生じる。そこで、情報処理装置１は、デバイスドライバの切り替えに伴うデバイス２へのアクセス停止時間を短縮する機能を提供する。
【００１４】
ここで、以下では、現在、ソフトウェア３からデバイス２へのアクセスに利用されているデバイスドライバ４を、現デバイスドライバ４と称することがある。また、デバイスファイル５を、現デバイスファイル５と称することがある。更に、現デバイスドライバ４の更新版であるデバイスドライバ７を、新デバイスドライバ７と称することがある。
【００１５】
情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。
記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部１ｂは、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）、ＡＳＩＣ（Application Specific Integrated Circuit）、ＦＰＧＡ（Field Programmable Gate Array）などを含み得る。処理部１ｂはプログラムを実行するプロセッサでもよい。「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）も含まれ得る。
【００１６】
記憶部１ａは、ソフトウェア３のプログラム、現デバイスドライバ４のプログラムおよび新デバイスドライバ７のプログラムを記憶する。また、記憶部１ａは、現デバイスファイル５および設定情報６を記憶する。更に、記憶部１ａは、新デバイスドライバ７に対して生成される仮デバイスファイル８も記憶する。
【００１７】
処理部１ｂは、記憶部１ａに記憶された各プログラムを実行することで、ソフトウェア３、現デバイスドライバ４および新デバイスドライバ７の機能を発揮する。
処理部１ｂは、現デバイスドライバ４を新デバイスドライバ７に切り替える旨の指示を受け付ける。例えば、当該指示は、情報処理装置１に対してユーザにより入力される。処理部１ｂは、現デバイスドライバ４によるデバイス２へのアクセス許可中に、現デバイスドライバ４に対応する現デバイスファイル５を取得する。処理部１ｂは、取得した現デバイスファイル５に基づいて新デバイスドライバ７に対する仮デバイスファイル８を生成する（ステップＳ１）。アクセス許可中のときには、ソフトウェア３は、現デバイスファイル５を介して、現デバイスドライバ４によるデバイス２へのアクセスを行える。
【００１８】
このとき、新デバイスドライバ７は、新デバイスドライバ７の関数のうち、現デバイスドライバ４の設定情報の読み出し用の特定の関数のみが利用可能な状態（一部機能が制限された制限状態）で動作する。制限状態の新デバイスドライバ７は、デバイス２に対するＲｅａｄ／Ｗｒｉｔｅ関数によるアクセス要求にビジー（busy）応答を返す。すなわち、処理部１ｂは、仮デバイスファイル８を介したデバイス２に対するアクセス要求に対して、新デバイスドライバ７からビジー応答を取得する。新デバイスドライバ７による不適切なデバイス操作の発生を抑制し、現デバイスドライバ４によるデバイスアクセスへの影響を抑えるためである。図１では、制限状態の新デバイスドライバ７を点線の枠で表している。
【００１９】
ここで、仮デバイスファイル８は、制限状態の新デバイスドライバ７により現デバイスドライバ４の所定の関数にアクセス可能とし、現デバイスドライバ４の設定情報６の読み出しを可能とする。現デバイスドライバ４は、当該所定の関数（例えば、“ｄｅｖ＿ｐｒｏｘｙ関数”と称する）を予め備えている。ｄｅｖ＿ｐｒｏｘｙ関数は、現デバイスドライバ４の設定情報６を読み出す機能をもつ。仮デバイスファイル８は、ｄｅｖ＿ｐｒｏｘｙ関数へのリンク（例えば、当該ｄｅｖ＿ｐｒｏｘｙ関数のエントリポイントのアドレス）を含む。処理部１ｂは、仮デバイスファイル８の当該リンクに基づいて、新デバイスドライバ７により現デバイスドライバ４のｄｅｖ＿ｐｒｏｘｙ関数を呼び出すことで、設定情報６を取得する。処理部１ｂは、設定情報６と、新デバイスドライバ７で予定される設定情報とを比較することで、両者の間の差分の設定情報を抽出することができる。処理部１ｂは、抽出した差分の設定情報を、記憶部１ａに格納する。なお、新デバイスドライバ７も、次回の更新のときのために、ｄｅｖ＿ｐｒｏｘｙ関数を備える（図１では図示を省略している）。
【００２０】
処理部１ｂは、現デバイスドライバ４によるデバイス２へのアクセス不許可中に、現デバイスドライバ４における設定情報６と新デバイスドライバにおける設定情報との差分の設定情報を仮デバイスファイル８に反映させて新デバイスファイル８ａとする（ステップＳ２）。処理部１ｂは、ステップＳ１，Ｓ２により新デバイスドライバ７の初期化処理を行う（ステップＳ１から初期化を開始し、ステップＳ２で初期化を完了する）。
【００２１】
アクセス不許可中のときには、ソフトウェア３による、現デバイスファイル５を介した現デバイスドライバ４によるデバイス２へのアクセスは中断される。差分の設定情報を仮デバイスファイル８に反映させる処理は、仮デバイスファイル８におけるｄｅｖ＿ｐｒｏｘｙ関数へのリンクを、設定情報６へのリンクに変更する処理、および、当該差分の設定情報を設定情報６に適用する処理を含む。設定情報６ａは、当該差分の設定情報を設定情報６に適用した後の設定情報である。こうして、処理部１ｂは、仮デバイスファイル８から新デバイスファイル８ａを作成する。
【００２２】
ここで、現デバイスドライバ４によるアクセス不許可中のときに差分の設定情報を反映させる理由は、現デバイスドライバ４によるアクセス許可中では（現デバイスドライバ４を動作させたままでは）、設定情報６に対する更新が発生する可能性があるためである。また、現デバイスドライバ４によるアクセスが行われている最中に、デバイスドライバ７による設定を設定情報６に書き込んでしまうと、現デバイスドライバ４によるデバイスアクセスに影響を及ぼすおそれがあるからである。
【００２３】
処理部１ｂは、新デバイスファイル８ａにより新デバイスドライバ７を起動し、現デバイスドライバ４から新デバイスドライバ７への切り替えを行う（ステップＳ３）。具体的には、処理部１ｂは、制限状態である新デバイスドライバ７の全ての機能を利用可能な状態に変更し（すなわち、新デバイスドライバ７を起動し）、ソフトウェア３による新デバイスファイル８ａを介したデバイス２へのアクセスを可能とする。新デバイスドライバ７は、新デバイスファイル８ａに基づいて、デバイス２へのアクセスに設定情報６ａを用いる。そして、処理部１ｂは、現デバイスドライバ４を解放（release）する。
【００２４】
情報処理装置１によれば、デバイスへのアクセス停止時間を短縮できる。
ここで、デバイスドライバの更新では、上記のように、現デバイスドライバ４によるデバイスアクセスの停止後に、新デバイスドライバ７によるデバイス２へのアクセスを開始することがある。この場合、切り替えのタイミングで、新デバイスドライバ７の初期化処理に時間を要し、デバイス２にアクセスできない時間が発生する。初期化処理では、デバイスファイルの作成や、デバイスドライバによる設定情報のメモリへの展開など、デバイスドライバによるデバイスアクセスを開始するための準備が行われる。
【００２５】
特に、現デバイスドライバ４から新デバイスドライバ７への切り替えのタイミングで、新デバイスドライバ７の初期化処理を開始することも考えられる。しかし、このようにすると、現デバイスドライバ４を停止させた後、初期化処理の開始から終了までの時間、デバイス２にアクセスできないことになり、デバイス２へのアクセス停止時間が長引く可能性が高い。デバイス２にアクセスできない時間が長引くと、当該デバイス２を使用するソフトウェア３の処理においてタイムアウトを発生させるなどの悪影響を及ぼす可能性がある。
【００２６】
そこで、処理部１ｂは、新デバイスドライバ７について仮デバイスファイル８により初期化を開始して、現デバイスドライバ４の動作中に初期化処理を進める。そして、処理部１ｂは、現デバイスドライバ４の停止後には、新デバイスドライバ７の全設定情報のうち、現デバイスドライバ４および新デバイスドライバ７の差分の設定情報のみを適用して初期化処理を完了させる。このように、現デバイスドライバ４の動作中に新デバイスドライバ７の初期化処理の一部を行うことで、デバイス２へのアクセス停止時間の短縮化を図れる。特に、現デバイスドライバ４の停止後に全ての設定情報について設定を行うよりも、現デバイスドライバ４の停止後に発生する設定処理の所要時間を短縮でき、切り替えまでに生じるデバイス２へのアクセス停止時間を短縮することができる。その結果、デバイス２を使用するソフトウェア３の処理に対して、タイムアウトなどの悪影響を及ぼす可能性を減らすことができる。
【００２７】
以下では、情報処理装置１の機能を有する具体的なサーバコンピュータ（以下、サーバと称することがある）を例示して、当該機能を更に詳細に説明する。
［第２の実施の形態］
図２は、第２の実施の形態のサーバのハードウェア例を示す図である。サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、通信インタフェース１０４、画像信号処理部１０５、入力信号処理部１０６、媒体リーダ１０７および機器接続部１０８を有する。
【００２８】
プロセッサ１０１は、サーバ１００の情報処理を制御するハードウェアである。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵ、ＤＳＰ、ＡＳＩＣまたはＦＰＧＡなどである。プロセッサ１０１は、ＣＰＵ、ＤＳＰ、ＡＳＩＣ、ＦＰＧＡなどのうちの２以上の要素の組み合わせであってもよい。
【００２９】
ＲＡＭ１０２は、サーバ１００の主記憶装置である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００３０】
ＨＤＤ１０３は、サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、および各種データが格納される。サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００３１】
通信インタフェース１０４は、ネットワーク１１と接続するための通信インタフェースである。通信インタフェース１０４としては、例えば、イーサネット（登録商標）のインタフェースを用いることができる。
【００３２】
画像信号処理部１０５は、プロセッサ１０１からの命令に従って、サーバ１００に接続されたディスプレイ１２に画像を出力する。ディスプレイ１２としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００３３】
入力信号処理部１０６は、サーバ１００に接続された入力デバイス１３から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１３としては、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００３４】
媒体リーダ１０７は、記録媒体１４に記録されたプログラムやデータを読み取る装置である。記録媒体１４として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１４として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０７は、例えば、プロセッサ１０１からの命令に従って、記録媒体１４から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００３５】
機器接続部１０８は、デバイス１５と接続するためのインタフェースである。機器接続部１０８には、例えば、プリンタや、外部記憶装置や、各ネットワーク機器などをデバイス１５として接続できる。機器接続部１０８は、プロセッサからの命令に従って、デバイス１５に対する入出力の制御を行う。
【００３６】
なお、サーバ１００は、第１の実施の形態の情報処理装置１の一例である。
また、デバイス１５は、第１の実施の形態のデバイス２の一例である。更に、通信インタフェース１０４、ディスプレイ１２、入力デバイス１３、媒体リーダ１０７および機器接続部１０８も、第１の実施の形態のデバイス２の一例である。
【００３７】
図３は、サーバのソフトウェア例を示す図である。サーバ１００は、プロセッサ１０１によってＯＳ１２０を実行する。また、サーバ１００は、デバイスドライバ１４１，１４２およびデバイスファイル１５１ａ，１５１ｂ，１５２ａを有する。
【００３８】
ＯＳ１２０は、デバイス１５にアクセスするＩＯ（Input/Output）制御部１３０を有する。ＩＯ制御部１３０は、ＩＯ要求処理部１３１、ドライバ制御部１３２および記憶部１３３を有する。
【００３９】
ＩＯ要求処理部１３１は、デバイスファイルを介してデバイスドライバにアクセスすることにより、デバイスを制御する。ＩＯ要求処理部１３１は、ドライバ制御部１３２からの命令に従い、デバイスの入出力制御や、デバイスの閉塞、デバイスの閉塞の解除などを行う。
【００４０】
ドライバ制御部１３２は、システム管理者が操作する管理サーバプログラムなどからデバイスの更新指示を受け付け、デバイスの状態管理、デバイスの更新、ＩＯ要求処理部１３１への指示を行う。
【００４１】
記憶部１３３は、ドライバ制御部１３２の処理に用いられる制御情報を記憶する。記憶部１３３は、ＲＡＭ１０２またはＨＤＤ１０３の記憶領域を用いて実現される。また、記憶部１３３は、デバイスドライバ１４１，１４２それぞれのプログラムやデバイスファイル１５１ａ，１５１ｂ，１５２ａを記憶する。
【００４２】
ここで、デバイスドライバは、デバイスに対する操作を制御するプログラムである。また、デバイスファイルは、アプリケーションやミドルウェアなどのソフトウェアが、デバイスにアクセスするために用いられる特殊ファイルである。デバイスファイルは、例えば、スペシャルファイル、またはデバイスノードなどと呼ばれることもある。デバイスを操作する関数（システムコール）は、ＯＳによって予め提供されている。デバイスを操作する関数には、例えば、ｏｐｅｎ関数、ｒｅｌｅａｓｅ関数、ｒｅａｄ関数、ｗｒｉｔｅ関数、ｒｅｌｅａｓｅ関数などがある。
【００４３】
例えば、デバイスドライバ１４１は、デバイス１５ａ，１５ｂに対する操作を制御する。デバイスファイル１５１ａは、デバイス１５ａへアクセスするためのインタフェースを提供する。デバイスファイル１５１ｂは、デバイス１５ｂへアクセスするためのインタフェースを提供する。
【００４４】
また、デバイスドライバ１４２は、デバイス１６ａに対する操作を制御する。デバイスファイル１５２ａは、デバイス１６ａへアクセスするためのインタフェースを提供する。
より具体的には、ＩＯ要求処理部１３１は、システムコールを用いてデバイスファイル１５１ａにアクセスすると、デバイスドライバ１４１が呼び出され、デバイス１５ａにアクセスできる。例えば、ＩＯ要求処理部１３１がデバイス１５ａに対する操作を行う場合、デバイスファイル１５１ａに対するオープン処理によりファイルディスクリプタを取得する。ＩＯ要求処理部１３１は、当該ファイルディスクリプタを指定した処理を実行することで、デバイス１５ａに対する操作を行う。デバイス１５ａを解放する場合、ＩＯ要求処理部１３１は、取得したファイルディスクリプタを解放する。ファイルディスクリプタの解放では、ＩＯ要求処理部１３１は、デバイスファイル１５１ａに対するクローズ処理を行う。
【００４５】
ＩＯ要求処理部１３１は、デバイス１５ａと同様に、デバイスファイル１５１ｂを介して、デバイスドライバ１４１によるデバイス１５ｂの操作を行える。また、ＩＯ要求処理部１３１は、デバイスファイル１５２ａを介して、デバイスドライバ１４２によるデバイス１６ａの操作を行える。
【００４６】
図４は、ｄｅｖ＿ｐｒｏｘｙ関数の例を示す図である。実デバイスファイル１５５ａ，１５５ｂは、動作中のデバイスドライバ１４５および動作中の実デバイス１７ａ，１７ｂにアクセスするために用いるデバイスファイルである。動作中のデバイスドライバ１４５は、現デバイスドライバに相当する。以下の説明では、動作中のデバイスドライバ１４５を動作中デバイスドライバ１４５と称することがある。
【００４７】
例えば、実デバイスファイル１５５ａは、動作中デバイスドライバ１４５により実デバイス１７ａにアクセスするためのデバイスファイルである。また、実デバイスファイル１５５ｂは、動作中デバイスドライバ１４５により実デバイス１７ｂにアクセスするためのデバイスファイルである。新デバイスドライバ１４６は、動作中デバイスドライバ１４５に対する新版のデバイスドライバである。
【００４８】
ここで、デバイスドライバ１４５には、新デバイスドライバ１４６からのアクセスを受け付けるｄｅｖ＿ｐｒｏｘｙ関数１４５ａが追加される。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、デバイスドライバ１４５が保持する情報を新デバイスドライバ１４６に提供する機能を有する。
【００４９】
仮デバイスファイル１５６ａ，１５６ｂは、新デバイスドライバ１４６に対して作成される仮のデバイスファイルである。仮デバイスファイル１５６ａは、実デバイス１７ａに対応するｄｅｖ＿ｐｒｏｘｙ関数１４５ａ（仮デバイス１８ａ）をアクセス対象とするデバイスファイルである。仮デバイス１８ａは、実デバイス１７ａに対応する仮想的なデバイスであるといえる。また、仮デバイスファイル１５６ｂは、実デバイス１７ｂに対応するｄｅｖ＿ｐｒｏｘｙ関数１４５ａ（仮デバイス１８ｂ）をアクセス対象とするデバイスファイルである。仮デバイス１８ｂは、実デバイス１７ｂに対応する仮想的なデバイスであるといえる。
【００５０】
仮デバイスファイル１５６ａ，１５６ｂは、仮オープンの状態で使用される。仮オープンの状態では、新デバイスドライバ１４６の関数のうち、特定の関数（ｄｅｖ＿ｐｒｏｘｙ関数１４５ａを介した情報の取得に利用される関数）のみが利用可能であり、他の関数の利用が制限される。
【００５１】
すなわち、仮デバイスファイル１５６ａは、新デバイスドライバ１４６を介してｄｅｖ＿ｐｒｏｘｙ関数１４５ａから実デバイス１７ａに関する情報を取得するインタフェースを提供する。仮デバイスファイル１５６ｂは、新デバイスドライバ１４６を介してｄｅｖ＿ｐｒｏｘｙ関数１４５ａから実デバイス１７ｂに関する情報を取得するインタフェースを提供する。
【００５２】
なお、新デバイスドライバ１４６は、次回のデバイスファイルの更新時などのために、ｄｅｖ＿ｐｒｏｘｙ関数１４６ａを備えている。
図５は、デバイス初期化テーブルの例を示す図である。デバイス初期化テーブル４００は、記憶部１３３に格納される。デバイス初期化テーブル４００は、デバイス毎に存在する。
【００５３】
デバイス初期化テーブル４００は、ｄｅｖ＿ｐｒｏｘｙ関数を用いて動作中のデバイスドライバおよび実デバイスから取得した情報を保持する。
デバイス初期化テーブル４００は、パラメータ、Ｒｅａｄ値、期待値の項目を含む。
【００５４】
パラメータの項目には、デバイスドライバにより管理されるパラメータの識別情報が登録される。Ｒｅａｄ値の項目には、動作中のデバイスドライバから取得した情報が設定される。期待値の項目には、新デバイスファイルにおいて予定されている設定値が予め登録される。
【００５５】
ここで、デバイス初期化テーブル４００のエントリについて説明する。例えば、パラメータ「１」は、Ｒｅａｄ値が「０ｘ０１」であり、期待値が「ｎｏｎｅ」である。期待値「ｎｏｎｅ」は期待値が無く、どのような値でも可であることを示す。パラメータ「１」については、新デバイスファイルにおいても設定値を変更しなくてよい（Ｒｅａｄ値のままでよい）。
【００５６】
また、パラメータ「３」は、Ｒｅａｄ値が「０ｘＦＦＦＦ２０２０」であり、期待値が「０ｘＦＦＦＦ２０Ａ０」であり、両者が異なる。パラメータ「３」については、Ｒｅａｄ値と期待値が異なっており、Ｒｅａｄ値と期待値とで差分があることになる。新デバイスファイルでは、期待値の方が適用される（設定をＲｅａｄ値から期待値に変更する）。
【００５７】
更に、パラメータ「５」は、Ｒｅａｄ値が「０ｘ０３」であり、期待値が「０ｘ０３」であり、両者が同一である。パラメータ「５」については、Ｒｅａｄ値と期待値が同一であるため差分がない。このため、新デバイスファイルにおいても設定値を変更しなくてよい（Ｒｅａｄ値のままでよい）。
【００５８】
図６は、ドライバ初期化完了コードの例を示す図である。ドライバ初期化完了コード４０１は、記憶部１３３に格納される。
ドライバ初期化完了コード４０１は、ドライバの初期化が完了したか否かを判定する情報を有する。ドライバ初期化完了コード４０１は、コード、値の項目を含む。コードの項目は、ドライバに対して初期化の完了有無を問い合わせた際の応答に含まれる情報を示す。値の項目は、コードがどのような内容であるかを示す情報である。例えば、コード「０ｘ００」は、初期化が「完了」であることを示す。また、コード「０ｘ０１」は、初期化が「仮完了」であることを示す。また、コード「０ｘ０１」は、初期化が「エラー」であることを示す。
【００５９】
図７は、ドライバ構成ファイルの例を示す図である。ドライバ構成ファイル４０２は、記憶部１３３に格納される。ドライバ構成ファイル４０２は、デバイスドライバの本体である。ドライバ構成ファイル４０２は、ドライバ属性ファイル４０２ａ、互換性ファイル４０２ｂ、バイナリファイル４０２ｃおよびチェックサムファイル４０２ｄを含む。
【００６０】
ドライバ属性ファイル４０２ａは、デバイスドライバの名称、デバイスドライバの版数、所定の関数（ｏｐｅｎ関数など）が展開されるＲＡＭ１０２上の相対アドレスなどを保持する。互換性ファイル４０２ｂは、デバイスドライバのオンラインアップデートが可能か否かを示す情報を有する。
【００６１】
バイナリファイル４０２ｃは、デバイスドライバのバイナリデータである。バイナリファイル４０２ｃは、デバイスドライバのプログラムの本体である。
チェックサムファイル４０２ｄは、ドライバ構成ファイル４０２の正常性を検証する情報を保持する。例えば、チェックサムファイル４０２は、ドライバ構成ファイル４０２の一部が破損していないことや、改変が行われていないことを検証するための情報を保持する。
【００６２】
図８は、ドライバ属性ファイルの例を示す図である。ドライバ属性ファイル４０２ａは、記憶部１３３に格納される。ドライバ属性ファイル４０２ａは、フィールド番号および内容の項目を含む。フィールド番号は、ドライバ属性ファイル４０２ａにおける記憶領域（フィールド）を識別する情報である。内容は、フィールド番号に対応するフィールドにおいて格納する情報の内容を示す情報である。
【００６３】
例えば、フィールド番号「０」のフィールドは、デバイスドライバの「ドライバ名」が設定される。フィールド番号「１」のフィールドは、デバイスドライバを識別する情報である「デバイスＩＤ」が設定される。例えば、デバイスＩＤには、ＬＡＮ，ＦＣ，ＨＤＤなどのデバイスの識別名が設定される。
【００６４】
フィールド番号「２」のフィールドは、デバイスドライバの提供元のベンダを識別する情報である「ベンダＩＤ」が設定される。
フィールド番号「３」のフィールドは、デバイスドライバのバージョンを識別する情報である「版数」が設定される。例えば、版数には、“Ｖ０５”などの情報が設定される。
【００６５】
フィールド番号「４」のフィールドは、デバイスドライバのｏｐｅｎ関数の展開先の相対アドレス（「ｏｐｅｎ関数の相対アドレス」）が設定される。相対アドレスは、ＲＡＭ１０２上にロードされたデバイスドライバの先頭アドレスからの相対値を示す。フィールド番号「５」のフィールドは、デバイスドライバのｒｅｌｅａｓｅ関数の展開先の相対アドレス（「ｒｅｌｅａｓｅ関数の相対アドレス」）が設定される。フィールド番号「６」のフィールドは、デバイスドライバのｒｅａｄ関数の展開先の相対アドレス（「ｒｅａｄ関数の相対アドレス」）が設定される。フィールド番号「７」のフィールドは、デバイスドライバのｗｒｉｔｅ関数の展開先の相対アドレス（「ｗｒｉｔｅ関数の相対アドレス」）が設定される。フィールド番号「８」のフィールドは、デバイスドライバのｉｏｃｔｌ関数の展開先の相対アドレス（「ｉｏｃｔｌ関数の相対アドレス」）が設定される。フィールド番号「９」のフィールドは、デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数の展開先の相対アドレス（「ｄｅｖ＿ｐｒｏｘｙ関数の相対アドレス」）が設定される。
【００６６】
図９は、互換性ファイルの例を示す図である。互換性ファイル４０２ｂは、記憶部１３３に格納される。互換性ファイル４０２ｂは、デバイスドライバについてオンラインアップデートが可能か否かを示す情報を有するファイルである。互換性ファイル４０２ｂは、フィールド番号、バージョンおよびオンラインアップデート可否の項目を含む。
【００６７】
フィールド番号は、互換性ファイル４０２ｂにおけるフィールドを識別する情報である。バージョンは、デバイスドライバのバージョンを識別する情報である。オンラインアップデート可否は、バージョンの項目で示されたデバイスドライバについて、オンラインアップデートが可能であるか否かを示す情報である。
【００６８】
例えば、フィールド番号「０」のフィールドは、デバイスドライバのバージョンが「Ｖ０５」について、オンラインアップデートが「ＯＫ（可）」であることを示す。また、フィールド番号「３」のフィールドは、デバイスドライバのバージョンが「Ｖ０２」について、オンラインアップデートが「ＮＧ（不可）」であることを示す。
【００６９】
図１０は、実デバイスファイルの例を示す図である。実デバイスファイル４０５は、記憶部１３３に格納される。実デバイスファイル４０５は、現デバイスファイルと呼ばれてもよい。実デバイスファイル４０５は、フィールド番号および内容の項目を含む。フィールド番号は、実デバイスファイル４０５におけるフィールドを識別する情報である。内容は、フィールド番号に対応するフィールドにおいて格納する情報の内容を示す情報である。
【００７０】
例えば、フィールド番号「０」のフィールドは、実デバイスファイル４０５を識別する「論理デバイス名」が設定される。フィールド番号「１」のフィールドは、デバイスドライバを識別する情報である「デバイスＩＤ」が設定される。例えば、デバイスＩＤには、ＬＡＮ，ＦＣ，ＨＤＤなどのデバイスの識別名が設定される。フィールド番号「２」のフィールドは、デバイスドライバの提供元のベンダを識別する情報である「ベンダＩＤ」が設定される。
【００７１】
フィールド番号「３」のフィールドは、デバイスドライバのバージョンを識別する情報である「版数」が設定される。例えば、版数には、Ｖ０４などが設定される。フィールド番号「４」のフィールドは、ｏｐｅｎ関数のエントリアドレス（エントリポイントのアドレス）が設定される。エントリアドレスは、ＲＡＭ１０２上にロードされた該当の関数の絶対アドレスを示す。フィールド番号「５」のフィールドは、ｒｅｌｅａｓｅ関数のエントリアドレスが設定される。フィールド番号「６」のフィールドは、ｒｅａｄ関数のエントリアドレスが設定される。フィールド番号「７」のフィールドは、ｗｒｉｔｅ関数のエントリアドレスが設定される。フィールド番号「８」のフィールドは、ｉｏｃｔｌ関数のエントリアドレスが設定される。フィールド番号「９」のフィールドは、ｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレスが設定される。
【００７２】
フィールド番号「１０」のフィールドは、デバイスドライバの実行状態を識別する情報である「動作モード」が設定される。例えば、実デバイスファイル４０５の動作モードとして、「実デバイス」が設定される。フィールド番号「１１」のフィールドは、デバイスドライバの動作状態を識別する情報である「動作状態」が設定される。例えば、動作状態として、「通常読込完了」、「通常オープン」、「仮オープン」のいずれかが設定される。フィールド番号「１２」のフィールドは、デバイスドライバの入出力データのＲＡＭ１０２上の開始位置を示すアドレス（「メモリマップされたＩ／Ｏの開始アドレス」）が設定される。フィールド番号「１３」のフィールドは、デバイスについてバスから見た位置情報を識別する情報である「ＰＣＩバスアドレス」が設定される。フィールド番号「１４」のフィールドは、未使用領域である。
【００７３】
図１１は、仮デバイスファイルの例を示す図である。仮デバイスファイル４０６は、記憶部１３３に格納される。仮デバイスファイル４０６は、フィールド番号、内容の項目を含む。仮デバイスファイル４０６は、フィールド番号および内容の項目を含む。
【００７４】
フィールド番号は、仮デバイスファイル４０６におけるフィールドを識別する情報である。内容は、フィールド番号に対応するフィールドに格納される情報の内容である。
例えば、フィールド番号「０」のフィールドは、仮デバイスファイル４０６を識別する「論理デバイス名」が設定される。フィールド番号「１」のフィールドは、デバイスドライバを識別する情報である「デバイスＩＤ」が設定される。例えば、デバイスＩＤには、ＬＡＮ，ＦＣ，ＨＤＤなどのデバイスの識別名が設定される。フィールド番号「２」のフィールドは、仮デバイスファイル４０６に対応するデバイスドライバの提供元のベンダを識別する情報である「ベンダＩＤ」が設定される。
【００７５】
フィールド番号「３」のフィールドは、デバイスドライバのバージョンを識別する情報である「版数」が設定される。例えば、版数には、Ｖ０５などが設定される。フィールド番号「４」のフィールドは、ｏｐｅｎ関数のエントリアドレスが設定される。フィールド番号「５」のフィールドは、ｒｅｌｅａｓｅ関数のエントリアドレスが設定される。フィールド番号「６」のフィールドは、ｒｅａｄ関数のエントリアドレスが設定される。フィールド番号「７」のフィールドは、ｗｒｉｔｅ関数のエントリアドレスが設定される。フィールド番号「８」のフィールドは、ｉｏｃｔｌ関数のエントリアドレスが設定される。フィールド番号「９」のフィールドは、ｄｅｖ＿ｐｒｏｘｙ関数（仮デバイスファイル４０６に対応する新デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数）のエントリアドレスが設定される。
【００７６】
フィールド番号「１０」のフィールドは、デバイスドライバの実行状態を識別する情報である「動作モード」が設定される。例えば、仮デバイスファイル４０６の動作モードとして、「仮デバイス」が設定される。
【００７７】
フィールド番号「１１」のフィールドは、デバイスドライバの動作状態を識別する情報である「動作状態」が設定される。例えば、動作状態として、「仮読込完了」、「仮オープン」のいずれかが設定される。
【００７８】
フィールド番号「１２」のフィールドは、実デバイスドライバ（実デバイスファイル４０５に対応するデバイスドライバ）のｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレスが設定される。
【００７９】
フィールド番号「１３」のフィールドは、ＰＣＩバスアドレスが設定される。なお、フィールド番号「１３」のフィールドには、実デバイスファイル４０５の同名のフィールドと同じＰＣＩバスアドレスが設定される。
【００８０】
フィールド番号「１４」のフィールドは、デバイスドライバの入出力データの開始位置を識別する情報である「メモリマップされたＩ／Ｏの開始アドレス」が設定される。
図１２は、ドライバ制御部の新ドライバ読込処理の例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。
【００８１】
（Ｓ１１）ドライバ制御部１３２は、デバイスドライバの更新指示を受け付け、更新指示を受けたデバイスドライバのオンラインでの更新の可否を判定する。例えば、デバイスドライバの更新指示は、ユーザにより入力される。
【００８２】
具体的には、ドライバ制御部１３２は、更新指示を受けたデバイスドライバのバージョンを取得し、互換性ファイル４０２ｂのオンラインアップデート可否の項目を参照することで、オンラインアップデート可否を判定する。ドライバ制御部１３２は、オンラインアップデートが可能である場合、ステップＳ１３にすすむ。ドライバ制御部１３２は、オンラインアップデートが不可である場合、ステップＳ１２にすすむ。
【００８３】
（Ｓ１２）ドライバ制御部１３２は、デバイスドライバのオフライン更新処理を実行する。デバイスドライバのオフライン更新処理は、実デバイスを閉塞して動作中デバイスドライバから新デバイスドライバへ更新し、更新後に実デバイスの閉塞を解除する処理である。デバイスドライバのオフライン更新処理は、後で図１３を用いて説明される。
【００８４】
（Ｓ１３）ドライバ制御部１３２は、新デバイスドライバのドライバ属性ファイル４０２ａからデバイスＩＤおよびベンダＩＤを読み込む。そして、ドライバ制御部１３２は、読み込んだデバイスＩＤおよびベンダＩＤと既に存在する実デバイスファイルのデバイスＩＤおよびベンダＩＤとが一致することを確認する。
【００８５】
（Ｓ１４）ドライバ制御部１３２は、実デバイスファイルを参照し、仮デバイスファイルを作成する。具体的な設定内容は、図１１で例示した通りである。特に、ドライバ制御部１３２は、仮デバイスファイルのフィールド番号「１２」のフィールドには、実デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレスを設定する。また、ドライバ制御部１３２は、仮デバイスファイルの動作状態を「仮読込完了」に設定する。
【００８６】
（Ｓ１５）ドライバ制御部１３２は、更新対象の全実デバイスファイルに対し仮デバイスファイルを作成済であるか否かを判定する。ドライバ制御部１３２は、更新対象の全実デバイスファイルに対する仮デバイスファイルを作成済みである場合、ステップＳ１６にすすむ。ドライバ制御部１３２は、更新対象の全実デバイスファイルに対する仮デバイスファイルを作成済でない場合、ステップＳ１４にすすみ、未処理の実デバイスファイルに対する仮デバイスファイルの作成を行う。
【００８７】
（Ｓ１６）ドライバ制御部１３２は、仮デバイスファイルの動作状態を仮オープンとする。仮オープンは、通常オープンとは異なり、ｒｅａｄ関数およびｗｒｉｔｅ関数の実行ができない制限状態とする機能である。すなわち、仮オープン状態の仮デバイスファイルでは、新デバイスファイルの関数のうち、制限対象の関数を利用することはできない。新デバイスドライバは、仮に、仮オープン状態でデバイスに対するＲｅａｄ／Ｗｒｉｔｅ関数によるアクセス要求を受け付けても、ビジー応答を返す。これにより、動作中のデバイスドライバによるデバイスアクセスへの影響を抑えられる。仮オープン時、新デバイスドライバは、仮デバイスファイルの「メモリマップされたＩ／Ｏの開始アドレス」をパラメータとし、動作中デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数を経由して、現デバイスドライバが保持するパラメータ毎の値を読み出す。新デバイスドライバは、読み出したパラメータの値を、記憶部１３３に記憶されたデバイス初期化テーブル４００のＲｅａｄ値に登録する。
【００８８】
（Ｓ１７）ドライバ制御部１３２は、ステップＳ１４で作成した全ての仮デバイスファイルについて仮オープンが完了したか否かを判定する。
ドライバ制御部１３２は、全ての仮デバイスファイルの仮オープンが完了した場合、ステップＳ１８にすすむ。ドライバ制御部１３２は、全ての仮デバイスファイルの仮オープンを完了していない場合、ステップＳ１６にすすみ、未だ仮オープンしていない仮デバイスファイルの仮オープンを行う。
【００８９】
（Ｓ１８）ドライバ制御部１３２は、現デバイスに対するアクセス（既存のＩＯ処理）が全て完了するまで待ち合わせてから実デバイスを閉塞するようにＩＯ要求処理部１３１に指示する。なお、閉塞指示の対象となるデバイスは、ステップＳ１１において更新指示のあったデバイスドライバのアクセス対象であるデバイスである。
【００９０】
（Ｓ１９）ドライバ制御部１３２は、実デバイスファイルのフィールド番号「１１」に対応する動作状態を「仮オープン」に変更する。また、ドライバ制御部１３２は、実デバイスファイルのフィールド番号「１０」の動作モードを「仮デバイス」に変更する。また、ドライバ制御部１３２は、実デバイスファイルのフィールド番号の「１２」のアドレスを別の記憶領域に保存してから、当該アドレスを、新デバイスファイルの「ｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレス」に変更する。
【００９１】
（Ｓ２０）ドライバ制御部１３２は、仮デバイスファイルの設定内容と実デバイスファイルの設定内容とを書き換えることで、新デバイスファイルを作成する。具体的には、ドライバ制御部１３２は、仮デバイスファイルのフィールド番号「１０」を「実デバイス」に、フィールド番号「１２」を実デバイスファイルのフィールド番号「１２」の「メモリマップされたＩ／Ｏの開始アドレス」に設定されていたアドレス（ステップＳ１９で保存されたアドレス）にそれぞれ変更する。これにより、仮デバイスファイルのフィールド番号「１４」は、未使用領域となる。更に、ドライバ制御部１３２は、仮デバイスファイルの「メモリマップされたＩ／Ｏの開始アドレス」で示される設定情報に、デバイス初期化テーブル４００で示される差分のパラメータの設定値を反映させる。ここで、差分のパラメータは、デバイス初期化テーブル４００のうち、Ｒｅａｄ値と期待値とが異なるパラメータである。また、反映される設定値は、期待値である。なお、期待値が「ｎｏｎｅ」であるパラメータについては、既存の設定をそのまま利用可能である（該当パラメータの設定変更を省略する）。こうして設定変更された仮デバイスファイルが、新デバイスファイルとなる。ドライバ制御部１３２は、新デバイスファイルの動作状態を「通常読込完了」に設定する。
【００９２】
（Ｓ２１）ドライバ制御部１３２は、ステップＳ２０で作成した新デバイスファイルの実オープン（ｏｐｅｎ関数の実行）を行う。新デバイスファイルの動作状態は「通常オープン」となる。これにより、新デバイスファイルを介して、新デバイスドライバの全ての関数の機能を利用可能となる。すなわち、ステップＳ２１により、新デバイスファイルは起動する（新デバイスファイルは完全に起動する）。このとき、ドライバ制御部１３２は、該当のデバイスにアクセスする際の論理デバイス名を新デバイスファイルの論理デバイス名とし、当該新デバイスファイルを介してデバイスにアクセスするようにＩＯ要求処理部１３１に指示する。
【００９３】
（Ｓ２２）ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了したか否かを判定する。ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了した場合、ステップＳ２３にすすむ。ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了していない場合、ステップＳ１９にすすみ、未だ実オープンが完了していない新デバイスファイルについて実オープンを行う。
【００９４】
（Ｓ２３）ドライバ制御部１３２は、ＩＯ要求処理部１３１にデバイスの閉塞解除を指示する。なお、閉塞指示の対象となるデバイスは、ステップＳ１８において閉塞指示をしたデバイスである。
【００９５】
（Ｓ２４）ドライバ制御部１３２は、旧デバイスドライバの解放（ｒｅｌｅａｓｅ関数の実行）を行い、ドライバ制御部１３２の新ドライバ読込処理を終了する。具体的には、ドライバ制御部１３２は、デバイスファイルに対するリリース処理を行うことで、実行中であったデバイスドライバ（旧デバイスドライバ）に対して割り当てられた記憶領域の解放などを行い、ドライバ制御部１３２の新ドライバ読込処理を終了する。
【００９６】
こうして、ドライバ制御部１３２は、オンライン更新により、旧デバイスドライバから新デバイスドライバへの切り替えを行う。
特に、動作中デバイスドライバ（現デバイスドライバ）は、動作中デバイスドライバにおける設定情報を応答する第１のｄｅｖ＿ｐｒｏｘｙ関数（第１の関数）を含む。ドライバ制御部１３２は、動作中デバイスドライバの動作中（アクセス許可中）に、仮デバイスファイルを介して第１のｄｅｖ＿ｐｒｏｘｙ関数を実行し、動作中デバイスドライバにおける設定情報を取得する。これにより、動作中デバイスドライバの動作を妨げずに、現在の設定情報を取得することができる。
【００９７】
また、新デバイスドライバは、新デバイスドライバにおける設定情報を応答する第２のｄｅｖ＿ｐｒｏｘｙ関数（第２の関数）を含む。ドライバ制御部１３２は、動作中デバイスドライバ（現デバイスドライバ）から新デバイスドライバへの切り替えの際に、現デバイスファイルに第２のｄｅｖ＿ｐｒｏｘｙ関数のＲＡＭ１０２におけるアドレス（エントリアドレス）を設定する。これにより、万一、新デバイスドライバの動作に不具合が発生しても、新デバイスドライバの設定情報を、旧デバイスドライバ側から取得可能となる。したがって、ドライバ制御部１３２は、新デバイスドライバと旧デバイスドライバとを入れ替えて図１２の手順を実行することで、旧デバイスドライバによるデバイスアクセスを復旧させることができる。
【００９８】
更に、ドライバ制御部１３２は、動作中デバイスドライバ（現デバイスドライバ）による既存のアクセスが完了してから、動作中デバイスドライバを停止させ、動作中デバイスドライバから新デバイスドライバへの切り替えを行う。これにより、既存のアクセスを中断させずに、切り替えを行うことができる。
【００９９】
なお、新デバイスドライバは、仮デバイスファイルによる仮オープン状態、および、新デバイスファイル（仮デバイスファイルが変化したもの）による実オープン状態の２種類の状態を取り得る。このため、ドライバ制御部１３２は、新デバイスドライバを２段階に起動しているということもできる。すなわち、ドライバ制御部１３２は、動作中デバイスドライバによるデバイスへのアクセス許可中に、デバイスへのアクセス機能が制限された第１の状態（制限状態または半起動状態ともいえる）で新デバイスドライバを起動させる。第１の状態では、新デバイスドライバにおける、仮オープン、リリースおよび動作中デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数の呼び出しの機能は利用できるが、Ｒｅａｄ／Ｗｒｉｔｅによるデバイスアクセスは制限される。そして、ドライバ制御部１３２は、動作中デバイスドライバによるデバイスへのアクセスが不許可となった後の切り替えのタイミングで、全ての機能が利用可能な第２の状態で新デバイスドライバを起動させる。こうして、新デバイスドライバの２段階の起動状態を実現することで、既存のデバイスドライバの動作中に、既存のデバイスアクセスへの影響を抑えて、既存の設定情報を取得可能となる。
【０１００】
図１３は、オフライン更新処理の例を示すフローチャートである。オフライン更新処理は、ドライバ制御部の新ドライバ読込処理のステップＳ１２に相当する。以下、図１３に示す処理をステップ番号に沿って説明する。
【０１０１】
（Ｓ３１）ドライバ制御部１３２は、現デバイスに対するアクセス（既存のＩＯ処理）が全て完了するまで待ち合わせてから実デバイスを閉塞するようにＩＯ要求処理部１３１に指示する。なお、閉塞指示の対象となるデバイスは、ステップＳ１１において更新指示のあったデバイスドライバのアクセス対象であるデバイスである。
【０１０２】
（Ｓ３２）ドライバ制御部１３２は、動作中デバイスドライバ（旧デバイスドライバ）の解放（ｒｅｌｅａｓｅ関数の実行）を行う。
（Ｓ３３）ドライバ制御部１３２は、新デバイスドライバにより旧デバイスドライバを上書きする。
【０１０３】
（Ｓ３４）ドライバ制御部１３２は、新デバイスドライバの実オープン（ｏｐｅｎ関数の実行）を行う。
（Ｓ３５）ドライバ制御部１３２は、デバイスを初期化する。例えば、ドライバ制御部１３２は、デバイスの動作に用いられる全てのパラメータの設定を行う。
【０１０４】
（Ｓ３６）ドライバ制御部１３２は、新デバイスドライバを初期化する。例えば、ドライバ制御部１３２は、デバイスドライバの動作に用いられる全てのパラメータの設定を行う。
【０１０５】
（Ｓ３７）ドライバ制御部１３２は、ＩＯ要求処理部１３１に実デバイスの閉塞解除を指示し、処理を終了する。
図１４は、ＩＯ要求処理の例を示すフローチャートである。以下、図１４に示す処理をステップ番号に沿って説明する。ＩＯ要求処理部１３１は、ドライバ制御部１３２から指示を受信し、本処理を実行する。
【０１０６】
（Ｓ４１）ＩＯ要求処理部１３１は、ドライバ制御部１３２から閉塞指示を受信したか否かを判定する。ＩＯ要求処理部１３１は、閉塞指示を受信した場合、ステップＳ４２にすすむ。ＩＯ要求処理部１３１は、閉塞指示を受信していない場合、ステップＳ４３にすすむ。
【０１０７】
（Ｓ４２）ＩＯ要求処理部１３１は、既存のＩＯ処理の完了後、デバイスの閉塞をデバイスに指示する。
（Ｓ４３）ＩＯ要求処理部１３１は、閉塞解除の指示を受信したか否かを判定する。ＩＯ要求処理部１３１は、閉塞解除の指示を受信した場合、ステップＳ４４にすすむ。ＩＯ要求処理部１３１は、閉塞解除の指示を受信していない場合、ステップＳ４５にすすむ。
【０１０８】
（Ｓ４４）ＩＯ要求処理部１３１は、デバイスの閉塞解除をデバイスに指示する。
（Ｓ４５）ＩＯ要求処理部１３１は、受信した命令の対象となるデバイスが閉塞中であるか否かを判定する。ＩＯ要求処理部１３１は、デバイスが閉塞中である場合、ステップＳ４６にすすむ。ＩＯ要求処理部１３１は、デバイスが閉塞中でない場合、ステップＳ４７にすすむ。
【０１０９】
（Ｓ４６）ＩＯ要求処理部１３１は、デバイスの閉塞解除まで、デバイスに対する命令の実行の待ち合わせを行う。具体的には、ＩＯ要求処理部１３１は、デバイスの閉塞解除が実行されるまで、命令の実行を保留する。
【０１１０】
（Ｓ４７）ＩＯ要求処理部１３１は、受信した命令をデバイスに指示し、命令を実行させ、処理を終了する。なお、ＩＯ要求処理部１３１は、処理を終了後、ドライバ制御部１３２からの指示待ち状態となる。
【０１１１】
図１５は、新ドライバ読込処理の例を示すシーケンスである。以下、図１５に示す処理をステップ番号に沿って説明する。
（Ｓ５１）サーバ１００のサーバ管理プログラムは、システム管理者からの指示を受け付け、オンラインによるデバイスドライバの更新をドライバ制御部１３２に指示する。
【０１１２】
（Ｓ５２）ドライバ制御部１３２は、互換性ファイル４０２ｂに基づき、オンラインによるデバイスドライバの更新が可能か否かを判定する。ここで、ドライバ制御部１３２は、オンラインによるデバイスドライバの更新が可能であるものとする。
【０１１３】
（Ｓ５３）ドライバ制御部１３２は、実デバイスファイルに対応する仮デバイスファイルを作成する。
（Ｓ５４）ドライバ制御部１３２は、仮デバイスファイルの仮オープンを行う。
【０１１４】
（Ｓ５５）ドライバ制御部１３２は、実デバイスの閉塞をＩＯ要求処理部１３１に指示する。
（Ｓ５６）ＩＯ要求処理部１３１は、実デバイスに対し閉塞処理を実行する。
【０１１５】
（Ｓ５７）ドライバ制御部１３２は、ＩＯ要求処理部１３１から実デバイス閉塞実行完了を示す応答を受け付ける。
（Ｓ５８）ドライバ制御部１３２は、実デバイスファイルの仮オープンを行う。
【０１１６】
（Ｓ５９）ドライバ制御部１３２は、仮デバイスファイルの設定内容と実デバイスファイルの設定内容とを書き換える。ドライバ制御部１３２は、その書き換えにより仮デバイスファイルから新デバイスファイルを作成する。
【０１１７】
（Ｓ６０）ドライバ制御部１３２は、新デバイスファイルの実オープンを行う。
（Ｓ６１）ドライバ制御部１３２は、実デバイスファイルの閉塞解除をＩＯ要求処理部１３１に指示する。
【０１１８】
（Ｓ６２）ＩＯ要求処理部１３１は、実デバイスに対し閉塞解除処理を実行する。
（Ｓ６３）ドライバ制御部１３２は、ＩＯ要求処理部１３１から実デバイス閉塞解除完了を示す応答を受け付ける。
【０１１９】
（Ｓ６４）ドライバ制御部１３２は、デバイスドライバ更新が完了した旨の応答をサーバ管理プログラムに指示する。例えば、ドライバ制御部１３２は、ドライバ初期化完了コード４０１に基づき、コード「０ｘ００」をサーバ管理プログラムに応答する。
【０１２０】
（Ｓ６５）サーバ管理プログラムは、ドライバ制御部１３２からデバイスドライバ更新が完了した旨の応答を受け付け、デバイスドライバの更新処理を終了する。
以上で説明したように、サーバ１００によれば、動作中デバイスドライバ１４５から新デバイスドライバ１４６への更新中に、仮デバイスファイルを用いて実デバイスへのアクセスの一部を許可する。
【０１２１】
このため、デバイスが閉塞される時間が短縮され、サーバ１００からデバイスへのアクセス停止時間が短縮される。その結果、デバイスを利用するアプリケーションやミドルウェアなどの処理でタイムアウトが発生する可能性を減らすことができる。デバイスドライバの切り替え対象のデバイスの数が多いほど、デバイスへのアクセス停止時間の短縮の効果は大きい。
【０１２２】
特に、一般的なドライバの更新では、デバイス初期化テーブル４００で検出される差分のパラメータは比較的少ない。したがって、ドライバ制御部１３２は、図１２のステップＳ２０の処理を比較的短時間で実行することができる。このため、現デバイスドライバによるデバイスアクセスを停止させてから新デバイスドライバによるデバイスアクセスが開始可能になるまでの時間は非常に短くなり、デバイスのビジー状態の待ち合わせ時間を下回る可能性を高められる。これにより、デバイスドライバの切り替えによりデバイスを利用する処理がタイムアウトする可能性を減らせる。その結果、ユーザの業務への影響を抑えて、デバイスドライバの切り替えを行える。
【０１２３】
また、新デバイスドライバによるデバイスアクセスが開始されるまで、旧デバイスドライバを仮オープン状態として残すことにより、万一、新デバイスドライバの動作に不具合があったときに、旧デバイスドライバに切り戻すことも可能となる。
【０１２４】
［第３の実施の形態］
次に、第３の実施の形態について説明する。第３の実施の形態の説明においては、第２の実施の形態と同一部分については適宜省略する。
【０１２５】
ここで、デバイスには、内部情報のテーブルをデバイスドライバにより保持するものがある。例えば、ＳＳＤの場合、ディレクトリ情報や、ウェアレベリングのためのブロック毎の書き込み回数のテーブルなどが挙げられる。このような内部情報の場合、あるタイミングにおいて、現デバイスドライバが参照する記憶領域から、新デバイスドライバが参照する記憶領域へのコピーを行うことも考えられる。しかし、現デバイスドライバ経由でデバイスへの書き込みが大量に発生していると、テーブルの書き換えも大量に発生しており、現デバイスドライバから新デバイスドライバへの切り替えを行えない。
【０１２６】
そこで、第３の実施の形態では、このように内部情報のテーブルを保持するデバイスドライバについて、現デバイスドライバから新デバイスドライバに効率的に切り替える方法を提供する。
【０１２７】
図１６は、第３の実施の形態の内部テーブルの例を示す図である。内部テーブル５００は、ＲＡＭ１０２上の所定の記憶領域に格納される。内部テーブル５００は、サブテーブル５０１，５０２，５０３および書換カウンタ５１０を有する。各サブテーブル（サブテーブル５０１，５０２，５０３）は、動作中デバイスドライバ１４５の実行に利用される情報を保持する。ここで、サブテーブル５０１の識別名は“サブテーブルＡ”である。サブテーブル５０２の識別名は“サブテーブルＢ”である。サブテーブル５０３の識別名は“サブテーブルＣ”である。
【０１２８】
例えば、サブテーブル５０１，５０２，５０３それぞれは、特定の機能に用いられる１つのテーブルを所定サイズ単位に分割したものでもよい。また、サブテーブル５０１，５０２，５０３は、それぞれが動作中デバイスドライバ１４５の３種の機能のうちの何れかに利用されるものでもよい。
【０１２９】
書換カウンタ５１０は、各サブテーブルの更新状況を管理するための情報である。書換カウンタ５１０は、各サブテーブルの書換回数を保持する。書換カウンタの書換回数の初期値は「−１」である。書換回数「−１」の状態で、１回、テーブル更新が行われると、書換回数は「１」となり、以後、テーブル更新のたびに、書換回数に１ずつ加算される。
【０１３０】
ドライバ制御部１３２は、書換回数が「−１」、または、「１以上」であれば、現デバイスドライバの該当のサブテーブルを、ｄｅｖ＿ｐｒｏｘｙ関数１４５ａを介して読み出し、新デバイスドライバにより参照されるＲＡＭ１０２上の記憶領域にコピーする。このとき、現デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、該当のデバイスの全サブテーブルの書換回数を「０」に設定する。
【０１３１】
図１７は、新ドライバ読込処理の例を示すフローチャートである。以下、図１７に示す処理をステップ番号に沿って説明する。
（Ｓ７１）ドライバ制御部１３２は、デバイスドライバの更新指示を受け付け、更新指示を受けたデバイスドライバのオンラインでの更新の可否を判定する。例えば、デバイスドライバの更新指示は、ユーザにより入力される。
【０１３２】
具体的には、ドライバ制御部１３２は、更新指示を受けたデバイスドライバのバージョンを取得し、互換性ファイル４０２ｂを参照し、オンラインアップデート可否を判定する。ドライバ制御部１３２は、オンラインアップデートが可能である場合、ステップＳ７３にすすむ。ドライバ制御部１３２は、オンラインアップデートが不可である場合、ステップＳ７２にすすむ。
【０１３３】
（Ｓ７２）ドライバ制御部１３２は、デバイスドライバのオフライン更新処理を実行する。デバイスドライバのオフライン更新処理は、図１３と同様であるため説明を省略する。
【０１３４】
（Ｓ７３）ドライバ制御部１３２は、新デバイスドライバのドライバ属性ファイル４０２ａからデバイスＩＤおよびベンダＩＤを読み込む。そして、ドライバ制御部１３２は、読み込んだデバイスＩＤおよびベンダＩＤと既に存在する実デバイスファイルのデバイスＩＤおよびベンダＩＤとが一致することを確認する。
【０１３５】
（Ｓ７４）ドライバ制御部１３２は、実デバイスファイルを参照し、仮デバイスファイルを作成する。具体的な設定内容は、図１１で例示した通りである。特に、ドライバ制御部１３２は、仮デバイスファイルのフィールド番号「１２」のフィールドには、実デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレスを設定する。また、ドライバ制御部１３２は、仮デバイスファイルの動作状態を「仮読込完了」に設定する。
【０１３６】
（Ｓ７５）ドライバ制御部１３２は、更新対象の全実デバイスファイルに対し仮デバイスファイルを作成済であるか否かを判定する。ドライバ制御部１３２は、更新対象の全実デバイスファイルに対する仮デバイスファイルを作成済である場合、ステップＳ７６にすすむ。ドライバ制御部１３２は、更新対象の全実デバイスファイルに対する仮デバイスファイルを作成済でない場合、ステップＳ７４にすすみ、未処理の実デバイスファイルに対する仮デバイスファイルの作成を行う。
【０１３７】
（Ｓ７６）ドライバ制御部１３２は、仮デバイスファイルの動作状態を仮オープンとする。新デバイスドライバは、仮に、仮オープン状態でデバイスに対するＲｅａｄ／Ｗｒｉｔｅ関数によるアクセス要求を受け付けても、ビジー応答を返す。これにより、動作中のデバイスドライバによるデバイスアクセスへの影響を抑えられる。仮オープン時、新デバイスドライバは、仮デバイスファイルの「メモリマップされたＩ／Ｏの開始アドレス」をパラメータとし、動作中デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数を経由して、現デバイスドライバが保持するパラメータ毎の値を読み出す。新デバイスドライバは、読み出したパラメータの値を、記憶部１３３に記憶されたデバイス初期化テーブル４００のＲｅａｄ値に登録する。
【０１３８】
（Ｓ７７）ドライバ制御部１３２は、ステップＳ７４で作成した全ての仮デバイスファイルについて仮オープンが完了したか否かを判定する。
ドライバ制御部１３２は、全ての仮デバイスファイルの仮オープンが完了した場合、ステップＳ７８にすすむ。ドライバ制御部１３２は、全ての仮デバイスファイルの仮オープンを完了していない場合、ステップＳ７６にすすみ、未だ仮オープンしていない仮デバイスファイルの仮オープンを行う。
【０１３９】
（Ｓ７８）ドライバ制御部１３２は、デバイスドライバを未切替えのデバイスを対象デバイスとする。すなわち、ドライバ制御部１３２は、動作中デバイスドライバから新デバイスドライバに未だ切り替えていないデバイスを対象デバイスとする。
【０１４０】
（Ｓ７９）ドライバ制御部１３２は、ｄｅｖ＿ｐｒｏｘｙ関数を用いて対象デバイスの動作中デバイスドライバが保持する書換カウンタ５１０の書換回数を読み出す。
（Ｓ８０）ドライバ制御部１３２は、書換カウンタ５１０の全サブテーブルについて書換回数が「０」であるか否かを判定する。ドライバ制御部１３２は、全サブテーブルについて書換回数が「０」である場合、図１８のステップＳ８４にすすむ。ドライバ制御部１３２は、全サブテーブルについて書換回数が「０」でない場合、ステップＳ８１にすすむ。
【０１４１】
（Ｓ８１）ドライバ制御部１３２は、書換回数が「−１」、または、書換回数が「１」以上であるサブテーブル（すなわち、書換回数が「０」以外のサブテーブル）を特定する。
【０１４２】
（Ｓ８２）ドライバ制御部１３２は、ステップＳ８１で特定したサブテーブルを動作中デバイスドライバのｄｅｖ＿ｐｒｏｘｙ関数を用いて取得し、当該サブテーブルを新デバイスドライバの使用領域にコピーする。また、ドライバ制御部１３２は、対象デバイスの全てのサブテーブルに対応する書換回数のクリア（書換回数を「０」に設定）を行う。
【０１４３】
（Ｓ８３）ドライバ制御部１３２は、次の未切替のデバイスを対象デバイスとし、ステップＳ７９にすすむ。
図１８は、新ドライバ読込処理の例（続き）を示すフローチャートである。以下、図１８に示す処理をステップ番号に沿って説明する。
【０１４４】
（Ｓ８４）ドライバ制御部１３２は、実デバイスファイルの動作モードを仮オープンに変更する。また、ドライバ制御部１３２は、実デバイスファイルのフィールド番号「１０」の動作モードを「仮デバイス」に変更する。また、ドライバ制御部１３２は、実デバイスファイルのフィールド番号の「１２」のアドレスを別の記憶領域に保存してから、当該アドレスを、新デバイスファイルの「ｄｅｖ＿ｐｒｏｘｙ関数のエントリアドレス」に変更する。
【０１４５】
（Ｓ８５）ドライバ制御部１３２は、新デバイスドライバが保持する全てのサブテーブルの書換カウンタの書換回数を「−１」（初期値）に設定する。
（Ｓ８６）ドライバ制御部１３２は、仮デバイスファイルと実デバイスファイルとを書き換えることで、新デバイスファイルを作成する。具体的には、ドライバ制御部１３２は、仮デバイスファイルのフィールド番号「１０」を「実デバイス」に、フィールド番号「１２」を実デバイスファイルのフィールド番号「１２」の「メモリマップされたＩ／Ｏの開始アドレス」に設定されていたアドレス（ステップＳ８４で保存されたアドレス）にそれぞれ変更する。これにより、仮デバイスファイルのフィールド番号「１４」は、未使用領域となる。更に、ドライバ制御部１３２は、仮デバイスファイルの「メモリマップされたＩ／Ｏの開始アドレス」で示される設定情報に、デバイス初期化テーブル４００で示される差分のパラメータの設定値を反映させる。ここで、差分のパラメータは、デバイス初期化テーブル４００のうち、Ｒｅａｄ値と期待値とが異なるパラメータである。また、反映される設定値は、期待値である。なお、期待値が「ｎｏｎｅ」であるパラメータについては、既存の設定をそのまま利用可能である（該当パラメータの設定変更を省略する）。こうして設定変更された仮デバイスファイルが、新デバイスファイルとなる。ドライバ制御部１３２は、新デバイスファイルの動作状態を「通常読込完了」に設定する。
【０１４６】
（Ｓ８７）ドライバ制御部１３２は、ステップＳ８６で作成した新デバイスファイルの実オープン（ｏｐｅｎ関数の実行）を行う。新デバイスファイルの動作状態は「通常オープン」となる。これにより、新デバイスファイルを介して、新デバイスドライバの全ての関数の機能を利用可能となる。すなわち、ステップＳ８７により、新デバイスファイルは起動する（新デバイスファイルは完全に起動する）。このとき、ドライバ制御部１３２は、該当のデバイスにアクセスする際の論理デバイス名を新デバイスファイルの論理デバイス名とし、当該新デバイスファイルを介してデバイスにアクセスするようにＩＯ要求処理部１３１に指示する。
【０１４７】
（Ｓ８８）ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了したか否かを判定する。ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了した場合、ステップＳ８９にすすむ。ドライバ制御部１３２は、全ての新デバイスファイルの実オープンが完了していない場合、図１７のステップＳ７８にすすむ。
【０１４８】
（Ｓ８９）ドライバ制御部１３２は、旧デバイスドライバの解放（ｒｅｌｅａｓｅ関数の実行）を行い、ドライバ制御部１３２の新ドライバ読込処理を終了する。具体的には、ドライバ制御部１３２は、デバイスファイルに対するリリース処理を行うことで、実行中であったデバイスドライバ（旧デバイスドライバ）に対して割り当てられた記憶領域の解放などを行い、ドライバ制御部１３２の新ドライバ読込処理を終了する。
【０１４９】
図１９は、ｄｅｖ＿ｐｒｏｘｙ関数の処理例を示すフローチャートである。以下、図１９に示す処理をステップ番号に沿って説明する。
（Ｓ１０１）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、デバイス情報読み出しの指示を受け付けたか否かを判定する。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、デバイス情報の読み出し指示を受け付けた場合、ステップＳ１０２に処理をすすめる。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、デバイス情報の読み出し指示を受け付けていない場合、ステップＳ１０３に処理をすすめる。なお、デバイス情報の読み出し指示は、仮オープン状態の新デバイスドライバにより発行される。
【０１５０】
（Ｓ１０２）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、メモリマップされたＩ／Ｏの開始アドレスに基づき、対応する実デバイスの情報を応答する。
なお、実デバイスの情報は、動作中デバイスドライバにおける各種の設定情報（デバイスドライバの処理に用いられるパラメータの設定値や実デバイスのメモリやレジスタに設定されているパラメータの設定値など）を含む。
【０１５１】
（Ｓ１０３）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、デバイスドライバのサブテーブルの読み出しの指示を受け付けたか否かを判定する。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、サブテーブルの読み出しの指示を受け付けた場合、ステップＳ１０４に処理をすすめる。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、サブテーブルの読み出しの指示を受け付けていない場合、ステップＳ１０５に処理をすすめる。
【０１５２】
（Ｓ１０４）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、指示されたサブテーブルを読み出して応答する。また、ｄｅｖ＿ｐｒｏｘｙ関数は、書換カウンタにおける全てのサブテーブルの書換回数を「０」に設定する。
【０１５３】
（Ｓ１０５）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、書換カウンタの書換回数の読み出しの指示を受け付けたか否かを判定する。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、書換カウンタの書換回数の読み出し指示を受け付けた場合、ステップＳ１０６に処理をすすめる。ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、書換カウンタの書換回数の読み出し指示を受け付けていない場合、処理を終了する。
【０１５４】
（Ｓ１０６）ｄｅｖ＿ｐｒｏｘｙ関数１４５ａは、書換カウンタに含まれる各サブテーブルの書換回数を応答し、処理を終了する。
以上で説明したように、第３の実施の形態では、ドライバ制御部１３２は、動作中デバイスドライバ１４５（現デバイスドライバ）の内部処理に用いられる複数のサブテーブルそれぞれの更新有無を複数のタイミングで監視する。そして、ドライバ制御部１３２は、前回のタイミングから今回のタイミングまでに更新の無いサブテーブルを新デバイスドライバ１４６の参照先の記憶領域にコピーする処理を各タイミングで行う。ドライバ制御部１３２は、複数のサブテーブルの全てのコピーが完了すると、動作中デバイスドライバ１４５を停止させて、動作中デバイスドライバ１４５から新デバイスドライバ１４６への切り替えを行う。
【０１５５】
これにより、動作中デバイスドライバ１４５が保持するサブテーブル毎に、新デバイスドライバ１４６への移行を行える。こうして、内部情報のサブテーブルを大量に保持するデバイスドライバの切り替えを、サブテーブル毎に移行しながら、効率的に行える。
【０１５６】
なお、サブテーブル毎に書換回数を監視する例を説明したが、サブテーブル毎の書換ログを取得し、ログの更新有無によって、サブテーブル毎の書換有無を監視することも考えられる。例えば、新規ログ量が小さくなり、更新分の反映時間が小さくなったタイミングで、動作中デバイスドライバを停止させ、切り替えを行う方法も考えられる。
【０１５７】
なお、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２および第３の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１４に記録できる。
【０１５８】
例えば、プログラムを記録した記録媒体１４を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１４に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０１５９】
１  情報処理装置
１ａ  記憶部
１ｂ  処理部
２  デバイス
３  ソフトウェア
４  現デバイスドライバ
５  現デバイスファイル
６，６ａ  設定情報
７  新デバイスドライバ
８  仮デバイスファイル
８ａ  新デバイスファイル
【図１】
2019016277.tif 000003
【図２】
2019016277.tif 000004
【図３】
2019016277.tif 000005
【図４】
2019016277.tif 000006
【図５】
2019016277.tif 000007
【図６】
2019016277.tif 000008
【図７】
2019016277.tif 000009
【図８】
2019016277.tif 000010
【図９】
2019016277.tif 000011
【図１０】
2019016277.tif 000012
【図１１】
2019016277.tif 000013
【図１２】
2019016277.tif 000014
【図１３】
2019016277.tif 000015
【図１４】
2019016277.tif 000016
【図１５】
2019016277.tif 000017
【図１６】
2019016277.tif 000018
【図１７】
2019016277.tif 000019
【図１８】
2019016277.tif 000020
【図１９】
2019016277.tif 000021