Linux reboot()系统调用:为什么在kernel_halt()之后调用do_exit
这与:
https://stackoverflow.com/a/13413099/1284631有关
现在,问题是: 为什么使用LINUX_REBOOT_CMD_HALT参数调用reboot()系统调用(参见此处:http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480)在调用kernel_halt()之后调用do_exit(0),因为调用kernel_halt()归结为调用stop_this_cpu()(参见此处:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/process.c#L519) ),作为native_machine_halt()的一部分(见这里:http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680). 或者,在我看来,stop_this_cpu()永远不会返回(它以无限循环结束). 那么,只是在kernel_halt()没有完成它的工作并返回的情况下调用do_exit(0)?为什么不直接恐慌()呢? 解决方法
一些想法:
>可能是kernel_halt()因为合法的原因拒绝实际停止,尽管我想不出任何原因.> kernel_halt()可能被设计为也可以由虚拟机管理程序或比内核更高或等同级别的东西调用(可能是自定义SMI代码?)>也许kernel_halt()函数提前返回,“调度”暂停,实际停止一段时间后会在某些硬件上发生.我记得读过关于在汇编中在DOS中执行ATX电源关闭 – 你会发出outb指令来启动电源关闭,但你必须有一些nops,无限循环,或者之后的hlt,作为实际的电源关闭可能会在一些周期后发生.>调用进程可能希望处理无法以内核崩溃之外的其他方式重新启动. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |