ライトブログ

どれかキーを押すと,続行します.

0x00000124との戦い 分析編

とってもとっても今月忙しくて、ブログの更新ができませんでした。 今日になってやっと、仕事にも一段落がついたので、今抱えているPC問題について 書こうと思います。

所属しているある団体の部屋にASX5812-A52というデスクトップPCがある。 個人所有している同社製のネットブック Aspire one AOA150-Bb と同じ、ACER社のPCだ。AOA150-Bbといえば、これまでDownscalingsupported 関連の話で幾度となくブログネタを提供してくれたPCだが、今度はデスクトップ機で問題が発生したようだ。

事の発端は活動をしているときに、突然ブルースクリーンになって再起動した 瞬間を見たことから始まる。ただWordで作業をしていただけで、何も負荷の かかることはしていないという。 再起動してしまって何のエラーか分からないので、毎度お決まりのBlueScreenViewで詳細を調べることに。 すると、これまでに20回以上ブルースクリーンが出ていると判明。 なんだこれは。。しばらく唖然としてしまった。 気を取り直して、調査を進めると、 ラーコードは0x00000124。問題の原因となっているファイルは、hal.dllと ntoskrnl.exeの2つであることが分かった。

通常のブルースクリーンと違い、何のエラーかを示す文章が出ないタイプの ブルースクリーンであるため、問題解決には難航が予想される。 さらに、エラーの原因のファイルに、hal.dllが入っているので、可能性としては、 ハードウェアレベルでの問題も考えられる。そうなってしまっては最強ツールの リカバリでさえ太刀打ちできないだろう。仮に直ったとしてもまた障害が起きる 可能性はある。それでは直したことにはならない。

さて、自論はこのくらいにして、今回のエラーについて考えてみることにしよう。

0x00000124(以下 0x124)で検索していると、様々な情報が出てくる。 また、非常にマイナーなエラーらしく、日本語のページは数少ない。 ここからは、このエラーについて調査した結果を載せたいと思う。

調査結果1 0x124は、別名、WHEA_UNCORRECTABLE_ERRORと呼ばれるエラーで、 致命的なハードウェアエラーが発生したことを示している。 このエラーは、WHEAによって提供されるエラーデータを使用して表示している。 なお、第1パラメータの内容によって、エラーの原因は変わる。 今回のエラーの第1パラメータの内容は、0x0なので、エラーの原因は マシンチェック例外と判断される。 もう「致命的」って単語が出た時点でやばそうな雰囲気ですね。

<WHEAとは> WHEA(Windows Hardware Error Architecture :Windowsハードウェアエラアーキテクチャ) Windows Vistaから導入されたWindowsのハードウェアのエラー 検出システム。 WHEAは、CPUからハードウェアエラーを検出した報告を受けると、ログに 記録する。この記録されるログのことを、WHEA-Loggerと呼び、WHEAは ログに記録がされたことを認知すると、システムを停止(ブルースクリーン)する。

<マシンチェック例外(Machine Check Exception)とは> CPUがハードウェアにある回復不能なエラーを検出した場合に、 Windowsがシステムを保護し、安全のためにシステムを停止させる機能のこと。 マシンチェック例外は、基本的にOCや、不安定な電源環境、 冷却不足、ハードウェア故障で発生するエラーと見られる。

↑英語のサイトとかを読んだ感じは、こういうことなのかなと思います。 WHEAについてはハードウェア設計者用のツールキットに説明があるので、 それのほうが詳しく載っていると思われます(英語)

調査結果2 WHEAを調べていると、イベントビューアで詳細が見られることが判明。 システムに何らかのイベントが生じると、それはすべて管理ツールの イベントビューアに記録されるので、そこから問題解決への糸口が見えるのでは と推測。イベントビューアを見ることに。 イベントビューアを開いて、システムログの中から、「重大」と「エラー」に 分類されているイベントのみを抽出して表示させてみると、100件を超えるほどの イベントが表示される結果に。 ほんとに抽出したの?って言いたくなるくらい多い。 抽出したデータを眺めていると、あったあった。 --------------------- WHEA-Logger 致命的なハードウェアエラーが発生しました。 コンポーネントによる報告:プロセッサコア エラーソース:マシンチェック例外 エラーの種類:バス/相互接続エラー --------------------- コンポーネントによる報告がプロセッサコアとなっているので、一瞬、CPUを 疑いましたが、CPUが壊れるということは熱暴走以外なかなか考えられないと 思うので保留。 気になるのは、バス/相互接続エラーというもの。 これはどれだけ検索をかけても良い情報が見当たらない。 文字だけを見ていると、コンピュータ内部のバスの、相互接続 (各ハードウェアの相互の接続)にエラーが生じていることになる。 しかし、バスが内部バスなのか外部バスなのかも分からないし、 各ハードウェアってどのハードウェアを指すのかも分からないので、 特定はかなり難しいと見られる。

調査結果3 ここからは、障害を引き起こしているとみられるhal.dllとntoskrnl.exeの 2つのファイルは、それぞれ何なのかについて考えてみる。 まず、hal.dllについて halとは、Hardware Abstraction Layer:ハードウェア抽象化レイヤと呼ばれる もので、元々はOSを様々なPCにインストールできるように、それぞれのPCの ハードウェアのプラットフォームの差を吸収できるようにするための機能とみられる。 図で説明すると、以下のようになる。

