系统在linux中停止

时间:2014-05-18 09:51:00

标签: c linux kernel

我在Linux内核中查看了reboot.c。

http://lxr.free-electrons.com/source/kernel/reboot.c

有一个对kernel_halt的调用,它说这个函数会 关闭所有内容并执行干净的系统停止。 干净的系统停止了什么意思? 任何人都可以解释这个停止实际上做了什么吗? 我也想知道syscore什么样的操作被认为是syscore操作?

  0 void kernel_halt(void)
    161 {
    162         kernel_shutdown_prepare(SYSTEM_HALT);
    163         migrate_to_reboot_cpu();
    164         syscore_shutdown();
    165         pr_emerg("System halted\n");
    166         kmsg_dump(KMSG_DUMP_HALT);
    167         machine_halt();
    168 }

1 个答案:

答案 0 :(得分:2)

syscore_shutdown()将检查所有已注册的syscore操作(drivers/base/syscore.c执行所有已注册的系统核心关闭回调。”)以查找非NULL操作shutdown和将执行它们。 Syscore操作使用register_syscore_ops注册,大多数驱动程序仅注册syscore_ops的resumesuspend字段。

对于x86 / x86_64,Linux内核版本3.13中有shutdown字段的部分syscore注册列表:

1)arch/x86/kernel/i8259.ci8259A_shutdown

261         /* Put the i8259A into a quiescent state that
262          * the kernel initialization code can get it
263          * out of.
264          */
265         outb(0xff, PIC_MASTER_IMR);     /* mask all of 8259A-1 */
266         outb(0xff, PIC_SLAVE_IMR);      /* mask all of 8259A-2 */

2)arch/x86/kernel/cpu/mcheck/mce.cmce_syscore_shutdown调用mce_disable_error_reporting

2026  * Disable machine checks on suspend and shutdown. We can't really handle
2027  * them later.
 ....
2037                         wrmsrl(MSR_IA32_MCx_CTL(i), 0);

3)kernel/irq/generic-chip.c irq_gc_shutdown:对于gc_list中的每个元素,尝试运行ct->chip.irq_pm_shutdown(data);; “ @irq_pm_shutdown:每个芯片关闭一次核心代码调用的函数”(description

4)drivers/leds/trigger/ledtrig-cpu.c

 84 static void ledtrig_cpu_syscore_shutdown(void)
 85 {
 86         ledtrig_cpu(CPU_LED_HALTED);
 87 }
...
 61         case CPU_LED_HALTED:
 62                 /* Will turn the LED off */
 63                 led_trigger_event(trig->_trig, LED_OFF);
  

清洁系统暂停的意义是什么?

彻底卸下所有东西,关闭所有硬件。

  

我也想知道syscore什么样的操作被认为是syscore操作?

Syscore用于注册一些函数以在挂起/恢复和关闭时工作。极少数驱动程序注册syscore关闭虚拟功能,例如:关闭PC机箱LED(not keyboard's leds,禁用中断,禁用机器检查(我认为像ECC错误,因为没有人会将它们报告给系统日志),...

  

任何人都可以解释这种停止实际上做了什么吗?

此暂停:切换到0 CPU内核,因为只有它可以重新启动或关闭,运行所有已注册的预关闭处理程序,然后打印“系统暂停”并要求硬件执行实际的电源关闭。

162         kernel_shutdown_prepare(SYSTEM_HALT);
163         migrate_to_reboot_cpu();
164         syscore_shutdown();
165         pr_emerg("System halted\n");
166         kmsg_dump(KMSG_DUMP_HALT);
167         machine_halt();