次のページ 前のページ 目次へ

The SIG11 problem

Rogier Wolff, R.E.Wolff@BitWizard.nl

9 August 2000

小林 雅典, zap03216@nifty.ne.jp

25 August 2000


カーネルをコンパイルする際の signal 11

この FAQ は、 近頃多くの人々を悩ませる現象は いったいどういった原因で起こることがありうるのかを述べたものです。 すなわち、Linux(*) カーネル (または、その種の大きなパッケージ) のコンパイルが ``signal 11'' でクラッシュするというものです。 原因はソフトウェアのこともありますが、ほとんどの場合はハードウェアにあります。 読み進めると、詳細が分るでしょう。

(*)もちろん、Linux 固有の現象ではありません。 もしハードウェアがイカれているのなら、Linux, Windows 3.1, FreeBSD, Windows NT, NextStep はすべてクラッシュするでしょう。

英文の最新版は http://www.BitWizard.nl/sig11/ で入手できます。

フランス語で読みたい方のために、フランス語訳が http://www.linux-france.org/article/sig11-fr/ で入手できます。

日本語訳 (この文書) の最新版は、 http://www.linux.or.jp/JF/JFdocs/GCC-SIG11-FAQ.html で入手できます。

原文のスペルミスを見つけた、耳寄りな追加情報がある、 あるいは「わたしも同じ目にあった」なんて話があれば、R.E.Wolff@BitWizard.nl にメールをください。 (注――技術的にナンセンスと考えられるものは却下します) サブジェクトに ``sig11'' か、 そのような言葉を書き添えてもらえるとありがたいです。




The Sig11 FAQ

質問

(カーネルを) コンパイルしていると、

      gcc: Internal compiler error: program cc1 got fatal signal 11
と出てクラッシュします。 コンパイラの何がまずいのでしょうか? コンパイラのどのバージョンが必要なのでしょうか? カーネルにどこか不具合があるのでしょうか?

答え

おそらく、コンパイラにせよカーネルにせよ、 お使いのソフトウェア環境には何も悪いところはありません。 ハードウェアとの関係が大いにありそうです。 まずそうな部分はいろいろあり、直しかたも様々です。 ちょっと読み進めると、詳細が分るでしょう。 この「法則」には、2 つの例外があります。 仮想記憶が不足している場合と、Red Hat 5.x または 6.x のインストールの最中です。 この文章の最後のほうに詳しく書いてあります。




質問

オッケー。ソフトウェアが原因じゃないって、どうやって確かめたらいいの?

答え

最初に、トラブルの原因がハードウェアであることを確認してみよう。 ``make'' が停止したら、もう一度 ``make'' とだけタイプする。 停止する前にもう少しだけファイルをコンパイルしたなら、 トラブルの原因はハードウェアに間違いない。 また即座に停止する (すなわち、``nothing to be done for xxxx'' を表示しながら少しばかりディレクトリをスキャンした後、 きっちり同じ場所で玉砕する) なら、

        dd if=/dev/HARD_DISK of=/dev/null bs=1024k count=MEGS
を試してみよう。

HARD_DISK を ``hda'' とかのハードディスクの名前 (例えば、hda や sda など。``df .'' すると出てくる) に、MEGS を搭載メインメモリのメガバイト数に置き換えて。 これを実行すると、 ハードディスクの最初の何メガバイトかがメモリに読み込まれるので、 次回 make する時には、C のソースファイルと gcc バイナリは、 ディスクからメモリへ再度読み込まれることを強いられる。 ここでもう一度 make してみよう。 もし、依然として同じ場所で停止するのなら、 あなたが読むべきなのはこの FAQ なのかどうかあやしくなってくる。 なぜなら、結局のところソフトウェアの問題のように思われてくるから.... 下にある「ほかの可能性はなんだろう」って質問をちょっと見てね.....

もし、この ``dd'' コマンドを実行してないうちはコンパイラが同じところで止まり続けて、``dd'' の実行後は別のところに移動するのなら、 ディスクからメモリへの転送に問題を抱えているのは確実だ。

質問

本当のところ、signal 11 ってどういう意味なの? ハードウェアの問題だってことは確かなの?

答え

いいかい、コンパイラが、 コンパイラの管理するメモリ区域の外側にアクセスしたんだ。 もし動作中のハードウェアでこいつが起こるなら、 コンパイラの内部にプログラミングの間違いがあるってこと。 それで ``internal compiler error'' っていうわけ。 でも、gcc はとてもたくさんのポインタを使うものだから、 ハードウェアがときたまビットを反転させてしまう場合、 しまいにはアドレッシングレンジの外側のどこかにアクセスしちゃいそうになる。 (めちゃくちゃなアドレスはたいていアドレッシングレンジの外側になっちゃう。 なぜって、 メインメモリに 4G ものお宝をもってるひとはめったにいないから... :-)

