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
まず実装を見てみましょう.
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
void machine_restart(char *cmd)
{
machine_ops.restart(cmd);
}
Linuxデバイス駆動プロファイル-PC再起動ソース分析:http://hi.baidu.com/qingmugong/item/8da4cafbf62d7cc80dd1c8db
kernelを覗く---sysを分析するreboot :http://blog.csdn.net/muge0913/article/details/7518576