在kernel的中重启kernel

来源:互联网 发布:wifi破解软件电脑版 编辑:程序博客网 时间:2024/06/04 19:42

需求

其实很简单,就想再特定情况下重启内核。当时拿到这个需求时首先想到的就是kernel_restart,经过测试发现无效;最后使用的是machine_restart;我们来看看这两个接口有啥区别。

kernel_restart

先看看实现:

void kernel_restart(char *cmd){       kernel_restart_prepare(cmd);  //重启前,向其它部分发出重启的消息       if (!cmd)          printk(KERN_EMERG "Restarting system.\n");       else           printk(KERN_EMERG "Restarting system with command '%s'.\n", 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

0 0
原创粉丝点击