近頃 ``signal 11'' 問題に遭遇したひとはみんなこのページに直行するみたいだ。 でも、もしあなたが自作のソフトウェアを開発している、 もしくはまだ十分にデバッグされてないソフトウェアをもっているのなら、 ``signal 11'' (または、segmentation fault) は依然としてプログラムの不具合を知らせるとても強力なヒントになる。``gcc'' のようなほとんど誰のところでも動作してるプログラムで、 これまたよくテストされたデータセット (例えば、Linux カーネル) のクラッシュを引き起こした場合だけが、 ハードウェアに不具合があるヒントとなるんだ。

もし、システムの中で、 ハードウェアのドライバに類するソフトウェアがイカれていたら、 ハードウェアの故障に酷似した症状が起こることもありうる。 でも、ドライバがダメな場合は、 単にコンパイラのクラッシュを引き起こすことよりも、 カーネル内部の深刻なトラブルを引き起こすことのほうがありがちだ。




質問

オッケー。ハードウェアの何が問題なんだろう?

答え

もしハードウェアがそいつを引き起こすなら、原因は:




質問

RAM のタイミングの問題だって? 1 ヶ月以上前に BIOS の設定をいじくった。 その間やまほどカーネルをコンパイルしたけど何もマズくなかった。RAM のタイミングに問題なんてありえない、よね?

答え

ありえるよ。RAM 工場には 60ns の RAM を作る機械と 70ns の RAM を作る機械が別々にあると思ってるの? そいつは違うね! いっしょくたに作って、それからテストするんだ。60ns の規格に適合するものもあれば、そうでないものもある。 もし作り手がそいつにふさわしい数字を振らなくてはならないとしたら、61ns が振られるものもあるかもしれない。 この場合、例えば 40 度以下の気温の時に、 君の愛機で動作するのはいかにもありそうなことだ。 (気温が上がると、チップの動作はのろくなる。 それがスーパーコンピュータをべらぼうに冷さなくてはならない訳)

でも、「夏の到来」や長時間のコンパイル作業で、 コンピュータ内部の温度が「限界」を越えるまで上がることはありえるね。 -- Philippe Troin (ptroin@compass-da.com)




質問

ちょっと安かったから、値段につられて ECC メモリじゃないやつを買っちゃった。 馬鹿みたい。高くても ECC にしとけばよかった。そうだよね?

答え

より高価な ECC メモリやマザーボードを買うと、 ある特定のタイプのエラーを防ぐことができます―― それはアルファ線の通過によってランダムに起こるエラーです。

たいていのひとは ``gcc'' を使ってみると、 半時間以内に ``signal 11'' 問題を再現できますが、 いざメモリをテストしてみると、何時間続けても再現できません。 よって ``signal 11'' は、 単にアルファ線がいきあたりばったりにビットを反転させて起こるのではないことは明らかです。 アルファ線が原因なら、メモリテストでも再現できるでしょうから。 これは何か別のことが起きているのを意味しています。

ほとんどの sig11 問題は、CPU <-> cache <-> memory の経路でのタイミングエラーによって引き起こされる印象があります。 この場合、メインメモリの ECC は役に立ちません。 いつ ECC を買うべきか? a) 物欲がうずいた時。b) たくさん RAM をもってる時。(なぜ最小限の数値を挙げないのかって? 最小限は、時流によってまさに「たくさん」変化するものだから。) 誰もが ECC メモリを使ってると猛烈に思いこんでるひともいます。 そういうひとは ``a)'' の理由からです。




質問

メモリの問題だって? BIOS のメモリテストは OK だ。 素敵な DOS のプログラムもメモリは OK だって言ってる。 メモリに問題なんてありえない、よね?

答え

ありえるよ。BIOS のメモリテストは全くの役立たずだ。 良いか悪いかテストするどころか、 実際に得られる以上のメモリがときたま OK になることさえあるくらいだ。

640k PC をもってる友人がいた (そう、640k PC でお分りの通り、昔々のお話)、 そいつの 2 つ目のバンクには、256kbit チップの代りに 64kbit チップが 1 つささっていた。 実際には 320k のワーキングメモリがあったことになる。 時々、BIOS の 384k のテストが ``OK'' になることがあった。 にもかかわらず、特定のアプリケーションだけは落ちる。 実際の問題を診断するのは、ひどく骨が折れた....

