kernelでkernelを再起動する

1451 ワード

需要


実は簡単で、さらに特定の状況でカーネルを再起動したいと思っています.その時、この需要を手に入れたとき、まず考えたのはkernelだった.restart、テストで無効であることが判明しました.最後に使ったのはmachine_restart;この2つのインタフェースの違いを見てみましょう.

kernel_restart


まず実装を見てみましょう.
void kernel_restart(char *cmd)
{
       kernel_restart_prepare(cmd);  // , 
       if (!cmd)
          printk(KERN_EMERG "Restarting system.
"); else printk(KERN_EMERG "Restarting system with command '%s'.
", cmd); machine_restart(cmd); // }

kernelが再起動する前に、カーネルが先に処理されることがわかります.
kernel_restart_prepare(cmd); 
kernelを見てみましょうrestart_prepareの実装:
void kernel_restart_prepare(char *cmd)
{
	blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd);
	system_state = SYSTEM_RESTART;
	usermodehelper_disable();
	device_shutdown();
	syscore_shutdown();
}

上のコードから分かるように、再駆動中にkernelを呼び出すとrestartは、実行に失敗した可能性が高い.
彼はshutdown selfができないからだ.このとき再起動する機能を実現するには、machine_を参照してください.restart.

machine_restart


インプリメンテーション
void machine_restart(char *cmd)
{
	machine_ops.restart(cmd);
}

上から分かるように、machine_restartはarchを直接呼び出すreset関数(具体的にはarch/下で検索する)である.

リファレンス


Linuxデバイス駆動プロファイル-PC再起動ソース分析:http://hi.baidu.com/qingmugong/item/8da4cafbf62d7cc80dd1c8db
kernelを覗く---sysを分析するreboot :http://blog.csdn.net/muge0913/article/details/7518576