(57)【特許請求の範囲】
【請求項１】
不揮発性メモリをキャッシュするメモリバッファであって、前記不揮発性メモリは複数の有効領域及び複数の旧領域内にそれぞれ複数の有効変数及び複数の旧変数を記憶する、メモリバッファと、
書込みイベント中に前記有効変数が移動する移動元及び移動先を示す、前記複数の有効領域及び前記複数の旧領域のうちの少なくとも一部を示す交互の構造ポインタ対を利用して、前記メモリバッファ内の有効変数の移動を追跡するジャーナル領域と、
を備える、システム。
【請求項２】
前記メモリバッファは、前記有効領域内の前記有効変数を、前記旧変数を含む旧領域に移動させ、それにより、前記旧変数を前記有効変数で上書きする、請求項１に記載のシステム。
【請求項３】
前記ジャーナル領域は、前記不揮発性メモリ内の予約された領域を含む、請求項１に記載のシステム。
【請求項４】
前記交互の構造ポインタ対は、第１の構造ポインタ対と、第２の構造ポインタ対とを含む、請求項１に記載のシステム。
【請求項５】
前記第１の構造ポインタ対は、
第１の旧領域に対応する第１のメモリアドレスと、前記第１の旧領域に対応する第１の領域サイズとに関連付けられる第１のポインタと、
第１の有効領域に対応する第２のメモリアドレスと、前記第１の有効領域に対応する第２の領域サイズとに関連付けられる第２のポインタと、
を含む、請求項４に記載のシステム。
【請求項６】
前記第２の構造ポインタ対は、
第３のメモリアドレスに関連付けられる第３のポインタと、
第４のメモリアドレスに関連付けられる第４のポインタと、
を含む、請求項４に記載のシステム。
【請求項７】
前記第４のメモリアドレスは第２の有効領域の少なくとも一部に対応し、前記第３のメモリアドレスは第２のメモリアドレスに対応する、請求項６に記載のシステム。
【請求項８】
前記メモリバッファ内の有効変数及び有効領域の移動は、前記不揮発性メモリ内の有効変数及び有効領域の移動と全く同じように対応する、請求項１に記載のシステム。
【請求項９】
前記メモリバッファ内の前記複数の有効領域及び前記複数の旧領域に記憶される前記複数の有効変数及び前記複数の旧変数は、ガベージコレクションプロセスの完了後の前記不揮発性メモリ内の前記複数の有効領域及び前記複数の旧領域に記憶される前記複数の有効変数及び前記複数の旧変数と同一である、請求項１に記載のシステム。
【請求項１０】
旧変数領域を求めてメモリバッファを探索するステップと、
前記旧変数領域に隣接する有効変数領域を求めて前記メモリバッファを探索するステップと、
前記旧変数領域の全てが有効変数で上書きされるまで、前記有効変数領域から前記旧変数領域に前記有効変数を書き込むステップと、
前記書込み中に前記有効変数が移動する移動元及び移動先を示す、前記旧変数領域及び前記有効変数領域の少なくとも一部を示す交互の構造ポインタ対を用いて、前記書込みの実行を追跡するステップと、
を含む、方法。
【請求項１１】
前記追跡するステップは、不揮発性メモリユニット上に存在するジャーナルレコード上に記録され、該不揮発性メモリユニットの内容は前記メモリバッファ内にキャッシュされる、請求項１０に記載の方法。
【請求項１２】
前記有効変数領域から前記旧変数領域への前記有効変数の書込みは、前記不揮発性メモリユニット内の前記有効変数領域から前記旧変数領域への前記有効変数の書込みに全く同じように対応する、請求項１１に記載の方法。
【請求項１３】
前記交互の構造ポインタ対は、第１の構造ポインタ対と、第２の構造ポインタ対とを含む、請求項１０に記載の方法。
【請求項１４】
非一時的コンピュータ可読媒体上に具現されるコンピュータプログラムであって、
旧変数領域を求めてメモリバッファを探索するためのコンピュータコードと、
前記旧変数領域に隣接する有効変数領域を求めて前記メモリバッファを探索するためのコンピュータコードと、
前記旧変数領域の全てが有効変数で上書きされるまで、前記有効変数領域から前記旧変数領域に前記有効変数を書き込むためのコンピュータコードと、
前記書込み中に前記有効変数が移動する移動元及び移動先を示す、前記旧変数領域及び前記有効変数領域の少なくとも一部を示す交互の構造ポインタ対を用いて、前記書込みの実行を追跡するためのコンピュータコードと、
を含む、コンピュータプログラム。
【請求項１５】
前記追跡するためのコンピュータコードは、不揮発性メモリユニット上に存在するジャーナルレコード上に前記交互の構造ポインタ対を記録するためのコンピュータコードを更に含み、前記不揮発性メモリユニットの内容は前記メモリバッファ内にキャッシュされる、請求項１４に記載のコンピュータプログラム。
【発明の詳細な説明】
【背景技術】
【０００１】
例えば、デスクトップコンピュータ、ラップトップコンピュータ、タブレットコンピュータ等のコンピューティングデバイスにおいて用いられるハードウェアコンポーネントは多くの場合にファームウェアを含み、ファームウェアは、ハードウェアと、ハードウェアコンポーネントの低レベル機能を制御する実行可能命令との組み合わせを指すことができる。すなわち、ファームウェアは、コンピューティングデバイス内に設置されたハードウェアコンポーネント同士のインタラクションを可能にすることによって、コンピューティングデバイスが適切に動作できるようにすることができる。一例として、ハードドライブが、電源投入時にハードドライブを構成し、プロセッサからの命令を解釈及び実行し、ハードドライブの電源を安全に切るファームウェアを含むことができる。
【０００２】
ユニファイド・エクステンシブルファームウェアインタフェース（ＵＥＦＩ：Unified Extensible Firmware Interface）は、オペレーティングシステムとプラットフォームファームウェアとの間のソフトウェアインタフェースを規定する仕様（ユニファイドＥＦＩフォーラムによって管理される）を指している。ＵＥＦＩは、基本入出力システム（ＢＩＯＳ）ファームウェアインタフェースの代わりになるものを意図している。すなわち、ＢＩＯＳはファームウェアの根底をなす基本部品と考えることができるのに対して、ＵＥＦＩは、コンピューティングデバイスのハードウェア及びファームウェアの上に載っているプログラム可能なソフトウェアインタフェースと考えることができる（すなわち、ＵＥＦＩはＢＩＯＳの上に載ることができ、実際にそうなっている）。全てのブートコードがマザーボードのＢＩＯＳ内に記憶されるのではなく、ＵＥＦＩが、例えばマザーボード上に、又はハードドライブ上に、又はネットワークシェア上にある何らかの不揮発性メモリ内のＥＦＩ／ディレクトリ内に存在することができる。言い換えると、ＥＦＩソフトウェアは、システム起動時に、ファームウェア、例えば、フラッシュメモリからロードすることができる。ロードされると、ＥＦＩソフトウェアはブートプロセスを制御することができる。結果として、ＵＥＦＩは、軽量又は擬似オペレーティングシステム（ＯＳ）に類似していると考えることができる。
【０００３】
種々の例をより完全に理解してもらうために、ここで、添付の図面とともに取り上げられる以下の説明が参照される。
【図面の簡単な説明】
【０００４】
【図１】不揮発性耐障害（fault tolerant：フォールトトレラント）書込み機構を利用することができる例示的なシステムを示す図である。
【図２Ａ】不揮発性耐障害書込み機構を実施することができる例示的なＵＥＦＩプラットフォームを示す図である。
【図２Ｂ】不揮発性耐障害書込み機構に従ってデータ移動を追跡するための例示的なジャーナル領域を示す図である。
【図３】不揮発性耐障害書込みイベントを実行する際に実行される例示的なプロセスを示す図である。
【発明を実施するための形態】
【０００５】
図１は、ファームウェア更新アプリケーション１４５を実行するための命令で符号化することができるコンピュータ可読記憶媒体１４０を含む例示的なコンピューティングデバイス１００のブロック図である。ファームウェア更新アプリケーション１４５／ファーム更新が、不揮発性耐障害書込み機構を実施することができる例示的なアプリケーション／状況にすぎないこと、及び種々の他のファームウェアアプリケーション／状況が考えられることに留意されたい。コンピューティングデバイス１００は、例えば、デスクトップコンピュータ、ラップトップコンピュータ、サーバ、ハンドヘルドコンピューティングデバイス等とすることができる。コンピューティングデバイス１００は、プロセッサ１１０と、ハードウェアコンポーネント１２０と、ファームウェア／ＯＳインタフェース１３０と、コンピュータ可読記憶媒体１４０及び１５０とを含むことができる。
【０００６】
プロセッサ１１０は中央処理ユニット（ＣＰＵ）、半導体を利用したマイクロプロセッサ、又はコンピュータ可読記憶媒体１４０及び／又は１５０内に記憶された命令を検索し、実行するのに適した任意の他のハードウェアデバイスとすることができる。詳細には、プロセッサ１１０は、ファームウェア更新アプリケーション１４５及びファームウェア更新１５５をフェッチし、復号し、実行することができる。
【０００７】
ハードウェアコンポーネント１２０は、コンピューティングデバイス１００の機能を実現するために用いられる機械部品、磁気部品、電子部品及び／又は電気部品を含む任意の物理的デバイスとすることができる。例えば、ハードウェアコンポーネント１２０は、ハードディスクドライブ、ソリッドステートドライブ、光ディスクドライブ、ビデオ若しくはネットワークカード、ラップトップバッテリ、又はコンピューティングデバイス１００の内部若しくは外部に結合される任意の他の物理的デバイスとすることができる。コンピューティングデバイス１００は、１つのハードウェアコンポーネント１２０のみを含むように示されるが、それぞれが自らのファームウェア１２５を含む複数のハードウェアコンポーネント１２０を含むことができることに留意されたい。
【０００８】
各ハードウェアコンポーネント１２０はファームウェア１２５を含むことができ、ファームウェアは、ハードウェアコンポーネント１２０の機能を制御するために、プロセッサ１１０によって、又はハードウェアコンポーネント１２０自体に含まれるプロセッサ（図示せず）によって実行可能な命令で符号化された不揮発性機械可読記憶媒体を含むことができる。例えば、ファームウェア１２５は、ハードウェアコンポーネント１２０からの読出し、若しくはハードウェアコンポーネント１２０への書込みを行う機能、ハードウェアコンポーネント１２０の電力を管理する機能、及び／又はハードウェアコンポーネント１２０の動作中に用いられる１つ若しくは複数の他の機能を実行する機能を提供することができる。
【０００９】
ファームウェア／ＯＳインタフェース１３０は、ハードウェアコンポーネント１２０のファームウェア１２５とコンピューティングデバイス１００のＯＳとの間の機能リンクを提供するためにコンピュータ可読記憶媒体上に符号化される実行可能命令を含むことができる。詳細には、コンピューティングデバイス１００の電源投入時に、ファームウェア／ＯＳインタフェース１３０は、ハードウェアコンポーネント１２０を初期化し、構成し、試験し、及びＯＳをロードする一連の命令を実行することができる。さらに、ファームウェア／ＯＳインタフェース１３０は、ファームウェア更新アプリケーション１４５を初期化し、ハードウェアコンポーネント１２０上に含まれるファームウェア１２５を更新することができる。一例として、ファームウェア／ＯＳインタフェース１３０は、ファームウェア更新１５５が利用可能であることを検出することができ、その後、所定の場所からファームウェア更新アプリケーション１４５を初期化することができる。
【００１０】
種々の例によれば、ファームウェア／ＯＳインタフェース１３０は、コンピューティングデバイス１００を初期化するサービスを提供するためのＵＥＦＩ仕様（上記で言及された）に従って実現されるインタフェースとすることができる。別の例として、ファームウェア／ＯＳインタフェース１３０は、ＢＩＯＳ（同じく上記で言及された）が初期構成（例えば、パワーオン・セルフテスト）を実行することができ、その一方で、ＵＥＦＩインタフェースが残りの構成を実行し、ＯＳと通信することができるような、ＢＩＯＳの併用によって実現されるＵＥＦＩインタフェースとすることができる。
【００１１】
コンピュータ可読記憶媒体１４０は、ファームウェア更新アプリケーション１４５を実行するための実行可能命令で符号化することができる。上記で説明されたように、ファームウェア更新アプリケーション１４５は、ファームウェア／ＯＳインタフェース１３０によって初期化され、ファームウェア更新プロセスを管理することができる。幾つかの例では、初期化時に、ファームウェア更新アプリケーション１４５は、ファームウェア更新１５５の場所を特定し、その後、ファームウェア更新１５５を実行することができる。例えば、コンピューティングデバイス１００がファームウェア更新のインストールを当初からサポートできるように、ファームウェア更新アプリケーション１４５はコンピューティングデバイス１００の製造業者によって供給される場合があり、例えば、製造中又はカスタマイズ中にハードディスクドライブ又は記憶媒体内に組み込まれる場合がある。代替的には、コンピューティングデバイス１００上で実行されるアプリケーションが、自動的に、又はユーザの指示で、ファームウェア更新アプリケーション１４５を記憶媒体１４０にダウンロードすることができる。
【００１２】
コンピュータ可読記憶媒体１５０は、ハードウェアコンポーネント１２０のファームウェア１２５にファームウェア更新１５５を適用するための実行可能命令で符号化することができる。例えば、ファームウェア更新１５５は、ハードウェアコンポーネント１２０のコントローラによってサポートされる命令を用いて、ファームウェア１２５を含む記憶媒体にアクセスし、この記憶媒体に変更を加える命令を含むことができる。より具体的な例として、ハードウェアコンポーネント１２０がハードディスクドライブであるとき、ファームウェア更新１５５は、ハードディスク内のＲＯＭ又は類似のメモリ上に記憶されたファームウェアイメージの指定されたセクションに書き込むためにハードディスクドライブによって受け取られる命令を含むことができる。このようにして、ファームウェア更新１５５は、ファームウェア１２５への全てのアクセスを取り扱うことができ、一方、ファームウェア更新アプリケーション１４５は更新プロセスを管理することができる。
【００１３】
コンピューティングデバイス１００の外部にあるように示されるが、コンピュータ可読記憶媒体１５０は、コンピューティングデバイス１００の内部に存在する場合もあることに留意されたい。したがって、ファームウェア更新１５５は、内部ハードディスクドライブ、光ディスク、又は別の記憶媒体上に記憶することができる。さらに、別々のデバイスとして示されるが、コンピュータ可読記憶媒体１４０及びコンピュータ可読記憶媒体１５０は、コンピューティングデバイス１００の内部にあるか、又は外部にある同じ媒体とすることができる。例えば、ファームウェア更新アプリケーション１４５及びファームウェア更新１５５を外部記憶媒体から起動することができるように、ファームウェア更新アプリケーション１４５及びファームウェア更新１５５をいずれもフラッシュメモリドライブ又は光ディスクのような外部記憶媒体上に記憶することができる。そのような例は、例えば、複数のコンピューティングデバイス１００上に（例えば、ネットワーク管理者によって）同じ更新がインストールされることになる環境において、又はファームウェア更新アプリケーション１４５をコンピューティングデバイス１００の内部記憶媒体から起動できない状況において有利である。
【００１４】
記憶の観点から、ソフトウェアアセット／管理データ／イメージは、ＵＥＦＩ仕様による旧来のファームウェア機能に対する拡張を用いて、ファームウェア変数として記憶することができる。すなわち、ＵＥＦＩは、プラットフォームファームウェア内に「変数」として知られる永続的データを記憶するための抽象化を提供することができる。変数は、属性を伴う識別情報（鍵）と、任意のデータ（値）との両方を含む鍵／値対として規定することができる。変数を利用して、（上記のようなファームウェア更新の状況等において）ＯＳランタイムエンティティに変数を渡すことを含む、プラットフォーム内に実現されるＥＦＩ環境と、そのＥＦＩ環境内で実行されるＥＦＩ  ＯＳローダ及び他のアプリケーションとの間で行き来する場合があるデータを記憶することができる。ＵＥＦＩ仕様において変数記憶の実施態様は規定されないが、変数は通常、大抵の場合に永続的でなければならず、それは、プラットフォーム上にＥＦＩを実装することによって、記憶するために渡された変数を、少なくとも変数が明確に削除されるか、又は上書きされるまで保持できるようにし、システムがブートするたびに使用できるようにすべきであることを意味する。
【００１５】
ＵＥＦＩ仕様によれば、変数サービスが、ＯＳとシステムファームウェア（ＳＦＷ）（すなわち、ＢＩＯＳ）との間のデータ交換のための共通／標準インタフェースを与えることができる。そのために、変数サービスはＯＳランタイムになっても持続することができ、それゆえ、変数サービスＡＰＩはＯＳの影響を受ける可能性があり、例えば、プリブート動作中のファームウェア動作に加えて、ＯＳランタイム中のＯＳ動作によって変数データを追加、変更及び削除できるようになる。一般的に、変数データはシステムのブートファームウェアデバイス（ＢＦＤ）に記憶することができ、ブートファームウェアデバイスは、限定はしないが、フラッシュデバイス又は電気的消去可能プログラマブルリードオンリーメモリ（ＥＥＰＲＯＭ）等の、或る形の書換え可能不揮発性メモリコンポーネントとすることができる。そのような不揮発性メモリコンポーネントは、包括的には不揮発性（ＮＶ）書換え可能メモリデバイスと呼ばれ、記憶されたデータに対する読出し及び書込みの両方のアクセスを提供しながら、システムが実際に稼働していないときに、データを不揮発的に（すなわち、持続的に）記憶することができる任意のデバイスを指すことができる。したがって、データをそのデバイスのために規定された適切な記憶範囲に書き換えることによって、ＮＶ書換え可能メモリデバイス上に記憶されるファームウェアの全て又は一部を更新することができる。
【００１６】
したがって、ＢＦＤ（又は補助ファームウェア記憶デバイス）の記憶空間の一部を、変数データを含む、永続的データを記憶するために予約することができる。フラッシュデバイス及び類似のデバイスの場合、メモリのこの部分は、ＮＶランダムアクセスメモリ（ＮＶＲＡＭ）と呼ぶことができる。フラッシュ記憶方式下で、個々のビットを一方向においてのみトグルすることができることを除いて、ＮＶＲＡＭは従来のＲＡＭと同じように機能することができる。結果として、トグルされたビットをリセットするために、複数のビット群がブロック単位で「消去」される。
【００１７】
上記で論じられたように、ＵＥＦＩ下では、変数は、識別情報＋属性（鍵）及び任意のデータ（値）からなる鍵／値対として規定される。これらの鍵／値対は、変数サービスを介してＮＶＲＡＭに記憶し、ＮＶＲＡＭからアクセスすることができ、変数サービスは３つの変数サービス関数：ＧｅｔＶａｒｉａｂｌｅ、ＧｅｔＮｅｘｔＶａｒｉａｂｌｅＮａｍｅ及びＳｅｔＶａｒｉａｂｌｅを含むことができる。ＧｅｔＶａｒｉａｂｌｅは変数の値を返すことができる。ＧｅｔＮｅｘｔＶａｒｉａｂｌｅＮａｍｅは、現在の変数名を列挙することができる。ＳｅｔＶａｒｉａｂｌｅは変数の値を設定することができる。ＧｅｔＶａｒｉａｂｌｅ関数及びＳｅｔＶａｒｉａｂｌｅ関数はそれぞれ５つのパラメータ：ＶａｒｉａｂｌｅＮａｍｅ、ＶｅｎｄｏｒＧｕｉｄ（ベンダのための固有識別子）、Ａｔｔｒｉｂｕｔｅｓ（属性マスクによる）、ＤａｔａＳｉｚｅ及びＤａｔａを用いることができる。Ｄａｔａパラメータは、変数型のデータ内容を書き込むか又は読み出すバッファを（メモリアドレスを介して）識別することができる。ＶａｒｉａｂｌｅＮａｍｅパラメータ及びＶｅｎｄｏｒＧｕｉｄパラメータは、特定のハードウェアコンポーネント（例えば、増設カード）に対応する変数を容易に識別できるようにするとともに、同じハードウェアコンポーネントに複数の変数を結び付けることができるようにすることが可能である。
【００１８】
詳細には、通常のＵＥＦＩ変数サービス実施態様では、既存のＵＥＦＩ変数に対する更新が行われるときに、既存の値が直接変更されないように、ＵＥＦＩ変数は連続して記憶装置に記憶することができる。むしろ、既存のＵＥＦＩ変数は変数ヘッダ内で単に「ＤＥＬＥＴＥＤ」とタグ付けされ、一方、その後、新たなＵＥＦＩ変数を作成することができ、新たなＵＥＦＩ変数は、対応する変数ヘッダ内で「ＡＤＤＥＤ」とタグ付けされる。類似の手順を利用して、既存のＵＥＦＩ変数を削除することができる。すなわち、記憶装置内にＵＥＦＩ変数と関連付けられる内容を依然として保持しながら、既存のＵＥＦＩ変数を「ＤＥＬＥＴＥＤ」とタグ付けすることができる。したがって、記憶のために利用可能なメモリサイズ／量によるが、最終的には、十分な変数作成／削除／更新／編集／追加動作の結果として、もはや不要である／有効でない変数、すなわち、ＤＥＬＥＴＥＤとタグ付けされた変数を消去する必要がある。ＤＥＬＥＴＥＤとタグ付けされた変数を消去するために、ガベージコレクションプロセスを実施することができる。
【００１９】
ＮＶＲＡＭ内に記憶されたＵＥＦＩ変数のためのガベージコレクションは、耐障害書込みのようにして実行されるべきであることに留意されたい。すなわち、ガベージコレクションが進行中にシステムクラッシュ、例えば、電源障害が生じる場合でも、ＵＥＦＩ変数データ損失が生じるべきではない。さらに、例えば、既存の変数の更新によって、ガベージコレクションがトリガされ、かつそのようなガベージコレクション中にシステムクラッシュが生じる場合には、要求された（更新された）ＵＥＦＩは、システムがシステムクラッシュから復旧した後に、その以前の値又は更新された値を保持する／その以前の値又は更新された値に関連付けられたままになるべきである。
【００２０】
ＵＥＦＩ変数のための従来のガベージコレクションによれば、予備ＮＶＲＡＭ領域を用いて、耐障害書込み機構を確保する。例えば、領域Ａが、ガベージコレクションが実行されることになるターゲットＵＥＦＩ変数ＮＶＲＡＭ領域を指していると仮定するとき、領域Ｂは予備ＮＶＲＡＭ領域であると仮定することができる。さらに、別のＮＶＲＡＭ領域、例えば、領域Ｃが、ガベージコレクション中にジャーナルを記憶するために用いられる小さなＮＶＲＡＭ領域であると仮定することができる。更に別のＮＶＲＡＭ領域、領域Ｄが、領域Ａ  ＵＥＦＩ変数データをキャッシュするために利用されるグローバルメモリバッファであると仮定することができる。更に別のＮＶＲＡＭ領域、例えば、領域Ｅ及び領域Ｆが、ガベージコレクションのための２つのローカル一時メモリバッファであると仮定することができる。
【００２１】
領域Ｄはグローバルキャッシュを指すことができ、ＧｅｔＶａｒｉａｂｌｅサービスを通してＵＥＦＩ変数が読み出されるとき、データはグローバルメモリバッファ（領域Ｄ）から直接検索することができることに留意されたい。そうすることにより、メモリ読出しを実行するのは、ＮＶＲＡＭ、この例では、領域Ａを読み出すより通常速いので、読出しアクセス時間が短縮される。一般的に、領域ＡのようなターゲットＵＥＦＩ変数ＮＶＲＡＭ領域においてガベージコレクションが始まる前に、グローバルメモリバッファ／キャッシュ（領域Ｄ）は領域Ａの全体（全ての記憶されたデータ）を既にキャッシュしていることに更に留意されたい。
【００２２】
例えば、従来のガベージコレクションプロセスによれば、新たな耐障害書込みイベントを領域Ｃに記録することができる。その後、「ＡＤＤＥＤ」とタグ付けされた任意の変数を領域Ａから領域Ｅに読み出すことができ、「ＤＥＬＥＴＥＤ」とタグ付けされた任意の変数を破棄することができ、結果として、領域Ｅが全ての有効変数を有することになる。その後、領域Ｅに含まれるデータを領域Ｂに書き込むことができる。書込みが完了した後に、領域Ｃにおいて以前に作成された新たな耐障害書込みイベントに対応するレコード／ジャーナルを、例えば、「予備領域更新完了」とタグ付けすることができる。その後、領域Ｂ内に含まれる全てのデータを領域Ｆに読み込むことができ、領域Ｆ内のデータを領域Ａにライトバックすることができる。この書込みが完了した後に、耐障害書込みイベントに対応する領域Ｃ内のレコード／ジャーナル（予備領域更新完了と最後にタグ付けされた）を更新し、例えば、「ターゲット領域更新完了」とタグ付けすることができる。この時点で、領域Ａは「ガベージコレクトされた」と考えることができ、領域Ｃにおいて作成された耐障害書込みイベントを更に再び更新し、例えば、「イベント完了」とタグ付けすることができる。したがって、全てのデータを領域Ａから領域Ｄに読み出すことができ、その際、領域Ｄは最新の有効変数（すなわち、領域Ａのキャッシュ）を有すると見なすことができる。
【００２３】
そのような従来の耐障害書込み方式によれば、更なる予備ＮＶＲＡＭ領域（例えば、領域Ｂ）を利用して、耐障害書込みイベントが確保されることを見て取ることができる。したがって、いつ、ガベージコレクション中にシステムクラッシュが生じても、有効なＵＥＦＩ変数領域のコピーが存在することができる（領域Ａ内又は領域Ｂ内）。それゆえ、システムがリブートした後に、ＳＦＷ（ＢＩＯＳ）が、領域Ｃ内に保持される記録されたジャーナルをチェックすることによって、中断された耐障害書込みイベントを再開することができる。
【００２４】
上記の従来の耐障害書込み方式がブロックデバイス（例えば、フラッシュ型メモリ）に対して適用できると仮定されるなら、実行されることになる書込みはブロック書込みであるべきである（各ブロック書込み前にブロック消去を伴う）。しかしながら、論じられたように、予備ＮＶＲＡＭ領域を利用して、データの冗長コピーが存在するのを確実にするので、或る特定の事例では、結果としてＮＶＲＡＭ記憶装置のサイズが２倍になる可能性がある。例えば、６００ｋバイトの対象となるＮＶＲＡＭ  ＵＥＦＩ変数が存在する場合には、従来の耐障害書込み機構を利用するプラットフォームは、ガベージコレクションに対応するために、ハードウェア上に少なくとも１２００ｋバイトのＮＶＲＡＭ記憶装置を備える。したがって、ＮＶＲＡＭ記憶装置（例えば、バッテリバックアップ式スタティックＲＡＭ（ＳＲＡＭ））を利用することは、システムコストを増加させる可能性がある。さらに、耐障害書込み方式において大量のデータを伴うＮＶＲＡＭ記憶装置読出しを頻繁に実行することは、ガベージコレクション実行時間を長くする可能性があり、時間に制約があるシナリオ、例えば、システム管理モード（ＳＭＭ）のＯＳにおけるランタイム時のガベージコレクションにおいて使用するのは望ましくない。またさらに、冗長なＮＶＲＡＭ記憶装置を利用する結果として、２倍（３倍、更にはそれ以上）のメモリに対応するための記憶装置要件を満たさなければならないので、空間に関するペナルティが生じる可能性がある。
【００２５】
したがって、種々の例が、ＮＶＲＡＭ記憶装置上でＵＥＦＩ変数のガベージコレクションを実行するが、冗長な記憶空間に頼る必要がない、ＵＥＦＩプラットフォームのための耐障害書込み機構を提供する。すなわち、大きなサイズのＮＶＲＡＭ記憶装置／デバイスはあまり必要でないか、又は全く必要ではなく、その一方で、ガベージコレクション性能も改善される。
【００２６】
数多くのＵＥＦＩプラットフォームにおいて、ＲＡＭタイプＮＶＲＡＭ記憶装置（例えば、バッテリバックアップ式ＳＲＡＭ）が、ＵＥＦＩ変数記憶装置として利用される。ＲＡＭタイプＮＶＲＡＭ記憶装置はブロック消去制限を有しないので、ＲＡＭのように柔軟に用いることができる。種々の例が、耐障害書込みのようにガベージコレクションを実行することによって、ＲＡＭタイプＮＶＲＡＭ記憶装置のこの属性を利用する。
【００２７】
図２Ａ及び図２Ｂは、例示的なＵＥＦＩプラットフォームを示しており、ガベージコレクションを、不揮発性メモリ（例えば、ＮＶＲＡＭ）耐障害書込み機構の一部として実行することができる。図２Ａに示されるように、ターゲット領域２０５が、ガベージコレクションを必要とするＮＶＲＡＭ記憶装置（すなわち、ＮＶＲＡＭ２００）内のターゲットＵＥＦＩ変数領域を指すことができる。同じく図２Ａに示されるように、グローバルメモリバッファキャッシュ２１５が、メモリバッファ２１０内のターゲット領域２０５のグローバルメモリキャッシュを指すことができる。
【００２８】
ターゲット領域２０５及びグローバルメモリバッファキャッシュ２１５は同じサイズにすることができ、同一のデータを含むことができることに留意されたい（ただし、ターゲット領域２０５内に記憶されたデータをグローバルメモリバッファキャッシュ２１５にキャッシュするのは個別のプロセスにおいて実行される場合がある）。すなわち、ターゲット領域２０５及びグローバルメモリバッファキャッシュ２１５はいずれも、以下のデータ、及びデータが記憶される領域、すなわち、変数記憶ヘッダ、有効変数領域、サイズＮの第１の削除変数領域、サイズ２Ｎの第２の有効変数領域、サイズ３Ｎの第２の削除変数領域及びサイズ４Ｎの第３の有効変数領域を有することができる。さらに、グローバルメモリバッファキャッシュ２１５は、ターゲット領域２０５（すなわち、実際のＮＶＲＡＭ記憶装置）の「メモリ内」コピーと考えることができる。またさらに、ジャーナル領域２２０は、ガベージコレクション中にジャーナルを記録するために割り当てられたＮＶＲＡＭ２００内の「小さな」ＮＶＲＡＭ領域を指すことができる。
【００２９】
ジャーナル領域２２０において、耐障害書込みイベントレコードを作成することができ、第１の削除変数領域の場所を特定するために、グローバルメモリバッファキャッシュ２１５を探索することができる（例えば、第１の削除変数領域は、事前の編集、書込み、削除、追加等の動作の結果として複数の連続削除変数を含む場合がある）。図２Ａの例によれば、第１の削除変数領域は、Ｐ１で表される構造ポインタによって指示されるときに特定することができる。さらに、第１の削除変数領域に続く次の有効変数領域は構造ポインタＰ２によって表すことができる。種々の例を説明する際に参照するのを容易にするために、構造ポインタ対Ｐ１及びＰ２は、Ｐ１／Ｐ２対を表す１つの手段として、「−１」、「−２」、「−３」等で区別することができる。例えば、第１のＰ１／Ｐ２対はＰ１−１及びＰ２−１と表すことができ、第２のＰ１／Ｐ２対はＰ１−２及びＰ２−２と表すことができ、他も同様である。
【００３０】
Ｐ１及びＰ２値がわかると、Ｐ１及びＰ２の値をジャーナル領域２２０に記録することができる。すなわち、図２Ｂに示されるように、ジャーナル領域２２０は、構造ポインタＰ１及びＰ２（並びにＰ１’及びＰ２’、それらは後に更に詳細に論じられる）によって指示される領域に関連付けられる基底アドレス及びサイズを記憶することができる。第２の有効変数領域内にあり、構造ポインタＰ２−１によって指示されるサイズＮデータ（この例では、サイズ２Ｎ領域の半分）を、グローバルバッファキャッシュ２１０から、ターゲット領域２０５内の対応する領域（例えば、Ｐ１ｎｖｒａｍ−１）に直接書き込むことができる。また、構造ポインタＰ２−１によって指示されるサイズＮデータを、構造ポインタＰ１−１によって指示されるメモリアドレスに書き込み、それに応じてメモリバッファ２１０を更新することもできる。すなわち、有効変数データは、グローバルメモリバッファキャッシュ２１５内（及び対応するターゲット領域２０５内）で、利用可能な（不要／旧データ、すなわち、ＤＥＬＥＴＥＤとタグ付けされた変数によってかつて占有されていた）記憶空間に「繰り上げ」られており、Ｐ１／Ｐ２対を利用して、データが移動される「移動先」及び「移動元」を示すことができる。
【００３１】
第２のＰ１／Ｐ２対は、後続回の更新のために形成する（そしてジャーナル領域２２０に記録する）ことができ、上記のプロセスを繰り返すことができる。すなわち、Ｐ１−２及びＰ２−２は、構造ポインタＰ１ｎｖｒａｍ−２によって指示される領域へのデータ（すなわち、グローバルメモリバッファキャッシュ２１５のサイズ２Ｎ領域にもともと記憶されていた残りの有効変数）の後続の書込みを表すことができる。さらに、メモリバッファ２１０を更新するために、同じデータを、構造ポインタＰ２−１によって表される、サイズ２Ｎ領域内にもともと記憶されていた有効変数の最初の半分によってかつて占有されていた領域に「繰り上げる」ことができる。
【００３２】
別の１組の有効変数を見つけるために、グローバルメモリバッファキャッシュ２１５を再び探索することができ、３回目の更新のために第３のＰ１／Ｐ２対（例えば、Ｐ１−３及びＰ２−３）を形成する（そして、ジャーナル領域２２０に記録する）ことができる。上記で説明されたのと同様の手順の後に、サイズ４Ｎ有効変数領域内に記憶される（そして、構造ポインタＰ２−３によって指示される）データを、ＮＶＲＡＭ２００のターゲット領域２０５内の構造ポインタＰ１ｎｖｒａｍ−３によって指示されるメモリアドレスに書き込むことができる。メモリバッファ２１０を更新するために、サイズ４Ｎ有効変数領域内に記憶される（そして、構造ポインタＰ２−３によって指示される）そのデータを、構造ポインタＰ１−３によって指示されるメモリアドレスに繰り上げることができる。
【００３３】
さらに、有効変数領域サイズ４Ｎは「消去する」ことができ、ジャーナルレコード２２０の「完了フラグ」フィールド／セクションを更新して、「完了した」状態を指示することができる。上記のプロセスは繰り返すことができることに留意されたい。
【００３４】
上記の例において、有効変数領域及び削除変数領域は、単に論じるのを容易にするために、サイズＮ、２Ｎ、３Ｎ及び４Ｎを有するように示されたことに留意されたい。すなわち、種々の例に従ってデータ移動を実行するときに、Ｐ１／Ｐ２レコード対によって指示される領域に関連付けられる領域サイズは以下のように比較することができる。構造ポインタＰ１によって指示される領域が、構造ポインタＰ２によって指示される領域以上のサイズを有する場合には、Ｐ２（又はＰ２’）サイズ及びＰ２（Ｐ２’）基底アドレスに対応するサイズ及び基底アドレスを有するデータがジャーナル領域２２０に記録され、グローバルメモリバッファキャッシュ２１５を探索して、後続のＰ１／Ｐ２レコード対を形成することができる。代替的には、構造ポインタＰ１によって指示される領域が構造ポインタＰ２によって指示される領域より小さいサイズを有する場合には、そのデータ移動は、ジャーナル領域２２０内に記録されたＰ１（又はＰ１’）サイズによって示されるデータのサイズを、ジャーナル領域２２０において記録されたＰ２（又はＰ２’）基底アドレスによって指示されるメモリアドレスに移動させることを伴うことになる。
【００３５】
結果として、種々の例に従って本明細書において説明されたように、データが「１つずつ」の手法で移動されるとき、ターゲット領域２０５及びグローバルメモリバッファキャッシュ２１５はいずれも、「ガベージコレクトされた」ＵＥＦＩ変数を含み、ＮＶＲＡＭ記憶装置内に冗長な又は予備のＮＶＲＡＭ領域を予約する必要はない。さらに、グローバルメモリバッファキャッシュ２１５を利用して、データ及びデータ移動を探索することができ、それにより、ＮＶＲＡＭ記憶装置（詳細には、ＮＶＲＡＭ２００のターゲット領域２０５）から大量のＮＶＲＡＭデータを読み出すのを不要にし、ガベージコレクション性能を改善する。したがって、種々の例は、時間に制約があるシナリオにおいて利用することができる。
【００３６】
さらに、ジャーナル領域２２０は最新の有効なＰ１／Ｐ２対を保持し、中断されたガベージコレクション手順を、データを失うことなく再開できるようにする。すなわち、上記で言及されたように、ジャーナル領域２２０は、Ｐ１／Ｐ２基底アドレス及びサイズ、並びにＰ１’／Ｐ２’基底アドレス及びサイズのレコードを保持することができる。Ｐ１’及びＰ２’は第２のレコード対を指すことができ、そのレコード対は、Ｐ１及びＰ２レコード対とともに、「トグル」されるようにして記録／更新することができる。すなわち、例えば、１回目の更新（上記で説明された）によれば、Ｐ１及びＰ２基底アドレス及びサイズを用いて、関連するＰ１／Ｐ２レコード対（例えば、Ｐ１−１及びＰ２−１）を保持することができる。２回目の更新（同じく上記で説明された）の場合、Ｐ１’及びＰ２’基底アドレス及びサイズを用いて、関連するＰ１／Ｐ２レコード対（例えば、Ｐ１−２及びＰ２−２）を保持することができる。それゆえ、関連するＰ１／Ｐ２レコード対の保持及び更新は、Ｐ１／Ｐ２レコード対と、Ｐ１’／Ｐ２’レコード対との間でトグルすることができ、ジャーナル領域２２０内に保持される指示子フラグを用いて、レコード対のいずれが（Ｐ１／Ｐ２又はＰ１’／Ｐ２’のいずれか）有効であると見なされるかを示すことができる。ガベージコレクションプロセスの中断後に、有効なレコード対をチェックして、データ移動がいかに進行すべきかを判断することができる。
【００３７】
種々の例に従って、このようにして２つのレコード対を利用することによって、例えば、電源障害に起因して、ガベージコレクション中に中断があるときにいつでも、有効なレコード対をジャーナル領域２２０内に保持できるようにし、この有効なレコード対が、特定のデータ移動のどこで／どの時点で中断が生じたかを示す。さらに、上記の記憶空間節約を促進するために、データ移動の追跡が単にＰ１／Ｐ２レコード対及びＰ１’／Ｐ２’レコード対を追跡することを伴うだけであり、一方、ジャーナル領域２２０が関連するサイズ及び基底アドレス情報を把握し、変数領域の実際のサイズに対応する必要はないという点で、記憶されるデータ量及び／又は記憶装置のサイズは無関係であると考えることができる。
【００３８】
図３は、例示的な不揮発性耐障害書込みイベントを実行するときに実行されるプロセスを示す流れ図である。旧（obsolete：無効）変数領域を見つけるためにメモリバッファが探索される（ブロック３０２）。さらに、旧変数領域に隣接する有効変数領域を見つけるために、メモリバッファが探索される。上記で言及されたように、メモリバッファは、不揮発性メモリのためのキャッシュとしての役割を果たすことができ、旧変数又はＤＥＬＥＴＥＤ変数を含むメモリバッファ内の領域は有効変数内に記憶される有効な変数で上書きすることができる。全ての旧変数領域が有効な変数で上書きされるまで、有効な変数が有効変数領域から旧変数領域に書き込まれる（ブロック３０６）。同じく上記で言及されたように、旧変数領域を上書きすることができるその方法は、例えば、上から下まで行うことができ、メモリバッファ（及び不揮発性メモリ）がガベージコレクトされるまで、すなわち、メモリバッファ及び不揮発性メモリ内に有効な変数のみが残されるまで、全ての旧変数領域及び有効変数領域を通して作業することができる。またさらに、書込みの実行が、書込み中に有効な変数が移動する移動元及び移動先を示す、旧変数領域及び有効変数領域の少なくとも一部を示す交互の構造ポインタ対を用いて追跡される（ブロック３０８）。例えば、上記で説明されたように、交互の構造ポインタ対（例えば、Ｐ１／Ｐ２レコード対及びＰ１’／Ｐ２’レコード対）を用いて、耐障害動作（例えば、中断されたガベージコレクション／書込みイベント）を達成できるように、メモリバッファ及び不揮発性メモリ内で有効な変数がいかに移動するかを記録することができる。
【００３９】
種々の例が或る特定のメモリアーキテクチャ及びプロセスシーケンスとの関連でこれまで説明されてきたが、一例として提示されており、限定するものではないことは理解されたい。例えば、本明細書において説明されたシステム及び方法は、単に１つの交互レコード対ではなく、例えば、データ移動を追跡するための複数の交互レコード対を用いて適用することができる。さらに、種々の例は、メモリの中を「上から下まで」進行することによって動作するように説明されてきたが、「下から上への」進行を利用することもできる。またさらに、耐障害書込み機構を適用することができるメモリのタイプは、必ずしも上記のＮＶＲＡＭ記憶装置に限定されるのではなく、データのブロック消去を必要としない任意の記憶装置に適用することができることに留意されたい。
【００４０】
同様に、種々の図が、種々の例に関する例示的なアーキテクチャ又は他の構成を示す場合があるが、それは例に含むことができる特徴及び機能を理解するのを助けるために行われる。本開示は、図示される例示的なアーキテクチャ又は構成に限定されるのではなく、種々の代替のアーキテクチャ及び構成を用いて、所望の特徴を実現することができる。実際には、種々の例を実施するために、代替の機能的、論理的又は物理的分割及び構成をいかに実現することができるかが当業者には明らかになるであろう。また、本明細書において表される名称以外の多数の異なる構成モジュール名を種々の分割に適用することができる。さらに、流れ図、動作説明及び方法クレームに関して、本明細書においてステップが提示される順序は、文脈において他に指示されない限り、種々の例が列挙された機能を同じ順序で実行するように実施されることを命じるものではない。
【００４１】
個々の例のうちの１つ又は複数において説明された種々の特徴、態様及び／又は機能は、その適用可能性に関して、それらの特徴、態様及び／又は機能が説明された特定の例に限定されるのではなく、代わりに、そのような例が説明されたか否か、並びにそのような特徴、態様及び／又は機能が、説明された例の一部として提示されたか否かにかかわらず、他の例のうちの１つ又は複数に単独で、又は種々の組み合わせにおいて適用できることは理解されたい。したがって、本開示の広さ及び範囲は、上記の例示的な例のいずれによっても制限されるべきではない。
【００４２】
本明細書において用いられる用語及び言い回し、並びにその変形は、他に明示されない限り、制限するのではなく、制約がないと解釈されるべきである。上記のことの例として、「含む（including）」という用語は、「限定はしないが、含む」等を意味するように読み取られるべきであり、「例」という用語は、その網羅的又は限定的なリストを提供するために用いられるのではなく、論じられている事柄の例示的な事例を提供するために用いられており、「１つの（a、an）という用語は、「少なくとも１つの」、「１つ又は複数の」等を意味するように読み取られるべきであり、「従来の」、「旧来の」、「通常の」、「標準的な」、「既知の」等の形容詞、及び類似の意味の用語は、説明される事柄を所与の期間に、又は所与の時点で入手可能な事柄に限定するものと解釈されるべきではなく、代わりに、現在、又は将来のいずれかの時点において入手可能であるか若しくは既知の場合がある従来の、旧来の、通常の、又は標準的な技術を含むように読み取られるべきである。同様に、本明細書が、当業者であれば明らかであるか、又は既知である技術を参照する場合、そのような技術は、現在、又は将来のいずれかの時点において当業者に明らかであるか又は既知である技術を含む。
【００４３】
さらに、本明細書において記載される種々の例は、例示的なブロック図、流れ図又は他の図示に関して説明される。本明細書を読んだ後に当業者には明らかになるように、図示される例及びその種々の代替形態は、図示される例に限定することなく実施することができる。例えば、ブロック図及びそれに付随する説明は、特定のアーキテクチャ又は構成を命じるものと解釈されるべきではない。
【００４４】
さらに、本明細書において説明される種々の例は、方法ステップ又はプロセスの一般的な状況において説明されており、それらのステップ又はプロセスは一例において、ネットワーク化環境においてコンピュータによって実行される、プログラムコードのようなコンピュータ実行可能命令を含む、例えば、非一時的コンピュータ可読メモリにおいて具現される、コンピュータプログラム製品によって実施することができる。コンピュータ可読メモリは、限定はしないが、リードオンリーメモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、コンパクトディスク（ＣＤ）、デジタル多用途ディスク（ＤＶＤ）等を含む、リムーバブル又は非リムーバブル記憶デバイスを含むことができる。一般的に、プログラムモジュールは、特定のタスクを実行するか、又は特定の抽象データ型を実現するルーチン、プログラム、オブジェクト、コンポーネント、データ構造等を含むことができる。コンピュータ実行可能命令、関連するデータ構造及びプログラムモジュールは、本明細書において開示される方法のステップを実行するためのプログラムコードの例を表す。そのような実行可能命令の特定のシーケンス又は関連するデータ構造は、そのようなステップ又はプロセスにおいて記述される機能を実施するための対応する動作の例を表す。
【００４５】
本明細書において用いられるときに、モジュールという用語は、１つ又は複数の例に従って実行することができる所与の機能ユニットを示すことができる。本明細書において用いられるときに、モジュールは、ハードウェア、ソフトウェア又はその組み合わせのいずれかの形を利用して実現される場合がある。例えば、１つ又は複数のプロセッサ、コントローラ、ＡＳＩＣ、ＰＬＡ、ＰＡＬ、ＣＰＬＤ、ＦＰＧＡ、論理コンポーネント、ソフトウェアルーチン又は他の機構を、モジュールを構成するように実装することができる。実施態様では、本明細書において説明される種々のモジュールは、個別のモジュールとして実現することもできるし、説明される機能及び特徴を１つ又は複数のモジュール間で部分的に又は全体的に共有することもできる。言い換えると、本説明を読んだ後に当業者には明らかになるように、本明細書において説明される種々の特徴及び機能は、任意の所与のアプリケーションにおいて実施することができ、１つ又は複数の個別のモジュール又は共有されるモジュールにおいて種々の組み合わせ及び置換において実現することができる。種々の特徴又は機能要素が別々のモジュールとして個々に説明されるか、又は特許請求される場合であっても、これらの特徴及び機能を１つ又は複数の共通のソフトウェア要素及びハードウェア要素の間で共有することができ、そのような説明が、そのような特徴又は機能を実現するために、別々のハードウェアコンポーネント又はソフトウェアコンポーネントが用いられることを要求又は暗示するものではないことは当業者には理解されよう。種々の例のコンポーネント又はモジュールが、一例において、全体として又は部分的にソフトウェアを用いて実施される場合、これらのソフトウェア要素は、それに関して説明された機能を実行することができるコンピューティングモジュール又は処理モジュールとともに動作するように実装することができる。幾つかの事例における「１つ又は複数の」、「少なくとも１つの」、「限定はしないが」、又は他の類似の言い回しのような、広げる言葉及び言い回しが存在するが、そのような広げる言い回しが存在しない場合がある事例では、それより狭い事例が意図されるか、又は要求されることを意味すると読み取られるべきではない。
【図１】
0006013626.tif 000002
【図２Ａ】
0006013626.tif 000003
【図２Ｂ】
0006013626.tif 000004
【図３】
0006013626.tif 000005