6月版 怒りのLinus、「カーネル開発者のふりはやめろ」


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/6/28

linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2006年5月はどのようなことが起きたのか、見てみましょう。

LILOに潜む「255文字制限」のナゾ

 LILOやGRUBなどのブートローダを利用してLinuxカーネルを起動する際、普通のコマンドラインアプリケーションのようにコマンドラインオプションを指定してカーネルの挙動を変えることができます。

 このコマンドラインオプションには、「255文字までしか利用できない」という制限が存在します。そこで、Alon Bar-Levがコマンドラインオプションの文字数を拡張する「THE LINUX/I386 BOOT PROTOCOL -Breaking the 256 limit」というパッチを提案しました。

 実は、このパッチは2005年からずっと提案されているのですが、LILOで255bytes以上のコマンドラインオプションを使うとクラッシュするという報告があっていまだカーネルに取り込まれていません。一体何が原因なのか? 「LILOの.bssセクションがカーネルがロードされる部分と重なるからだ」とか、いろいろと理由が挙げられていますが、どうも決め手がはっきりしないようです。H. PeterAnvinは、この状況について「誰か反証になる事実を持っていないか? 持っているのならその詳細は? 『誰々がいうには……、誰それが何々といったそうな……』みんな伝聞ばっかりじゃないか!」と嘆きました。

 実際問題として、LILOとカーネルの相互作用について詳しく分析できている人があまりいないようで、実際にどのような問題が発生しているのか追跡できていないようです。結局、今回もカーネルに渡せるコマンドラインの長さの限界は255文字のままで議論が終わってしまったようです。

参考:
カーネルソースのCOMMAND_LINE_SIZE該当部分
include/asm-i386/setup.h、arch/i386/kernel/setup.c

デッドロックを探せ!

 Ingo Molnarは、「ANNOUNCE: lock validator -V1」というメールで、Linuxカーネル内部で利用されているロックの依存関係の正しさを検出するパッチを発表しました。spinlocks、rwlocks、mutexes、rwsemsなどの処理を実行時に解析するものだそうです。

 ロックとは、複数の処理を排他制御する機構です。ロックを保持しているCPUが実行権限を持ち、その間ほかのCPUは待ちます。複数のロックがある場合はどうなるか。もしロックを掛ける順番を間違えると、お互いにロックが解放されるのを待つという状況が生まれる場合があります。その状況を「デッドロック」といいます。もちろんロック取得の順番はそれなりに決まっており、デッドロックが発生しないようになっています。しかし間違える場合もあり、結果として負荷が高い状況であったり、大規模なシステムになった場合にだけ発現する分かりにくいバグとして登場します。

 このパッチはロックする順番を解析・記憶し、怪しいロック順序がないことを確認します。怪しい順番でロックが行われているのを検出すると、将来的にデッドロックを発生させる可能性があるので警告メッセージを出力します。例えばロックが必要な処理AとBがあるとします。

ケース1 タイミングがずれてデッドロックにならない場合
スレッド1: Aを
ロック
Bを
ロック
処理 Bを
解放
Aを
解放
                 
スレッド2:                   Bを
ロック
Aを
ロック
処理 Aを
解放
Bを
解放

ケース2 デッドロックになる場合
スレッド1: Aをロック スレッド2がBを解放するのを待ち続ける
スレッド2: Bをロック スレッド1がAを解放するのを待ち続ける

 カーネルが起動してから、一度でもAのロックから解放までの間にBをロックしたことがあるとします。その状態でBのロックから解放までの間にAをロックする処理があると、今回はデッドロックは発生しませんが、その2つの処理が同時に動くと将来的にはデッドロックになる可能性があります。偶然ケース1の状況で収まっている場合でも、タイミングによってはケース2のような事態になる可能性があることを検出しようというわけです。

 Ingo Molnarのパッチを適用すると、3CPU以下のシステムではデッドロックが発現しないケースでも、1CPUのシステムで警告を発生させることができます。このパッチのおかげで、いくつかのデッドロック候補が迅速に発見されました。

 最終的には、カーネル2.6.17-rc5-mm1にマージされています。このパッチを適用すると実行速度が低下するそうなので常時使うのには適しませんが、デバッグのお供にどうぞ。

関連リンク:
Ingo Molnarのlockdep-patchesのページ
http://redhat.com/~mingo/lockdep-patches/

1/2

Index
Linux Kernel Watch 6月版
 怒りのLinus、「カーネル開発者のふりはやめろ」
Page 1
 LILOに潜む「255文字制限」のナゾ
 デッドロックを探せ!
  Page 2
 カーネルメモリリーク検出パッチは有用?
 vsyscall領域の固定がセキュリティリスクを高める?
 sched_clock()による時間計測に注意
 -stableリリース、今月も大忙し

連載 Linux Kernel Watch


 Linux Squareフォーラム Linuxカーネル関連記事
連載:Linux Kernel Watch(連載中)
Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします
連載:Linuxファイルシステム技術解説
ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する
特集:全貌を現したLinuxカーネル2.6[第1章]
エンタープライズ向けに刷新されたカーネル・コア
ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する
特集:/procによるLinuxチューニング[前編]
/procで理解するOSの状態

Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する
特集:仮想OS「User Mode Linux」活用法
Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説
Linuxのカーネルメンテナは柔軟なシステム
カーネルメンテナが語るコミュニティとIA-64 Linux
IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間