(58)【調査した分野】(Int.Cl.,DB名)
前記訂正不能メモリエラーの前記表示は、前記プロセッサがポイズンを消費することによって引き起こされたプロセッサマシンチェック例外である、請求項1に記載の方法。
前記メモリアドレスの範囲の前記検査の結果に基づいて、初期化に成功しなかった前記メモリアドレスの範囲内にあるメモリアドレスを前記オペレーティングシステムに通知するステップを更に含む、請求項1に記載の方法。
【発明を実施するための形態】
【0004】
マシンチェックアーキテクチャシステムにおけるポイズンの使用は、訂正不能エラーを含むメモリの検出及びCPUがエラーを含むメモリを用いることの防止において非常に有用である。幾つかの場合には、メモリは、ソフトウェアによって用いられるデータ値を含む場合がある。破損したデータ値の使用によって、正しくない結果が取得される場合がある。他の場合には、メモリロケーションは、CPUによって実行される命令を含む場合がある。そのような場合、メモリロケーションに含まれる命令は、本質的にはランダムな命令である。なぜならば、エラーがその命令をどのように変更したのかを判断することができないからである。ECCを用いると、破損した命令を識別することができるが、必ずしも訂正することはできない。
【0005】
上述したように、マシンチェック例外の受信の際にオペレーティングシステムによってとられる通常の動作は、影響を受けるメモリロケーションを用いていたプロセスをパージすることである。プロセスをパージすることは、通常、プロセスの動作を停止して、そのプロセスにアロケートされていたメモリ等の全てのリソースを解放することを意味する。しかしながら、プロセスが単にパージされるとき、ポイズンの存在に起因して、幾つかの問題が発生する。発生する1つの問題は、オペレーティングシステムがプロセスをパージすると、そのプロセスによる使用中のメモリが未知の状態で放置されるということである。メモリは、更なるエラーを含む場合があり、この場合、異なるプロセスがこのメモリの使用を試みると、その結果、追加のマシンチェック例外が生じることになる。別の問題は、プロセスによって用いられるメモリがポイズンを有する可能性があり、OSがそのメモリ領域を別のプロセスに割り当てた場合、そのプロセスは、ポイズン化したメモリ内に立ち入る可能性があるということである。現行のシステムにおけるオペレーティングシステムは、通例、パージされるプロセスのメモリのポイズンを浄化するメモリコントローラについて十分に知らない。
【0006】
オペレーティングシステムは、2つの選択肢を有する。第1に、パージされるプロセスによって用いられていたメモリを使用不能と宣言することができる。そのような場合、オペレーティングシステムは、そのメモリの使用をもはや試みない。リブート間で長時間動作するシステムでは、これは、ますます多くのプロセスがパージされ、それらのメモリリソースが利用不能あるとしてマーキングされるにつれて、メモリマップに非常に多くのギャップを発生させる場合がある。第2の選択肢では、最初にポイズンを引き起こしたメモリハードウェアに関連した実際の問題が存在し得る場合であっても、オペレーティングシステムは、プロセスをパージするものの、メモリの継続使用を可能にする場合がある。メモリにポイズンがないこと及び未訂正のエラーを引き起こすフォールトがないことを確実にするステップがとられていない場合、メモリをむやみに再利用すると、追加のマシンチェックの生成を引き起こす場合がある。
【0007】
上記議論は、まず第1に、エラーを含むメモリを用いていたプロセスをパージすることができるものと仮定していた。ポイズンが、オペレーティングシステムカーネル等の影響を受け易いプロセスにおいて検出された場合、そのプロセスをパージすると、その結果、一般に、システムはクラッシュする。多くの場合、オペレーティングシステムの設計者は、カーネル等のクリティカルなプロセスがパージされるとき、このクリティカルなプロセスによって用いられるメモリのメモリダンプを提供する。このダンプによって、専門家は、クリティカルなプロセスが障害時に行っていたことを解析し、この障害をより良くデバッグすることが可能になる。しかしながら、クリティカルなプロセスによって用いられるメモリが追加のエラーを含む場合、単にメモリにアクセスして内容をダンプするにすぎない動作が、追加のマシンチェック例外を引き起こす場合がある。
【0008】
ポイズンによって引き起こされるマシンチェック例外に関連した問題を更に悪化させることは、ポイズンの単なる生成が、それ自体はプロセスをパージする理由ではないということである。例えば、メモリコントローラが、CPUキャッシュ用にキャッシュラインのプリフェッチを試みたとき、メモリ内にエラーを検出する場合がある。メモリコントローラは、この場合、エラーを含むメモリをポイズンシグネチャと取り替え、このポイズンシグネチャをキャッシュにロードすることができる。この時点において、システムは、そのポイズンが生成されたことは知っているが、そのポイズンが消費されるか否か及びいつ消費されるのかを判断する方法を有しない。例えば、プロセスは、プリフェッチされたキャッシュラインへのアクセスを決して試みることはなく、したがって、マシンチェック例外を決して生成することはない。さらに、システムは、オペレーティングシステムが、ポイズンを消費したプロセスをパージすることによって、ポイズンの消費から回復することができたか否かを判断する明確な方法を有しない。
【0009】
本明細書において説明する技法は、ポイズンの消費によって引き起こされるマシンチェック例外からの回復に関連した上述の問題を克服するものである。そのような例外が発生したとき、オペレーティングシステムは、オペレーティングシステムとハードウェアとの間の抽象化レイヤとして機能するシステムファームウェアに、マシンチェック例外が受信されたことを知らせることができる。オペレーティングシステムは、プロセスのパージに成功したか否か又はメモリのダンプ等の他の回復動作が行われるか否かもファームウェアに知らせることができる。加えて、オペレーティングシステムは、パージされるプロセスによって用いられていたメモリアドレスの単数又は複数の範囲をファームウェアに知らせることができる。
【0010】
次に、システムファームウェアは、オペレーティングシステムによって提供されたメモリアドレスの範囲を調べることができる。このファームウェアは、メモリが追加のエラーを含むか否かを判断し、メモリ範囲を再初期化(reinitialize)して、以前のエラーについて生成されたポイズンのメモリ範囲をクリアすることができる。システムファームウェアは、メモリを検査して、エラーがメモリ内の実際の欠陥によって引き起こされたか否かを判断することもできる。ファームウェアは、破損したデータを含む場合があるキャッシュメモリ等の全ての他のロケーションをパージすることもできる。メモリのクリーンアップが実行されると、ファームウェアは、結果をオペレーティングシステムに返信して報告することができる。これらの結果は、どのメモリの範囲がクリーンアップに成功したのか、及びどのメモリの範囲がクリーンアップに成功しなかったのかを含むことができる。
【0011】
次に、オペレーティングシステムは、ファームウェアによって提供された情報を用いて、メモリを使用可能な状態に戻すこともできるし、メモリを使用不能としてマーキングすることもできる。検査に成功したとしてファームウェアによって示されたメモリは、異なるプロセスに再利用されるようにオペレーティングシステムに返すことができる。
【0012】
幾つかの場合には、エラーを含むメモリを用いているプロセスをパージすることができない。例えば、オペレーティングシステムカーネルを実行しているプロセスは、直接パージすることができない。なぜならば、これは、システムクラッシュを引き起こす場合があるからである。そのような場合には、オペレーティングシステムは、後の解析に備えてダンプされるメモリアドレスの範囲をファームウェアに知らせることができる。この場合、ファームウェアは、メモリの再初期化を試みることができず、ポイズンシグネチャを含むメモリロケーション、又はOSがアクセスした場合に追加の未訂正のエラーを引き起こすことになるメモリロケーションに単に留意するだけである。この情報は、オペレーティングシステムに提供することができ、オペレーティングシステムは、その結果、メモリをダンプするときに、ポイズン又はエラーを含むメモリロケーションを回避することができる。
【0013】
図1は、本明細書において説明する技法によるシステムの一例である。このシステム100は、サーバコンピュータ又はパーソナルコンピュータに見られるようなコンピューティングシステムとすることができる。システム100は、スマートフォン、タブレット、携帯情報端末、又は他の任意のそのようなデバイス等の他の任意のタイプのコンピューティングデバイスとすることもできる。本明細書において説明する技法は、どの特定のタイプのデバイスにも限定されるものではなく、逆に、以下で説明するタイプの要素を含む任意のタイプのデバイスに適用可能である。
【0014】
システム100は、プロセッサ110、非一時的プロセッサ可読媒体120、及びメモリ130を備えることができる。プロセッサは、プロセッサ可読命令を取り出して実行することができる任意のタイプのプロセッサとすることができる。さらに、プロセッサは、メモリエラーを検出し、それらのエラーをシステムの他の構成要素に通知することができるタイプのものとすることができる。例えば、プロセッサは、訂正不能エラーを含むメモリがポイズンシグネチャと呼ばれる特殊なシグネチャを用いてマーキングされるマシンチェックアーキテクチャを採用することができる。ポイズンシグネチャは、通常、メモリエラーを含むキャッシュラインのECCビットを、ポイズンとして認識することができるパターンを用いて変更することによって作成される。プロセッサがポイズンを消費したとき、マシンチェック例外等の例外を発生させることができる。ファームウェア及びオペレーティングシステムは、以下で説明するように、この例外を受信して、訂正動作を行うことができる。プロセッサは、キャッシュメモリ115を備えることもできる。このキャッシュメモリは、プロセッサダイ自体に位置するメモリとすることができ、データへの高速アクセスを可能にすることができる。キャッシュメモリの使用については、以下で更に詳細に説明する。
【0015】
システムは、一組の命令を含む非一時的プロセッサ可読媒体120も備えることができる。これらの命令がプロセッサによって実行されるとき、プロセッサは、本明細書において説明する機能を実施することができる。この媒体は、アプリケーション122、オペレーティングシステム124、及びファームウェア126を含むことができる。これらのアプリケーションは、システム100の機能を提供することができる。例えば、ウェブホスティングサーバでは、アプリケーションは、ウェブサーバとすることができる。本明細書において説明する技法は、どの特定のタイプのアプリケーションにも限定されるものではない。理解すべきは、アプリケーションが、システム上で動作して、エンドユーザが所望する機能を提供するプログラムであるということである。
【0016】
媒体は、オペレーティングシステムも含むことができる。このオペレーティングシステムは、システム100のリソースを管理することができる。例えば、オペレーティングシステムは、システム上で動作しているアプリケーションにメモリ等のリソースをアロケートすることによって、それらのアプリケーションを管理することができる。オペレーティングシステムは、オペレーティングシステムアプリケーションプログラミングインタフェース(API)を通じて様々な能力をアプリケーションに提供することもできる。これらのAPIを通じて、アプリケーションは、コンピューティングシステムのリソースへのアクセスを得ることができる。オペレーティングシステムは、システム100の全てのリソースの経過を追跡し、どのリソースが利用可能であるのか、及びどのリソースが使用中、すなわち利用不能であるのかを判断することができる。
【0017】
オペレーティングシステム124は、ファームウェア126を用いて、プロセッサ及びシステム100の他の構成要素とインタフェースすることができる。このファームウェアは、ハードウェアとオペレーティングシステムとの間に抽象化レイヤを提供するソフトウェア命令とすることができる。例えば、オペレーティングシステムは、下層にあるハードウェアの能力を利用したい場合がある。オペレーティングシステムは、ハードウェアとのより大きな度合いの一体性を有するファームウェアとインタフェースして、その能力を要求することができる。ファームウェアは、ハードウェアについてのより大きな知識レベルを有し、したがって、オペレーティングシステムからの一般化されたリソース要求を取り込み、それらの要求を、必要とされる特定のハードウェアレベルコマンドに変換することができる。ファームウェアは、通常はオペレーティングシステムに利用可能でないコマンドをハードウェア上で実行することができる場合もある。例えば、ファームウェアは、ハードウェアの能力の有効化及び無効化を行うことができる場合がある。
【0018】
システム100は、メモリ130も備えることができる。このメモリは、通常、プロセッサが用いることができるランダムアクセスメモリである。通常のコンピューティングシステムでは、非一時的プロセッサ可読媒体120上に記憶されたプロセッサ命令は、通常、プロセッサによる実行の前にメモリ130内にロードされる。プロセッサによるメモリへのアクセスは、通常、媒体120にアクセスすることによって達成することができる速度よりもはるかに高速にすることができる。
【0019】
アプリケーションは、通常、オペレーティングシステムによって管理されるプロセスとして実行される。オペレーティングシステムは、アプリケーションによって用いられるメモリアドレスの或る範囲をアロケートすることができる。図示するように、2つの例示のアプリケーションプロセス132、134がある。これらのプロセスは、ウェブサーバ、ワードプロセッシングプログラム、又は他の任意のタイプのアプリケーション等の任意のタイプのアプリケーションとすることができる。
図1に示すように、これらのプロセスは、メモリアドレスの或る範囲を占有する。このメモリアドレスの範囲は、連続した範囲として示されているが、これは、説明を簡単にするためである。メモリアドレスの範囲は、不連続な場合がある。例えば、プロセスに配分されたメモリの間に、空いているメモリアドレスのセクション133、135が存在する場合がある。この説明の残りの部分では、プロセスによって用いられるアドレスの範囲は、そのプロセスにアロケートされた全てのメモリを意味し、そのメモリが1つ又は複数の連続した範囲にあるか否かを問わない。
【0020】
アプリケーションの観点からプロセスを説明してきたが、オペレーティングシステム自体がプロセスである。他の任意のプロセスと同様に、オペレーティングシステムは、そのオペレーティングシステムの機能を提供するのに用いられる命令を記憶するために、それ自体にメモリ131をアロケートすることができる。ハードウェアの観点からすれば、オペレーティングシステムは、本質的には、実行される別のプロセスにすぎない。
【0021】
動作中、プロセッサは、命令及びデータをメモリからロードすることができる。キャッシュメモリを含むプロセッサアーキテクチャでは、メモリの内容は、プロセッサによるより高速なアクセスを得るためにキャッシュ内にロードすることができる。通常、メモリの内容は、キャッシュラインと呼ばれる場合がある複数バイトの単位で、プロセッサからプロセッサキャッシュへ及びプロセッサキャッシュからプロセッサへ移動される。例えば、メモリの8バイトの集合体をキャッシュラインとして合わせてグループ化することができる。しかしながら、本明細書において説明する技法は、どの所与のサイズのキャッシュラインにも限定されるものではないことが理解されるべきである。キャッシュラインは、ECCによって保護することができる。上述したように、ECCは、通常、キャッシュライン内の単一ビットエラーを検出して訂正することができる。したがって、単一ビットエラーについては、これ以上説明しないことにする。複数ビットエラーの場合には、ECCは、エラーを検出することができる場合があるが、そのエラーを訂正することはできない。キャッシュライン内の複数ビットエラーは、訂正不能エラーと呼ばれる場合がある。
【0022】
メモリには、多くのエラー発生源が存在する。1つの可能な発生源は、高エネルギー粒子である。高エネルギー粒子は、メモリロケーションに記憶された1つ又は複数のビットの値を変化させる場合があり、したがって、メモリは正しくない値を含む。別の可能なエラー発生源は、機能不良のメモリチップである。更に別のエラー発生源は、メモリに直接アクセスしてデータを不正確に記憶する場合がある入力/出力デバイス(図示せず)である場合がある。さらに、アプリケーションソフトウェア、オペレーティングシステム、又はファームウェア内のバグが、メモリ内にエラーを引き起こす場合がある。
【0023】
メモリ内のエラーは、複数のメカニズムを通じて検出することができる。例えば、多くのプロセッサアーキテクチャは、メモリ内の各キャッシュラインをステップスルーすることができるスクラバハードウェアを含む。ECCを用いることによって、スクラバは、メモリにエラーが存在すると判断することができる。エラーが、マルチビットエラーを意味する訂正不能なタイプのものである場合、スクラバは、キャッシュラインの内容を、メモリが破損していることを示すポイズンシグネチャと取り替えることができる。同様に、キャッシュラインがメモリからプロセッサ又はプロセッサキャッシュ内にロードされるとき、メモリをロードするのに用いられるハードウェアは、訂正不能エラーがこのキャッシュラインに存在すると判断することができる。この場合も、そのキャッシュラインをポイズンシグネチャと取り替えることができる。破損したキャッシュラインがプロセッサキャッシュから排除されるとき、CPUキャッシュコントローラは、このキャッシュラインがメモリに返信される前にこのキャッシュラインをポイズン化することができる。ポイズンシグネチャを生成する他のあり得る理由は、当業者に知られている。理解すべきは、訂正不能エラーがキャッシュラインに発見されたとき、そのラインをポイズンシグネチャと取り替えることができるということである。
【0024】
或る時点において、プロセッサは、ポイズンシグネチャを含むキャッシュラインに対して或るタイプのアクセスを試みる場合がある。プロセッサは、そのキャッシュラインをメモリ又はプロセッサキャッシュから直接ロードすることができる。このアクセス動作は、キャッシュラインに記憶された命令を実行しようとしている場合もあるし、キャッシュラインに記憶されたデータ値を用いようとしている場合もある。ポイズンシグネチャを含むキャッシュラインへのアクセスの試みは、ポイズンの消費と呼ばれる。マシンチェックアーキテクチャを採用したプロセッサでは、ポイズンの消費は、プロセッサにマシンチェック例外を生成させる。このマシンチェック例外は、プロセッサハードウェアからファームウェアに渡すことができる。次に、ファームウェアは、マシンチェック例外の表示をオペレーティングシステムに渡すことができる。
【0025】
オペレーティングシステムが、マシンチェック例外の表示を受信すると、オペレーティングシステムは、そのエラーが回復可能であるか否かを最初に決定しなければならない。上述したように、各プロセスには、メモリアドレスの或る範囲がアロケートされる。マシンチェック例外は、ポイズンを含んだ特定のメモリロケーションを識別する。したがって、オペレーティングシステムは、どのプロセス及び関連付けられたメモリ範囲がマシンチェック例外の原因であったのかを判断することができる。
【0026】
幾つかの場合には、オペレーティングシステムは、例外を引き起こしたプロセスをパージすることによって、マシンチェック例外から回復することができる場合がある。プロセスをパージすることは、通常、このプロセスを停止させることと、このプロセスによって用いられている全てのリソースを解放することとを伴う。プロセスをパージすることは、プロセスをキルすると表現される場合もある。しかしながら、マシンチェック例外に関して上記で説明した問題が発生するのは、この時点である。オペレーティングシステムがプロセスをパージすることができる場合であっても、そのプロセスによって用いられていたメモリは、依然としてエラーを含んでいる場合がある。例えば、ポイズンの生成を引き起こしたキャッシュラインを含むメモリチップが実際に欠陥を有する場合、そのプロセスによって用いられるアドレス範囲にある他のキャッシュラインも、ポイズンシグネチャを含むか又はポイズンの生成をもたらすことになるエラーを含む可能性が非常に高い。
【0027】
オペレーティングシステムは、パージされたプロセスによって用いられていたメモリを他のプロセスに利用可能にする前に、そのメモリをまずクリーニングして検証することが望ましい場合がある。1つの例示の実施態様では、オペレーティングシステムは、ポイズンが消費されたことと、オペレーティングシステムが、ポイズンを有するキャッシュラインを含んでいたプロセスをパージすることによって回復を試みていることとの表示をファームウェアに送信することができる。オペレーティングシステムは、パージされたプロセスによって用いられていたメモリアドレスの範囲をファームウェアに知らせることができる。換言すれば、プロセッサは、ポイズン又は他のエラーの存在の有無についてチェックする必要があるメモリアドレスの範囲をファームウェアに知らせることができる。
【0028】
この表示を受信すると、ファームウェアは、パージされたプロセスによって用いられていたメモリアドレスの範囲のクリーンアップを試みることができる。幾つかの例示の実施態様では、このクリーンアップの一部として、ファームウェアは、プロセッサ内におけるポイズンの生成及びポイズン消費の検出を一時的に無効化することができる。上記で説明したように、ファームウェアは、プロセッサと密接に一体化され、したがって、これらの下位レベルの機能を制御することができる。ファームウェアは、クリーンアッププロセスの間、マシンチェック例外を無効化することができる。なぜならば、メモリをクリーンアップするにすぎない動作が、それ以外で追加のマシンチェック例外を引き起こす場合があるからである。例えば、パージされたプロセスに関連付けられた幾つかのキャッシュラインを含むメモリチップが欠陥を有し、したがって、多くのエラーを有すると仮定する。メモリのクリーンアップを試みるプロセスにおいて、メモリはアクセスされる。マシンチェック例外が有効化されている場合、メモリにアクセスしてメモリをクリーンアップすることによって、追加のマシンチェック例外が引き起こされる。
【0029】
1つの例示の実施態様では、ファームウェアは、システムの起動中に行われるのと同様にメモリアドレスの範囲を初期化することによって、このメモリアドレスの範囲のクリーンアップを試みることができる。換言すれば、メモリは、エラーを含まない既知の良好な値であるものに初期化することができる。この初期化が行われるとき、メモリコントローラは、ポイズンのない既知の良好な状態にECCビットを初期化するモードにすることができる。次に、ファームウェアは、メモリアドレスの範囲を検査して、このメモリアドレスの範囲に既知の良好な値を適切に記憶することができたか否かを判断することができる。一時的フォールトの場合、この検査は成功するはずである。一方、欠陥のあるメモリチップ等の永続的なフォールトの場合、この初期化は失敗する場合がある。いずれの場合も、ファームウェアは、どのメモリロケーションの初期化を成功することができ、どのメモリロケーションの初期化を成功することができなかったかを判断することができる場合がある。
【0030】
次に、ファームウェアは、この情報をオペレーティングシステムに戻すことができる。次に、オペレーティングシステムは、初期化に成功したメモリロケーションを、他のプロセスによる使用に今後利用可能であるとしてマーキングすることができる。初期化に成功しなかったメモリロケーションは、使用には利用不能であるとしてマーキングすることができる。
【0031】
メモリ自体をクリーンアップすることに加えて、ファームウェアは、ポイズンシグネチャ又はエラーを含むメモリが伝播した任意のロケーションもクリーンアップすることができる。上記で説明したように、幾つかのプロセッサアーキテクチャでは、メモリは、直接読み出されるのではなく、まずプロセッサキャッシュ内に読み込まれ、このプロセッサキャッシュからプロセッサによって読み出される。ポイズンシグネチャがメモリ内のキャッシュラインに存在する場合、そのポイズンシグネチャは、プロセッサキャッシュにも現われる。したがって、ファームウェアは、ポイズンの存在の有無についてプロセッサキャッシュも調べることができ、見つかった場合には、ポイズンを含むキャッシュラインをプロセッサキャッシュからパージすることができる。ファームウェアは、メモリ内のポイズンのクリーンアップを試みる前に、CPUキャッシュの全てをフラッシュすることもできる。
【0032】
プロセッサキャッシュは、ポイズン又は他のエラーの存在の有無についてチェックされる。なぜならば、欠陥のあるキャッシュラインが、プリフェッチ動作等を通じてプロセッサキャッシュ内にロードされている場合があるが、プロセッサによって実際には消費されていない可能性があるからである。したがって、メモリ及びプロセッサキャッシュ等の、破損したキャッシュラインが存在し得る全てのロケーションを見直すことによって、欠陥のあるキャッシュラインがマシンチェック例外を引き起こしていなかった場合であっても、それらの全てのキャッシュラインを検出することができる。
【0033】
幾つかの場合には、プロセスをパージすることによる回復が可能でない。例えば、マシンチェック例外を引き起こしたメモリに関連付けられたプロセスがオペレーティングシステムプロセス自体である場合、このプロセスをパージすることは、直ちにシステムクラッシュをもたらす。ポイズンの消費は、システムのクラッシュ以外に選択肢がない場合があるが、多くのオペレーティングシステムは、クラッシュの前にデバッグ情報のログファイルへのダンプを試みる。このデバッグ情報は、クラッシュの前にシステムに起こっていたことを判断するために技術者に有用な場合がある。
【0034】
用いられる1つの共通の技法は、オペレーティングシステムプロセスのメモリの内容を含むコアファイルをダンプすることである。オペレーティングシステムは、クラッシュの前に、オペレーティングシステムプロセスに関連付けられたメモリを読み出し、メモリの内容のファイルに書き込むことができる。しかしながら、上記と同様に、メモリをダンプするためにメモリにアクセスするにすぎない動作が、追加のマシンチェック例外を引き起こす場合がある。本明細書において説明する技法は、メモリの内容をダンプすることを可能にするように僅かに変更することができる。
【0035】
オペレーティングシステムは、この場合も、プロセスがパージされようとしている表示と、そのプロセスによって用いられるアドレスの範囲とをファームウェアに送信することができる。一方、この表示は、オペレーティングシステムがエラーからの回復を試行しようとしていないことも含むことができる。この場合、ファームウェアは、メモリの再初期化を試みない場合がある。なぜならば、これは、メモリをファイルにダンプする目的を無効にするからである。逆に、ファームウェアは、メモリアドレスの範囲を調べて、どのアドレスがポイズン又は訂正不能エラーを含むのかを判断することができる。訂正不能エラーを含むメモリロケーションは、オペレーティングシステムに返信することができる。オペレーティングシステムが、メモリの内容のファイルへのダンプを試みるとき、エラーを含むとして示されたメモリロケーションを省略することができ、したがって、追加のマシンチェック例外の生成が防止される。この結果、オペレーティングシステムによって用いられるメモリのダンプは完全なものには満たないが、得られる結果は、デバッグデータが全く作成されないシステムクラッシュよりも優れている。
【0036】
上記で説明した回復技法に加えて、ファームウェアは、ポイズンを含むと以前判断されたことがあるメモリロケーションの経過を追跡することもできる。例えば、メモリチップが欠陥を有し、したがって、そのチップ上のメモリが用いられるごとにポイズンが連続して生成されるものと仮定する。ポイズンが最初に検出されると、オペレーティングシステムは、プロセスをパージし、メモリを使用状態に戻すことができる(障害は、初期化及び検査を通過することができるタイプのものであると仮定する)。オペレーティングシステムは、そのメモリロケーションを異なるプロセスに割り当てることができ、その結果、再びポイズンが生成される。ファームウェアは、ポイズンを一貫して生成しているメモリロケーションの経過を追跡することができ、それらのロケーションが初期化を通過することができる場合であっても、それらのロケーションを欠陥有りとして示すことができる。
【0037】
図2は、訂正不能メモリエラーを処理するための高レベル流れ図の一例である。ブロック210において、訂正不能メモリエラーの表示をプロセッサから受信することができる。例えば、マシンチェックアーキテクチャを利用するシステムの場合、この表示は、ポイズンの消費によって引き起こされたマシンチェック例外である場合がある。ブロック220において、訂正不能メモリエラーの通知をオペレーティングシステムに送信することができる。例えば、この通知は、マシンチェック例外とすることができ、この通知は、オペレーティングシステムの例外ハンドラに送信することができる。
【0038】
ブロック230において、初期化されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。このアドレスの範囲は、上記ブロック210において示された訂正不能メモリエラーのアドレスを含む場合がある。上記で説明したように、メモリアドレスの範囲は、訂正不能メモリエラーを含んだメモリロケーションに関連付けられたプロセスによって用いられるメモリアドレスの範囲である場合がある。
【0039】
図3は、訂正不能エラーの検出に基づいてメモリを初期化するための高レベル流れ図の一例である。ブロック305において、上記と同様に、訂正不能メモリエラーの表示をプロセッサから受信することができる。ブロック310において、訂正不能メモリエラーの通知をオペレーティングシステムに送信することができる。ブロック315において、オペレーティングシステムが訂正不能メモリエラーから回復することができるか否かを示す表示をオペレーティングシステムから受信することができる。上記で説明したように、回復は、プロセスがパージに成功した場合を含むことができる。
【0040】
ブロック320において、訂正不能メモリエラーをエラーログにログ記録することができる。このログ記録は、オペレーティングシステムがエラーから回復することができたか否かを含むことができる。上記で説明したように、ファームウェアは、訂正不能メモリエラーの経過を追跡して、物理メモリに関連した問題が存在するか否かを判断することができる。メモリの或る特定の範囲が訂正不能メモリエラーに繰り返し該当する場合、ファームウェアは、物理メモリに関連した問題が存在すると判断することができ、そのメモリをサービスから除去することもできるし、そのメモリの使用を停止するようにOSに伝えることもできる。
【0041】
ブロック325において、メモリアドレスの範囲をオペレーティングシステムから受信することができる。このメモリアドレスの範囲は、訂正不能メモリエラーのアドレスを含む場合がある。このアドレスの範囲は、訂正不能メモリエラーに起因してパージされたことがあるプロセスによって用いられていたメモリアドレスである場合がある。ブロック330において、少なくともこのメモリアドレスの範囲について、訂正不能メモリエラーの検出を無効化することができる。上記で説明したように、ファームウェアがこのメモリアドレスの範囲のクリーンアップを試みているとき、メモリは、再初期化、検査、及びポイズンのクリアが行われようとしているので、ファームウェアが、ネストされたマシンチェックを行うことは逆効果を招くことになる。
【0042】
ブロック335において、上記メモリアドレスの範囲を初期化することができる。上記で説明したように、メモリアドレスの範囲を初期化することは、物理メモリ自体を初期化することに加えて、ポイズンが伝播した他の任意のエリアも初期化することを含むことができる。例えば、ポイズンを含むキャッシュラインが、メモリに加えてCPUキャッシュにも存在する場合、メモリの初期化によりシステムからポイズンが除去されるように、そのキャッシュラインをキャッシュからフラッシュすることができる。ブロック340において、メモリアドレスの範囲を検査することができる。メモリアドレスが初期化された後、メモリを検査して、エラーを引き起こしている物理メモリ自体に関連した実際の問題が存在するか否かを判断することができる。
【0043】
ブロック345において、訂正不能メモリエラーの検出を再有効化することができる。ブロック350において、初期化に成功しなかったメモリアドレスの範囲内にあるメモリアドレスをオペレーティングシステムに通知することができる。初期化の成功は、ブロック340において行われた検査に基づいて判断することができる。オペレーティングシステムは、初期化に成功しなかったメモリを、任意のプロセスによる更なる使用には利用不能であると宣言することができる。ブロック355において、メモリアドレスの範囲の初期化の成功をオペレーティングシステムに通知することができる。したがって、初期化に成功したメモリアドレスをオペレーティングシステムに通信することができる。次に、オペレーティングシステムは、これらのメモリアドレスの範囲を、他のプロセスによる使用に利用可能とすることができる。
【0044】
図4は、オペレーティングシステムがメモリアドレスの範囲をクリーンアップする高レベル流れ図の一例である。ブロック410において、訂正不能メモリエラーの表示をファームウェアから受信することができる。例えば、この表示は、プロセッサアーキテクチャがマシンチェックを備える場合には、マシンチェック例外とすることができる。ブロック420において、そのアドレス範囲が訂正不能メモリエラーを含むプロセスを回復させることができるか否かを判断することができる。上記で説明したように、回復は、プロセスをパージすることを含むことができる。幾つかの場合には、オペレーティングシステムカーネル等のプロセスは、システムに更なる影響を引き起こすことなくパージすることはできない。
【0045】
ブロック430において、初期化されるメモリアドレスの範囲をファームウェアに送信することができる。このメモリアドレスの範囲は、訂正不能メモリエラーのアドレスを含む場合がある。上記で説明したように、回復動作は、エラーを含んだメモリロケーションを用いていたプロセスをパージすることとすることができる。回復プロセスの一部は、プロセスによって用いられていた全てのメモリをチェックすることとすることができる。この提供されたメモリアドレスの範囲は、プロセスによって用いられていたメモリの全てを含むことができる。
【0046】
図5は、訂正不能メモリエラーによって引き起こされる回復可能エラー及び回復不能エラーを処理するための高レベル流れ図の一例である。ブロック505において、訂正不能メモリエラーの表示を、プロセッサ上で実行されているファームウェアから受信することができる。ブロック510において、そのアドレス範囲が訂正不能メモリエラーを含むプロセスを回復させることができるか否かを判断することができる。回復可能なプロセスは、パージすることができるが、それでもシステムの残りの部分は動作し続けることが可能なプロセスとすることができる。例えば、アプリケーションプロセスは、パージすることができるが、それでも他のアプリケーション及びオペレーティングシステム自体は動作し続けることが可能である。一方、オペレーティングシステム自体等の幾つかのプロセスは、パージすることができない場合がある。
【0047】
ブロック515において、プロセスが回復可能であるか否かを判断することができる。回復可能でない場合、プロセスはブロック545に移動する。このブロックについては、以下で説明する。回復可能である場合、プロセスはブロック520に移動する。ブロック520において、初期化されるメモリアドレスの範囲をファームウェアに送信することができる。この範囲は、訂正不能メモリエラーのアドレスを含む場合がある。ブロック525において、プロセスをパージすることができる。上記で説明したように、プロセスをパージすることは、このプロセスを停止させることと、このプロセスによって用いられていたメモリ等の全てのリソースを解放することとを含むことができる。
【0048】
ブロック530において、初期化に成功したメモリアドレスの範囲の表示をファームウェアから受信することができる。幾つかの場合には、初期化に成功したメモリアドレスの範囲は、ブロック520において送信されたアドレスの範囲と同じである場合がある。しかしながら、これは、常に当てはまるとは限らない。幾つかの状況では、メモリアドレスの範囲に対するサブセットしか、初期化に成功していない場合がある。ブロック535において、初期化に成功したメモリアドレスの範囲を、使用のために利用可能であるとしてマーキングすることができる。したがって、オペレーティングシステムは、再初期化に成功したメモリを他のプロセスに自由にリアロケートすることができる。ブロック540において、初期化に成功しなかったメモリは、利用不能であるとしてマーキングすることができる。オペレーティングシステムは、利用不能であるとしてマーキングされたメモリのアロケートを試みることはできない。
【0049】
訂正不能エラーを含んだメモリを用いていたプロセスが回復可能でない場合、プロセスはブロック540に移動する。ブロック540において、その内容がログにダンプされるメモリアドレスの範囲を、ファームウェアが受信することができる。ファームウェア自体は、ダンププロセスを認識しておらず、メモリアドレスの範囲と、プロセスが回復されないとの表示とを単に受信するだけである。ログへのデータの実際のダンプは、オペレーティングシステムによって行われる。
【0050】
ブロック550において、オペレーティングシステムは、訂正不能メモリエラーを含む範囲内にあるメモリロケーションの表示をファームウェアから受信することができる。換言すれば、オペレーティングシステムは、アクセスされた場合に追加のマシンチェック例外を引き起こすメモリアドレスを受信することができる。ブロック555において、訂正不能メモリエラーを含まないメモリアドレスをログにダンプすることができる。換言すれば、オペレーティングシステムは、ブロック550において、エラーを含むメモリロケーションの通知を受け、ブロック555において、エラーを含まないロケーションのみがログにダンプされる。したがって、ダンプするためにメモリ内のデータを取り出すプロセスは、エラーを有するメモリロケーションがダンプされないので、追加のマシンチェック例外を引き起こさない。
【0051】
図6は、ポイズン消費を検出するための高レベル流れ図の一例である。ブロック610において、メモリロケーションにアクセスすることができる。このアクセスは、メモリコントローラ、IOデバイス、又はメモリにアクセスすることができる他の任意の要素によることができる。ブロック620において、このメモリロケーションがポイズンを含むと判断される場合がある。幾つかの場合には、ポイズンは、そのメモリロケーションに既に存在している場合がある。他の場合には、メモリロケーションがアクセスされたとき、メモリにエラーが存在すると判断される場合がある。例えば、エラーは、ECCによって検出することができる。エラーを訂正することができない場合、ポイズンシグネチャをそのメモリロケーションに配置することができる。
【0052】
ブロック630において、オペレーティングシステムは、ポイズンの消費の通知を受けることができる。例えば、プロセッサは、メモリロケーションの利用(例えば、消費)を試み、そのメモリロケーションがポイズンを含むことを検出すると、マシンチェック例外を引き起こすことができる。このマシンチェック例外は、通常はファームウェアを通じてオペレーティングシステムに伝播させることができる。
【0053】
ブロック640において、ポイズンを含むメモリロケーションに関連付けられたプロセスによって占有されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。オペレーティングシステムは、プロセスをパージして、ポイズンの消費から回復している場合があり、したがって、他のプロセスのためのメモリの再利用を試行する前に、プロセスによって用いられていたメモリの全てをチェックする必要がある。ブロック650において、訂正不能メモリエラーを含むメモリアドレスの範囲内にあるメモリアドレスを判断することができる。
【0054】
図7は、ポイズンを検出し、ポイズンから回復するための高レベル流れ図の一例である。ブロック705において、上記と同様に、メモリロケーションにアクセスすることができる。ブロック710において、このメモリロケーションのアクセスは、マシンチェック例外を引き起こす場合がある。ブロック715おいて、このメモリロケーションがポイズンを含み、プロセッサがポイズンを消費したことから、マシンチェック例外が引き起こされたと判断することができる。ブロック720において、オペレーティングシステムは、ポイズンの消費の通知を受けることができる。この通知は、プロセッサからファームウェアを通じてオペレーティングシステムにマシンチェック例外を渡すことによって行うことができる。次に、オペレーティングシステムは、適切な回復を行うように試みることができる。
【0055】
ブロック725において、メモリロケーションに関連付けられたプロセスによって占有されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。上記で説明したように、オペレーティングシステムは、プロセスのパージ又はこのプロセスによって用いられているメモリのダンプを行いたい場合がある。メモリアドレスの範囲は、プロセスによって用いられているメモリを含む場合がある。ブロック730において、ポイズン監視を無効化することができる。上記で説明したように、メモリ及びメモリをチェックするのに用いられるECCビットを再初期化するプロセス又はメモリ自体を検査するプロセスは、追加のポイズン生成及び更なるマシンチェック例外を引き起こす場合がある。ポイズン監視を無効化することによって、追加のマシンチェック例外を生成することなく回復動作を進めることを可能にすることができる。
【0056】
ブロック735において、エラーが回復可能であるか否かを判断することができる。上記で説明したように、回復可能なエラーは、プロセスをパージすることができるとともにメモリを再生することができるエラーである。回復不能なエラーは、プロセスがオペレーティングシステム自体であるとき等、プロセスをパージすることができないエラーである。
【0057】
プロセスが回復可能である場合、プロセスはブロック750に移動する。このブロックについては、以下で説明する。そうでない場合、プロセスはブロック740に移動する。ブロック740において、メモリアドレスの範囲内にあるメモリアドレスを検査して、どのアドレスが訂正不能エラーを含むのかを判断することができる。これらのメモリロケーションにアクセスすることは、望ましくない場合がある。なぜならば、このアクセス自体が、追加のマシンチェック例外を引き起こす場合があるからである。ブロック745において、訂正不能エラーを含むメモリアドレスの範囲をオペレーティングシステムに送信することができる。次に、オペレーティングシステムは、プロセスによって用いられているメモリをダンプするときにこの情報を利用して、追加のマシンチェック例外を引き起こすロケーションへのアクセスを回避することができる。
【0058】
プロセスが回復可能である場合、プロセスはブロック750に移動する。ブロック750において、メモリアドレスの範囲内にあるメモリアドレスを初期化することができる。上記で説明したように、メモリアドレスを初期化することは、物理メモリを初期化することを含むことができる。加えて、メモリ内の値が伝播されている場合があるキャッシュ等のロケーションもパージすることができる。ブロック755において、メモリアドレスの範囲を検査して、初期化が成功したか否かを判断することができる。
【0059】
ブロック760において、初期化に成功しておらず、したがって、訂正不能メモリエラーを含む場合があるメモリアドレスの範囲内にあるメモリアドレスを判断することができる。ブロック765において、初期化に成功したメモリアドレスの範囲をオペレーティングシステムに送信することができる。次に、オペレーティングシステムは、初期化に成功したメモリを、使用のために利用可能とすることができる。加えて、オペレーティングシステムは、初期化に成功しなかったメモリロケーションを、その後の使用には利用不能にすることができる。