2014年7月9日水曜日

Linux kernel内のリブートの取り扱い

Linux kernel内のリブートの取り扱いについて、
そもそもカーネル内部でリブートを発動するのは
void machine_restart(char * __unused)
で、"arch/*/kernel/"のどこかのファイルにあります。
x86なら"arch/x86/kernel/reboot.c"ですし、
ARMなら"arch/arm/kernel/process.c"となります。
とりあえずカーネルの適当な場所でmachine_restart()を呼べば、
基本的にはリブートされることになるはずです。

ARMでいくと、machine_restart()から最終的に
void arch_reset(char mode)
が呼び出されてリブートするのですが、
このarch_reset()は"arch/arm/mach-*/"のどこかのファイルに実装されています。
引数modeによる動作の違いはarch_reset()の実装しだいということにはなりますが、
通常は'h'になっていて、ハードウェアリセットに流すような処理になっていることが多いようです。
多くはwatchdogリセットに流すような感じでしょうか。
チップ(ボード)毎に最適な方法をとることになります。

0 件のコメント:

コメントを投稿