Pentium F00F バグ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/04/22 07:46 UTC 版)
![]() |
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。(2018年11月)
|
f00f("foof"と発音)は、インテルの Pentium、Pentium MMX、Pentiumオーバードライブプロセッサにおいて、ある世代以前のモデルに存在し公開されている、設計上の不具合の通称である。問題[注釈 1]を起こす機械語バイト列「f0 0f c7 c8」の先頭2バイトの16進表現に由来する。
Intelはこの問題を「ロック付 CMPXCHG8B 命令の無効オペランドエラッタ」と呼んでいる[1]。
内容
問題を起こす機械語コード(f0 0f c7 c8)に対応するアセンブリ言語表現は以下のようになる。本来はメモリオペランドを指定して使用する前提の命令であり[2]、下記のコードは実際のアセンブラで処理できないかもしれない。
lock cmpxchg8b eax
不具合を引き起こすにはオペランドはレジスタである必要がある[1][2]。ここでは例示としてeaxをオペランドにしているが、その他のレジスタでもよい。
cmpxchg8b命令は、オペランドとして指定されたアドレスのメモリ上の8byteの領域を取る。この命令を実行すると、edx:eaxの値とメモリ上の8byte値を比較し[2]、一致したらZフラグをセットするとともにecx:ebxの値をこの8byte領域にストアし、一致しなければZフラグをクリアするとともに8byteのデータをedx:eaxにロードする(コンペア・アンド・スワップ、詳細はリファレンスマニュアル等を参照)。ただし、この命令の機械語では、命令フォーマット上はオペランドにレジスタも指定することが許容される。そして、レジスタオペランドを指定したcmpxchg8b命令を、lockプレフィクス付で実行すると、この不具合が引き起こされる[1][2]。
lockプレフィックス[注釈 2]なしでは、この命令は不正命令例外を引き起こすだけである[1][2]。即ち、レジスタペアedx:eaxに格納された8byte=64bitのデータと、指定されたレジスタ、上記の例ではeaxに格納された4byte=32bitのデータの比較は妥当ではないからである。
しかし、lockプリフィックスを付けた場合、以後のメモリアクセスが抑制されるために、プロセッサは不正命令例外ハンドラに移行することができず[1]、この段階でハングアップし以後は一切の命令を実行せず、割り込みも受け付けなくなってしまう。復旧するにはシステムを再起動しなければならない[1]。
対策
この命令は特別な権限を要求せず、特にユーザープロセスの実行中にOSが全く関与できずに発生すると思われたため、当初は重大な問題と考えられた[3]。以後、OSでの対策が行われるとともに、プロセッサ側でも対策が行われた。
オペレーティングシステムでの対応
広く普及していたプロセッサにエラッタが発見されたことから、オペレーティングシステムベンダは発生条件を検知してクラッシュを防ぐ対策を実装する作業に追われた[4][5]。
回避にはオペレーティングシステムでの対策を要する。例外発生時に、例外ハンドラへのアクセスが、まずページフォールトを発生するようにして、不具合を回避する[1][2]。
プロセッサのバグフィクス
Pentium Pro以降のIntelプロセッサにはこのバグの影響はない[1]。また、最新のIntel Pentium Processor Speficificationもアップデートされ、B2ステッピングではこの問題は修正されている。
影響
f00f命令を問題のあるシステム上で実行しても、ハードウェア的なダメージを起こさない[1]。もちろんファイルシステムやオペレーティングシステム、その他の状況にもよるが、ディスクバッファがフラッシュされていなかったり書込み操作中にドライブに割り込まれたり、とあるアトミックでない操作中に割り込まれたりした状態でこのコードを踏み、フリーズしたならば、データを失うことはあり得る。
f00fバグは一般的に知られたので、この言葉は時々よく似たハードウェア設計ミス、例えばCyrix coma バグのようなものを指すのにも使われる。
脚注
注釈
出典
- ^ a b c d e f g h i “ロック付CMPXCHG8B(コンペア アンド エクスチェンジ8バイト)命令の無効オペランドエラッタの概要”. Intel. 1998年1月15日時点のオリジナルよりアーカイブ。2020年4月4日閲覧。
- ^ a b c d e f “エラッタに関する技術的解説”. Intel. 1998年1月15日時点のオリジナルよりアーカイブ。2020年4月4日閲覧。
- ^ “Net reacts to "F0" Pentium bug” (英語). CNet. オリジナルの2013年1月2日時点におけるアーカイブ。
- ^ “オペレーティングシステム ベンダからのステートメント”. Intel. 1998年1月15日時点のオリジナルよりアーカイブ。2020年4月4日閲覧。
- ^ “インテル、Pentiumのバグの概要を発表。対策はOSで”. PC Watch 2020年4月4日閲覧。
関連項目
- Pentium FDIV バグ
- Cyrix coma バグ
外部リンク
「Pentium F00F バグ」の例文・使い方・用例・文例
- バグパイプを吹く人たちの演奏
- フォアグラウンド処理のバグについての報告
- 多くの科学者が、アメリカの農業に大きな損害を与えたスーパーバグを制御するために研究している。
- 彼はバグパイプを吹くことができる。
- 納品したプログラムのバグについて、社内の技術者が応急的なプログラムを作成することで対応する。
- だからバグ別の場所では直さなければならない。
- 累積バグ数
- あなたたちはバグの修正に注力してください。
- 私たちはバグについてお客様に正確に伝える必要がある。
- そのバグを再現できませんでした。
- そのバグが修正されるのを待っています。
- このバグは以前から存在しています。
- このバグは以前から発生しています。
- あなたはそのバグの原因が分かりますか?
- あなたはそのバグを改善してくれてありがとう。
- このバグの原因を解明するのに、まる3日もかかりました。
- バグの原因は初歩的な構文の誤りというか、単なる凡ミスでした。
- プロジェクトメンバーを総動員し、2日かけてやっとバグの原因が分かりました。
- バグの原因が特定できましたので早急に対応致します。
- ああそうそう、コメント欄のバグは文字間を調節するletter-spacingタグを使うと起こるものだったみたい。
- Pentium F00F バグのページへのリンク