たいていのメモリの問題は、特殊な状況の下でしか起こりません。 そのような状況がどういうものであるのかは、 まだほとんど分らないのです。gcc はどうもそういった特殊な状況を作り出す「みたい」です。 メモリテスト、特に BIOS のメモリテストはそうではありません。 筆者はもう、Linux カーネルと優秀なメモリテスターを収録したフロッピーの作成サービスはやっていません。 その話は勘弁してください......

その理由として、メモリテストだと、CPU はほんのわずかな命令しか実行しないことと、 メモリアクセスのパターンが非常に規則的になりがちなことが挙げられます。 このような状況の下だと、 メモリのうちのほんのわずかな部分しか酷使されません。 もしあなたが電子技術を学んでいて、 メモリテストに興味がおありなら、 何が起きているのかを理解すれば修士論文が書けます。 顧客には信頼性がないと主張されているのに、 製造段階のテストでは落ちてくれないハードウェアに悩まされてる計算機メーカーが、 喜んでそのようなプロジェクトのスポンサーになってくれるでしょう......




質問

カーネルをコンパイルする時だけ起こるのですか?

答え

いいえ。ハードウェアには、 カーネルをコンパイルしてる最中なのかを知る術がありません。 カーネルのコンパイルは、 あいにくハードウェアにとってはとても骨が折れる仕事なのです。 それで、 カーネルをコンパイルしている時にだけたくさん起こるのです。gcc や glibc のような大きなパッケージのコンパイルも、sig11 の引き金になることが多いです。




質問

NT, Windows 95, OS/2, DOS だと、何もクラッシュしません。 Linux 特有の何かに違いありません。

答え

まず第一に、Linux は上記のどの OS よりもハードウェアを酷使します。 上に挙げたマイクロソフト製のような OS の中には、 とにかくいつクラッシュするかまったく予測がつかないものがあります。 マイクロソフトに電話して、 「おい、今日ウインドウズが落ちたぞ」 なんて言うひとはひとりもいないでしょう。 とにかくもしあなたがそういう行動に出たとしても、 相手は、ユーザーであるあなたがエラーを起こしたんだ (ドイツの雑誌に掲載された the interview with Bill Gates を見てね....) 今はちゃんと動作しているのだから、口をつぐむべきだ、 などとほざくでしょう。

これらの OS には、Linux より「予測可能な」ところもあります。 エクセルは、いつもきっちり同じメモリ領域にロードされるはず、 という意味です。 したがってこの場合、 ビットエラーが起こった時に影響を受けるのは常にエクセルになります。 エクセルはクラッシュするでしょう。もしくは、 エクセルがほかのアプリケーションをクラッシュさせるでしょう。 とにかく、落ちるのは単なるアプリケーションで、 メモリとは関係ないように思われるでしょう。

きっちりインストールされた Linux システムなら、 エラーを起こさずにカーネルをコンパイルできるはずだと確信してます。 間違いなく、sig11 は起こりません。 (** 例外――Cyrix プロセッサでの Red Hat 5.0。別のところを見てね。 **)

実際のところ、Linux と gcc はほかの OS 以上にハードウェアを酷使します。 もし Linux 以外で、 クラッシュするところまでハードウェアを酷使するものが必要なら、winstone を試してみるのが吉。 -- Jonathan Bright (bright@informix.com)




質問

いつも signal 11 なの?

答え

いいえ。4, 6, 7 のようなほかのシグナルも、ときたま発生します。 でも、signal 11 が最もありふれています。

メモリに記憶された情報がイカれてしまっている時なら、 何が起こってもおかしくありません。 バイナリの異常がもっと頻発しても不思議はないくらいです。 にもかかわらず、いつも gcc が signal 11 を受け取るものだと決めつけるのはかなりの偏見のように思われます。 以下の現象も見られます:

最初のほうは、カーネルが、 実際にはメモリの間違った記憶によって引き起こされたものを、 「カーネルのプログラミングエラー」と「勘違いする」ケースです。 最後のほうは、 アプリケーションプログラムがこのトラブルによって終了してしまったところです。

-- S.G.de Marinis (trance@interseg.it)
-- Dirk Nachtmann (nachtman@kogs.informatik.uni-hamburg.de)




質問

何をすればいいの?

答え

何が悪いのかをつきとめたい場合は、以下のことを試してみましょう... 注――これらの中には、 コンピュータを著しく遅くするおそれのあるものもあります。 これらの狙いは、コンピュータをきちんと動作させ、 どこが悪いのかを絞りこんでいくことです。 情報を得られれば、 例えばベンダーに故障箇所を交換してもらうことができます。

