2012-11-19 32 views
5

這涉及到:https://stackoverflow.com/a/13413099/1284631Linux reboot()系統調用:爲什麼它在kernel_halt()之後調用do_exit(0)?

現在的問題是:

爲什麼重啓()系統調用,當LINUX_REBOOT_CMD_HALT參數調用(在這裏看到: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)?爲什麼不直接用panic()呢?

+0

恐慌使內核失速,退出,可能重新啓動 –

+0

@ eicto:是的,我同意這一點,我在我的文章結尾的短語中說同樣的事情。真正的問題是:爲什麼在* panic()之前調用do_exit(0)*?如果你想讓內核停止,退出或重啓,爲什麼不直接調用panic()? – user1284631

回答

2

一些想法:

  • 這可能是kernel_halt()拒絕停止實際上有正當的理由,雖然我不能認爲任何。
  • kernel_halt()可以設計成也以比內核更高或同等水平的管理程序或東西被稱爲(自定義SMI代碼也許?)
  • 也許kernel_halt()功能早返回,「調度」的停止,以及某些硬件會在一段時間後實際暫停。我記得在閱讀關於在DOS中執行ATX電源關閉時,你會發出outb指令來啓動電源關閉,但你必須有一些nops,無限循環或hlt之後,作爲實際的電源關閉可能會在一些週期後發生。
  • 調用進程可能希望處理除內核恐慌之外的其他方式的重啓失敗。
+0

謝謝。我很感激。 – user1284631