mcrash

名前

mcrash - カーネルメモリアナライザ

書式

mcrash [-p /dev/mem] [-q] [mapfile]

-p /dev/mem
mcrashがメモリ情報取得に内部で使用するインターフェースを /dev/memにします。 現在これはi386系のプラットフォームでしか正しく動作しません。
-q
起動時のメッセージを抑制します。
mapfile
カーネルのマップファイル。省略時は/boot/System.map

説明

mcrashは、Linux用の crash コマンドです。
mcrash/dev/kmem/dev/memを通して カーネルメモリを参照し、データを加工してテキストとして表示します。 mcrashによりLinuxカーネルの動作を解析することができ、 カーネルのデバッグや学習に役立てることができます。

mcrashはカーネルのヘッダファイルとあわせてビルドします。 つまり、カーネルごとに専用のmcrashを作ることになります。 そのかわり、対象カーネルのソースを修正する必要はありません。

ゴール

mcrashはもともと作者自身がLinuxカーネルを学習するために作りました。 カーネルの動作を理解するには、ソースや文献などを読むことはもちろん大切ですが、 実際にカーネルの中ではどういう事が起きているのかを目でみてわかるように するとより理解し易くなるように思います。 例えば、プログラムがforkした前後でカーネルのテーブルがどうなるか、 ファイルをopenするとどういうテーブル構造になるのか、などなど。 カーネル内のデータ構造は大変複雑で相互に絡み合っていますが、 各テーブルの関係が理解できるとカーネルの動作も格段に理解しやすくなります。

また、Linuxカーネルが正しく動かないことに遭遇した時のハックにも mcrashは役立つでしょう。

作者が今まで読んだLinuxカーネルのソースはごく一部であり mcrashがカバーしているLinuxのテーブルもごくごく一部ですが、 今後もmcrashの強化を継続し より広い範囲をカバーできるようにするのが目標です。

操作方法

基本コマンド型式

基本コマンドは以下の型式で呼び出します。
   コマンド名 [-オプション] [引数]
コマンド名
カーネルのconfigにより使用可能なコマンドが異なります。 helpコマンドにより、 使用できるコマンドを確認できます。 ほとんどのコマンド名は構造体の名前に関係しています。
ユニークに認識できるなら短く入力しても受け付けます (例えば "quit" の代りに "q" など)。
オプション
コマンドにより使用可能なオプションが異なります。
引数
空白で区切り複数指定可能です。 16進数またはカーネル内のシンボルまたはmcrashの変数で指定します。 それらを混在させた四則演算による指定、 およびメモリアクセス演算子 "*" によるポインタ指定も可能です。 それぞれの演算子はC言語と同じ優先順位を持っています。

引数 := 項 | 引数 空白 項
:= 端 | 項 "+" 項 | 項 "-" 項 | 項 "*" 項 | 項 "/" 項 | 項 "<<" 項 | 項 ">>" 項
:= 16進数 | シンボル | 変数参照 | "sizeof(" 型 ")" | "*" 端 | "(" 項 ")"
16進数 := [0-9a-fA-Z]+
シンボル := [_a-zA-Z][_a-zA-Z0-9]*
変数参照 := $[_a-zA-Z][_a-zA-Z0-9]*
:= [_a-zA-Z][_a-zA-Z0-9]* | "*"

各項はクォーテーション('')またはダブルクォーテーション("") または大括弧([])により囲むことができ、 その場合は空白を含んでいてもひとつの項として扱われます。 また、クォーテーションの場合には変数展開が抑制されますが、 ダブルクォーテーションまたは大括弧で囲んだ場合は変数展開されます。

引数の例
   dump c0100000
   dump jiffies
   dump $?
   dump *rscsi_disks
   dump "c0100000 + sizeof(int)" sizeof(int)

出力リダイレクト

基本コマンドの出力結果をファイルにリダイレクト可能です。
例
   基本コマンド > ファイル名
ファイルが存在しない場合は、新しく作成されます。 ファイルが存在する場合は、後ろに追加(アペンド)されます。

シェル呼び出し

"!" に続けてコマンドを入力した場合、 シェルを呼び出し外部コマンドを実行します。
例
   ! ls -l

パイプライン

基本コマンドの出力結果を外部コマンドの入力にすることができます。
例
   基本コマンド ! 外部コマンド
   または
   基本コマンド | 外部コマンド

変数と代入コマンド

変数に値を代入することができます。 変数宣言の様なものは不要で、そのまま代入できます。
例
   a=c0282000
変数に代入した値は、 "$"の後に変数名を指定すると取り出すことができます。
例
   task_struct $a

特殊変数

mcrashには直接代入することができない特別な変数があります。
"$?"
ひとつ前のコマンドの結果(戻り値)を保持しています。 多くのコマンドは結果として何らかのチェーンのnextポインタの値を返します。
"$-数字"
コマンドで表示された値を保持しています。 直前の行の最左に表示されている値が $-1 に格納され、 そこから右へ順に $-2, $-3, … となります。
"$数字"
関数の中で参照した場合、関数の引数を返します。 $1が第一引数です。

注意


mcrash, Copyright (C) 2002,2003 ASANO Masahiro