ここに、PC1とPC2の2つのパソコンがあるとする。一番下のハードウェアの 部分を見ると、PC1は凸があるが、PC2は凹になっていることが分かると思う。 説明においては、これをハードウェアのプラットフォームの差とする。 halがなければ、OSは各ハードウェアごとにシステムコードを変えなければ動作 できない問題が発生する。

Windowsが考案された時の目標として、高度な移植性の確保が挙げられた。 当時は、パソコンにはそのパソコン専用のOSが組み込まれており、それは他の PCでは動作しないというデメリットを持っていた。しかし、それではハードウェア の進化にも追いつけないし、管理の煩雑化というデメリットが生まれてしまう。 そこで、halを作り、各ハードウェアのプラットフォームごとの差を吸収し、OSが 各ハードウェアのプラットフォームに共通の機能を提供していけるようにすることで、 移植性を高めようとしたのだ。このときhalは、いわばクッション材の役割を果たし、 ハードウェアとソフトウェア(OS)のかけ橋となる。

Windowsにおけるhal.dllは、ハードウェア抽象化のほかに、I/Oインタフェース、 割り込み処理、プロセッサの通信システム、電源管理など、Windowsが正常に 動くために必要な最低限のインタフェースを提供する仕事をしている。

ntoskrnl.exeについて ntoskrnl.exeとは、NTOSのカーネル機能を提供する超重要なWindowsの 基幹ファイルで、メモリ管理、プロセス管理、カーネルの管理などを担当 している。 NTOSとは、現在の主流となっているOS(Windows2000、XP、Vista、7、8) に共通的に用いられているOSの設計方法で高度な安定性を持っているOSを指す。 NTの意味については、諸説あるので、省略する。

さらに、イベントビューアを見ると、ntoskrnl.exeが原因でブルースクリーンに なるときには、その直前にKP41病が発生していることが分かった。 <KP41病とは> 正式名は、Kernel-Power 41エラー。現在でも具体的な原因が分かって いない大きな問題の一つ。メモリの電圧が低く、正常に電力供給がされて いないために発生するというものが通説だが、それは基本的に自作PCで OCをやっている人でなければ発生しない問題と言える。また、過剰な負荷が かかったときに発生すると言われているが、冒頭で述べたとおり、Wordで 作業をしていただけなので、負荷による障害は考えにくい。

さらに、hal.dllとntoskrnl.exeは、ともに依存し合っている性質(リンク)がある。 hal.dllやntoskrnl.exeなど、Windowsの重要なシステムファイルは、関数を 使って、システムの動作を行っている。(関数と言っても、Excelは関係ない) その中で、ハードウェアとOSのかけ橋であるhal.dllと、基礎的なOSの機能 (カーネル)を提供するntoskrnl.exeは、とても似た関係にある。 これをかなり簡単に説明すると、以下のような図になる。 なお、図の上のほうが権限は上になる。(例えば、OSはそれ以下の ntoskrnl.exeとhal.dllとハードウェアを管理する権限を持つ)

この図を見ると、ntoskrl.exeとhal.dllは、OSによって提供されるファイルの中でも、 ハードウェアに近い部分で働くファイルであるのだ。

PCは、私たちユーザーの入力により、OSを通り、ハードウェアで処理を行い、 またOSを通ってユーザーが見える形(ディスプレイへの表示など)で出力を するのである。 これに先ほどの関数の話を入れると、ntoskrnl.exeは、それより上位の プログラムからの命令を受け、ハードウェアで処理を行わせるために、hal.dllに リンクをする。また、ハードウェアからの処理結果を返すために、hal.dllは上位の ntoskrnl.exeにリンクをする。このリンクは、hal.dllとntoskrnl.exeに共通の関数が あるために発生する。

さて、ここまで様々な角度からこのエラーを読み解いてきたが、 原因はいまだに分からない。ただ、問題の全体像は以下のようになるのではと 思われる。

問題1.マシンチェック例外 CPUによるマシンチェック例外エラー検出機能が動作し、システムを保護する ためにWHEAに報告し、ブルースクリーンにした。原因はバス/相互接続エラー。 →原因はハードウェア

問題2.KP41病 KP41病は、原因が分からないので、何とも言えないが、これの原因が ハードウェアだと仮定すると、hal.dllの問題にもつながるし、それはリンクされている ntoskrnl.exeの問題にもつながる。ハードウェアが原因と仮定した段階で、 同時に問題1のエラーも発生する要因になるので、WHEAが動き、 ブルースクリーンになることも考えられる。 →原因は不明(OSレベル、ハードウェアレベル双方の可能性)

問題1と問題2の結果、0x124 WHEA_UNCORRECTABLE_ERROR が発生するのである。

しかし、ハードウェアレベルで障害が発生しているならば、PC起動時の POST(Power On Self Test)が失敗し、そこで起動が停止するはず。 先ほどのバス/相互接続エラーとかだったら尚更だろう。 となると、このエラーはブート段階のPOSTでは検出されず、起動後使用していると 発生するエラーだと推測されるのである。 そう考えると、ハードウェアレベルでの障害ではなく、hal.dllやntoskrnl.exeが ただ単に破損しているだけと考えられるのである。 ここで矛盾が生まれていることは、言うまでもない。

さて、文章が飛躍していてでとても読みにくかったかもしれないが、今後も 研究して、謎が解明できるようにしたいと思う。

2014/3/29 追加 続編完成。 0x00000124との戦い 正しい答えはあるのか

2014/7/29 完全勝利 0x00000124との戦い 1年1カ月の答え