(57)【要約】ライブデバイスドライバ更新を実施するためのシステム、装置、及び方法が開示されている。プロセッサが所与のバージョンのデバイスドライバをロードするとき、この所与のバージョンはオペレーティングシステムに登録されるのではなく、プロキシモジュールに登録される。前バージョンのデバイスドライバが既に動作している場合、プロキシモジュールは所与のバージョンに前バージョンへのポインタを提供する。所与のバージョンは、ポインタを使用して、前バージョンから静的データを取得する。前バージョンが停止した後に、所与のバージョンは、前バージョンから一時データを取得し、次いで実行バージョンのデバイスドライバとして引き継がれる。後続のバージョンのデバイスドライバは、同じようにして前バージョンを置き換えることができる。また、ダウングレードについて言えば、前バージョンのデバイスドライバは、同じようにして後続のバージョンを置き換えることができる。【選択図】図１
2021522594.tif 000002
【特許請求の範囲】
【請求項１】
オペレーティングシステム（ＯＳ）と、プロキシモジュールと、１つ以上のソフトウェアアプリケーションとデバイスとの間のインタラクションを管理するように構成された第１のバージョンのデバイスドライバとのプログラム命令を格納するメモリと、
前記第１のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールのプログラム命令を実行することと、を行うように構成されたプロセッサと、を備えるシステムであって、
前記プロキシモジュールのプログラム命令を実行することは、
前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、前記システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する表示を提供することと、
他のバージョンの前記デバイスドライバが前記システムにロードされておらず、前記デバイスを管理していないと判定することに応答して、前記第１のバージョンの前記デバイスドライバとして前記ＯＳに登録し、前記ＯＳに対して前記第１のバージョンの前記デバイスドライバをエミュレートすることと、を行う、システム。
【請求項２】
前記プロセッサは、更に、
前記デバイスと前記１つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記第１のバージョンの前記デバイスドライバとは異なる第２のバージョンの前記デバイスドライバをロードすることと、
前記第２のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第２のバージョンの前記デバイスドライバに、前記第１のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第２のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第１のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を行うように構成されている、請求項１に記載のシステム。
【請求項３】
前記プロセッサは、更に、
１つ以上の外部スティミュラススレッドを停止する１つ以上のリクエストを生成することと、
前記１つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記１つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
を行うように構成されている、請求項２に記載のシステム。
【請求項４】
前記プロセッサは、更に、
状態情報を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
前記第１のバージョンの前記デバイスドライバを非アクティブ化することと、
を行うように構成されている、請求項２に記載のシステム。
【請求項５】
前記プロセッサは、前記第１のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第２のバージョンの前記デバイスドライバに通知するように構成されている、請求項４に記載のシステム。
【請求項６】
前記プロセッサは、更に、
前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに静的データを転送することと、
前記第１のバージョンの前記デバイスドライバを停止することと、
前記第１のバージョンの前記デバイスドライバを停止した後で、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに一時データを転送することと、
を行うように構成されている、請求項４に記載のシステム。
【請求項７】
前記プロセッサは、更に、
他のデバイスドライバが前記デバイスを現在管理していない場合、前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、第１の表示を提供することと、
別のデバイスドライバが前記デバイスを現在管理している場合、前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、第２の表示を提供することであって、前記第２の表示が前記第１の表示とは異なる、前記提供することと、
を行うように構成されている、請求項１に記載のシステム。
【請求項８】
第１のバージョンのデバイスドライバをプロキシモジュールに登録するために、前記第１のバージョンの前記デバイスドライバのプログラム命令を実行することであって、前記第１のバージョンの前記デバイスドライバが、デバイスと１つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成されている、前記実行すること、を含む方法であって、
前記第１のバージョンの前記デバイスドライバを前記プロキシモジュールに登録した後で、
前記プロキシモジュールのプログラム命令を実行して、前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する表示を提供することと、
他のバージョンの前記デバイスドライバが前記システムにロードされておらず、前記デバイスを管理していないと判定することに応答して、前記第１のバージョンの前記デバイスドライバとしてＯＳに登録し、前記ＯＳに対して前記第１のバージョンの前記デバイスドライバをエミュレートすることと、
を行う、方法。
【請求項９】
第２のバージョンの前記デバイスドライバをロードすることであって、前記第２のバージョンの前記デバイスドライバが、前記デバイスと前記１つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成されており、前記第２のバージョンの前記デバイスドライバが、前記第１のバージョンの前記デバイスドライバとは異なる、前記ロードすることと、
前記第２のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第２のバージョンの前記デバイスドライバに、前記第１のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第２のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第１のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を更に含む、請求項８に記載の方法。
【請求項１０】
１つ以上の外部スティミュラススレッドを停止する１つ以上のリクエストを生成することと、
前記１つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記１つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
を更に含む、請求項９に記載の方法。
【請求項１１】
状態情報を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
前記第１のバージョンの前記デバイスドライバを非アクティブ化することと、
を更に含む、請求項９に記載の方法。
【請求項１２】
前記第１のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第２のバージョンの前記デバイスドライバに通知することを更に含む、請求項１１に記載の方法。
【請求項１３】
前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに静的データを転送することと、
前記第１のバージョンの前記デバイスドライバを停止することと、
前記第１のバージョンの前記デバイスドライバを停止した後で、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに一時データを転送することと、
を更に含む、請求項１１に記載の方法。
【請求項１４】
前記プロセッサは、更に、他のデバイスドライバが前記デバイスを現在管理していない場合、前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、第１の表示を提供することと、
別のデバイスドライバが前記デバイスを現在管理している場合、前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、第２の表示を提供することであって、前記第２の表示が前記第１の表示とは異なる、前記提供することと、
を行うように構成された、請求項８に記載の方法。
【請求項１５】
第１のバージョンのデバイスドライバをプロキシモジュールに登録することであって、前記第１のバージョンの前記デバイスドライバが、デバイスと１つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記登録すること、を行うようにプロセッサによって実行可能なプログラム命令を含む非一時的なコンピュータ可読記憶媒体であって、
前記第１のバージョンの前記デバイスドライバを前記プロキシモジュールに登録した後で、
前記プロキシモジュールから前記第１のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する表示を提供することと、
他のバージョンの前記デバイスドライバが前記デバイスを管理していないと判定することに応答して、前記第１のバージョンの前記デバイスドライバの代わりに、前記プロキシモジュールをＯＳに登録し、前記プロキシモジュールにより、前記ＯＳに対して前記第１のバージョンの前記デバイスドライバをエミュレートすることと、
を行う、非一時的なコンピュータ可読記憶媒体。
【請求項１６】
前記プログラム命令が、更に、
前記デバイスと前記１つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記第１のバージョンの前記デバイスドライバとは異なる第２のバージョンの前記デバイスドライバをロードすることと、
前記第２のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第２のバージョンの前記デバイスドライバに、前記第１のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第２のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第１のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を行うように実行可能である、請求項１５に記載の非一時的なコンピュータ可読記憶媒体。
【請求項１７】
前記プログラム命令が、更に、
１つ以上の外部スティミュラススレッドを停止するリクエストを生成することと、
前記１つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記１つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
を行うように実行可能である、請求項１６に記載の非一時的なコンピュータ可読記憶媒体。
【請求項１８】
前記プログラム命令が、更に、
状態情報を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに移すことと、
前記第１のバージョンの前記デバイスドライバを非アクティブ化することと、
を行うように実行可能である、請求項１６に記載の非一時的なコンピュータ可読記憶媒体。
【請求項１９】
前記プログラム命令が、更に、前記第１のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第２のバージョンの前記デバイスドライバに通知するように実行可能である、請求項１８に記載の非一時的なコンピュータ可読記憶媒体。
【請求項２０】
前記プログラム命令が、更に、
前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに静的データを転送することと、
前記第１のバージョンの前記デバイスドライバを停止することと、
前記第１のバージョンの前記デバイスドライバを停止した後で、前記第１のバージョンの前記デバイスドライバから前記第２のバージョンの前記デバイスドライバに一時データを転送することと、
を行うように実行可能である、請求項１８に記載の非一時的なコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
関連技術の説明
バグ修正またはセキュリティパッチは、実運用のカーネルモジュールコードベースに定期的に適用される。一部のコンピューティング環境では、これらのパッチにより動作環境が中断されることになる。例えば、クラウドサービスプロバイダ（ＣＳＰ）は、数千のホストを備える実運用環境で様々なソフトウェアモジュールを実行する。大規模なＣＳＰが、更新バージョンのカーネルデバイスモジュール（すなわち、デバイスドライバ）をインストールするために、ユーザをホストから追い出すことは現実的ではない。また、全てのユーザが自発的にログオフするまで待つことも不可能である。
【０００２】
更に、対応するデバイスが動作している間に、実行中のカーネルデバイスモジュール（または略してモジュール）を交換しようとするのは、難しい場合がある。モジュールをアンロードし、リロードする行為が、消失状態という事態を招く可能性がある。１つの問題として、新しいモジュールは、古いモジュールが残した状態を全く認識しないことが挙げられる。古いモジュールがアンロードされ、新しいモジュールがロードを開始した後の期間は、デバイスを管理するドライバがなくなる。デバイスに対するアクティビティまたは状態の変更は全て失われる。
【０００３】
本明細書で説明される方法及び機構の利点は、添付の図面と併せて以下の説明を参照することにより、一層よく理解することができる。
【図面の簡単な説明】
【０００４】
【図１】コンピューティングシステムの一実施態様のブロック図である。
【図２】サーバの仮想環境の一実施態様のブロック図である。
【図３】コンピューティングシステムの一実施態様のブロック図を示す。
【図４】コンピューティングシステムの一実施態様のブロック図を示す。
【図５】コンピューティングシステムの一実施態様のブロック図を示す。
【図６】コンピューティングシステムの一実施態様のブロック図を示す。
【図７】ＯＳ、プロキシモジュール、及びカーネルデバイスモジュール間のインタラクションの一実施態様のシーケンス図を示す。
【図８】新しいカーネルデバイスモジュールをロードする際のインタラクションの一実施態様のシーケンス図を示す。
【図９】新しいカーネルデバイスモジュールをロードする際のインタラクションの一実施態様のシーケンス図を示す。
【図１０】既存のカーネルデバイスモジュールバージョンを停止する一実施態様のシーケンス図を示す。
【図１１】カーネルデバイスモジュールをロードするための方法の一実施態様を示す一般化された流れ図である。
【図１２】デバイスの制御を、第１のバージョンのデバイスドライバから第２のバージョンのデバイスドライバに移すために、第１のバージョンのデバイスドライバを停止する方法の一実施態様を示す一般化された流れ図である。
【発明を実施するための形態】
【０００５】
本明細書に提示される方法及び機構の理解の徹底を期すために、以下の記述では、多くの具体的な詳細が述べられている。しかしながら、当業者は、それらの具体的な詳細をその通りに用いなくても、様々な実施態様の実施が可能であることを認識するはずである。いくつかの事例では、周知の構造、構成要素、信号、コンピュータプログラム命令、及び技法については、本明細書で説明するアプローチを分かりにくくすることを避けるために、詳細に示していない。説明を単純かつ明瞭にするために、図に示す要素は必ずしも縮尺通りに描かれていないことが理解されよう。例えば、一部の要素の寸法が、他の要素に比較して誇張される場合がある。
【０００６】
カーネルデバイスモジュールのライブ更新を実行するための様々なシステム、装置、及び方法が本明細書に開示されている。一実施態様では、プロキシモジュールがシステムにロードされ、プロキシモジュールが、２つの異なるバージョンのカーネルデバイスモジュールのための登録ポイント及び通信ポイントを提供する。一実施態様では、プロキシモジュール及びカーネルデバイスモジュールは、ロード可能なカーネルモジュールである。プロキシモジュールは、第１のバージョンのカーネルデバイスモジュールから第２のバージョンのカーネルデバイスモジュールに制御が移されるときに、ロード可能な２つのバージョンのカーネルモジュールを同時にアクティブにしながら、複製することも、解放することもできないドライバアクティビティを実行する。一実施態様では、プロキシモジュールは、デバイス登録、入出力制御（ＩＯＣＴＬ）呼び出し、ｓｙｓｆｓ呼び出し、及びその他のアクティビティを含むがこれらに限定されないアクティビティを実行する。
【０００７】
第１のバージョンのカーネルデバイスモジュールがロードされると、これは、プロキシモジュールからエクスポートされたアプリケーションプログラミングインタフェース（ＡＰＩ）を使用して、プロキシモジュールに登録される。次いでプロキシモジュールは、第１のバージョンのカーネルデバイスモジュールを装って、オペレーティングシステム（ＯＳ）に登録される。プロキシモジュールは、全ての必要なオープンｓｙｓｆｓ属性ファイル及びＩＯＣＴＬファイル属性を維持する。第２のバージョンのカーネルデバイスモジュールがロードされると、第２のバージョンのカーネルデバイスモジュールもまたプロキシモジュールに登録される。プロキシモジュールは既にＯＳに登録されているので、プロキシモジュールはその登録ステップを繰り返す必要はない。各バージョンのカーネルデバイスモジュールがプロキシモジュールに登録されるので、プロキシモジュールは、どのように各バージョンのカーネルデバイスモジュールを見つけて通信したらいいかを認識している。新しいバージョンのカーネルデバイスモジュールは、他のバージョンを探すために、プロキシモジュールにクエリを実行し、２つのバージョンが直接通信できるようにする。一実施態様では、２つのバージョンのカーネルデバイスモジュールが互いに直接通信できるようになると、この２つのバージョンは、プロキシモジュールからの更なる支援を必要とせずに、それらの間のデバイス制御の移行を管理する。
【０００８】
ここで図１を参照すると、コンピューティングシステム１００の一実施態様のブロック図が示されている。一実施態様では、コンピューティングシステム１００は、少なくともプロセッサ１０５Ａ〜１０５Ｎ、入力／出力（Ｉ／Ｏ）インタフェース１２０、バス１２５、メモリコントローラ（複数可）１３０、ネットワークインタフェースコントローラ（ＮＩＣ）１３５、及びメモリデバイス（複数可）１４０を含む。他の実施態様では、コンピューティングシステム１００は他の構成要素を含み、及び／またはコンピューティングシステム１００は異なるように構成される。プロセッサ１０５Ａ〜１０５Ｎは、システム１００に含まれる任意の数のプロセッサを表している。一実施態様では、プロセッサ１０５Ａは、中央処理装置（ＣＰＵ）などの汎用プロセッサである。一実施態様では、プロセッサ１０５Ｎは、高並列アーキテクチャを有するデータ並列プロセッサである。データ並列プロセッサには、グラフィックスプロセッシングユニット（ＧＰＵ）、デジタルシグナルプロセッサ（ＤＳＰ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、特定用途向け集積回路（ＡＳＩＣ）などが含まれる。いくつかの実施態様では、プロセッサ１０５Ａ〜１０５Ｎは、複数のデータ並列プロセッサを含む。
【０００９】
メモリコントローラ（複数可）１３０は、Ｉ／Ｏインタフェース１２０に結合されたプロセッサ１０５Ａ〜１０５Ｎ及びＩ／Ｏデバイス（図示せず）によってアクセス可能な任意の数及び種類のメモリコントローラを表す。メモリコントローラ（複数可）１３０は、任意の数及び種類のメモリデバイス（複数可）１４０に結合されている。メモリデバイス（複数可）１４０は、任意の数及び種類のメモリデバイスを表す。例えば、メモリデバイス（複数可）１４０内のメモリの種類としては、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、スタティックランダムアクセスメモリ（ＳＲＡＭ）、ＮＡＮＤフラッシュメモリ、ＮＯＲフラッシュメモリ、強誘電体ランダムアクセスメモリ（ＦｅＲＡＭ）、またはその他のメモリが挙げられる。
【００１０】
Ｉ／Ｏインタフェース１２０は、任意の数及び種類のＩ／Ｏインタフェース（例えば、ペリフェラルコンポーネントインターコネクト（ＰＣＩ）バス、ＰＣＩエクステンデッド（ＰＣＩ−Ｘ）、ＰＣＩＥ（ＰＣＩ  Ｅｘｐｒｅｓｓ）バス、ギガビットイーサネット（ＧＢＥ）バス、ユニバーサルシリアルバス（ＵＳＢ））を表す。各種の周辺デバイス（図示せず）がＩ／Ｏインタフェース１２０に結合されている。このような周辺デバイスには、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティックまたは他の種類のゲームコントローラ、メディア記録デバイス、外部ストレージデバイス、ネットワークインタフェースカードなどが含まれる（ただし、これらに限定されない）。ネットワークインタフェースコントローラ（ＮＩＣ）１３５は、ネットワーク１４５を通してネットワークメッセージを送信し、受信する。
【００１１】
ネットワーク１４５は、無線接続、直接ローカルエリアネットワーク（ＬＡＮ）、メトロポリタンエリアネットワーク（ＭＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、イントラネット、インターネット、ケーブルネットワーク、パケット交換ネットワーク、光ファイバネットワーク、ルータ、ストレージエリアネットワーク、または他の種類のネットワークを含む任意の種類のネットワークまたはネットワークの組み合わせを表す。ＬＡＮの例には、イーサネットネットワーク、光ファイバ分散データインタフェース（ＦＤＤＩ）ネットワーク、及びトークンリングネットワークが含まれる。様々な実施態様において、ネットワーク１４５は、リモートダイレクトメモリアクセス（ＲＤＭＡ）ハードウェア及び／またはソフトウェア、伝送制御プロトコル／インターネットプロトコル（ＴＣＰ／ＩＰ）ハードウェア及び／またはＴＣＰ／ＩＰソフトウェア、ルータ、リピータ、スイッチ、グリッド、及び／またはその他の構成要素を更に含む。
【００１２】
様々な実施態様において、コンピューティングシステム１００は、コンピュータ、ラップトップ、モバイルデバイス、ゲームコンソール、サーバ、ストリーミングデバイス、ウェアラブルデバイス、または他の様々な種類のいずれかのコンピューティングシステムもしくはコンピューティングデバイスである。コンピューティングシステム１００の構成要素の数は、実施態様ごとに異なることに留意されたい。例えば、他の実施態様では、図１に示した数よりも多いかまたは少ない各構成要素が存在する。他の実施態様では、コンピューティングシステム１００は、図１に示していない他の構成要素を含むことにも留意されたい。更に、他の実施態様では、コンピューティングシステム１００は、図１に示すものと違う他の方法で構築される。
【００１３】
次に図２を参照すると、サーバ２００の仮想環境の一実施態様のブロック図が示される。一実施態様では、サーバ２００は、クライアント２０５Ａ〜２０５Ｎ、仮想マシン（ＶＭ）２１５Ａ〜２１５Ｎ、仮想マシンモニタ（ＶＭＭ）２２０、ホストハードウェア２３０、メモリ２４０、バス／ファブリック２５０、及びデバイス２５５を含む。一実施態様では、サーバ２００は、クラウドサービスプロバイダ環境の一部である。サーバ２００は、一実施態様で使用されるサーバアーキテクチャの単なる一例にすぎないことを理解されたい。他の実施態様では、サーバは、他の好適な方法で構成された他の数及び／または種類の構成要素を含む。
【００１４】
クライアント２０５Ａ〜２０５Ｎは、サーバ２００上のリソースに結合されている任意の数のクライアント、及び／またはサーバ２００上のリソースを使用している任意の数のクライアントを表す。クライアント２０５Ａ〜２０５Ｎは、それぞれ、任意の数及び種類のアプリケーション２０７及び２０８を含む。クライアント２０５Ａ〜２０５Ｎのそれぞれの中のアプリケーションの１つは、例えば、Ｌｉｎｕｘ（登録商標）またはＭｉｃｒｏｓｏｆｔ（登録商標）Ｗｉｎｄｏｗｓ（登録商標）などのオペレーティングシステムであり得る。各クライアント２０５Ａ〜２０５Ｎはまた、デバイス２５５とインタラクトするために、それぞれゲストドライバ２１０Ａ〜２１０Ｎを含み得る。一実施態様では、クライアント２０５Ａ〜２０５Ｎごとに、仮想マシン（ＶＭ）２１５Ａ〜２１５Ｎが、サーバ２００上にインスタンス化される。一実施態様では、ＶＭＭ２２０は、ＶＭ２１５Ａ〜２１５Ｎをスケジュール設定し、各ＶＭ内のオペレーティングシステムは、デバイス２５５でのアプリケーション２０７〜２０８のスケジューリングを管理する。ホストハードウェア２３０は、任意の数及び種類の処理リソースを含む。例えば、一実施態様では、ホストハードウェア２３０は、複数のＣＰＵ（例えば、マルチコアＣＰＵ）を含む。ホストハードウェア２３０はまた、メモリコントローラロジック、キャッシュサブシステム（複数可）、ファブリック及び／または相互接続リソース、ネットワークインタフェース回路、電力管理回路、電圧調整器などを含む。メモリ２４０は、サーバ２００内に含まれる任意の数及び種類のメモリデバイスを表す。バス／ファブリック２５０は、サーバ２００の様々な構成要素を接続するための任意の種類の相互接続ロジックを含む。単一のデバイス２５５がバス／ファブリック２５０に接続されて示されているが、他の複数のデバイスがバス／ファブリック２５０に接続され得ることが理解されるべきである。一実施態様では、デバイス２５５はＧＰＵである。他の実施態様では、デバイス２５５は、他の様々な種類のいずれかのデバイスである。様々な実施態様において、クライアント２０５Ａ〜２０５Ｎは、少なくとも部分的にデバイス２５５のコンピューティングリソースを使用して実行されるアプリケーションを含み得る。デバイス２５５をそれぞれ使用するクライアント２０５Ａ〜２０５Ｎのゲストドライバ２１０Ａ〜２１０Ｎは、それぞれアプリ２０７及び２０８とデバイス２５５のリソースとの間のインタラクションを管理するように設計されている。
【００１５】
ＯＳ２７０とデバイス２５５との間のインタラクションを管理するために、メモリ２４０は、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａを格納しており、このカーネルデバイスモジュール２６０Ａは、デバイス２５５用のデバイスドライバである。第Ｎのバージョンのカーネルデバイスモジュール２６０Ａがメモリ２４０にロードされて、サーバ２００にインストールされるとき、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａは、オペレーティングシステム（ＯＳ）２７０に登録されるのではなく、プロキシモジュール２６５に登録される。一実施態様では、ＯＳ２７０はＬｉｎｕｘ（登録商標）ベースのＯＳである。他の実施態様では、ＯＳ２７０は、他の様々な種類のいずれかのＯＳ（例えば、Ｗｉｎｄｏｗｓ（登録商標））である。
【００１６】
第Ｎのバージョンのカーネルデバイスモジュール２６０Ａがメモリ２４０にロードされて、サーバ２００にインストールされるとき、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａは、オペレーティングシステム（ＯＳ）２７０に登録されるのではなく、プロキシモジュール２６５に登録される。第Ｎのバージョンのカーネルデバイスモジュール２６０Ａは、前バージョンのデバイスドライバが、既にインストールされていて、デバイス２５５用のサーバ２００で動作しているかどうかを認識していない。プロキシモジュール２６５は、登録処理の間に、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａが第１のデバイスドライバであるかどうか、または前バージョンのデバイスドライバが既に存在しているかどうかを、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａに通知するために表示を返す。サーバ２００の存続期間中に、新たな機能を追加する、バグを修正する、及び／またはその他の種類の変更を加えることのために、デバイス２５５用のデバイスドライバを更新することが望まれる場合がある。ただし、デバイスドライバの更新が、クライアント２０５Ａ〜２０５Ｎの動作との干渉を最小限にすることも望まれる。第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂは、第Ｎのバージョンのカーネルデバイスドライバ２６０Ａを置き換えることを目的とする、デバイス２５５用の新しいバージョンのデバイスドライバを表す。例えば、一実施態様では、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂは、第Ｎのバージョンのカーネルデバイスドライバ２６０Ａとは異なる１つ以上のデータ構造を使用する。
【００１７】
第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂがメモリ２４０にロードされて、サーバ２００にインストールされるとき、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂは、オペレーティングシステム（ＯＳ）２７０に登録されるのではなく、プロキシモジュール２６５に登録される。第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂがプロキシモジュール２６５に登録されるとき、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂは、前バージョンのデバイスドライバが、既にインストールされていて、デバイス２５５用のサーバ２００で動作しているかどうかを認識していない。前バージョン（第Ｎのバージョン）が既に動作している場合、プロキシモジュール２６５は、登録処理の間に、既存のデバイスドライバが既に動作していることを、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂに通知するために表示を返す。プロキシモジュール２６５はまた、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂに、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａへのポインタを提供する。これにより、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂと第Ｎのバージョンのカーネルデバイスモジュール２６０Ａとが通信して、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂへの制御の移行を管理することが可能になる。
【００１８】
いくつかの予想される展開では、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａから第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂへのこの制御の移行は、クライアント２０５Ａ〜２０５Ｎが移行を認識することなく行われなければならない。モジュール２６０Ａ〜２６０Ｂ間で制御を移すプロセスの一部として、デバイス２５５に関連付けられた静的データが、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａから第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂにコピーされる。静的データがコピーされている間に、少しも中断することなく、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａはデバイス２５５の管理を継続し、クライアント２０５Ａ〜２０５Ｎはデバイス２５５の実行及び使用を継続する。一実施態様では、静的データには、いくつかのＶＦ、フレームバッファのサイズ、構成ファイルからのデータ、ビデオ基本入出力システム（ＢＩＯＳ）画像、及び／またはその他のデータが含まれる。静的データがコピーされた後に、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａが停止される。一実施態様では、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａを停止するには、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａに入ってくる全ての入力を阻止することを必要とする。ただし、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａに入ってくる全ての入力を阻止することが、必ずしもクライアント２０５Ａ〜２０５Ｎを阻害するわけではない。例えば、一実施態様では、デバイス２５５はＧＰＵであり、所与のクライアント２０５は、停止動作が開始されたときに、デバイス２５５でレンダリング動作を実行している可能性がある。第Ｎのバージョンのカーネルデバイスモジュール２６０Ａが停止している間に、レンダリング動作は、中断することなしに、デバイス２５５で実行し続けることができる。所与のクライアント２０５が第Ｎのバージョンのカーネルデバイスモジュール２６０Ａからのレスポンスを待っている場合にのみ、所与のクライアント２０５はわずかな遅延を受けるであろう。第Ｎのバージョンが停止され、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂがまだ始動していない間に、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａに対する外部スティミュラスが発生した場合、起こり得るわずかな遅延がシステムに生じる可能性がある。第Ｎのバージョンのカーネルデバイスモジュール２６０Ａが停止した後、デバイス２５５に関連付けられた一時データは、第Ｎのバージョンのカーネルデバイスモジュール２６０Ａから第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂに転送される。そして、第（Ｎ＋１）のバージョンのカーネルデバイスモジュール２６０Ｂが、デバイス２５５用の新しいデバイスドライバとして引き継がれる。クライアント２０５Ａ〜２０５Ｎは、デバイス２５５用のデバイスドライバのこの変更を認識しない。
【００１９】
次に図３を参照すると、コンピューティングシステム３００の一実施態様のブロック図が示されている。一実施態様では、カーネルデバイスモジュール３０５Ａが、所与のデバイス（図示せず）のデバイスドライバとして動作するようにプロキシモジュール３１５Ａに登録される。一実施態様では、所与のデバイスはＧＰＵである。他の実施態様では、所与のデバイスは、他の様々な種類のいずれかのデバイスである。本明細書では、「カーネルデバイスモジュール」と「デバイスドライバ」という用語は、区別なく用いられていることに留意されたい。
【００２０】
ＶＭ３２０Ａ、３３０Ａ、及び３４０Ａは、所与のデバイスの処理リソースを利用している任意の数のＶＭを表す。ＶＭ３２０Ａ、３３０Ａ、及び３４０Ａは、それぞれ、所与のデバイスにおいて交替で実行される仮想関数（ＶＦ）３２５Ａ、３３５Ａ、及び３４５Ａに対応する。別の実施態様では、ＶＦではない様々なクライアントが、交替で、所与のデバイスで実行される場合がある。カーネルデバイスモジュール３０５Ａがプロキシモジュール３１５Ａに登録された後、プロキシモジュール３１５Ａは、カーネルデバイスモジュール３０５Ａを装って、オペレーティングシステム（ＯＳ）（図示せず）に登録される。つまり、プロキシモジュール３１５Ａは、カーネルデバイスモジュール３０５Ａを所与のデバイスのデバイスドライバとして登録するために、ＯＳに対してカーネルデバイスモジュール３０５Ａだと自称する。次に、プロキシモジュール３１５Ａがカーネルデバイスモジュール３０５Ａの代わりにＯＳに登録された後、カーネルデバイスモジュール３０５Ａは、所与のデバイスの管理を開始することができる。一実施態様では、所与のデバイスを管理するには、ＩＯＣＴＬ呼び出し及びｓｙｓｆｓ呼び出しの処理、割り込み（例えば、メールボックス割り込み、ワールドスイッチ割り込みなど）の処理、ならびにデバッグリクエストの処理を必要とする。他の実施態様では、所与のデバイスを管理するには、その他の種類のアクションを必要とする。
【００２１】
次に図４を参照すると、コンピューティングシステム４００の一実施態様のブロック図が示されている。コンピューティングシステム４００は、後の時点での（図３の）コンピューティングシステム３００を表すことを意図している。したがって、カーネルデバイスモジュール３０５Ｂ及びプロキシモジュール３１５Ｂは、それぞれ、後の時点でのカーネルデバイスモジュール３０５Ａ及びプロキシモジュール３１５Ａを表すことを意図している。図４に示される時点では、カーネルデバイスモジュール３１０Ｂがシステム４００にロードされている。システム４００にロードされるということは、カーネルデバイスモジュール３１０Ｂがシステム４００のメモリに格納されており、カーネルデバイスモジュール３１０Ｂの実行がシステム４００の１つ以上のプロセッサで開始されていることを意味する。
【００２２】
この説明の目的のために、カーネルデバイスモジュール３１０Ｂは、カーネルデバイスモジュール３０５Ｂの後続のバージョンであると想定されている。例えば、カーネルデバイスモジュール３０５Ｂが第１のバージョンのデバイスドライバである場合、カーネルデバイスモジュール３１０Ｂは、第２のバージョンまたはそれ以降（またはダウングレードについてはそれ以前）のバージョンのデバイスドライバである。デバイスドライバは、新たな機能の実装、バグの修正、セキュリティアップデートの提供、及び／またはその他の変更の実施のために、随時更新されるのが一般的である。したがって、所与のデバイスのための元のデバイスドライバは、システム４００の全存続期間を通じて、所与のデバイスのための唯一のデバイスドライバではないことが予想される。よって、カーネルデバイスモジュール３０５Ｂへの更新は、様々な時点でシステム４００にロードされる。カーネルデバイスモジュール３１０Ｂは、カーネルデバイスモジュール３０５Ｂの完全な置き換えであることを意図している。カーネルデバイスモジュール３０５Ｂの完全な置き換えを実行する場合、カーネルデバイスモジュール３０５Ｂからカーネルデバイスモジュール３１０Ｂへの制御の受け渡しにより、ＶＭ３２０Ｂ、３３０Ｂ、及び３４０Ｂが阻害されるべきではない。あるいは、言い換えれば、カーネルデバイスモジュール３０５Ｂからカーネルデバイスモジュール３１０Ｂへの制御の移行時に、ＶＭ３２０Ｂ、３３０Ｂ、及び３４０Ｂに対する妨害を最小限に抑えることが望ましい。図４に示すように、ＶＭ３２０Ｂ、３３０Ｂ、及び３４０Ｂは、それぞれ、所与のデバイスにおいて交替で実行されるＶＦ３２５Ｂ、３３５Ｂ、及び３４５Ｂに対応する。別の実施態様では、ＶＦではない様々なクライアントが、所与のデバイスで実行されている場合がある。
【００２３】
本明細書で使用するとき、「カーネルデバイスモジュール」という用語は、システム４００の所与のデバイスと、システム４００のＯＳまたは他のソフトウェアアプリケーションとの間のインタフェースを処理するデバイスドライバとして定義される。一実施態様では、所与のデバイスはＧＰＵである。他の実施態様では、所与のデバイスは、他の様々な種類のいずれかのデバイスである。この説明の目的のために、カーネルデバイスモジュール３１０Ｂ及びカーネルデバイスモジュール３１０Ａは、両方とも、システム４００の同じデバイスにインタフェースするように設計されていると想定されている。したがって、カーネルデバイスモジュール３１０Ｂとカーネルデバイスモジュール３１０Ａとの両方が、同じ所与のデバイスへのインタフェースを同時に処理しようとした場合、それにより、システム４００にとって予測不可能な挙動がもたらされるはずである。したがって、カーネルデバイスモジュール３０５Ｂ及びカーネルデバイスモジュール３１０Ｂは、制御の受け渡しを管理するために、所与のデバイスへのアクセスを調整することになる。
【００２４】
カーネルデバイスモジュール３１０Ｂがシステム４００にロードされるとき、カーネルデバイスモジュール３１０Ｂは、ＯＳに登録されるのではなく、プロキシモジュール３１５Ｂに登録される。ＯＳは、所与のデバイスに対して既に既存のドライバを登録しているので、ＯＳは、この所与のデバイスに対して、同じドライバ名でカーネルデバイスモジュール３１０Ｂを登録することを許可しない。既存の登録は、カーネルデバイスモジュール３０５Ｂの代わりに、プロキシモジュール３１５Ｂによって行われたものである。結果的に、カーネルデバイスモジュール３１０Ｂは、所与のデバイスのデバイスドライバとなるようにＯＳに登録され得ないため、カーネルデバイスモジュール３１０Ｂは、プロキシモジュール３１５Ｂに登録される。この登録の試行を受信することに応答して、プロキシモジュール３１５Ｂは、別のカーネルデバイスモジュール（すなわち、カーネルデバイスモジュール３０５Ｂ）が、所与のデバイスのデバイスドライバになるように既に登録されていることをカーネルデバイスモジュール３１０Ｂに通知する。プロキシモジュール３１５Ｂはまた、カーネルデバイスモジュール３１０Ｂがカーネルデバイスモジュール３０５Ｂと通信することを可能にするポインタを、カーネルデバイスモジュール３１０Ｂに提供する。
【００２５】
本実施態様では、カーネルデバイスモジュール３１０Ｂは、ポインタを使用してカーネルデバイスモジュール３０５Ｂと通信し、それによって所与のデバイスの制御の移行を促進する。第１のステップとして、カーネルデバイスモジュール３１０Ｂは、所与のデバイスに関連付けられた全ての静的データをリクエストする。このリクエストに応答して、カーネルデバイスモジュール３０５Ｂは、所与のデバイスに関連付けられた静的データを、カーネルデバイスモジュール３１０Ｂに送る。一実施態様では、静的データには、いくつかのＶＦ、フレームバッファのサイズ、構成ファイルからのデータ、ビデオ基本入出力システム（ＢＩＯＳ）画像、及び／またはその他のデータが含まれる。これらのイベントが発生している間に、カーネルデバイスモジュール３０５Ｂは、所与のデバイスのデバイスドライバとして機能し続ける。カーネルデバイスモジュール３０５Ｂは、所与のデバイスのデバイスドライバとして機能し続けることにより、所与のデバイスに対するＩＯＣＴＬ呼び出し及びｓｙｓｆｓ呼び出しを処理し続ける。カーネルデバイスモジュール３０５Ｂはまた、所与のデバイスに対するメールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号を処理し続ける。
【００２６】
次に図５を参照すると、コンピューティングシステム５００の一実施態様のブロック図が示されている。図５は、図４の説明の続きを表す。つまり、コンピューティングシステム５００は、後の時点でのコンピューティングシステム４００を表すことを意図している。したがって、カーネルデバイスモジュール３０５Ｃ、カーネルデバイスモジュール３１０Ｃ、及びプロキシモジュール３１５Ｃは、それぞれ、（図４の）後の時点でのカーネルデバイスモジュール３０５Ｂ、カーネルデバイスモジュール３１０Ｂ、及びプロキシモジュール３１５Ｂを表すことを意図している。ＶＭ３２０Ｃ、３３０Ｃ、及び３４０ＣならびにＶＦ３２５Ｃ、３３５Ｃ、及び３４５Ｃはまた、それぞれ、（図４の）後の時点でのＶＭ３２０Ｂ、３３０Ｂ、及び３４０ＢならびにＶＦ３２５Ｂ、３３５Ｂ、及び３４５Ｂを表す。
【００２７】
図５に示される時点で、カーネルデバイスモジュール３０５Ｃによるメールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号の処理は一時停止されている。カーネルデバイスモジュール３０５Ｃを宛先とする、所与のデバイスに対してこの時間中に生成される割り込みまたはデバッグ信号は、全てキューに入れられる。また一方、カーネルデバイスモジュール３０５Ｃは、この時点では、ＩＯＣＴＬ呼び出し及びｓｙｓｆｓ呼び出しを処理し続ける。本実施態様では、ＶＭ３２０Ｂ、３３０Ｂ、または３４０Ｂのいずれかが、ちょうど所与のデバイスを利用している場合には、引き続き利用することができる。ＶＭ宛ての任意の割り込みまたは動作は、妨げられることなく引き続き処理され得る。カーネルデバイスモジュール３０５Ｃとカーネルデバイスモジュール３１０Ｃとは互いに通信して、割り込み及びデバッグ信号の処理の一時停止と、カーネルデバイスモジュール３０５Ｃの停止とのタイミングを調整する。カーネルデバイスモジュール３０５Ｃが停止されると、カーネルデバイスモジュール３０５Ｃは、一時データをカーネルデバイスモジュール３１０Ｃに送る。一実施態様では、一時データには、現在実行中のＶＦ、現在実行中のＶＦの状態、実行リストにあるＶＦの順序、イベントバケット、累積データ、及び／または他のデータが含まれる。カーネルデバイスモジュール３０５Ｃが停止している間、ＶＭ宛ての任意の割り込みまたは動作は、妨げられることなく引き続き処理され得る。
【００２８】
次に図６を参照すると、コンピューティングシステム６００の一実施態様のブロック図が示されている。コンピューティングシステム６００は、後の時点でのコンピューティングシステム５００を表すことを意図している。したがって、カーネルデバイスモジュール３０５Ｄ、カーネルデバイスモジュール３１０Ｄ、及びプロキシモジュール３１５Ｄは、それぞれ、後の時点でのカーネルデバイスモジュール３０５Ｃ、カーネルデバイスモジュール３１０Ｃ、及びプロキシモジュール３１５Ｃを表すことを意図している。また、ＶＭ３２０Ｄ、３３０Ｄ、及び３４０Ｄ、ならびにＶＦ３２５Ｄ、３３５Ｄ、及びＶＦ３４５Ｄは、それぞれ、後の時点でのＶＭ３２０Ｃ、３３０Ｃ、及び３４０Ｃ、ならびにＶＦ３２５Ｃ、３３５Ｃ、及びＶＦ３４５Ｃを表す。
【００２９】
図６に示される時点で、メールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号の処理は、カーネルデバイスモジュール３１０Ｄによって再開されている。カーネルデバイス３０５Ｄが割り込み及びデバッグ信号の処理を中止してから、カーネルデバイス３１０Ｄが割り込み及びデバッグ信号の処理を処理するのを開始するまでの間に生成された任意の割り込みまたはデバッグ信号は、それらが記録されていた対応するキューまたは状態レジスタから処理される。更に、図６によって表される時点で、カーネルデバイスモジュール３１０Ｄは、ＩＯＣＴＬ呼び出し及びｓｙｓｆｓ呼び出しの処理を開始するようになる。カーネルデバイスモジュール３１０Ｄ及びカーネルデバイスモジュール３０５Ｄは、互いに通信して、ＩＯＣＴＬ呼び出し及びｓｙｓｆｓ呼び出しの処理を処理するための制御の移行を調整する。
【００３０】
次に図７を参照すると、ＯＳ、プロキシモジュール、及びカーネルデバイスモジュール間のインタラクションの一実施態様のシーケンス図が示されている。一実施態様では、カーネルデバイスモジュール７０６に対してｍｏｄｐｒｏｂｅ呼び出しが行われると、ＯＳ７０２は、カーネルデバイスモジュール７０６の依存関係を解決する。実施態様に応じて、ｍｏｄｐｒｏｂｅは手動で実行されるか、またはｍｏｄｐｒｏｂｅは起動スクリプトの一部として自動化される。ＯＳ７０２は、カーネルデバイスモジュール７０６がプロキシモジュール７０４に依存していると判定した場合、ステップ７１０でプロキシモジュール７０４をロードして初期化する。プロキシモジュール７０４は、ステップ７１４でロードすべきカーネルデバイスモジュール７０６に備えて、ステップ７１２で内部初期化を実行する。次に、カーネルデバイスモジュール７０６がステップ７１４でロードされた後、カーネルデバイスモジュール７０６は、ステップ７１６で関数「ｒｅｇｉｓｔｅｒ＿ｄｒｉｖｅｒ」を呼び出して、プロキシモジュール７０４に登録する。本説明の目的のために、カーネルデバイスモジュール７０６は、本システムの特定のデバイス向けにロードすべき第１のデバイスドライバであると想定されている。したがって、カーネルデバイスモジュール７０６が、特定のデバイスに対してロードすべき第１のデバイスドライバであるので、プロキシモジュール７０４は、ステップ７１８において、カーネルデバイスモジュール７０６のこのインスタンスに関連付けられた、プロキシモジュール７０４の内部テーブルをアクティブとしてマークし、ハードウェアの初回の初期化が特定のデバイスに対して実行される。
【００３１】
カーネルデバイスモジュール７０６は、ＯＳ７０２にデバイスドライバとして登録されるのではなく、プロキシモジュール７０４にデバイスドライバとして登録される。プロキシモジュール７０４は、カーネルデバイスモジュール７０６の代理ＯＳとして機能する。バス（例えば、ペリフェラルコンポーネントインターコネクト（ＰＣＩ））デバイス識別子（ＩＤ）は、プロキシモジュール７０４に対して透過的である。プロキシモジュール７０４は、カーネルデバイスモジュール７０６からデバイスＩＤを取得する。それによって、プロキシモジュール７０４のバージョンとカーネルデバイスモジュール７０６のバージョンとの間に独立性のための付加的レベルが設けられる。プロキシモジュール７０４は、カーネルデバイスモジュール７０６によって提供されるデバイスＩＤを使用して、カーネルデバイスモジュール７０６の代わりに、プロキシモジュール７０４自体のドライバをＯＳ７０２に登録することになる。カーネルデバイスモジュール７０６は、プロキシモジュール７０４に、プロキシモジュール７０４がカーネルデバイスモジュール７０６への呼び戻しとして使用する関数ポインタのテーブルを渡す。セキュリティの目的で、プロキシモジュール７０４は、関数ポインタテーブルのコピーを作成する。これにより、カーネルデバイスモジュール７０６が、悪意から故意に、または偶然に（例えば、バグのため）テーブルを変更することが防止される。
【００３２】
ループ７２１において、ＯＳ７０２は、所与のデバイスＩＤに一致するデバイスを検索し、ステップ７２２で、一致するデバイスＩＤごとにプロキシモジュール７０４の．ｐｒｏｂｅ関数を呼び出す。ＯＳ７０２は、これをカーネルデバイスモジュール７０６のデバイスＩＤテーブル内のデバイスＩＤと一致する全てのデバイスに対して実行する。．ｐｒｏｂｅ関数への呼び出しを受けた時に、プロキシモジュール７０４は、ハードウェアデバイスの初期化を全く実行しない。むしろ、デバイスの初期化は、カーネルデバイスモジュール７０６によって実行される。プロキシモジュール７０４は、カーネルデバイスモジュール７０６の一致するデバイスＩＤごとに、．ｐｒｏｂｅ呼び戻し関数を呼び出す。一実施態様では、プロキシモジュール７０４は、ＯＳパラメータに追加される追加のパラメータを用いて、カーネルデバイスモジュール７０６の．ｐｒｏｂｅ関数を呼び出す。この追加のパラメータは、ロードがドライバの初期ロードであるのか、それとも前ドライバの置き換えであるのかを示す。シーケンス図７００に示す実施態様の場合、プロキシモジュール７０４は、追加のパラメータを使用して、これがドライバの初期ロードであることをカーネルデバイスモジュール７０６に通知する。これがドライバの初期ロードであるという通知を受けることに応答して、カーネルデバイスモジュール７０６は、完全なハードウェア初期化を実行する。
【００３３】
全てのデバイスがプローブされて初期化されると、カーネルデバイスモジュール７０６は、その通常のランタイムモードに入る。ランタイム中、デバイス及びカーネルデバイスモジュール７０６の状態に影響を及ぼし得るスティミュラスの例には、メールボックス割り込み、ワールドスイッチタイマ割り込み、及びハードウェアエミュレータからの通知が含まれ得る。ゲストＯＳのゲストドライバは、メールボックス割り込みを使用して、カーネルデバイスモジュール７０６宛ての通知を生成する。カーネルデバイスモジュール７０６がメールボックス割り込みを受けると、カーネルデバイスモジュール７０６は、後の処理のためにメールボックス作業キュー上の作業項目をスケジュールする。ＯＳ７０２が使用可能になると、ＯＳ７０２は、作業キュー上の作業を実行する。一実施態様では、カーネルデバイスモジュール７０６は、プログラム可能な間隔でワールドスイッチタイマ割り込みを処理する。一実施態様では、プログラム可能な間隔とは、３ミリ秒（ｍｓ）から５ｍｓの範囲をいう。カーネルデバイスモジュールは、間隔ごとに、ワールドスイッチ作業キュー内のワールドスイッチリクエストをスケジュールする。
【００３４】
様々な実施態様において、ハードウェアエミュレータとカーネルデバイスモジュール７０６とは、ＩＯＣＴＬ呼び出し（ハードウェアエミュレータ→カーネルデバイスモジュール７０６）及びｓｙｓｆｓ呼び出し（カーネルデバイスモジュール７０６→ハードウェアエミュレータ）を介して互いに通信する。一実施態様では、ハードウェアエミュレータは、クイックエミュレータ（ＱＥＭＵ）である。ハードウェアエミュレータが何らかの作業を処理するためにカーネルデバイスモジュール７０６を必要とする場合、ハードウェアエミュレータは、ＩＯＣＴＬ属性を開き、リクエストを送り、その後、属性を閉じる。カーネルデバイスモジュール７０６がＩＯＣＴＬ呼び出しから戻ると、作業は完了している。作業は、呼び出し元のスレッドでの呼び出しに応答して、カーネルデバイスモジュール７０６内で直接行われる。ワールドスイッチング及びメールボックス割り込みの場合のように関与している作業キューはない。ハードウェアエミュレータが行うべき作業がカーネルデバイスモジュール７０６にある場合、カーネルデバイスモジュール７０６は、コマンドをバッファに配置し、ハードウェアエミュレータインスタンスが待機している属性を合図する。ハードウェアエミュレータは、バッファを読み出し、ハードウェアエミュレータが作業を終了するとＩＯＣＴＬ呼び出しで応答する。
【００３５】
カーネルデバイスモジュール７０６は、カーネルデバイスモジュール７０６が、置き換えられるか、またはアンロードされるまで、スティミュラスを検出して処理するループ７３１内に留まる。一実施態様では、カーネルデバイスモジュール７０６の通常のランタイム時に、カーネルデバイスモジュール７０６は、プロキシモジュール７０４とは独立して実行される。言い換えれば、本実施態様では、プロキシモジュール７０４は、デバイスのシングルルート入力／出力仮想化（ＳＲＩＯＶ）動作に関与しない。一実施態様では、プロキシモジュール７０４は、カーネルデバイスモジュール７０６の更新または置換を担当する。本実施態様では、プロキシモジュール７０４は、カーネルデバイスモジュール７０６が本システムからアンロードされようとする場合、または新しい方のカーネルデバイスモジュールがカーネルデバイスモジュール７０６を置き換えようとする場合にアクティブ化される。
【００３６】
次に図８を参照すると、新しいカーネルデバイスモジュール８１０をロードする際のインタラクションの一実施態様のシーケンス図が示される。新しいカーネルデバイスモジュール８１０が本システムにロードされるとき、新しいカーネルデバイスモジュール８１０は、ＯＳに登録されるのではなく、プロキシモジュール８０５に登録される。新しいカーネルデバイスモジュールバージョン８１０は、既に実行されている既存のカーネルデバイスモジュール８１５が存在することを認識していない。新しいカーネルデバイスモジュールバージョン８１０は、既存のカーネルデバイスモジュールバージョン８１５が、プロキシモジュール８０５に登録されるために、所与の関数ｒｅｇｉｓｔｅｒ＿ｄｒｉｖｅｒ（）を呼び出すことによって、プロキシモジュール８０５に登録されたのと同じ方法でプロキシモジュール８０５に登録されるよう試みる。新しいカーネルデバイスモジュールバージョン８１０は、ステップ８２０において、関数ポインタのテーブルとデバイスＩＤのテーブルとの両方をプロキシモジュール８０５に渡す。
【００３７】
一実施態様では、新しいカーネルデバイスモジュール８１０のロードは、ライブカーネルデバイスモジュール更新プロセスをトリガし、それ以上のユーザインタラクションは必要とされない。一実施態様では、既存のカーネルデバイスモジュールバージョン８１５は、成功した場合は削除され、またはエラーが検出された場合には、新しいカーネルデバイスモジュールバージョン８１０が削除される。ライブカーネルデバイスモジュールバージョン更新の目標の１つは、実行中のクライアントセッションを中断することなく、カーネルデバイスモジュールの実行可能コードを更新できるようにすることである。これには、コードの順方向更新及び逆方向更新の両方が含まれる。完全な更新を実行できるようにするために、更新前に存在していた全てのライブクライアントセッションが更新後にもアクティブになることが望ましい。新しいカーネルデバイスモジュール８１０が、既存のカーネルデバイスモジュール８１５がサポートするデバイスと同じデバイスをサポートする場合、新しいカーネルデバイスモジュール８１０は、これらのデバイスの新しいデバイスドライバとして登録される。あるいは、新しいカーネルデバイスモジュール８１０が、既存のカーネルデバイスモジュール８１５がサポートするデバイスと同じデバイスをサポートできない場合は、更新は中止され、エラーの説明がログに記録される。
【００３８】
次に図９を参照すると、新しいカーネルデバイスモジュール８１０をロードする際のインタラクションの一実施態様のシーケンス図が示される。図９は、図８の説明の続きであることを意図したものである。デバイスの制御を既存のカーネルデバイスモジュール８１５から新しいカーネルデバイスモジュール８１０に移すとき、静的データは、既存のカーネルデバイスモジュール８１５から新しいカーネルデバイスモジュール８１０に送られる。静的データが転送された後、既存のカーネルデバイスモジュール８１５から新しいカーネルデバイスモジュール８１０に一時データを転送するために、既存のカーネルデバイスモジュール８１５は停止される。
【００３９】
一実施態様では、新しいデバイスドライバへの移行中に機密の一時データを転送するために、デバイスの状態は安定している必要がある。本実施態様では、デバイスは引き続き動作することができるが、カーネルデバイスモジュールによって認識されている状態を変更することはできない。一実施態様では、ソフトウェア及び／またはデバイスの状態を変更することができるスティミュラスが特定される。一実施態様では、これらのスティミュラスには、メールボックス割り込み、ワールドスイッチ割り込み、及びハードウェアエミュレータからの通知が含まれる。他の実施態様では、デバイスの状態が変化するのを防ぐために、他のスティミュラスが特定されて停止される。既存のカーネルデバイスモジュール８１５は、機密の一時データの転送中にいずれかの状態変化が起こるのを防ぐために、これらの特定されたスティミュラスを阻止することによって、ボックス９１０内で停止される。
【００４０】
ここで図１０を参照すると、既存のカーネルデバイスモジュールバージョン１０１０を停止する一実施態様のシーケンス図が示される。本説明の目的のために、既存のカーネルデバイスモジュールバージョン１０１０を置き換えることにより、新しいカーネルデバイスモジュールバージョン１００５が、所与のデバイスのデバイスドライバとして引き継いでいると想定している。一実施態様では、所与のデバイスはＧＰＵであり、他の実施態様では、所与のデバイスは、他の様々なデバイス（例えば、ネットワークコントローラ、ストレージデバイス）のいずれかである。既存のカーネルデバイスモジュールバージョン１０１０を置き換えるために、既存のカーネルデバイスモジュールバージョン１０１０は停止させる。一実施態様では、既存のカーネルデバイスモジュールバージョン１０１０の停止は、新しいカーネルデバイスモジュールバージョン１００５によって開始されるが、停止状態に到達するために様々なアクションを実行するのは、既存のカーネルデバイスモジュールバージョン１０１０である。一実施態様では、ホストコンピューティングシステムで実行されている複数のスレッドを停止することによって、既存のカーネルデバイスモジュールバージョン１０１０を停止する。一実施態様では、停止されるスレッドには、スケジューラスレッド、メールボックススレッド、及びＩＯＣＴＬスレッドが含まれる。一実施態様では、各スレッドは、スレッドが新規作業を受け入れることができるか否かを示す関連フラグを（アダプタごとに）有する。
【００４１】
一実施態様では、停止すべき第１のスレッドは、ステップ１０１５のスケジューラスレッドである。スケジューラスレッドに対してフラグを設定することで、カーネルデバイスモジュールのワールドスイッチスケジューラに、スケジューラスレッドが新しいスケジューラリクエストを開始することができなくなる（つまり、それ以上のワールドスイッチが発生するのを阻止することができる）ことが示される。メールボックススレッドがスケジューラを再起動するリクエストを生成しようとする可能性があるため、スケジューラスレッドは最初に停止される。スケジューラスレッドは引き続き処理中のリクエストを処理することができるが、スケジューラスレッドが停止すると、スケジューラスレッドは新しいリクエストを開始することができないことに注意されたい。スケジューラスレッドを再起動するための呼び出しが行われた場合、この呼び出しは無視される。
【００４２】
一実施態様では、スケジューラスレッドがステップ１０１５で停止され、その後、ステップ１０２０でメールボックススレッドが停止される。ゲストドライバが排他的アクセスモードを保持している場合、ゲストドライバはワールドスイッチミューテックスを保持していることにもなる。ワールドスイッチミューテックスは、他の任意の仮想関数（ＶＦ）へのワールドスイッチングを防ぐ。ワールドスイッチミューテックスは、ゲストドライバが、（メールボックスメッセージを介して）排他モードを解放するか、またはタイムアウトしたときに解放される。メールボックススレッドは、排他モードを許可するリクエストよりも、排他モードを解放するリクエストを優先する。メールボックススレッドがアクティブに実行されていて、排他モードを解放するリクエストがある場合、このリクエストは処理中となる。メールボックススレッドは、スケジューラスレッドが停止するのを待つ前に、排他モードの解放を終えることができる。排他モードが保持されており、作業キューに排他モードの保留中の解放がない場合、スケジューラスレッドは停止してもよく、過渡状態の移行の間に、ミューテックス状態が、カーネルデバイスモジュールバージョン１００５に移行されることに注意されたい。つまり、ライブ更新は、ライブ更新を完了する前に、排他モードが完了するまで待つ必要はない。
【００４３】
メールボックススレッドが新規作業を受け付けないようにするために、メールボックススレッドはステップ１０２０で停止される。メールボックススレッドのための新規作業は、ゲストドライバが、排他モードに入るリクエスト、または排他モードを終了するリクエストを発行することから始まる。一実施態様では、ゲストドライバを停止する代わりに、メールボックス割り込みが禁止される。ゲストドライバは、引き続きメールボックス割り込みのトリガを試みることができるが、メールボックス割り込みは処理されない。割り込みリクエストはメールボックス状態レジスタに保存され、割り込みが禁止されている間に作業リクエストが生成されたかどうかを判定するために、後でポーリングすることができる。ステップ１０２０でメールボックススレッドを停止するリクエストは、メールボックススレッドが作業項目を処理している間に発生する場合がある。また、メールボックススレッドのキューに入れられた作業項目がある場合もある。フラグを設定しても、メールボックススレッドがアイドル状態になることを示すものではない。次のステップは、ステップ１０２５でメールボックススレッドが停止するのを待つことである。
【００４４】
ステップ１０２０でメールボックススレッドの停止をリクエストした後、処理中の作業項目は完了するまで処理されるが、新しい作業項目は開始されない。キュー上の全ての作業項目は、一時データの転送中に処理するために、新しいカーネルデバイスモジュールバージョン１００５に転送される。一実施態様では、既存のカーネルデバイスモジュールバージョン１０１０は、ステップ１０２５でメールボックススレッドが停止するのを待ち、スケジューラスレッドが停止するのを待ってから、ステップ１０３５でＩＯＣＴＬスレッドを停止する。一般的には、メールボックス作業項目にはＶＭＭからのレスポンスも必要になる。デッドロックせずにレスポンスを受け取るために、ＩＯＣＴＬスレッドは、メールボックススレッドがステップ１０２５で停止するまで実行を継続することが許可される。ステップ１０３５でＩＯＣＴＬスレッドの停止をリクエストした後、既存のカーネルデバイスモジュールバージョン１０１０は、ステップ１０４０でＩＯＣＴＬスレッドが停止するのを待つ。既存のカーネルデバイスモジュールバージョン１０１０は、未処理の作業が完了するまで待機してから、新しいカーネルデバイスモジュールバージョン１００５に正常なレスポンスを返す。未処理の作業が完了すると、一時データが既存のカーネルデバイスモジュールバージョン１０１０から新しいカーネルデバイスモジュールバージョン１００５に転送され、次いでデバイスの制御が新しいカーネルデバイスモジュールバージョン１００５に渡される。
【００４５】
次に図１１を参照すると、カーネルデバイスモジュールをロードするための方法１１００の一実施態様が示されている。説明のために、本実施態様のステップと図１２のステップとは順を追って示されている。しかしながら、説明された方法の様々な実施態様では、説明された要素の１つ以上が、同時に実行されるか、示された順序とは異なる順序で実行されるか、または完全に省略されることに留意されたい。その他の追加要素も所望に応じて実行される。本明細書に記載された様々なシステムまたは装置のいずれかは、方法１１００を実施するように構成されている。
【００４６】
所与のバージョンのデバイスドライバが、プロキシモジュールに登録され、この所与のバージョンのデバイスドライバは、ソフトウェアアプリケーションと所与のデバイスとの間のインタラクションを管理するように構成されている（ブロック１１０５）。一実施態様では、デバイスはＧＰＵである。他の実施態様では、デバイスは、他の様々な種類の処理デバイスまたは周辺デバイスのいずれかである。次に、プロキシモジュールは、前バージョンのデバイスドライバが既に、所与のデバイスを対象にして、本システムにロードされて、実行されているかどうかを判定する（条件ブロック１１１０）。前バージョンのデバイスドライバが既に本システムにロードされて実行されている場合（条件ブロック１１１０、「Ｙｅｓ」肢）、プロキシモジュールは、所与のバージョンのデバイスドライバに、デバイスドライバの前バージョンが既にロードされていることを明示する第１の表示を提供する（ブロック１１１５）。プロキシモジュールはまた、所与のバージョンのデバイスドライバに、前のバージョンのデバイスドライバを指し示すポインタを提供する（ブロック１１２０）。所与のバージョンのデバイスドライバは、第１の表示を受け取ることに応答して、デバイスのハードウェア初期化をやめる（ブロック１１２５）。所与のバージョンのデバイスドライバは、ポインタを使用して前バージョンのデバイスドライバと通信し、それによって前バージョンのデバイスドライバから所与のバージョンのデバイスドライバへのデバイスの制御の移行を処理する（ブロック１１３０）。デバイスの制御が前バージョンのデバイスドライバから所与のバージョンのデバイスドライバに移された後、前バージョンのデバイスドライバは非アクティブ化される（ブロック１１３５）。ブロック１１３５の後、方法１１００は終了する。
【００４７】
前バージョンのデバイスドライバがまだ本システムにロードされておらず、実行されていない場合（条件ブロック１１１０、「Ｎｏ」肢）、プロキシモジュールは、所与のバージョンのデバイスドライバに、第１の表示とは異なる第２の表示を提供する（ブロック１１４０）。また、プロキシモジュールは、所与のバージョンのデバイスドライバとしてＯＳに登録される（ブロック１１４５）。つまり、プロキシモジュールは、ＯＳに対して所与のバージョンのデバイスドライバをエミュレートする。また、第２の表示を受け取ることに応答して、所与のバージョンのデバイスドライバによってデバイスがハードウェア初期化ルーチンを実行する（ブロック１１５０）。また、第２の表示を受け取ることに応答して、所与のバージョンのデバイスドライバは、デバイスの管理を開始する（ブロック１１５５）。ブロック１１５５の後、方法１１００は終了する。様々な実施態様において、方法１１００は、本システムにインストールされる新しいバージョンのデバイスドライバごとに実行されることに留意されたい。
【００４８】
次に図１２を参照すると、デバイスの制御を、第１のバージョンのデバイスドライバから第２のバージョンのデバイスドライバに移すために、第１のバージョンのデバイスドライバを停止する方法１２００の一実施態様が示される。第２のバージョンのデバイスドライバは、第１のバージョンのデバイスドライバが既にコンピューティングシステムの所与のデバイスを管理しているという表示を受け取る（ブロック１２０５）。一実施態様では、第２のバージョンのデバイスドライバは、プロキシモジュールへの登録に応答して表示を受け取る。表示を受け取ることに応答して、スケジューラスレッドを停止するリクエストが生成される（ブロック１２１０）。一実施態様では、スケジューラスレッドは、対応するフラグを設定することによって停止されるが、このフラグは、スケジューラスレッドが新しいスケジューラリクエストを開始できなくなったことをゲストドライバに示すものである。次に、メールボックススレッドを停止するリクエストが生成される（ブロック１２１５）。メールボックススレッドを停止するリクエストは、メールボックススレッドが新規作業を受け付けないようにするために、ブロック１２１５で生成される。次に、第１のバージョンのデバイスドライバは、メールボックススレッドが停止するのを待つ（ブロック１２２０）。次に、第１のバージョンのデバイスドライバは、スケジューラスレッドが停止するのを待つ（ブロック１２２５）。次に、ＩＯＣＴＬスレッドを停止するリクエストが生成される（ブロック１２３０）。次に、本システムは、ＩＯＣＴＬスレッドが停止するのを待つ（ブロック１２３５）。次に、第１のバージョンのデバイスドライバから第２のバージョンのデバイスドライバに、一時データが転送される（ブロック１２４０）。次に、第１のバージョンのデバイスドライバから第２のバージョンのデバイスドライバに、デバイスの制御が移される（ブロック１２４５）。ブロック１２４５の後、方法１２００は終了する。
【００４９】
様々な実施態様において、本明細書で説明した方法及び／または機構を実施するために、ソフトウェアアプリケーションのプログラム命令が使用される。例えば、汎用プロセッサまたは専用プロセッサによって実行可能なプログラム命令が企図されている。様々な実施態様において、このようなプログラム命令は、高水準プログラミング言語によって表される。他の実施態様では、プログラム命令は、高水準プログラミング言語からバイナリ形式、中間形式、またはその他の形式にコンパイルされる。代替的に、ハードウェアの挙動及び設計を記述するプログラム命令が書かれる。そのようなプログラム命令は、Ｃなどの高水準プログラミング言語で表される。あるいは、Ｖｅｒｉｌｏｇなどのハードウェア設計言語（ＨＤＬ）が用いられる。様々な実施態様において、プログラム命令は、様々な非一時的なコンピュータ可読記憶媒体のいずれかに記憶される。記憶媒体は、コンピューティングシステムにプログラム命令を提供してプログラムを実行するために、使用中、コンピューティングシステムによってアクセス可能である。一般的に言って、そのようなコンピューティングシステムは、プログラム命令を実行するように構成された少なくとも１つ以上のメモリと１つ以上のプロセッサとを含む。
【００５０】
上記の実施態様は、非限定的な実施態様の例に過ぎないことを強調しておく必要がある。上記の開示が十分に理解されると、多くの変形形態及び修正形態が当業者に明らかになるであろう。以下の特許請求の範囲は、そうした全ての変形形態及び修正形態を包含するように解釈されることが意図されている。
【図１】
2021522594.tif 000003
【図２】
2021522594.tif 000004
【図３】
2021522594.tif 000005
【図４】
2021522594.tif 000006
【図５】
2021522594.tif 000007
【図６】
2021522594.tif 000008
【図７】
2021522594.tif 000009
【図８】
2021522594.tif 000010
【図９】
2021522594.tif 000011
【図１０】
2021522594.tif 000012
【図１１】
2021522594.tif 000013
【図１２】
2021522594.tif 000014
【国際調査報告】
2021522594.tif 000015
2021522594.tif 000016
2021522594.tif 000017