上に挙げた手段のうち、 メモリの借用だけは試せないというひとがほとんどでしょうが、 やれるだけのことをやっても変化が見られないとなると、 きわめてやっかいです。 この場合は、本当に RAM そのものが原因だと言えそうなのです。 目下、RAM は PC の最も高価なパーツなので、 こんな結論であって欲しくはないでしょう。 でも残念ながら、 結局 RAM のせいだと判明したとの返事をたくさんもらってます。 でもまだまだあきらめないで――RAM は全くのゴミではないかもしれない―― いつでも下取りに出して別の、 もしくはより多くの RAM を買うことができます。


質問

RAM テスターの機械でうちの RAM をテストしたことがある。 結果は OK だった。RAM に問題なんてありえない、よね?

答え

ありえます。RAM の中で今まさに起こっているエラーは、RAM テスターでは検出できないように思われます。 「あなたの」コンピュータでは、 マザーボードがあやしいやりかたで RAM をアクセスしているか、 さもなくば RAM を混乱させているかもしれないからです。 この場合の利点は、 いまだに RAM テスターを信頼してる誰かさんに RAM を売りつけてやれることです......




質問

うちで Red Hat のインストールが玉砕するのはなぜ?

答え

マシンによっては、Red Hat 5.x や 6.x のインストールには問題がいくつかあります。

Red Hat のインストールが、完璧な状態のマシンでうまくいかない (signal 7 もしくは signal 11 でクラッシュする) ことがあるとの報告をもらいましたし、 筆者もこの目でしかと見たことがあります。 愛機は昔も今も 100% 信頼のおけるマシンです。みんな、 旧式の「ちゃんと動く」ディストリビューションを捨てて、 トラブルに巻き込まれていきます。そのうえに、 もっと新しいバージョンの Red Hat をインストールしたがるのです。 さらにまた古いバージョンに戻すことは、もはや選択できません。 なぜなら、5.x に戻したところで、 結果として同じ「インストール中のクラッシュ」に見舞われるからです。

Patrick Haley (haleyp@austin.rr.com) は、96MB (32 & 64) を上限として、あらゆるパターンでメモリを装着してみたところ、96MB 載せた時だけはきちんとインストールできるのが分ったと報告してくれました。 これは、筆者自身の (Red Hat のインストールに失敗した) 経験とも一致します―― 筆者の場合は、32MB のマシンにインストールしようとして失敗したのです。

最新情報――カーネルに問題があるせいかもしれないみたいです。 カーネルが、(一時的に) メモリ不足におちいって、 カレントプロセスを kill するのかもしれません。 Hubert Mantel (mantel@suse.de) によるパッチが http://juanjox.linuxhq.com/patch/20-p0459.html で入手できます。

実際、このケースにあてはまるのなら、2 つ目の仮想コンソールに切り替えて (ctrl-alt-F2 を押す)、そこで 2, 3 秒ごとに ``sync'' と打つのを試してみてください。 これをやると、 ハードディスクバッファとして割り当てられたメモリの量が切り詰められます... Red Hat のインストールが 2 度 3 度と続けてクラッシュした際に、 このトリックを用いることでインストールを完了できたという方は、 ぜひご一報ください!!!

この問題から逃れるには何をしたらいいのかって?...




質問

ほかの可能性はなんだろう?

答え

ほかには、以下に挙げた可能性が記録されています:




質問

こんなことは信じられないな。誰のところで起こったの?

答え

まあ、少なくとも筆者個人のところで起こったことです。 でも、こんなわたしの言うことを信じる必要はありません。 以下の人達のところでも起こりました:




新たな話に興味があります。 もし問題を抱えていて、 それが何であるか確信がもてないなら、R.E.Wolff@BitWizard.nl にメールをいただけると、助けになれるかもしれません。 普通なら好奇心がわたしに、 その問題が何であるかをあなたがつきとめるまで、 質問に答えるように駆りたてるでしょう..... (一方、問題が明らかに上に挙げてあるものなら、うんざり :-)


日本語版の謝辞

この文書の翻訳にあたって、JF ML のみなさんにたいへんお世話になりました。なかでも、 山下 義之さん、武井 伸光さんにはたくさんの有益なアドバイスをいただきました。 感謝します。 -- Masanori Kobayasi (zap03216@nifty.ne.jp)




この文書のオリジナル英文は http://www.BitWizard.nl で管理されています。
次のページ 前のページ 目次へ