(57)【特許請求の範囲】
【請求項１】
訂正不能メモリエラーの表示をプロセッサから受信するステップと、
前記訂正不能メモリエラーの通知をオペレーティングシステムに送信するステップと、
初期化するメモリアドレスの範囲を前記オペレーティングシステムから受信するステップであって、該アドレスの範囲は、前記訂正不能メモリエラーのアドレスを含んでいるステップと
を含み、
少なくとも前記メモリアドレスの範囲について訂正不能メモリエラーの検出を無効化するステップと、
前記メモリアドレスの範囲を初期化するステップと、
前記メモリアドレスの範囲を検査するステップと、
訂正不能メモリエラーの検出を再有効化するステップと
を更に含む、方法。
【請求項２】
前記オペレーティングシステムが前記訂正不能メモリエラーから回復したか否かを示す表示を前記オペレーティングシステムから受信するステップと、
前記訂正不能メモリエラーをエラーログにログ記録するステップであって、該ログ記録することは、前記オペレーティングシステムが前記エラーから回復したか否かを含んでいるステップと
を更に含む、請求項１に記載の方法。
【請求項３】
前記訂正不能メモリエラーの前記表示は、前記プロセッサがポイズンを消費することによって引き起こされたプロセッサマシンチェック例外である、請求項１に記載の方法。
【請求項４】
前記メモリアドレスの範囲の前記検査の結果に基づいて、初期化に成功したメモリアドレスを前記オペレーティングシステムに通知するステップを更に含む、請求項１に記載の方法。
【請求項５】
前記メモリアドレスの範囲の前記検査の結果に基づいて、初期化に成功しなかった前記メモリアドレスの範囲内にあるメモリアドレスを前記オペレーティングシステムに通知するステップを更に含む、請求項１に記載の方法。
【請求項６】
訂正不能メモリエラーの表示を、プロセッサ上で実行されているファームウェアから受信するステップと、
アドレス範囲が前記訂正不能メモリエラーを含むプロセスを回復させることができるか否かを判断するステップと、
初期化されるメモリアドレスの範囲を前記ファームウェアに送信するステップであって、該範囲は、前記訂正不能メモリエラーのアドレスを含んでいるステップと
を含む、方法。
【請求項７】
前記プロセスを回復させることができる場合、前記方法は前記プロセスをパージするステップを更に含む、請求項６に記載の方法。
【請求項８】
初期化に成功した前記メモリアドレスの範囲の表示を前記ファームウェアから受信するステップと、
初期化に成功したメモリアドレスを、使用のために利用可能であるとしてマーキングするステップと、
初期化に成功しなかったメモリアドレスを利用不能であるとしてマーキングするステップと
を更に含む、請求項７に記載の方法。
【請求項９】
前記プロセスを回復させることができない場合、前記方法は、
内容がログにダンプされるメモリアドレスの範囲を前記ファームウェアに送信するステップと、
訂正不能エラーを含む前記メモリアドレスの範囲内にあるメモリロケーションの表示を前記ファームウェアから受信するステップと、
訂正不能メモリエラーを含まない前記メモリアドレスの範囲内にあるメモリロケーションのメモリアドレスを前記ログにダンプするステップと
を更に含む、請求項６に記載の方法。
【請求項１０】
前記訂正不能メモリエラーの前記表示は、前記プロセッサがポイズンを消費することによって引き起こされるプロセッサマシンチェック例外である、請求項６に記載の方法。
【請求項１１】
非一時的プロセッサ可読媒体であって、プロセッサによって実行されると、該プロセッサに、
メモリロケーションにアクセスさせ、
前記メモリロケーションがポイズンを含むと判断させ、
ポイズンの消費をオペレーティングシステムへ通知させ、
前記メモリロケーションに関連付けられたプロセスによって占有されたメモリアドレスの範囲を前記オペレーティングシステムから受信させ、
訂正不能メモリエラーを含む前記メモリアドレスの範囲内にあるメモリアドレスを判断させる
一組のプロセッサ実行可能命令を含み、
前記プロセッサに、
ポイズン監視を無効化させ、
前記メモリアドレスの範囲内にあるメモリアドレスを初期化させ、
前記メモリアドレスの範囲内にある前記メモリアドレスを検査して、初期化の成功を判断させ、
初期化に成功した前記メモリアドレスの範囲を前記オペレーティングシステムへ送信させる
命令を更に含む、非一時的プロセッサ可読媒体。
【請求項１２】
前記プロセッサに、
ポイズン監視を無効化させ、
前記メモリアドレスの範囲内にあるメモリアドレスを検査して、どのアドレスが訂正不能エラーを含むのかを判断させ、
訂正不能エラーを含む前記メモリアドレスの範囲を前記オペレーティングシステムへ送信させる、
命令を更に含む、請求項１１に記載の媒体。
【請求項１３】
前記プロセッサは、マシンチェック例外を引き起こすポイズンの消費によって該ポイズンを検出する、請求項１１に記載の媒体。 
【発明の詳細な説明】
【背景技術】
【０００１】
マシンチェックアーキテクチャは、現代のコンピューティングシステムにおいて、メモリ内の障害等の障害を検出するのに用いることができる技法である。多くのコンピューティングシステムでは、メモリは、エラー訂正符号（ＥＣＣ）によって保護されている。通常用いられているエラー訂正符号は、単一ビットエラーを検出して訂正することができる。マルチビットエラーの場合、ＥＣＣは、エラーを検出することができる場合があるが、そのエラーを訂正することはできない。マシンチェックアーキテクチャを利用するシステムでは、訂正不能エラーを含むメモリロケーションが発見されたとき、ポイズンシグネチャ（poison signature）又は単にポイズン（poison）と呼ばれる特殊な値が、そのメモリロケーションに配置される。ポイズンシグネチャは、通常、ＥＣＣビットを操作することによって生成される。データ内の訂正不能エラーは、メモリコントローラ、ＣＰＵキャッシュ、ＩＯデバイスによって、又は任意の数の他の要素において識別される場合があり、それらの要素のうちのいずれもが、データ内にポイズンシグネチャを生成することができる。
【０００２】
システムは、ポイズンが存在する場合であっても、長時間の間、動作することができる場合がある。しかしながら、中央処理ユニット（ＣＰＵ）が、ポイズンを含むメモリロケーションの使用を試みると、マシンチェック例外が、プロセッサによって生成される場合がある。このマシンチェック例外は、コンピューティングデバイスのファームウェア又はオペレーティングシステムによってインターセプトされる場合がある。幾つかの場合には、訂正動作を行うことができず、システム全体がクラッシュする場合がある。一方、他の場合には、オペレーティングシステムは、回復動作を行うことができる場合がある。例えば、オペレーティングシステムは、ポイズンを含むと判断されたメモリロケーションを用いていた特定のプロセスをキルする場合がある。
【図面の簡単な説明】
【０００３】
【図１】本明細書において説明する技法によるシステムの一例を示す図である。
【図２】訂正不能メモリエラーを処理するための高レベル流れ図の一例を示す図である。
【図３】訂正不能エラーの検出に基づいてメモリを初期化する（initializing）ための高レベル流れ図の一例を示す図である。
【図４】オペレーティングシステムがメモリアドレスの範囲をクリーンアップする高レベル流れ図の一例を示す図である。
【図５】訂正不能メモリエラーによって引き起こされる回復可能エラー及び回復不能エラーを処理するための高レベル流れ図の一例を示す図である。
【図６】ポイズン消費を検出するための高レベル流れ図の一例を示す図である。
【図７】ポイズンの検出及びポイズンからの回復のための高レベル流れ図の一例を示す図である。
【発明を実施するための形態】
【０００４】
マシンチェックアーキテクチャシステムにおけるポイズンの使用は、訂正不能エラーを含むメモリの検出及びＣＰＵがエラーを含むメモリを用いることの防止において非常に有用である。幾つかの場合には、メモリは、ソフトウェアによって用いられるデータ値を含む場合がある。破損したデータ値の使用によって、正しくない結果が取得される場合がある。他の場合には、メモリロケーションは、ＣＰＵによって実行される命令を含む場合がある。そのような場合、メモリロケーションに含まれる命令は、本質的にはランダムな命令である。なぜならば、エラーがその命令をどのように変更したのかを判断することができないからである。ＥＣＣを用いると、破損した命令を識別することができるが、必ずしも訂正することはできない。
【０００５】
上述したように、マシンチェック例外の受信の際にオペレーティングシステムによってとられる通常の動作は、影響を受けるメモリロケーションを用いていたプロセスをパージすることである。プロセスをパージすることは、通常、プロセスの動作を停止して、そのプロセスにアロケートされていたメモリ等の全てのリソースを解放することを意味する。しかしながら、プロセスが単にパージされるとき、ポイズンの存在に起因して、幾つかの問題が発生する。発生する１つの問題は、オペレーティングシステムがプロセスをパージすると、そのプロセスによる使用中のメモリが未知の状態で放置されるということである。メモリは、更なるエラーを含む場合があり、この場合、異なるプロセスがこのメモリの使用を試みると、その結果、追加のマシンチェック例外が生じることになる。別の問題は、プロセスによって用いられるメモリがポイズンを有する可能性があり、ＯＳがそのメモリ領域を別のプロセスに割り当てた場合、そのプロセスは、ポイズン化したメモリ内に立ち入る可能性があるということである。現行のシステムにおけるオペレーティングシステムは、通例、パージされるプロセスのメモリのポイズンを浄化するメモリコントローラについて十分に知らない。
【０００６】
オペレーティングシステムは、２つの選択肢を有する。第１に、パージされるプロセスによって用いられていたメモリを使用不能と宣言することができる。そのような場合、オペレーティングシステムは、そのメモリの使用をもはや試みない。リブート間で長時間動作するシステムでは、これは、ますます多くのプロセスがパージされ、それらのメモリリソースが利用不能あるとしてマーキングされるにつれて、メモリマップに非常に多くのギャップを発生させる場合がある。第２の選択肢では、最初にポイズンを引き起こしたメモリハードウェアに関連した実際の問題が存在し得る場合であっても、オペレーティングシステムは、プロセスをパージするものの、メモリの継続使用を可能にする場合がある。メモリにポイズンがないこと及び未訂正のエラーを引き起こすフォールトがないことを確実にするステップがとられていない場合、メモリをむやみに再利用すると、追加のマシンチェックの生成を引き起こす場合がある。
【０００７】
上記議論は、まず第１に、エラーを含むメモリを用いていたプロセスをパージすることができるものと仮定していた。ポイズンが、オペレーティングシステムカーネル等の影響を受け易いプロセスにおいて検出された場合、そのプロセスをパージすると、その結果、一般に、システムはクラッシュする。多くの場合、オペレーティングシステムの設計者は、カーネル等のクリティカルなプロセスがパージされるとき、このクリティカルなプロセスによって用いられるメモリのメモリダンプを提供する。このダンプによって、専門家は、クリティカルなプロセスが障害時に行っていたことを解析し、この障害をより良くデバッグすることが可能になる。しかしながら、クリティカルなプロセスによって用いられるメモリが追加のエラーを含む場合、単にメモリにアクセスして内容をダンプするにすぎない動作が、追加のマシンチェック例外を引き起こす場合がある。
【０００８】
ポイズンによって引き起こされるマシンチェック例外に関連した問題を更に悪化させることは、ポイズンの単なる生成が、それ自体はプロセスをパージする理由ではないということである。例えば、メモリコントローラが、ＣＰＵキャッシュ用にキャッシュラインのプリフェッチを試みたとき、メモリ内にエラーを検出する場合がある。メモリコントローラは、この場合、エラーを含むメモリをポイズンシグネチャと取り替え、このポイズンシグネチャをキャッシュにロードすることができる。この時点において、システムは、そのポイズンが生成されたことは知っているが、そのポイズンが消費されるか否か及びいつ消費されるのかを判断する方法を有しない。例えば、プロセスは、プリフェッチされたキャッシュラインへのアクセスを決して試みることはなく、したがって、マシンチェック例外を決して生成することはない。さらに、システムは、オペレーティングシステムが、ポイズンを消費したプロセスをパージすることによって、ポイズンの消費から回復することができたか否かを判断する明確な方法を有しない。
【０００９】
本明細書において説明する技法は、ポイズンの消費によって引き起こされるマシンチェック例外からの回復に関連した上述の問題を克服するものである。そのような例外が発生したとき、オペレーティングシステムは、オペレーティングシステムとハードウェアとの間の抽象化レイヤとして機能するシステムファームウェアに、マシンチェック例外が受信されたことを知らせることができる。オペレーティングシステムは、プロセスのパージに成功したか否か又はメモリのダンプ等の他の回復動作が行われるか否かもファームウェアに知らせることができる。加えて、オペレーティングシステムは、パージされるプロセスによって用いられていたメモリアドレスの単数又は複数の範囲をファームウェアに知らせることができる。
【００１０】
次に、システムファームウェアは、オペレーティングシステムによって提供されたメモリアドレスの範囲を調べることができる。このファームウェアは、メモリが追加のエラーを含むか否かを判断し、メモリ範囲を再初期化（reinitialize）して、以前のエラーについて生成されたポイズンのメモリ範囲をクリアすることができる。システムファームウェアは、メモリを検査して、エラーがメモリ内の実際の欠陥によって引き起こされたか否かを判断することもできる。ファームウェアは、破損したデータを含む場合があるキャッシュメモリ等の全ての他のロケーションをパージすることもできる。メモリのクリーンアップが実行されると、ファームウェアは、結果をオペレーティングシステムに返信して報告することができる。これらの結果は、どのメモリの範囲がクリーンアップに成功したのか、及びどのメモリの範囲がクリーンアップに成功しなかったのかを含むことができる。
【００１１】
次に、オペレーティングシステムは、ファームウェアによって提供された情報を用いて、メモリを使用可能な状態に戻すこともできるし、メモリを使用不能としてマーキングすることもできる。検査に成功したとしてファームウェアによって示されたメモリは、異なるプロセスに再利用されるようにオペレーティングシステムに返すことができる。
【００１２】
幾つかの場合には、エラーを含むメモリを用いているプロセスをパージすることができない。例えば、オペレーティングシステムカーネルを実行しているプロセスは、直接パージすることができない。なぜならば、これは、システムクラッシュを引き起こす場合があるからである。そのような場合には、オペレーティングシステムは、後の解析に備えてダンプされるメモリアドレスの範囲をファームウェアに知らせることができる。この場合、ファームウェアは、メモリの再初期化を試みることができず、ポイズンシグネチャを含むメモリロケーション、又はＯＳがアクセスした場合に追加の未訂正のエラーを引き起こすことになるメモリロケーションに単に留意するだけである。この情報は、オペレーティングシステムに提供することができ、オペレーティングシステムは、その結果、メモリをダンプするときに、ポイズン又はエラーを含むメモリロケーションを回避することができる。
【００１３】
図１は、本明細書において説明する技法によるシステムの一例である。このシステム１００は、サーバコンピュータ又はパーソナルコンピュータに見られるようなコンピューティングシステムとすることができる。システム１００は、スマートフォン、タブレット、携帯情報端末、又は他の任意のそのようなデバイス等の他の任意のタイプのコンピューティングデバイスとすることもできる。本明細書において説明する技法は、どの特定のタイプのデバイスにも限定されるものではなく、逆に、以下で説明するタイプの要素を含む任意のタイプのデバイスに適用可能である。
【００１４】
システム１００は、プロセッサ１１０、非一時的プロセッサ可読媒体１２０、及びメモリ１３０を備えることができる。プロセッサは、プロセッサ可読命令を取り出して実行することができる任意のタイプのプロセッサとすることができる。さらに、プロセッサは、メモリエラーを検出し、それらのエラーをシステムの他の構成要素に通知することができるタイプのものとすることができる。例えば、プロセッサは、訂正不能エラーを含むメモリがポイズンシグネチャと呼ばれる特殊なシグネチャを用いてマーキングされるマシンチェックアーキテクチャを採用することができる。ポイズンシグネチャは、通常、メモリエラーを含むキャッシュラインのＥＣＣビットを、ポイズンとして認識することができるパターンを用いて変更することによって作成される。プロセッサがポイズンを消費したとき、マシンチェック例外等の例外を発生させることができる。ファームウェア及びオペレーティングシステムは、以下で説明するように、この例外を受信して、訂正動作を行うことができる。プロセッサは、キャッシュメモリ１１５を備えることもできる。このキャッシュメモリは、プロセッサダイ自体に位置するメモリとすることができ、データへの高速アクセスを可能にすることができる。キャッシュメモリの使用については、以下で更に詳細に説明する。
【００１５】
システムは、一組の命令を含む非一時的プロセッサ可読媒体１２０も備えることができる。これらの命令がプロセッサによって実行されるとき、プロセッサは、本明細書において説明する機能を実施することができる。この媒体は、アプリケーション１２２、オペレーティングシステム１２４、及びファームウェア１２６を含むことができる。これらのアプリケーションは、システム１００の機能を提供することができる。例えば、ウェブホスティングサーバでは、アプリケーションは、ウェブサーバとすることができる。本明細書において説明する技法は、どの特定のタイプのアプリケーションにも限定されるものではない。理解すべきは、アプリケーションが、システム上で動作して、エンドユーザが所望する機能を提供するプログラムであるということである。
【００１６】
媒体は、オペレーティングシステムも含むことができる。このオペレーティングシステムは、システム１００のリソースを管理することができる。例えば、オペレーティングシステムは、システム上で動作しているアプリケーションにメモリ等のリソースをアロケートすることによって、それらのアプリケーションを管理することができる。オペレーティングシステムは、オペレーティングシステムアプリケーションプログラミングインタフェース（ＡＰＩ）を通じて様々な能力をアプリケーションに提供することもできる。これらのＡＰＩを通じて、アプリケーションは、コンピューティングシステムのリソースへのアクセスを得ることができる。オペレーティングシステムは、システム１００の全てのリソースの経過を追跡し、どのリソースが利用可能であるのか、及びどのリソースが使用中、すなわち利用不能であるのかを判断することができる。
【００１７】
オペレーティングシステム１２４は、ファームウェア１２６を用いて、プロセッサ及びシステム１００の他の構成要素とインタフェースすることができる。このファームウェアは、ハードウェアとオペレーティングシステムとの間に抽象化レイヤを提供するソフトウェア命令とすることができる。例えば、オペレーティングシステムは、下層にあるハードウェアの能力を利用したい場合がある。オペレーティングシステムは、ハードウェアとのより大きな度合いの一体性を有するファームウェアとインタフェースして、その能力を要求することができる。ファームウェアは、ハードウェアについてのより大きな知識レベルを有し、したがって、オペレーティングシステムからの一般化されたリソース要求を取り込み、それらの要求を、必要とされる特定のハードウェアレベルコマンドに変換することができる。ファームウェアは、通常はオペレーティングシステムに利用可能でないコマンドをハードウェア上で実行することができる場合もある。例えば、ファームウェアは、ハードウェアの能力の有効化及び無効化を行うことができる場合がある。
【００１８】
システム１００は、メモリ１３０も備えることができる。このメモリは、通常、プロセッサが用いることができるランダムアクセスメモリである。通常のコンピューティングシステムでは、非一時的プロセッサ可読媒体１２０上に記憶されたプロセッサ命令は、通常、プロセッサによる実行の前にメモリ１３０内にロードされる。プロセッサによるメモリへのアクセスは、通常、媒体１２０にアクセスすることによって達成することができる速度よりもはるかに高速にすることができる。
【００１９】
アプリケーションは、通常、オペレーティングシステムによって管理されるプロセスとして実行される。オペレーティングシステムは、アプリケーションによって用いられるメモリアドレスの或る範囲をアロケートすることができる。図示するように、２つの例示のアプリケーションプロセス１３２、１３４がある。これらのプロセスは、ウェブサーバ、ワードプロセッシングプログラム、又は他の任意のタイプのアプリケーション等の任意のタイプのアプリケーションとすることができる。図１に示すように、これらのプロセスは、メモリアドレスの或る範囲を占有する。このメモリアドレスの範囲は、連続した範囲として示されているが、これは、説明を簡単にするためである。メモリアドレスの範囲は、不連続な場合がある。例えば、プロセスに配分されたメモリの間に、空いているメモリアドレスのセクション１３３、１３５が存在する場合がある。この説明の残りの部分では、プロセスによって用いられるアドレスの範囲は、そのプロセスにアロケートされた全てのメモリを意味し、そのメモリが１つ又は複数の連続した範囲にあるか否かを問わない。
【００２０】
アプリケーションの観点からプロセスを説明してきたが、オペレーティングシステム自体がプロセスである。他の任意のプロセスと同様に、オペレーティングシステムは、そのオペレーティングシステムの機能を提供するのに用いられる命令を記憶するために、それ自体にメモリ１３１をアロケートすることができる。ハードウェアの観点からすれば、オペレーティングシステムは、本質的には、実行される別のプロセスにすぎない。
【００２１】
動作中、プロセッサは、命令及びデータをメモリからロードすることができる。キャッシュメモリを含むプロセッサアーキテクチャでは、メモリの内容は、プロセッサによるより高速なアクセスを得るためにキャッシュ内にロードすることができる。通常、メモリの内容は、キャッシュラインと呼ばれる場合がある複数バイトの単位で、プロセッサからプロセッサキャッシュへ及びプロセッサキャッシュからプロセッサへ移動される。例えば、メモリの８バイトの集合体をキャッシュラインとして合わせてグループ化することができる。しかしながら、本明細書において説明する技法は、どの所与のサイズのキャッシュラインにも限定されるものではないことが理解されるべきである。キャッシュラインは、ＥＣＣによって保護することができる。上述したように、ＥＣＣは、通常、キャッシュライン内の単一ビットエラーを検出して訂正することができる。したがって、単一ビットエラーについては、これ以上説明しないことにする。複数ビットエラーの場合には、ＥＣＣは、エラーを検出することができる場合があるが、そのエラーを訂正することはできない。キャッシュライン内の複数ビットエラーは、訂正不能エラーと呼ばれる場合がある。
【００２２】
メモリには、多くのエラー発生源が存在する。１つの可能な発生源は、高エネルギー粒子である。高エネルギー粒子は、メモリロケーションに記憶された１つ又は複数のビットの値を変化させる場合があり、したがって、メモリは正しくない値を含む。別の可能なエラー発生源は、機能不良のメモリチップである。更に別のエラー発生源は、メモリに直接アクセスしてデータを不正確に記憶する場合がある入力／出力デバイス（図示せず）である場合がある。さらに、アプリケーションソフトウェア、オペレーティングシステム、又はファームウェア内のバグが、メモリ内にエラーを引き起こす場合がある。
【００２３】
メモリ内のエラーは、複数のメカニズムを通じて検出することができる。例えば、多くのプロセッサアーキテクチャは、メモリ内の各キャッシュラインをステップスルーすることができるスクラバハードウェアを含む。ＥＣＣを用いることによって、スクラバは、メモリにエラーが存在すると判断することができる。エラーが、マルチビットエラーを意味する訂正不能なタイプのものである場合、スクラバは、キャッシュラインの内容を、メモリが破損していることを示すポイズンシグネチャと取り替えることができる。同様に、キャッシュラインがメモリからプロセッサ又はプロセッサキャッシュ内にロードされるとき、メモリをロードするのに用いられるハードウェアは、訂正不能エラーがこのキャッシュラインに存在すると判断することができる。この場合も、そのキャッシュラインをポイズンシグネチャと取り替えることができる。破損したキャッシュラインがプロセッサキャッシュから排除されるとき、ＣＰＵキャッシュコントローラは、このキャッシュラインがメモリに返信される前にこのキャッシュラインをポイズン化することができる。ポイズンシグネチャを生成する他のあり得る理由は、当業者に知られている。理解すべきは、訂正不能エラーがキャッシュラインに発見されたとき、そのラインをポイズンシグネチャと取り替えることができるということである。
【００２４】
或る時点において、プロセッサは、ポイズンシグネチャを含むキャッシュラインに対して或るタイプのアクセスを試みる場合がある。プロセッサは、そのキャッシュラインをメモリ又はプロセッサキャッシュから直接ロードすることができる。このアクセス動作は、キャッシュラインに記憶された命令を実行しようとしている場合もあるし、キャッシュラインに記憶されたデータ値を用いようとしている場合もある。ポイズンシグネチャを含むキャッシュラインへのアクセスの試みは、ポイズンの消費と呼ばれる。マシンチェックアーキテクチャを採用したプロセッサでは、ポイズンの消費は、プロセッサにマシンチェック例外を生成させる。このマシンチェック例外は、プロセッサハードウェアからファームウェアに渡すことができる。次に、ファームウェアは、マシンチェック例外の表示をオペレーティングシステムに渡すことができる。
【００２５】
オペレーティングシステムが、マシンチェック例外の表示を受信すると、オペレーティングシステムは、そのエラーが回復可能であるか否かを最初に決定しなければならない。上述したように、各プロセスには、メモリアドレスの或る範囲がアロケートされる。マシンチェック例外は、ポイズンを含んだ特定のメモリロケーションを識別する。したがって、オペレーティングシステムは、どのプロセス及び関連付けられたメモリ範囲がマシンチェック例外の原因であったのかを判断することができる。
【００２６】
幾つかの場合には、オペレーティングシステムは、例外を引き起こしたプロセスをパージすることによって、マシンチェック例外から回復することができる場合がある。プロセスをパージすることは、通常、このプロセスを停止させることと、このプロセスによって用いられている全てのリソースを解放することとを伴う。プロセスをパージすることは、プロセスをキルすると表現される場合もある。しかしながら、マシンチェック例外に関して上記で説明した問題が発生するのは、この時点である。オペレーティングシステムがプロセスをパージすることができる場合であっても、そのプロセスによって用いられていたメモリは、依然としてエラーを含んでいる場合がある。例えば、ポイズンの生成を引き起こしたキャッシュラインを含むメモリチップが実際に欠陥を有する場合、そのプロセスによって用いられるアドレス範囲にある他のキャッシュラインも、ポイズンシグネチャを含むか又はポイズンの生成をもたらすことになるエラーを含む可能性が非常に高い。
【００２７】
オペレーティングシステムは、パージされたプロセスによって用いられていたメモリを他のプロセスに利用可能にする前に、そのメモリをまずクリーニングして検証することが望ましい場合がある。１つの例示の実施態様では、オペレーティングシステムは、ポイズンが消費されたことと、オペレーティングシステムが、ポイズンを有するキャッシュラインを含んでいたプロセスをパージすることによって回復を試みていることとの表示をファームウェアに送信することができる。オペレーティングシステムは、パージされたプロセスによって用いられていたメモリアドレスの範囲をファームウェアに知らせることができる。換言すれば、プロセッサは、ポイズン又は他のエラーの存在の有無についてチェックする必要があるメモリアドレスの範囲をファームウェアに知らせることができる。
【００２８】
この表示を受信すると、ファームウェアは、パージされたプロセスによって用いられていたメモリアドレスの範囲のクリーンアップを試みることができる。幾つかの例示の実施態様では、このクリーンアップの一部として、ファームウェアは、プロセッサ内におけるポイズンの生成及びポイズン消費の検出を一時的に無効化することができる。上記で説明したように、ファームウェアは、プロセッサと密接に一体化され、したがって、これらの下位レベルの機能を制御することができる。ファームウェアは、クリーンアッププロセスの間、マシンチェック例外を無効化することができる。なぜならば、メモリをクリーンアップするにすぎない動作が、それ以外で追加のマシンチェック例外を引き起こす場合があるからである。例えば、パージされたプロセスに関連付けられた幾つかのキャッシュラインを含むメモリチップが欠陥を有し、したがって、多くのエラーを有すると仮定する。メモリのクリーンアップを試みるプロセスにおいて、メモリはアクセスされる。マシンチェック例外が有効化されている場合、メモリにアクセスしてメモリをクリーンアップすることによって、追加のマシンチェック例外が引き起こされる。
【００２９】
１つの例示の実施態様では、ファームウェアは、システムの起動中に行われるのと同様にメモリアドレスの範囲を初期化することによって、このメモリアドレスの範囲のクリーンアップを試みることができる。換言すれば、メモリは、エラーを含まない既知の良好な値であるものに初期化することができる。この初期化が行われるとき、メモリコントローラは、ポイズンのない既知の良好な状態にＥＣＣビットを初期化するモードにすることができる。次に、ファームウェアは、メモリアドレスの範囲を検査して、このメモリアドレスの範囲に既知の良好な値を適切に記憶することができたか否かを判断することができる。一時的フォールトの場合、この検査は成功するはずである。一方、欠陥のあるメモリチップ等の永続的なフォールトの場合、この初期化は失敗する場合がある。いずれの場合も、ファームウェアは、どのメモリロケーションの初期化を成功することができ、どのメモリロケーションの初期化を成功することができなかったかを判断することができる場合がある。
【００３０】
次に、ファームウェアは、この情報をオペレーティングシステムに戻すことができる。次に、オペレーティングシステムは、初期化に成功したメモリロケーションを、他のプロセスによる使用に今後利用可能であるとしてマーキングすることができる。初期化に成功しなかったメモリロケーションは、使用には利用不能であるとしてマーキングすることができる。
【００３１】
メモリ自体をクリーンアップすることに加えて、ファームウェアは、ポイズンシグネチャ又はエラーを含むメモリが伝播した任意のロケーションもクリーンアップすることができる。上記で説明したように、幾つかのプロセッサアーキテクチャでは、メモリは、直接読み出されるのではなく、まずプロセッサキャッシュ内に読み込まれ、このプロセッサキャッシュからプロセッサによって読み出される。ポイズンシグネチャがメモリ内のキャッシュラインに存在する場合、そのポイズンシグネチャは、プロセッサキャッシュにも現われる。したがって、ファームウェアは、ポイズンの存在の有無についてプロセッサキャッシュも調べることができ、見つかった場合には、ポイズンを含むキャッシュラインをプロセッサキャッシュからパージすることができる。ファームウェアは、メモリ内のポイズンのクリーンアップを試みる前に、ＣＰＵキャッシュの全てをフラッシュすることもできる。
【００３２】
プロセッサキャッシュは、ポイズン又は他のエラーの存在の有無についてチェックされる。なぜならば、欠陥のあるキャッシュラインが、プリフェッチ動作等を通じてプロセッサキャッシュ内にロードされている場合があるが、プロセッサによって実際には消費されていない可能性があるからである。したがって、メモリ及びプロセッサキャッシュ等の、破損したキャッシュラインが存在し得る全てのロケーションを見直すことによって、欠陥のあるキャッシュラインがマシンチェック例外を引き起こしていなかった場合であっても、それらの全てのキャッシュラインを検出することができる。
【００３３】
幾つかの場合には、プロセスをパージすることによる回復が可能でない。例えば、マシンチェック例外を引き起こしたメモリに関連付けられたプロセスがオペレーティングシステムプロセス自体である場合、このプロセスをパージすることは、直ちにシステムクラッシュをもたらす。ポイズンの消費は、システムのクラッシュ以外に選択肢がない場合があるが、多くのオペレーティングシステムは、クラッシュの前にデバッグ情報のログファイルへのダンプを試みる。このデバッグ情報は、クラッシュの前にシステムに起こっていたことを判断するために技術者に有用な場合がある。
【００３４】
用いられる１つの共通の技法は、オペレーティングシステムプロセスのメモリの内容を含むコアファイルをダンプすることである。オペレーティングシステムは、クラッシュの前に、オペレーティングシステムプロセスに関連付けられたメモリを読み出し、メモリの内容のファイルに書き込むことができる。しかしながら、上記と同様に、メモリをダンプするためにメモリにアクセスするにすぎない動作が、追加のマシンチェック例外を引き起こす場合がある。本明細書において説明する技法は、メモリの内容をダンプすることを可能にするように僅かに変更することができる。
【００３５】
オペレーティングシステムは、この場合も、プロセスがパージされようとしている表示と、そのプロセスによって用いられるアドレスの範囲とをファームウェアに送信することができる。一方、この表示は、オペレーティングシステムがエラーからの回復を試行しようとしていないことも含むことができる。この場合、ファームウェアは、メモリの再初期化を試みない場合がある。なぜならば、これは、メモリをファイルにダンプする目的を無効にするからである。逆に、ファームウェアは、メモリアドレスの範囲を調べて、どのアドレスがポイズン又は訂正不能エラーを含むのかを判断することができる。訂正不能エラーを含むメモリロケーションは、オペレーティングシステムに返信することができる。オペレーティングシステムが、メモリの内容のファイルへのダンプを試みるとき、エラーを含むとして示されたメモリロケーションを省略することができ、したがって、追加のマシンチェック例外の生成が防止される。この結果、オペレーティングシステムによって用いられるメモリのダンプは完全なものには満たないが、得られる結果は、デバッグデータが全く作成されないシステムクラッシュよりも優れている。
【００３６】
上記で説明した回復技法に加えて、ファームウェアは、ポイズンを含むと以前判断されたことがあるメモリロケーションの経過を追跡することもできる。例えば、メモリチップが欠陥を有し、したがって、そのチップ上のメモリが用いられるごとにポイズンが連続して生成されるものと仮定する。ポイズンが最初に検出されると、オペレーティングシステムは、プロセスをパージし、メモリを使用状態に戻すことができる（障害は、初期化及び検査を通過することができるタイプのものであると仮定する）。オペレーティングシステムは、そのメモリロケーションを異なるプロセスに割り当てることができ、その結果、再びポイズンが生成される。ファームウェアは、ポイズンを一貫して生成しているメモリロケーションの経過を追跡することができ、それらのロケーションが初期化を通過することができる場合であっても、それらのロケーションを欠陥有りとして示すことができる。
【００３７】
図２は、訂正不能メモリエラーを処理するための高レベル流れ図の一例である。ブロック２１０において、訂正不能メモリエラーの表示をプロセッサから受信することができる。例えば、マシンチェックアーキテクチャを利用するシステムの場合、この表示は、ポイズンの消費によって引き起こされたマシンチェック例外である場合がある。ブロック２２０において、訂正不能メモリエラーの通知をオペレーティングシステムに送信することができる。例えば、この通知は、マシンチェック例外とすることができ、この通知は、オペレーティングシステムの例外ハンドラに送信することができる。
【００３８】
ブロック２３０において、初期化されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。このアドレスの範囲は、上記ブロック２１０において示された訂正不能メモリエラーのアドレスを含む場合がある。上記で説明したように、メモリアドレスの範囲は、訂正不能メモリエラーを含んだメモリロケーションに関連付けられたプロセスによって用いられるメモリアドレスの範囲である場合がある。
【００３９】
図３は、訂正不能エラーの検出に基づいてメモリを初期化するための高レベル流れ図の一例である。ブロック３０５において、上記と同様に、訂正不能メモリエラーの表示をプロセッサから受信することができる。ブロック３１０において、訂正不能メモリエラーの通知をオペレーティングシステムに送信することができる。ブロック３１５において、オペレーティングシステムが訂正不能メモリエラーから回復することができるか否かを示す表示をオペレーティングシステムから受信することができる。上記で説明したように、回復は、プロセスがパージに成功した場合を含むことができる。
【００４０】
ブロック３２０において、訂正不能メモリエラーをエラーログにログ記録することができる。このログ記録は、オペレーティングシステムがエラーから回復することができたか否かを含むことができる。上記で説明したように、ファームウェアは、訂正不能メモリエラーの経過を追跡して、物理メモリに関連した問題が存在するか否かを判断することができる。メモリの或る特定の範囲が訂正不能メモリエラーに繰り返し該当する場合、ファームウェアは、物理メモリに関連した問題が存在すると判断することができ、そのメモリをサービスから除去することもできるし、そのメモリの使用を停止するようにＯＳに伝えることもできる。
【００４１】
ブロック３２５において、メモリアドレスの範囲をオペレーティングシステムから受信することができる。このメモリアドレスの範囲は、訂正不能メモリエラーのアドレスを含む場合がある。このアドレスの範囲は、訂正不能メモリエラーに起因してパージされたことがあるプロセスによって用いられていたメモリアドレスである場合がある。ブロック３３０において、少なくともこのメモリアドレスの範囲について、訂正不能メモリエラーの検出を無効化することができる。上記で説明したように、ファームウェアがこのメモリアドレスの範囲のクリーンアップを試みているとき、メモリは、再初期化、検査、及びポイズンのクリアが行われようとしているので、ファームウェアが、ネストされたマシンチェックを行うことは逆効果を招くことになる。
【００４２】
ブロック３３５において、上記メモリアドレスの範囲を初期化することができる。上記で説明したように、メモリアドレスの範囲を初期化することは、物理メモリ自体を初期化することに加えて、ポイズンが伝播した他の任意のエリアも初期化することを含むことができる。例えば、ポイズンを含むキャッシュラインが、メモリに加えてＣＰＵキャッシュにも存在する場合、メモリの初期化によりシステムからポイズンが除去されるように、そのキャッシュラインをキャッシュからフラッシュすることができる。ブロック３４０において、メモリアドレスの範囲を検査することができる。メモリアドレスが初期化された後、メモリを検査して、エラーを引き起こしている物理メモリ自体に関連した実際の問題が存在するか否かを判断することができる。
【００４３】
ブロック３４５において、訂正不能メモリエラーの検出を再有効化することができる。ブロック３５０において、初期化に成功しなかったメモリアドレスの範囲内にあるメモリアドレスをオペレーティングシステムに通知することができる。初期化の成功は、ブロック３４０において行われた検査に基づいて判断することができる。オペレーティングシステムは、初期化に成功しなかったメモリを、任意のプロセスによる更なる使用には利用不能であると宣言することができる。ブロック３５５において、メモリアドレスの範囲の初期化の成功をオペレーティングシステムに通知することができる。したがって、初期化に成功したメモリアドレスをオペレーティングシステムに通信することができる。次に、オペレーティングシステムは、これらのメモリアドレスの範囲を、他のプロセスによる使用に利用可能とすることができる。
【００４４】
図４は、オペレーティングシステムがメモリアドレスの範囲をクリーンアップする高レベル流れ図の一例である。ブロック４１０において、訂正不能メモリエラーの表示をファームウェアから受信することができる。例えば、この表示は、プロセッサアーキテクチャがマシンチェックを備える場合には、マシンチェック例外とすることができる。ブロック４２０において、そのアドレス範囲が訂正不能メモリエラーを含むプロセスを回復させることができるか否かを判断することができる。上記で説明したように、回復は、プロセスをパージすることを含むことができる。幾つかの場合には、オペレーティングシステムカーネル等のプロセスは、システムに更なる影響を引き起こすことなくパージすることはできない。
【００４５】
ブロック４３０において、初期化されるメモリアドレスの範囲をファームウェアに送信することができる。このメモリアドレスの範囲は、訂正不能メモリエラーのアドレスを含む場合がある。上記で説明したように、回復動作は、エラーを含んだメモリロケーションを用いていたプロセスをパージすることとすることができる。回復プロセスの一部は、プロセスによって用いられていた全てのメモリをチェックすることとすることができる。この提供されたメモリアドレスの範囲は、プロセスによって用いられていたメモリの全てを含むことができる。
【００４６】
図５は、訂正不能メモリエラーによって引き起こされる回復可能エラー及び回復不能エラーを処理するための高レベル流れ図の一例である。ブロック５０５において、訂正不能メモリエラーの表示を、プロセッサ上で実行されているファームウェアから受信することができる。ブロック５１０において、そのアドレス範囲が訂正不能メモリエラーを含むプロセスを回復させることができるか否かを判断することができる。回復可能なプロセスは、パージすることができるが、それでもシステムの残りの部分は動作し続けることが可能なプロセスとすることができる。例えば、アプリケーションプロセスは、パージすることができるが、それでも他のアプリケーション及びオペレーティングシステム自体は動作し続けることが可能である。一方、オペレーティングシステム自体等の幾つかのプロセスは、パージすることができない場合がある。
【００４７】
ブロック５１５において、プロセスが回復可能であるか否かを判断することができる。回復可能でない場合、プロセスはブロック５４５に移動する。このブロックについては、以下で説明する。回復可能である場合、プロセスはブロック５２０に移動する。ブロック５２０において、初期化されるメモリアドレスの範囲をファームウェアに送信することができる。この範囲は、訂正不能メモリエラーのアドレスを含む場合がある。ブロック５２５において、プロセスをパージすることができる。上記で説明したように、プロセスをパージすることは、このプロセスを停止させることと、このプロセスによって用いられていたメモリ等の全てのリソースを解放することとを含むことができる。
【００４８】
ブロック５３０において、初期化に成功したメモリアドレスの範囲の表示をファームウェアから受信することができる。幾つかの場合には、初期化に成功したメモリアドレスの範囲は、ブロック５２０において送信されたアドレスの範囲と同じである場合がある。しかしながら、これは、常に当てはまるとは限らない。幾つかの状況では、メモリアドレスの範囲に対するサブセットしか、初期化に成功していない場合がある。ブロック５３５において、初期化に成功したメモリアドレスの範囲を、使用のために利用可能であるとしてマーキングすることができる。したがって、オペレーティングシステムは、再初期化に成功したメモリを他のプロセスに自由にリアロケートすることができる。ブロック５４０において、初期化に成功しなかったメモリは、利用不能であるとしてマーキングすることができる。オペレーティングシステムは、利用不能であるとしてマーキングされたメモリのアロケートを試みることはできない。
【００４９】
訂正不能エラーを含んだメモリを用いていたプロセスが回復可能でない場合、プロセスはブロック５４０に移動する。ブロック５４０において、その内容がログにダンプされるメモリアドレスの範囲を、ファームウェアが受信することができる。ファームウェア自体は、ダンププロセスを認識しておらず、メモリアドレスの範囲と、プロセスが回復されないとの表示とを単に受信するだけである。ログへのデータの実際のダンプは、オペレーティングシステムによって行われる。
【００５０】
ブロック５５０において、オペレーティングシステムは、訂正不能メモリエラーを含む範囲内にあるメモリロケーションの表示をファームウェアから受信することができる。換言すれば、オペレーティングシステムは、アクセスされた場合に追加のマシンチェック例外を引き起こすメモリアドレスを受信することができる。ブロック５５５において、訂正不能メモリエラーを含まないメモリアドレスをログにダンプすることができる。換言すれば、オペレーティングシステムは、ブロック５５０において、エラーを含むメモリロケーションの通知を受け、ブロック５５５において、エラーを含まないロケーションのみがログにダンプされる。したがって、ダンプするためにメモリ内のデータを取り出すプロセスは、エラーを有するメモリロケーションがダンプされないので、追加のマシンチェック例外を引き起こさない。
【００５１】
図６は、ポイズン消費を検出するための高レベル流れ図の一例である。ブロック６１０において、メモリロケーションにアクセスすることができる。このアクセスは、メモリコントローラ、ＩＯデバイス、又はメモリにアクセスすることができる他の任意の要素によることができる。ブロック６２０において、このメモリロケーションがポイズンを含むと判断される場合がある。幾つかの場合には、ポイズンは、そのメモリロケーションに既に存在している場合がある。他の場合には、メモリロケーションがアクセスされたとき、メモリにエラーが存在すると判断される場合がある。例えば、エラーは、ＥＣＣによって検出することができる。エラーを訂正することができない場合、ポイズンシグネチャをそのメモリロケーションに配置することができる。
【００５２】
ブロック６３０において、オペレーティングシステムは、ポイズンの消費の通知を受けることができる。例えば、プロセッサは、メモリロケーションの利用（例えば、消費）を試み、そのメモリロケーションがポイズンを含むことを検出すると、マシンチェック例外を引き起こすことができる。このマシンチェック例外は、通常はファームウェアを通じてオペレーティングシステムに伝播させることができる。
【００５３】
ブロック６４０において、ポイズンを含むメモリロケーションに関連付けられたプロセスによって占有されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。オペレーティングシステムは、プロセスをパージして、ポイズンの消費から回復している場合があり、したがって、他のプロセスのためのメモリの再利用を試行する前に、プロセスによって用いられていたメモリの全てをチェックする必要がある。ブロック６５０において、訂正不能メモリエラーを含むメモリアドレスの範囲内にあるメモリアドレスを判断することができる。
【００５４】
図７は、ポイズンを検出し、ポイズンから回復するための高レベル流れ図の一例である。ブロック７０５において、上記と同様に、メモリロケーションにアクセスすることができる。ブロック７１０において、このメモリロケーションのアクセスは、マシンチェック例外を引き起こす場合がある。ブロック７１５おいて、このメモリロケーションがポイズンを含み、プロセッサがポイズンを消費したことから、マシンチェック例外が引き起こされたと判断することができる。ブロック７２０において、オペレーティングシステムは、ポイズンの消費の通知を受けることができる。この通知は、プロセッサからファームウェアを通じてオペレーティングシステムにマシンチェック例外を渡すことによって行うことができる。次に、オペレーティングシステムは、適切な回復を行うように試みることができる。
【００５５】
ブロック７２５において、メモリロケーションに関連付けられたプロセスによって占有されるメモリアドレスの範囲をオペレーティングシステムから受信することができる。上記で説明したように、オペレーティングシステムは、プロセスのパージ又はこのプロセスによって用いられているメモリのダンプを行いたい場合がある。メモリアドレスの範囲は、プロセスによって用いられているメモリを含む場合がある。ブロック７３０において、ポイズン監視を無効化することができる。上記で説明したように、メモリ及びメモリをチェックするのに用いられるＥＣＣビットを再初期化するプロセス又はメモリ自体を検査するプロセスは、追加のポイズン生成及び更なるマシンチェック例外を引き起こす場合がある。ポイズン監視を無効化することによって、追加のマシンチェック例外を生成することなく回復動作を進めることを可能にすることができる。
【００５６】
ブロック７３５において、エラーが回復可能であるか否かを判断することができる。上記で説明したように、回復可能なエラーは、プロセスをパージすることができるとともにメモリを再生することができるエラーである。回復不能なエラーは、プロセスがオペレーティングシステム自体であるとき等、プロセスをパージすることができないエラーである。
【００５７】
プロセスが回復可能である場合、プロセスはブロック７５０に移動する。このブロックについては、以下で説明する。そうでない場合、プロセスはブロック７４０に移動する。ブロック７４０において、メモリアドレスの範囲内にあるメモリアドレスを検査して、どのアドレスが訂正不能エラーを含むのかを判断することができる。これらのメモリロケーションにアクセスすることは、望ましくない場合がある。なぜならば、このアクセス自体が、追加のマシンチェック例外を引き起こす場合があるからである。ブロック７４５において、訂正不能エラーを含むメモリアドレスの範囲をオペレーティングシステムに送信することができる。次に、オペレーティングシステムは、プロセスによって用いられているメモリをダンプするときにこの情報を利用して、追加のマシンチェック例外を引き起こすロケーションへのアクセスを回避することができる。
【００５８】
プロセスが回復可能である場合、プロセスはブロック７５０に移動する。ブロック７５０において、メモリアドレスの範囲内にあるメモリアドレスを初期化することができる。上記で説明したように、メモリアドレスを初期化することは、物理メモリを初期化することを含むことができる。加えて、メモリ内の値が伝播されている場合があるキャッシュ等のロケーションもパージすることができる。ブロック７５５において、メモリアドレスの範囲を検査して、初期化が成功したか否かを判断することができる。
【００５９】
ブロック７６０において、初期化に成功しておらず、したがって、訂正不能メモリエラーを含む場合があるメモリアドレスの範囲内にあるメモリアドレスを判断することができる。ブロック７６５において、初期化に成功したメモリアドレスの範囲をオペレーティングシステムに送信することができる。次に、オペレーティングシステムは、初期化に成功したメモリを、使用のために利用可能とすることができる。加えて、オペレーティングシステムは、初期化に成功しなかったメモリロケーションを、その後の使用には利用不能にすることができる。
【図１】
0005965076.tif 000002
【図２】
0005965076.tif 000003
【図３】
0005965076.tif 000004
【図４】
0005965076.tif 000005
【図５】
0005965076.tif 000006
【図６】
0005965076.tif 000007
【図７】
0005965076.tif 000008