2009年4月10日金曜日

Linuxでリブート


訳あってLinuxでリブートをかけたときに実行されるコードを調べてみました。
もちろんリブートの前にはデーモンを止めたりHDDキャッシュのフラッシュをしたりはしますが、
そういうことではなく最終的に呼ばれるコードのことです。
halt, shutdown など類似コマンドや動作は結構ありますが、この際代表してrebootを見てみることにします。
とりあえず kernel 2.6.17 での話です。


Linuxでリブートする場合、シェルからrebootコマンドを実行するパターンが多いとは思いますが、
最終的にrebootシステムコールが呼ばれることになります。
"linux/kernel/sys.c"には kernel_restart()という関数が実装されており、
i386カーネルの場合は"linux/arch/i386/kernel/reboot.c"のmachine_reboot()がコールされます。
今の私の興味であるARMアーキテクチャでは
"linux/arch/arm/kernel/process.c"のmachine_restart()がこれに対応します。
まあ、"linux/include/asm-arm/arch-dw/system.h"のarch_reset()が実行されるだけですが。
ここにCPUと周辺チップにリセットをハード的にかけるコードを書いておけば完璧です。
通常MMUを使っているでしょうから、プログラムカウンタを0に戻すなんて技は使えませんのであしからず。

0 件のコメント:

コメントを投稿