(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-12-07
(45)【発行日】2023-12-15
(54)【発明の名称】カーネルデバイスモジュールのライブ更新
(51)【国際特許分類】
G06F 8/65 20180101AFI20231208BHJP
G06F 13/10 20060101ALI20231208BHJP
G06F 9/455 20180101ALI20231208BHJP
G06F 9/50 20060101ALI20231208BHJP
【FI】
G06F8/65
G06F13/10 330B
G06F9/455 150
G06F9/50 150Z
(21)【出願番号】P 2020560328
(86)(22)【出願日】2019-04-26
(86)【国際出願番号】 IB2019053461
(87)【国際公開番号】W WO2019207550
(87)【国際公開日】2019-10-31
【審査請求日】2022-04-25
(32)【優先日】2018-04-27
(33)【優先権主張国・地域又は機関】US
(32)【優先日】2018-08-30
(33)【優先権主張国・地域又は機関】US
(73)【特許権者】
【識別番号】508301087
【氏名又は名称】エーティーアイ・テクノロジーズ・ユーエルシー
【氏名又は名称原語表記】ATI TECHNOLOGIES ULC
【住所又は居所原語表記】One Commerce Valley Drive East, Markham, Ontario, L3T 7X6 Canada
(74)【代理人】
【識別番号】100108833
【氏名又は名称】早川 裕司
(74)【代理人】
【識別番号】100111615
【氏名又は名称】佐野 良太
(74)【代理人】
【識別番号】100162156
【氏名又は名称】村雨 圭介
(72)【発明者】
【氏名】ケリー ドナルド クラーク ジタルク
【審査官】山本 俊介
(56)【参考文献】
【文献】特開2001-318874(JP,A)
【文献】特表2008-511055(JP,A)
【文献】米国特許出願公開第2007/0174849(US,A1)
【文献】米国特許出願公開第2017/0269928(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00 -8/77
G06F 9/455
G06F 9/50
G06F 13/10
(57)【特許請求の範囲】
【請求項1】
オペレーティングシステム(OS)と、プロキシモジュールと、1つ以上のソフトウェアアプリケーションとデバイスとの間のインタラクションを管理するように構成された第1のバージョンのデバイスドライバとのプログラム命令を格納するメモリと、
前記第1のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールのプログラム命令を実行することと、を行うように構成されたプロセッサと、を備えるシステムであって、
前記プロキシモジュールのプログラム命令を実行することは、
前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、前記システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する
インディケーションを提供することと、
他のバージョンの前記デバイスドライバが前記システムにロードされておらず、前記デバイスを管理していないと判定することに応答して、前記第1のバージョンの前記デバイスドライバとして前記OSに登録し、前記OSに対して前記第1のバージョンの前記デバイスドライバをエミュレートすることと、を行う、システム。
【請求項2】
前記プロセッサは、更に、
前記デバイスと前記1つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記第1のバージョンの前記デバイスドライバとは異なる第2のバージョンの前記デバイスドライバをロードすることと、
前記第2のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第2のバージョンの前記デバイスドライバに、前記第1のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第2のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第1のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を行うように構成されている、請求項1に記載のシステム。
【請求項3】
前記プロセッサは、更に、
1つ以上の外部スティミュラススレッドを停止する1つ以上のリクエストを生成することと、
前記1つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記1つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
を行うように構成されている、請求項2に記載のシステム。
【請求項4】
前記プロセッサは、更に、
状態情報を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
前記第1のバージョンの前記デバイスドライバを非アクティブ化することと、
を行うように構成されている、請求項2に記載のシステム。
【請求項5】
前記プロセッサは、前記第1のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第2のバージョンの前記デバイスドライバに通知するように構成されている、請求項4に記載のシステム。
【請求項6】
前記プロセッサは、更に、
前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに静的データを転送することと、
前記第1のバージョンの前記デバイスドライバを停止することと、
前記第1のバージョンの前記デバイスドライバを停止した後で、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに一時データを転送することと、
を行うように構成されている、請求項4に記載のシステム。
【請求項7】
前記プロセッサは、更に、
他のデバイスドライバが前記デバイスを現在管理していない場合、前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、第1の
インディケーションを提供することと、
別のデバイスドライバが前記デバイスを現在管理している場合、前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、第2の
インディケーションを提供することであって、前記第2の
インディケーションが前記第1の
インディケーションとは異なる、前記提供することと、
を行うように構成されている、請求項1に記載のシステム。
【請求項8】
第1のバージョンのデバイスドライバをプロキシモジュールに登録するために、前記第1のバージョンの前記デバイスドライバのプログラム命令を実行することであって、前記第1のバージョンの前記デバイスドライバが、デバイスと1つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成されている、前記実行すること、を含む方法であって、
前記第1のバージョンの前記デバイスドライバを前記プロキシモジュールに登録した後で、
前記プロキシモジュールのプログラム命令を実行して、前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する
インディケーションを提供することと、
他のバージョンの前記デバイスドライバが前記システムにロードされておらず、前記デバイスを管理していないと判定することに応答して、前記第1のバージョンの前記デバイスドライバとしてOSに登録し、前記OSに対して前記第1のバージョンの前記デバイスドライバをエミュレートすることと、
を行う、方法。
【請求項9】
第2のバージョンの前記デバイスドライバをロードすることであって、前記第2のバージョンの前記デバイスドライバが、前記デバイスと前記1つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成されており、前記第2のバージョンの前記デバイスドライバが、前記第1のバージョンの前記デバイスドライバとは異なる、前記ロードすることと、
前記第2のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第2のバージョンの前記デバイスドライバに、前記第1のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第2のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第1のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を更に含む、請求項8に記載の方法。
【請求項10】
1つ以上の外部スティミュラススレッドを停止する1つ以上のリクエストを生成することと、
前記1つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記1つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
を更に含む、請求項9に記載の方法。
【請求項11】
状態情報を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
前記第1のバージョンの前記デバイスドライバを非アクティブ化することと、
を更に含む、請求項9に記載の方法。
【請求項12】
前記第1のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第2のバージョンの前記デバイスドライバに通知することを更に含む、請求項11に記載の方法。
【請求項13】
前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに静的データを転送することと、
前記第1のバージョンの前記デバイスドライバを停止することと、
前記第1のバージョンの前記デバイスドライバを停止した後で、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに一時データを転送することと、
を更に含む、請求項11に記載の方法。
【請求項14】
プロセッサ
が、他のデバイスドライバが前記デバイスを現在管理していない場合、前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、第1の
インディケーションを提供することと、
別のデバイスドライバが前記デバイスを現在管理している場合、前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、第2の
インディケーションを提供することであって、前記第2の
インディケーションが前記第1の
インディケーションとは異なる、前記提供することと、
を
更に含む、請求項8に記載の方法。
【請求項15】
第1のバージョンのデバイスドライバをプロキシモジュールに登録することであって、前記第1のバージョンの前記デバイスドライバが、デバイスと1つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記登録すること、を行うようにプロセッサによって実行可能なプログラム命令を含む非一時的なコンピュータ可読記憶媒体であって、
前記第1のバージョンの前記デバイスドライバを前記プロキシモジュールに登録した後で、
前記プロキシモジュールから前記第1のバージョンの前記デバイスドライバへ、別のバージョンの前記デバイスドライバが、システムに既にロードされていて、前記デバイスを管理しているかどうかを明示する
インディケーションを提供することと、
他のバージョンの前記デバイスドライバが前記デバイスを管理していないと判定することに応答して、前記第1のバージョンの前記デバイスドライバの代わりに、前記プロキシモジュールをOSに登録し、前記プロキシモジュールにより、前記OSに対して前記第1のバージョンの前記デバイスドライバをエミュレートすることと、
を行う、非一時的なコンピュータ可読記憶媒体。
【請求項16】
前記プログラム命令が、更に、
前記デバイスと前記1つ以上のソフトウェアアプリケーションとの間のインタラクションを管理するように構成された、前記第1のバージョンの前記デバイスドライバとは異なる第2のバージョンの前記デバイスドライバをロードすることと、
前記第2のバージョンの前記デバイスドライバを前記プロキシモジュールに登録することと、
前記プロキシモジュールにより、前記第2のバージョンの前記デバイスドライバに、前記第1のバージョンの前記デバイスドライバを指し示すポインタを提供することと、
前記第2のバージョンの前記デバイスドライバにより、前記ポインタを介して、前記第1のバージョンの前記デバイスドライバから状態情報をリクエストすることと、
を行うように実行可能である、請求項15に記載の非一時的なコンピュータ可読記憶媒体。
【請求項17】
前記プログラム命令が、更に、
1つ以上の外部スティミュラススレッドを停止するリクエストを生成することと、
前記1つ以上の外部スティミュラススレッドが停止するのを待つことと、
前記1つ以上の外部スティミュラススレッドが停止することに応答して、前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
を行うように実行可能である、請求項16に記載の非一時的なコンピュータ可読記憶媒体。
【請求項18】
前記プログラム命令が、更に、
状態情報を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに転送することと、
前記デバイスの制御を、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに移すことと、
前記第1のバージョンの前記デバイスドライバを非アクティブ化することと、
を行うように実行可能である、請求項16に記載の非一時的なコンピュータ可読記憶媒体。
【請求項19】
前記プログラム命令が、更に、前記第1のバージョンの前記デバイスドライバが前記システムにロードされていて、前記デバイスを管理していると判定することに応答して、前記プロキシモジュールを実行して、前記デバイスのハードウェア初期化を省くように、前記第2のバージョンの前記デバイスドライバに通知するように実行可能である、請求項18に記載の非一時的なコンピュータ可読記憶媒体。
【請求項20】
前記プログラム命令が、更に、
前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに静的データを転送することと、
前記第1のバージョンの前記デバイスドライバを停止することと、
前記第1のバージョンの前記デバイスドライバを停止した後で、前記第1のバージョンの前記デバイスドライバから前記第2のバージョンの前記デバイスドライバに一時データを転送することと、
を行うように実行可能である、請求項18に記載の非一時的なコンピュータ可読記憶媒体。
【発明の詳細な説明】
【背景技術】
【0001】
関連技術の説明
バグ修正またはセキュリティパッチは、実運用のカーネルモジュールコードベースに定期的に適用される。一部のコンピューティング環境では、これらのパッチにより動作環境が中断されることになる。例えば、クラウドサービスプロバイダ(CSP)は、数千のホストを備える実運用環境で様々なソフトウェアモジュールを実行する。大規模なCSPが、更新バージョンのカーネルデバイスモジュール(すなわち、デバイスドライバ)をインストールするために、ユーザをホストから追い出すことは現実的ではない。また、全てのユーザが自発的にログオフするまで待つことも不可能である。
【0002】
更に、対応するデバイスが動作している間に、実行中のカーネルデバイスモジュール(または略してモジュール)を交換しようとするのは、難しい場合がある。モジュールをアンロードし、リロードする行為が、消失状態という事態を招く可能性がある。1つの問題として、新しいモジュールは、古いモジュールが残した状態を全く認識しないことが挙げられる。古いモジュールがアンロードされ、新しいモジュールがロードを開始した後の期間は、デバイスを管理するドライバがなくなる。デバイスに対するアクティビティまたは状態の変更は全て失われる。
【0003】
本明細書で説明される方法及び機構の利点は、添付の図面と併せて以下の説明を参照することにより、一層よく理解することができる。
【図面の簡単な説明】
【0004】
【
図1】コンピューティングシステムの一実施態様のブロック図である。
【
図2】サーバの仮想環境の一実施態様のブロック図である。
【
図3】コンピューティングシステムの一実施態様のブロック図を示す。
【
図4】コンピューティングシステムの一実施態様のブロック図を示す。
【
図5】コンピューティングシステムの一実施態様のブロック図を示す。
【
図6】コンピューティングシステムの一実施態様のブロック図を示す。
【
図7】OS、プロキシモジュール、及びカーネルデバイスモジュール間のインタラクションの一実施態様のシーケンス図を示す。
【
図8】新しいカーネルデバイスモジュールをロードする際のインタラクションの一実施態様のシーケンス図を示す。
【
図9】新しいカーネルデバイスモジュールをロードする際のインタラクションの一実施態様のシーケンス図を示す。
【
図10】既存のカーネルデバイスモジュールバージョンを停止する一実施態様のシーケンス図を示す。
【
図11】カーネルデバイスモジュールをロードするための方法の一実施態様を示す一般化された流れ図である。
【
図12】デバイスの制御を、第1のバージョンのデバイスドライバから第2のバージョンのデバイスドライバに移すために、第1のバージョンのデバイスドライバを停止する方法の一実施態様を示す一般化された流れ図である。
【発明を実施するための形態】
【0005】
本明細書に提示される方法及び機構の理解の徹底を期すために、以下の記述では、多くの具体的な詳細が述べられている。しかしながら、当業者は、それらの具体的な詳細をその通りに用いなくても、様々な実施態様の実施が可能であることを認識するはずである。いくつかの事例では、周知の構造、構成要素、信号、コンピュータプログラム命令、及び技法については、本明細書で説明するアプローチを分かりにくくすることを避けるために、詳細に示していない。説明を単純かつ明瞭にするために、図に示す要素は必ずしも縮尺通りに描かれていないことが理解されよう。例えば、一部の要素の寸法が、他の要素に比較して誇張される場合がある。
【0006】
カーネルデバイスモジュールのライブ更新を実行するための様々なシステム、装置、及び方法が本明細書に開示されている。一実施態様では、プロキシモジュールがシステムにロードされ、プロキシモジュールが、2つの異なるバージョンのカーネルデバイスモジュールのための登録ポイント及び通信ポイントを提供する。一実施態様では、プロキシモジュール及びカーネルデバイスモジュールは、ロード可能なカーネルモジュールである。プロキシモジュールは、第1のバージョンのカーネルデバイスモジュールから第2のバージョンのカーネルデバイスモジュールに制御が移されるときに、ロード可能な2つのバージョンのカーネルモジュールを同時にアクティブにしながら、複製することも、解放することもできないドライバアクティビティを実行する。一実施態様では、プロキシモジュールは、デバイス登録、入出力制御(IOCTL)呼び出し、sysfs呼び出し、及びその他のアクティビティを含むがこれらに限定されないアクティビティを実行する。
【0007】
第1のバージョンのカーネルデバイスモジュールがロードされると、これは、プロキシモジュールからエクスポートされたアプリケーションプログラミングインタフェース(API)を使用して、プロキシモジュールに登録される。次いでプロキシモジュールは、第1のバージョンのカーネルデバイスモジュールを装って、オペレーティングシステム(OS)に登録される。プロキシモジュールは、全ての必要なオープンsysfs属性ファイル及びIOCTLファイル属性を維持する。第2のバージョンのカーネルデバイスモジュールがロードされると、第2のバージョンのカーネルデバイスモジュールもまたプロキシモジュールに登録される。プロキシモジュールは既にOSに登録されているので、プロキシモジュールはその登録ステップを繰り返す必要はない。各バージョンのカーネルデバイスモジュールがプロキシモジュールに登録されるので、プロキシモジュールは、どのように各バージョンのカーネルデバイスモジュールを見つけて通信したらいいかを認識している。新しいバージョンのカーネルデバイスモジュールは、他のバージョンを探すために、プロキシモジュールにクエリを実行し、2つのバージョンが直接通信できるようにする。一実施態様では、2つのバージョンのカーネルデバイスモジュールが互いに直接通信できるようになると、この2つのバージョンは、プロキシモジュールからの更なる支援を必要とせずに、それらの間のデバイス制御の移行を管理する。
【0008】
ここで
図1を参照すると、コンピューティングシステム100の一実施態様のブロック図が示されている。一実施態様では、コンピューティングシステム100は、少なくともプロセッサ105A~105N、入力/出力(I/O)インタフェース120、バス125、メモリコントローラ(複数可)130、ネットワークインタフェースコントローラ(NIC)135、及びメモリデバイス(複数可)140を含む。他の実施態様では、コンピューティングシステム100は他の構成要素を含み、及び/またはコンピューティングシステム100は異なるように構成される。プロセッサ105A~105Nは、システム100に含まれる任意の数のプロセッサを表している。一実施態様では、プロセッサ105Aは、中央処理装置(CPU)などの汎用プロセッサである。一実施態様では、プロセッサ105Nは、高並列アーキテクチャを有するデータ並列プロセッサである。データ並列プロセッサには、グラフィックスプロセッシングユニット(GPU)、デジタルシグナルプロセッサ(DSP)、フィールドプログラマブルゲートアレイ(FPGA)、特定用途向け集積回路(ASIC)などが含まれる。いくつかの実施態様では、プロセッサ105A~105Nは、複数のデータ並列プロセッサを含む。
【0009】
メモリコントローラ(複数可)130は、I/Oインタフェース120に結合されたプロセッサ105A~105N及びI/Oデバイス(図示せず)によってアクセス可能な任意の数及び種類のメモリコントローラを表す。メモリコントローラ(複数可)130は、任意の数及び種類のメモリデバイス(複数可)140に結合されている。メモリデバイス(複数可)140は、任意の数及び種類のメモリデバイスを表す。例えば、メモリデバイス(複数可)140内のメモリの種類としては、ダイナミックランダムアクセスメモリ(DRAM)、スタティックランダムアクセスメモリ(SRAM)、NANDフラッシュメモリ、NORフラッシュメモリ、強誘電体ランダムアクセスメモリ(FeRAM)、またはその他のメモリが挙げられる。
【0010】
I/Oインタフェース120は、任意の数及び種類のI/Oインタフェース(例えば、ペリフェラルコンポーネントインターコネクト(PCI)バス、PCIエクステンデッド(PCI-X)、PCIE(PCI Express)バス、ギガビットイーサネット(GBE)バス、ユニバーサルシリアルバス(USB))を表す。各種の周辺デバイス(図示せず)がI/Oインタフェース120に結合されている。このような周辺デバイスには、ディスプレイ、キーボード、マウス、プリンタ、スキャナ、ジョイスティックまたは他の種類のゲームコントローラ、メディア記録デバイス、外部ストレージデバイス、ネットワークインタフェースカードなどが含まれる(ただし、これらに限定されない)。ネットワークインタフェースコントローラ(NIC)135は、ネットワーク145を通してネットワークメッセージを送信し、受信する。
【0011】
ネットワーク145は、無線接続、直接ローカルエリアネットワーク(LAN)、メトロポリタンエリアネットワーク(MAN)、ワイドエリアネットワーク(WAN)、イントラネット、インターネット、ケーブルネットワーク、パケット交換ネットワーク、光ファイバネットワーク、ルータ、ストレージエリアネットワーク、または他の種類のネットワークを含む任意の種類のネットワークまたはネットワークの組み合わせを表す。LANの例には、イーサネットネットワーク、光ファイバ分散データインタフェース(FDDI)ネットワーク、及びトークンリングネットワークが含まれる。様々な実施態様において、ネットワーク145は、リモートダイレクトメモリアクセス(RDMA)ハードウェア及び/またはソフトウェア、伝送制御プロトコル/インターネットプロトコル(TCP/IP)ハードウェア及び/またはTCP/IPソフトウェア、ルータ、リピータ、スイッチ、グリッド、及び/またはその他の構成要素を更に含む。
【0012】
様々な実施態様において、コンピューティングシステム100は、コンピュータ、ラップトップ、モバイルデバイス、ゲームコンソール、サーバ、ストリーミングデバイス、ウェアラブルデバイス、または他の様々な種類のいずれかのコンピューティングシステムもしくはコンピューティングデバイスである。コンピューティングシステム100の構成要素の数は、実施態様ごとに異なることに留意されたい。例えば、他の実施態様では、
図1に示した数よりも多いかまたは少ない各構成要素が存在する。他の実施態様では、コンピューティングシステム100は、
図1に示していない他の構成要素を含むことにも留意されたい。更に、他の実施態様では、コンピューティングシステム100は、
図1に示すものと違う他の方法で構築される。
【0013】
次に
図2を参照すると、サーバ200の仮想環境の一実施態様のブロック図が示される。一実施態様では、サーバ200は、クライアント205A~205N、仮想マシン(VM)215A~215N、仮想マシンモニタ(VMM)220、ホストハードウェア230、メモリ240、バス/ファブリック250、及びデバイス255を含む。一実施態様では、サーバ200は、クラウドサービスプロバイダ環境の一部である。サーバ200は、一実施態様で使用されるサーバアーキテクチャの単なる一例にすぎないことを理解されたい。他の実施態様では、サーバは、他の好適な方法で構成された他の数及び/または種類の構成要素を含む。
【0014】
クライアント205A~205Nは、サーバ200上のリソースに結合されている任意の数のクライアント、及び/またはサーバ200上のリソースを使用している任意の数のクライアントを表す。クライアント205A~205Nは、それぞれ、任意の数及び種類のアプリケーション207及び208を含む。クライアント205A~205Nのそれぞれの中のアプリケーションの1つは、例えば、Linux(登録商標)またはMicrosoft(登録商標)Windows(登録商標)などのオペレーティングシステムであり得る。各クライアント205A~205Nはまた、デバイス255とインタラクトするために、それぞれゲストドライバ210A~210Nを含み得る。一実施態様では、クライアント205A~205Nごとに、仮想マシン(VM)215A~215Nが、サーバ200上にインスタンス化される。一実施態様では、VMM220は、VM215A~215Nをスケジュール設定し、各VM内のオペレーティングシステムは、デバイス255でのアプリケーション207~208のスケジューリングを管理する。ホストハードウェア230は、任意の数及び種類の処理リソースを含む。例えば、一実施態様では、ホストハードウェア230は、複数のCPU(例えば、マルチコアCPU)を含む。ホストハードウェア230はまた、メモリコントローラロジック、キャッシュサブシステム(複数可)、ファブリック及び/または相互接続リソース、ネットワークインタフェース回路、電力管理回路、電圧調整器などを含む。メモリ240は、サーバ200内に含まれる任意の数及び種類のメモリデバイスを表す。バス/ファブリック250は、サーバ200の様々な構成要素を接続するための任意の種類の相互接続ロジックを含む。単一のデバイス255がバス/ファブリック250に接続されて示されているが、他の複数のデバイスがバス/ファブリック250に接続され得ることが理解されるべきである。一実施態様では、デバイス255はGPUである。他の実施態様では、デバイス255は、他の様々な種類のいずれかのデバイスである。様々な実施態様において、クライアント205A~205Nは、少なくとも部分的にデバイス255のコンピューティングリソースを使用して実行されるアプリケーションを含み得る。デバイス255をそれぞれ使用するクライアント205A~205Nのゲストドライバ210A~210Nは、それぞれアプリ207及び208とデバイス255のリソースとの間のインタラクションを管理するように設計されている。
【0015】
OS270とデバイス255との間のインタラクションを管理するために、メモリ240は、第Nのバージョンのカーネルデバイスモジュール260Aを格納しており、このカーネルデバイスモジュール260Aは、デバイス255用のデバイスドライバである。第Nのバージョンのカーネルデバイスモジュール260Aがメモリ240にロードされて、サーバ200にインストールされるとき、第Nのバージョンのカーネルデバイスモジュール260Aは、オペレーティングシステム(OS)270に登録されるのではなく、プロキシモジュール265に登録される。一実施態様では、OS270はLinux(登録商標)ベースのOSである。他の実施態様では、OS270は、他の様々な種類のいずれかのOS(例えば、Windows(登録商標))である。
【0016】
第Nのバージョンのカーネルデバイスモジュール260Aがメモリ240にロードされて、サーバ200にインストールされるとき、第Nのバージョンのカーネルデバイスモジュール260Aは、オペレーティングシステム(OS)270に登録されるのではなく、プロキシモジュール265に登録される。第Nのバージョンのカーネルデバイスモジュール260Aは、前バージョンのデバイスドライバが、既にインストールされていて、デバイス255用のサーバ200で動作しているかどうかを認識していない。プロキシモジュール265は、登録処理の間に、第Nのバージョンのカーネルデバイスモジュール260Aが第1のデバイスドライバであるかどうか、または前バージョンのデバイスドライバが既に存在しているかどうかを、第Nのバージョンのカーネルデバイスモジュール260Aに通知するために表示を返す。サーバ200の存続期間中に、新たな機能を追加する、バグを修正する、及び/またはその他の種類の変更を加えることのために、デバイス255用のデバイスドライバを更新することが望まれる場合がある。ただし、デバイスドライバの更新が、クライアント205A~205Nの動作との干渉を最小限にすることも望まれる。第(N+1)のバージョンのカーネルデバイスモジュール260Bは、第Nのバージョンのカーネルデバイスドライバ260Aを置き換えることを目的とする、デバイス255用の新しいバージョンのデバイスドライバを表す。例えば、一実施態様では、第(N+1)のバージョンのカーネルデバイスモジュール260Bは、第Nのバージョンのカーネルデバイスドライバ260Aとは異なる1つ以上のデータ構造を使用する。
【0017】
第(N+1)のバージョンのカーネルデバイスモジュール260Bがメモリ240にロードされて、サーバ200にインストールされるとき、第(N+1)のバージョンのカーネルデバイスモジュール260Bは、オペレーティングシステム(OS)270に登録されるのではなく、プロキシモジュール265に登録される。第(N+1)のバージョンのカーネルデバイスモジュール260Bがプロキシモジュール265に登録されるとき、第(N+1)のバージョンのカーネルデバイスモジュール260Bは、前バージョンのデバイスドライバが、既にインストールされていて、デバイス255用のサーバ200で動作しているかどうかを認識していない。前バージョン(第Nのバージョン)が既に動作している場合、プロキシモジュール265は、登録処理の間に、既存のデバイスドライバが既に動作していることを、第(N+1)のバージョンのカーネルデバイスモジュール260Bに通知するために表示を返す。プロキシモジュール265はまた、第(N+1)のバージョンのカーネルデバイスモジュール260Bに、第Nのバージョンのカーネルデバイスモジュール260Aへのポインタを提供する。これにより、第(N+1)のバージョンのカーネルデバイスモジュール260Bと第Nのバージョンのカーネルデバイスモジュール260Aとが通信して、第(N+1)のバージョンのカーネルデバイスモジュール260Bへの制御の移行を管理することが可能になる。
【0018】
いくつかの予想される展開では、第Nのバージョンのカーネルデバイスモジュール260Aから第(N+1)のバージョンのカーネルデバイスモジュール260Bへのこの制御の移行は、クライアント205A~205Nが移行を認識することなく行われなければならない。モジュール260A~260B間で制御を移すプロセスの一部として、デバイス255に関連付けられた静的データが、第Nのバージョンのカーネルデバイスモジュール260Aから第(N+1)のバージョンのカーネルデバイスモジュール260Bにコピーされる。静的データがコピーされている間に、少しも中断することなく、第Nのバージョンのカーネルデバイスモジュール260Aはデバイス255の管理を継続し、クライアント205A~205Nはデバイス255の実行及び使用を継続する。一実施態様では、静的データには、いくつかのVF、フレームバッファのサイズ、構成ファイルからのデータ、ビデオ基本入出力システム(BIOS)画像、及び/またはその他のデータが含まれる。静的データがコピーされた後に、第Nのバージョンのカーネルデバイスモジュール260Aが停止される。一実施態様では、第Nのバージョンのカーネルデバイスモジュール260Aを停止するには、第Nのバージョンのカーネルデバイスモジュール260Aに入ってくる全ての入力を阻止することを必要とする。ただし、第Nのバージョンのカーネルデバイスモジュール260Aに入ってくる全ての入力を阻止することが、必ずしもクライアント205A~205Nを阻害するわけではない。例えば、一実施態様では、デバイス255はGPUであり、所与のクライアント205は、停止動作が開始されたときに、デバイス255でレンダリング動作を実行している可能性がある。第Nのバージョンのカーネルデバイスモジュール260Aが停止している間に、レンダリング動作は、中断することなしに、デバイス255で実行し続けることができる。所与のクライアント205が第Nのバージョンのカーネルデバイスモジュール260Aからのレスポンスを待っている場合にのみ、所与のクライアント205はわずかな遅延を受けるであろう。第Nのバージョンが停止され、第(N+1)のバージョンのカーネルデバイスモジュール260Bがまだ始動していない間に、第Nのバージョンのカーネルデバイスモジュール260Aに対する外部スティミュラスが発生した場合、起こり得るわずかな遅延がシステムに生じる可能性がある。第Nのバージョンのカーネルデバイスモジュール260Aが停止した後、デバイス255に関連付けられた一時データは、第Nのバージョンのカーネルデバイスモジュール260Aから第(N+1)のバージョンのカーネルデバイスモジュール260Bに転送される。そして、第(N+1)のバージョンのカーネルデバイスモジュール260Bが、デバイス255用の新しいデバイスドライバとして引き継がれる。クライアント205A~205Nは、デバイス255用のデバイスドライバのこの変更を認識しない。
【0019】
次に
図3を参照すると、コンピューティングシステム300の一実施態様のブロック図が示されている。一実施態様では、カーネルデバイスモジュール305Aが、所与のデバイス(図示せず)のデバイスドライバとして動作するようにプロキシモジュール315Aに登録される。一実施態様では、所与のデバイスはGPUである。他の実施態様では、所与のデバイスは、他の様々な種類のいずれかのデバイスである。本明細書では、「カーネルデバイスモジュール」と「デバイスドライバ」という用語は、区別なく用いられていることに留意されたい。
【0020】
VM320A、330A、及び340Aは、所与のデバイスの処理リソースを利用している任意の数のVMを表す。VM320A、330A、及び340Aは、それぞれ、所与のデバイスにおいて交替で実行される仮想関数(VF)325A、335A、及び345Aに対応する。別の実施態様では、VFではない様々なクライアントが、交替で、所与のデバイスで実行される場合がある。カーネルデバイスモジュール305Aがプロキシモジュール315Aに登録された後、プロキシモジュール315Aは、カーネルデバイスモジュール305Aを装って、オペレーティングシステム(OS)(図示せず)に登録される。つまり、プロキシモジュール315Aは、カーネルデバイスモジュール305Aを所与のデバイスのデバイスドライバとして登録するために、OSに対してカーネルデバイスモジュール305Aだと自称する。次に、プロキシモジュール315Aがカーネルデバイスモジュール305Aの代わりにOSに登録された後、カーネルデバイスモジュール305Aは、所与のデバイスの管理を開始することができる。一実施態様では、所与のデバイスを管理するには、IOCTL呼び出し及びsysfs呼び出しの処理、割り込み(例えば、メールボックス割り込み、ワールドスイッチ割り込みなど)の処理、ならびにデバッグリクエストの処理を必要とする。他の実施態様では、所与のデバイスを管理するには、その他の種類のアクションを必要とする。
【0021】
次に
図4を参照すると、コンピューティングシステム400の一実施態様のブロック図が示されている。コンピューティングシステム400は、後の時点での(
図3の)コンピューティングシステム300を表すことを意図している。したがって、カーネルデバイスモジュール305B及びプロキシモジュール315Bは、それぞれ、後の時点でのカーネルデバイスモジュール305A及びプロキシモジュール315Aを表すことを意図している。
図4に示される時点では、カーネルデバイスモジュール310Bがシステム400にロードされている。システム400にロードされるということは、カーネルデバイスモジュール310Bがシステム400のメモリに格納されており、カーネルデバイスモジュール310Bの実行がシステム400の1つ以上のプロセッサで開始されていることを意味する。
【0022】
この説明の目的のために、カーネルデバイスモジュール310Bは、カーネルデバイスモジュール305Bの後続のバージョンであると想定されている。例えば、カーネルデバイスモジュール305Bが第1のバージョンのデバイスドライバである場合、カーネルデバイスモジュール310Bは、第2のバージョンまたはそれ以降(またはダウングレードについてはそれ以前)のバージョンのデバイスドライバである。デバイスドライバは、新たな機能の実装、バグの修正、セキュリティアップデートの提供、及び/またはその他の変更の実施のために、随時更新されるのが一般的である。したがって、所与のデバイスのための元のデバイスドライバは、システム400の全存続期間を通じて、所与のデバイスのための唯一のデバイスドライバではないことが予想される。よって、カーネルデバイスモジュール305Bへの更新は、様々な時点でシステム400にロードされる。カーネルデバイスモジュール310Bは、カーネルデバイスモジュール305Bの完全な置き換えであることを意図している。カーネルデバイスモジュール305Bの完全な置き換えを実行する場合、カーネルデバイスモジュール305Bからカーネルデバイスモジュール310Bへの制御の受け渡しにより、VM320B、330B、及び340Bが阻害されるべきではない。あるいは、言い換えれば、カーネルデバイスモジュール305Bからカーネルデバイスモジュール310Bへの制御の移行時に、VM320B、330B、及び340Bに対する妨害を最小限に抑えることが望ましい。
図4に示すように、VM320B、330B、及び340Bは、それぞれ、所与のデバイスにおいて交替で実行されるVF325B、335B、及び345Bに対応する。別の実施態様では、VFではない様々なクライアントが、所与のデバイスで実行されている場合がある。
【0023】
本明細書で使用するとき、「カーネルデバイスモジュール」という用語は、システム400の所与のデバイスと、システム400のOSまたは他のソフトウェアアプリケーションとの間のインタフェースを処理するデバイスドライバとして定義される。一実施態様では、所与のデバイスはGPUである。他の実施態様では、所与のデバイスは、他の様々な種類のいずれかのデバイスである。この説明の目的のために、カーネルデバイスモジュール310B及びカーネルデバイスモジュール310Aは、両方とも、システム400の同じデバイスにインタフェースするように設計されていると想定されている。したがって、カーネルデバイスモジュール310Bとカーネルデバイスモジュール310Aとの両方が、同じ所与のデバイスへのインタフェースを同時に処理しようとした場合、それにより、システム400にとって予測不可能な挙動がもたらされるはずである。したがって、カーネルデバイスモジュール305B及びカーネルデバイスモジュール310Bは、制御の受け渡しを管理するために、所与のデバイスへのアクセスを調整することになる。
【0024】
カーネルデバイスモジュール310Bがシステム400にロードされるとき、カーネルデバイスモジュール310Bは、OSに登録されるのではなく、プロキシモジュール315Bに登録される。OSは、所与のデバイスに対して既に既存のドライバを登録しているので、OSは、この所与のデバイスに対して、同じドライバ名でカーネルデバイスモジュール310Bを登録することを許可しない。既存の登録は、カーネルデバイスモジュール305Bの代わりに、プロキシモジュール315Bによって行われたものである。結果的に、カーネルデバイスモジュール310Bは、所与のデバイスのデバイスドライバとなるようにOSに登録され得ないため、カーネルデバイスモジュール310Bは、プロキシモジュール315Bに登録される。この登録の試行を受信することに応答して、プロキシモジュール315Bは、別のカーネルデバイスモジュール(すなわち、カーネルデバイスモジュール305B)が、所与のデバイスのデバイスドライバになるように既に登録されていることをカーネルデバイスモジュール310Bに通知する。プロキシモジュール315Bはまた、カーネルデバイスモジュール310Bがカーネルデバイスモジュール305Bと通信することを可能にするポインタを、カーネルデバイスモジュール310Bに提供する。
【0025】
本実施態様では、カーネルデバイスモジュール310Bは、ポインタを使用してカーネルデバイスモジュール305Bと通信し、それによって所与のデバイスの制御の移行を促進する。第1のステップとして、カーネルデバイスモジュール310Bは、所与のデバイスに関連付けられた全ての静的データをリクエストする。このリクエストに応答して、カーネルデバイスモジュール305Bは、所与のデバイスに関連付けられた静的データを、カーネルデバイスモジュール310Bに送る。一実施態様では、静的データには、いくつかのVF、フレームバッファのサイズ、構成ファイルからのデータ、ビデオ基本入出力システム(BIOS)画像、及び/またはその他のデータが含まれる。これらのイベントが発生している間に、カーネルデバイスモジュール305Bは、所与のデバイスのデバイスドライバとして機能し続ける。カーネルデバイスモジュール305Bは、所与のデバイスのデバイスドライバとして機能し続けることにより、所与のデバイスに対するIOCTL呼び出し及びsysfs呼び出しを処理し続ける。カーネルデバイスモジュール305Bはまた、所与のデバイスに対するメールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号を処理し続ける。
【0026】
次に
図5を参照すると、コンピューティングシステム500の一実施態様のブロック図が示されている。
図5は、
図4の説明の続きを表す。つまり、コンピューティングシステム500は、後の時点でのコンピューティングシステム400を表すことを意図している。したがって、カーネルデバイスモジュール305C、カーネルデバイスモジュール310C、及びプロキシモジュール315Cは、それぞれ、(
図4の)後の時点でのカーネルデバイスモジュール305B、カーネルデバイスモジュール310B、及びプロキシモジュール315Bを表すことを意図している。VM320C、330C、及び340CならびにVF325C、335C、及び345Cはまた、それぞれ、(
図4の)後の時点でのVM320B、330B、及び340BならびにVF325B、335B、及び345Bを表す。
【0027】
図5に示される時点で、カーネルデバイスモジュール305Cによるメールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号の処理は一時停止されている。カーネルデバイスモジュール305Cを宛先とする、所与のデバイスに対してこの時間中に生成される割り込みまたはデバッグ信号は、全てキューに入れられる。また一方、カーネルデバイスモジュール305Cは、この時点では、IOCTL呼び出し及びsysfs呼び出しを処理し続ける。本実施態様では、VM320B、330B、または340Bのいずれかが、ちょうど所与のデバイスを利用している場合には、引き続き利用することができる。VM宛ての任意の割り込みまたは動作は、妨げられることなく引き続き処理され得る。カーネルデバイスモジュール305Cとカーネルデバイスモジュール310Cとは互いに通信して、割り込み及びデバッグ信号の処理の一時停止と、カーネルデバイスモジュール305Cの停止とのタイミングを調整する。カーネルデバイスモジュール305Cが停止されると、カーネルデバイスモジュール305Cは、一時データをカーネルデバイスモジュール310Cに送る。一実施態様では、一時データには、現在実行中のVF、現在実行中のVFの状態、実行リストにあるVFの順序、イベントバケット、累積データ、及び/または他のデータが含まれる。カーネルデバイスモジュール305Cが停止している間、VM宛ての任意の割り込みまたは動作は、妨げられることなく引き続き処理され得る。
【0028】
次に
図6を参照すると、コンピューティングシステム600の一実施態様のブロック図が示されている。コンピューティングシステム600は、後の時点でのコンピューティングシステム500を表すことを意図している。したがって、カーネルデバイスモジュール305D、カーネルデバイスモジュール310D、及びプロキシモジュール315Dは、それぞれ、後の時点でのカーネルデバイスモジュール305C、カーネルデバイスモジュール310C、及びプロキシモジュール315Cを表すことを意図している。また、VM320D、330D、及び340D、ならびにVF325D、335D、及びVF345Dは、それぞれ、後の時点でのVM320C、330C、及び340C、ならびにVF325C、335C、及びVF345Cを表す。
【0029】
図6に示される時点で、メールボックス割り込み、ワールドスイッチ割り込み、及びデバッグ信号の処理は、カーネルデバイスモジュール310Dによって再開されている。カーネルデバイス305Dが割り込み及びデバッグ信号の処理を中止してから、カーネルデバイス310Dが割り込み及びデバッグ信号の処理を処理するのを開始するまでの間に生成された任意の割り込みまたはデバッグ信号は、それらが記録されていた対応するキューまたは状態レジスタから処理される。更に、
図6によって表される時点で、カーネルデバイスモジュール310Dは、IOCTL呼び出し及びsysfs呼び出しの処理を開始するようになる。カーネルデバイスモジュール310D及びカーネルデバイスモジュール305Dは、互いに通信して、IOCTL呼び出し及びsysfs呼び出しの処理を処理するための制御の移行を調整する。
【0030】
次に
図7を参照すると、OS、プロキシモジュール、及びカーネルデバイスモジュール間のインタラクションの一実施態様のシーケンス図が示されている。一実施態様では、カーネルデバイスモジュール706に対してmodprobe呼び出しが行われると、OS702は、カーネルデバイスモジュール706の依存関係を解決する。実施態様に応じて、modprobeは手動で実行されるか、またはmodprobeは起動スクリプトの一部として自動化される。OS702は、カーネルデバイスモジュール706がプロキシモジュール704に依存していると判定した場合、ステップ710でプロキシモジュール704をロードして初期化する。プロキシモジュール704は、ステップ714でロードすべきカーネルデバイスモジュール706に備えて、ステップ712で内部初期化を実行する。次に、カーネルデバイスモジュール706がステップ714でロードされた後、カーネルデバイスモジュール706は、ステップ716で関数「register_driver」を呼び出して、プロキシモジュール704に登録する。本説明の目的のために、カーネルデバイスモジュール706は、本システムの特定のデバイス向けにロードすべき第1のデバイスドライバであると想定されている。したがって、カーネルデバイスモジュール706が、特定のデバイスに対してロードすべき第1のデバイスドライバであるので、プロキシモジュール704は、ステップ718において、カーネルデバイスモジュール706のこのインスタンスに関連付けられた、プロキシモジュール704の内部テーブルをアクティブとしてマークし、ハードウェアの初回の初期化が特定のデバイスに対して実行される。
【0031】
カーネルデバイスモジュール706は、OS702にデバイスドライバとして登録されるのではなく、プロキシモジュール704にデバイスドライバとして登録される。プロキシモジュール704は、カーネルデバイスモジュール706の代理OSとして機能する。バス(例えば、ペリフェラルコンポーネントインターコネクト(PCI))デバイス識別子(ID)は、プロキシモジュール704に対して透過的である。プロキシモジュール704は、カーネルデバイスモジュール706からデバイスIDを取得する。それによって、プロキシモジュール704のバージョンとカーネルデバイスモジュール706のバージョンとの間に独立性のための付加的レベルが設けられる。プロキシモジュール704は、カーネルデバイスモジュール706によって提供されるデバイスIDを使用して、カーネルデバイスモジュール706の代わりに、プロキシモジュール704自体のドライバをOS702に登録することになる。カーネルデバイスモジュール706は、プロキシモジュール704に、プロキシモジュール704がカーネルデバイスモジュール706への呼び戻しとして使用する関数ポインタのテーブルを渡す。セキュリティの目的で、プロキシモジュール704は、関数ポインタテーブルのコピーを作成する。これにより、カーネルデバイスモジュール706が、悪意から故意に、または偶然に(例えば、バグのため)テーブルを変更することが防止される。
【0032】
ループ721において、OS702は、所与のデバイスIDに一致するデバイスを検索し、ステップ722で、一致するデバイスIDごとにプロキシモジュール704の.probe関数を呼び出す。OS702は、これをカーネルデバイスモジュール706のデバイスIDテーブル内のデバイスIDと一致する全てのデバイスに対して実行する。.probe関数への呼び出しを受けた時に、プロキシモジュール704は、ハードウェアデバイスの初期化を全く実行しない。むしろ、デバイスの初期化は、カーネルデバイスモジュール706によって実行される。プロキシモジュール704は、カーネルデバイスモジュール706の一致するデバイスIDごとに、.probe呼び戻し関数を呼び出す。一実施態様では、プロキシモジュール704は、OSパラメータに追加される追加のパラメータを用いて、カーネルデバイスモジュール706の.probe関数を呼び出す。この追加のパラメータは、ロードがドライバの初期ロードであるのか、それとも前ドライバの置き換えであるのかを示す。シーケンス
図700に示す実施態様の場合、プロキシモジュール704は、追加のパラメータを使用して、これがドライバの初期ロードであることをカーネルデバイスモジュール706に通知する。これがドライバの初期ロードであるという通知を受けることに応答して、カーネルデバイスモジュール706は、完全なハードウェア初期化を実行する。
【0033】
全てのデバイスがプローブされて初期化されると、カーネルデバイスモジュール706は、その通常のランタイムモードに入る。ランタイム中、デバイス及びカーネルデバイスモジュール706の状態に影響を及ぼし得るスティミュラスの例には、メールボックス割り込み、ワールドスイッチタイマ割り込み、及びハードウェアエミュレータからの通知が含まれ得る。ゲストOSのゲストドライバは、メールボックス割り込みを使用して、カーネルデバイスモジュール706宛ての通知を生成する。カーネルデバイスモジュール706がメールボックス割り込みを受けると、カーネルデバイスモジュール706は、後の処理のためにメールボックス作業キュー上の作業項目をスケジュールする。OS702が使用可能になると、OS702は、作業キュー上の作業を実行する。一実施態様では、カーネルデバイスモジュール706は、プログラム可能な間隔でワールドスイッチタイマ割り込みを処理する。一実施態様では、プログラム可能な間隔とは、3ミリ秒(ms)から5msの範囲をいう。カーネルデバイスモジュールは、間隔ごとに、ワールドスイッチ作業キュー内のワールドスイッチリクエストをスケジュールする。
【0034】
様々な実施態様において、ハードウェアエミュレータとカーネルデバイスモジュール706とは、IOCTL呼び出し(ハードウェアエミュレータ→カーネルデバイスモジュール706)及びsysfs呼び出し(カーネルデバイスモジュール706→ハードウェアエミュレータ)を介して互いに通信する。一実施態様では、ハードウェアエミュレータは、クイックエミュレータ(QEMU)である。ハードウェアエミュレータが何らかの作業を処理するためにカーネルデバイスモジュール706を必要とする場合、ハードウェアエミュレータは、IOCTL属性を開き、リクエストを送り、その後、属性を閉じる。カーネルデバイスモジュール706がIOCTL呼び出しから戻ると、作業は完了している。作業は、呼び出し元のスレッドでの呼び出しに応答して、カーネルデバイスモジュール706内で直接行われる。ワールドスイッチング及びメールボックス割り込みの場合のように関与している作業キューはない。ハードウェアエミュレータが行うべき作業がカーネルデバイスモジュール706にある場合、カーネルデバイスモジュール706は、コマンドをバッファに配置し、ハードウェアエミュレータインスタンスが待機している属性を合図する。ハードウェアエミュレータは、バッファを読み出し、ハードウェアエミュレータが作業を終了するとIOCTL呼び出しで応答する。
【0035】
カーネルデバイスモジュール706は、カーネルデバイスモジュール706が、置き換えられるか、またはアンロードされるまで、スティミュラスを検出して処理するループ731内に留まる。一実施態様では、カーネルデバイスモジュール706の通常のランタイム時に、カーネルデバイスモジュール706は、プロキシモジュール704とは独立して実行される。言い換えれば、本実施態様では、プロキシモジュール704は、デバイスのシングルルート入力/出力仮想化(SRIOV)動作に関与しない。一実施態様では、プロキシモジュール704は、カーネルデバイスモジュール706の更新または置換を担当する。本実施態様では、プロキシモジュール704は、カーネルデバイスモジュール706が本システムからアンロードされようとする場合、または新しい方のカーネルデバイスモジュールがカーネルデバイスモジュール706を置き換えようとする場合にアクティブ化される。
【0036】
次に
図8を参照すると、新しいカーネルデバイスモジュール810をロードする際のインタラクションの一実施態様のシーケンス図が示される。新しいカーネルデバイスモジュール810が本システムにロードされるとき、新しいカーネルデバイスモジュール810は、OSに登録されるのではなく、プロキシモジュール805に登録される。新しいカーネルデバイスモジュールバージョン810は、既に実行されている既存のカーネルデバイスモジュール815が存在することを認識していない。新しいカーネルデバイスモジュールバージョン810は、既存のカーネルデバイスモジュールバージョン815が、プロキシモジュール805に登録されるために、所与の関数register_driver()を呼び出すことによって、プロキシモジュール805に登録されたのと同じ方法でプロキシモジュール805に登録されるよう試みる。新しいカーネルデバイスモジュールバージョン810は、ステップ820において、関数ポインタのテーブルとデバイスIDのテーブルとの両方をプロキシモジュール805に渡す。
【0037】
一実施態様では、新しいカーネルデバイスモジュール810のロードは、ライブカーネルデバイスモジュール更新プロセスをトリガし、それ以上のユーザインタラクションは必要とされない。一実施態様では、既存のカーネルデバイスモジュールバージョン815は、成功した場合は削除され、またはエラーが検出された場合には、新しいカーネルデバイスモジュールバージョン810が削除される。ライブカーネルデバイスモジュールバージョン更新の目標の1つは、実行中のクライアントセッションを中断することなく、カーネルデバイスモジュールの実行可能コードを更新できるようにすることである。これには、コードの順方向更新及び逆方向更新の両方が含まれる。完全な更新を実行できるようにするために、更新前に存在していた全てのライブクライアントセッションが更新後にもアクティブになることが望ましい。新しいカーネルデバイスモジュール810が、既存のカーネルデバイスモジュール815がサポートするデバイスと同じデバイスをサポートする場合、新しいカーネルデバイスモジュール810は、これらのデバイスの新しいデバイスドライバとして登録される。あるいは、新しいカーネルデバイスモジュール810が、既存のカーネルデバイスモジュール815がサポートするデバイスと同じデバイスをサポートできない場合は、更新は中止され、エラーの説明がログに記録される。
【0038】
次に
図9を参照すると、新しいカーネルデバイスモジュール810をロードする際のインタラクションの一実施態様のシーケンス図が示される。
図9は、
図8の説明の続きであることを意図したものである。デバイスの制御を既存のカーネルデバイスモジュール815から新しいカーネルデバイスモジュール810に移すとき、静的データは、既存のカーネルデバイスモジュール815から新しいカーネルデバイスモジュール810に送られる。静的データが転送された後、既存のカーネルデバイスモジュール815から新しいカーネルデバイスモジュール810に一時データを転送するために、既存のカーネルデバイスモジュール815は停止される。
【0039】
一実施態様では、新しいデバイスドライバへの移行中に機密の一時データを転送するために、デバイスの状態は安定している必要がある。本実施態様では、デバイスは引き続き動作することができるが、カーネルデバイスモジュールによって認識されている状態を変更することはできない。一実施態様では、ソフトウェア及び/またはデバイスの状態を変更することができるスティミュラスが特定される。一実施態様では、これらのスティミュラスには、メールボックス割り込み、ワールドスイッチ割り込み、及びハードウェアエミュレータからの通知が含まれる。他の実施態様では、デバイスの状態が変化するのを防ぐために、他のスティミュラスが特定されて停止される。既存のカーネルデバイスモジュール815は、機密の一時データの転送中にいずれかの状態変化が起こるのを防ぐために、これらの特定されたスティミュラスを阻止することによって、ボックス910内で停止される。
【0040】
ここで
図10を参照すると、既存のカーネルデバイスモジュールバージョン1010を停止する一実施態様のシーケンス図が示される。本説明の目的のために、既存のカーネルデバイスモジュールバージョン1010を置き換えることにより、新しいカーネルデバイスモジュールバージョン1005が、所与のデバイスのデバイスドライバとして引き継いでいると想定している。一実施態様では、所与のデバイスはGPUであり、他の実施態様では、所与のデバイスは、他の様々なデバイス(例えば、ネットワークコントローラ、ストレージデバイス)のいずれかである。既存のカーネルデバイスモジュールバージョン1010を置き換えるために、既存のカーネルデバイスモジュールバージョン1010は停止させる。一実施態様では、既存のカーネルデバイスモジュールバージョン1010の停止は、新しいカーネルデバイスモジュールバージョン1005によって開始されるが、停止状態に到達するために様々なアクションを実行するのは、既存のカーネルデバイスモジュールバージョン1010である。一実施態様では、ホストコンピューティングシステムで実行されている複数のスレッドを停止することによって、既存のカーネルデバイスモジュールバージョン1010を停止する。一実施態様では、停止されるスレッドには、スケジューラスレッド、メールボックススレッド、及びIOCTLスレッドが含まれる。一実施態様では、各スレッドは、スレッドが新規作業を受け入れることができるか否かを示す関連フラグを(アダプタごとに)有する。
【0041】
一実施態様では、停止すべき第1のスレッドは、ステップ1015のスケジューラスレッドである。スケジューラスレッドに対してフラグを設定することで、カーネルデバイスモジュールのワールドスイッチスケジューラに、スケジューラスレッドが新しいスケジューラリクエストを開始することができなくなる(つまり、それ以上のワールドスイッチが発生するのを阻止することができる)ことが示される。メールボックススレッドがスケジューラを再起動するリクエストを生成しようとする可能性があるため、スケジューラスレッドは最初に停止される。スケジューラスレッドは引き続き処理中のリクエストを処理することができるが、スケジューラスレッドが停止すると、スケジューラスレッドは新しいリクエストを開始することができないことに注意されたい。スケジューラスレッドを再起動するための呼び出しが行われた場合、この呼び出しは無視される。
【0042】
一実施態様では、スケジューラスレッドがステップ1015で停止され、その後、ステップ1020でメールボックススレッドが停止される。ゲストドライバが排他的アクセスモードを保持している場合、ゲストドライバはワールドスイッチミューテックスを保持していることにもなる。ワールドスイッチミューテックスは、他の任意の仮想関数(VF)へのワールドスイッチングを防ぐ。ワールドスイッチミューテックスは、ゲストドライバが、(メールボックスメッセージを介して)排他モードを解放するか、またはタイムアウトしたときに解放される。メールボックススレッドは、排他モードを許可するリクエストよりも、排他モードを解放するリクエストを優先する。メールボックススレッドがアクティブに実行されていて、排他モードを解放するリクエストがある場合、このリクエストは処理中となる。メールボックススレッドは、スケジューラスレッドが停止するのを待つ前に、排他モードの解放を終えることができる。排他モードが保持されており、作業キューに排他モードの保留中の解放がない場合、スケジューラスレッドは停止してもよく、過渡状態の移行の間に、ミューテックス状態が、カーネルデバイスモジュールバージョン1005に移行されることに注意されたい。つまり、ライブ更新は、ライブ更新を完了する前に、排他モードが完了するまで待つ必要はない。
【0043】
メールボックススレッドが新規作業を受け付けないようにするために、メールボックススレッドはステップ1020で停止される。メールボックススレッドのための新規作業は、ゲストドライバが、排他モードに入るリクエスト、または排他モードを終了するリクエストを発行することから始まる。一実施態様では、ゲストドライバを停止する代わりに、メールボックス割り込みが禁止される。ゲストドライバは、引き続きメールボックス割り込みのトリガを試みることができるが、メールボックス割り込みは処理されない。割り込みリクエストはメールボックス状態レジスタに保存され、割り込みが禁止されている間に作業リクエストが生成されたかどうかを判定するために、後でポーリングすることができる。ステップ1020でメールボックススレッドを停止するリクエストは、メールボックススレッドが作業項目を処理している間に発生する場合がある。また、メールボックススレッドのキューに入れられた作業項目がある場合もある。フラグを設定しても、メールボックススレッドがアイドル状態になることを示すものではない。次のステップは、ステップ1025でメールボックススレッドが停止するのを待つことである。
【0044】
ステップ1020でメールボックススレッドの停止をリクエストした後、処理中の作業項目は完了するまで処理されるが、新しい作業項目は開始されない。キュー上の全ての作業項目は、一時データの転送中に処理するために、新しいカーネルデバイスモジュールバージョン1005に転送される。一実施態様では、既存のカーネルデバイスモジュールバージョン1010は、ステップ1025でメールボックススレッドが停止するのを待ち、スケジューラスレッドが停止するのを待ってから、ステップ1035でIOCTLスレッドを停止する。一般的には、メールボックス作業項目にはVMMからのレスポンスも必要になる。デッドロックせずにレスポンスを受け取るために、IOCTLスレッドは、メールボックススレッドがステップ1025で停止するまで実行を継続することが許可される。ステップ1035でIOCTLスレッドの停止をリクエストした後、既存のカーネルデバイスモジュールバージョン1010は、ステップ1040でIOCTLスレッドが停止するのを待つ。既存のカーネルデバイスモジュールバージョン1010は、未処理の作業が完了するまで待機してから、新しいカーネルデバイスモジュールバージョン1005に正常なレスポンスを返す。未処理の作業が完了すると、一時データが既存のカーネルデバイスモジュールバージョン1010から新しいカーネルデバイスモジュールバージョン1005に転送され、次いでデバイスの制御が新しいカーネルデバイスモジュールバージョン1005に渡される。
【0045】
次に
図11を参照すると、カーネルデバイスモジュールをロードするための方法1100の一実施態様が示されている。説明のために、本実施態様のステップと
図12のステップとは順を追って示されている。しかしながら、説明された方法の様々な実施態様では、説明された要素の1つ以上が、同時に実行されるか、示された順序とは異なる順序で実行されるか、または完全に省略されることに留意されたい。その他の追加要素も所望に応じて実行される。本明細書に記載された様々なシステムまたは装置のいずれかは、方法1100を実施するように構成されている。
【0046】
所与のバージョンのデバイスドライバが、プロキシモジュールに登録され、この所与のバージョンのデバイスドライバは、ソフトウェアアプリケーションと所与のデバイスとの間のインタラクションを管理するように構成されている(ブロック1105)。一実施態様では、デバイスはGPUである。他の実施態様では、デバイスは、他の様々な種類の処理デバイスまたは周辺デバイスのいずれかである。次に、プロキシモジュールは、前バージョンのデバイスドライバが既に、所与のデバイスを対象にして、本システムにロードされて、実行されているかどうかを判定する(条件ブロック1110)。前バージョンのデバイスドライバが既に本システムにロードされて実行されている場合(条件ブロック1110、「Yes」肢)、プロキシモジュールは、所与のバージョンのデバイスドライバに、デバイスドライバの前バージョンが既にロードされていることを明示する第1の表示を提供する(ブロック1115)。プロキシモジュールはまた、所与のバージョンのデバイスドライバに、前のバージョンのデバイスドライバを指し示すポインタを提供する(ブロック1120)。所与のバージョンのデバイスドライバは、第1の表示を受け取ることに応答して、デバイスのハードウェア初期化をやめる(ブロック1125)。所与のバージョンのデバイスドライバは、ポインタを使用して前バージョンのデバイスドライバと通信し、それによって前バージョンのデバイスドライバから所与のバージョンのデバイスドライバへのデバイスの制御の移行を処理する(ブロック1130)。デバイスの制御が前バージョンのデバイスドライバから所与のバージョンのデバイスドライバに移された後、前バージョンのデバイスドライバは非アクティブ化される(ブロック1135)。ブロック1135の後、方法1100は終了する。
【0047】
前バージョンのデバイスドライバがまだ本システムにロードされておらず、実行されていない場合(条件ブロック1110、「No」肢)、プロキシモジュールは、所与のバージョンのデバイスドライバに、第1の表示とは異なる第2の表示を提供する(ブロック1140)。また、プロキシモジュールは、所与のバージョンのデバイスドライバとしてOSに登録される(ブロック1145)。つまり、プロキシモジュールは、OSに対して所与のバージョンのデバイスドライバをエミュレートする。また、第2の表示を受け取ることに応答して、所与のバージョンのデバイスドライバによってデバイスがハードウェア初期化ルーチンを実行する(ブロック1150)。また、第2の表示を受け取ることに応答して、所与のバージョンのデバイスドライバは、デバイスの管理を開始する(ブロック1155)。ブロック1155の後、方法1100は終了する。様々な実施態様において、方法1100は、本システムにインストールされる新しいバージョンのデバイスドライバごとに実行されることに留意されたい。
【0048】
次に
図12を参照すると、デバイスの制御を、第1のバージョンのデバイスドライバから第2のバージョンのデバイスドライバに移すために、第1のバージョンのデバイスドライバを停止する方法1200の一実施態様が示される。第2のバージョンのデバイスドライバは、第1のバージョンのデバイスドライバが既にコンピューティングシステムの所与のデバイスを管理しているという表示を受け取る(ブロック1205)。一実施態様では、第2のバージョンのデバイスドライバは、プロキシモジュールへの登録に応答して表示を受け取る。表示を受け取ることに応答して、スケジューラスレッドを停止するリクエストが生成される(ブロック1210)。一実施態様では、スケジューラスレッドは、対応するフラグを設定することによって停止されるが、このフラグは、スケジューラスレッドが新しいスケジューラリクエストを開始できなくなったことをゲストドライバに示すものである。次に、メールボックススレッドを停止するリクエストが生成される(ブロック1215)。メールボックススレッドを停止するリクエストは、メールボックススレッドが新規作業を受け付けないようにするために、ブロック1215で生成される。次に、第1のバージョンのデバイスドライバは、メールボックススレッドが停止するのを待つ(ブロック1220)。次に、第1のバージョンのデバイスドライバは、スケジューラスレッドが停止するのを待つ(ブロック1225)。次に、IOCTLスレッドを停止するリクエストが生成される(ブロック1230)。次に、本システムは、IOCTLスレッドが停止するのを待つ(ブロック1235)。次に、第1のバージョンのデバイスドライバから第2のバージョンのデバイスドライバに、一時データが転送される(ブロック1240)。次に、第1のバージョンのデバイスドライバから第2のバージョンのデバイスドライバに、デバイスの制御が移される(ブロック1245)。ブロック1245の後、方法1200は終了する。
【0049】
様々な実施態様において、本明細書で説明した方法及び/または機構を実施するために、ソフトウェアアプリケーションのプログラム命令が使用される。例えば、汎用プロセッサまたは専用プロセッサによって実行可能なプログラム命令が企図されている。様々な実施態様において、このようなプログラム命令は、高水準プログラミング言語によって表される。他の実施態様では、プログラム命令は、高水準プログラミング言語からバイナリ形式、中間形式、またはその他の形式にコンパイルされる。代替的に、ハードウェアの挙動及び設計を記述するプログラム命令が書かれる。そのようなプログラム命令は、Cなどの高水準プログラミング言語で表される。あるいは、Verilogなどのハードウェア設計言語(HDL)が用いられる。様々な実施態様において、プログラム命令は、様々な非一時的なコンピュータ可読記憶媒体のいずれかに記憶される。記憶媒体は、コンピューティングシステムにプログラム命令を提供してプログラムを実行するために、使用中、コンピューティングシステムによってアクセス可能である。一般的に言って、そのようなコンピューティングシステムは、プログラム命令を実行するように構成された少なくとも1つ以上のメモリと1つ以上のプロセッサとを含む。
【0050】
上記の実施態様は、非限定的な実施態様の例に過ぎないことを強調しておく必要がある。上記の開示が十分に理解されると、多くの変形形態及び修正形態が当業者に明らかになるであろう。以下の特許請求の範囲は、そうした全ての変形形態及び修正形態を包含するように解釈されることが意図されている。