我不是问如何关闭。我想问一下怎么断电
Linux内核代码中的函数是什么做断电动作的?并请解释一下代码。
答案1
实际的内核代码取决于您的系统架构。对于 x86 系统,它们位于拱门/x86/kernel/reboot.c
停止将停止机器,并使其处于开机状态。所以它只是停止内核,但通常不会关闭它的电源。
static void native_machine_halt(void)
{
/* Stop other cpus and apics */
machine_shutdown();
tboot_shutdown(TB_SHUTDOWN_HALT);
stop_this_cpu(NULL);
}
同时power_off也会切断APM/ACPI的电源pm_power_off()
static void native_machine_power_off(void)
{
if (pm_power_off) {
if (!reboot_force)
machine_shutdown();
pm_power_off();
}
/* A fallback in case there is no PM info available */
tboot_shutdown(TB_SHUTDOWN_HALT);
}
machine_shutdown()是一个无限循环
tboot_shutdown()(拱门/x86/内核/tboot.c)
停止这个CPU(空)(拱门/x86/kernel/process.c) 禁用CPU的IRQ,将CPU设置为离线,
pm_power_off()(拱门/x86/内核/apm_32.c) 是一个函数指针apm_power_off()
正如您所看到的,所有工作都取决于拱门。在所有情况下,都是通过 ASM 调用完成的。
为了apm_power_off(),使用代码 APT_STATE_OFF (0x0003) 调用 Bios。
apm_bios_call_simple(APM_FUNC_SET_STATE, APM_DEVICE_ALL, APM_STATE_OFF, eax, err);
为了native_halt()(arch/x86/include/asm/irqflags.h)此调用用于:
asm volatile("hlt": : :"memory");
选择你的毒药:)
答案2
传统上,软件可以通过将命令传递到 Shell 或 Subshell 来控制功率级别。使用此方法时,您必须善待用户,并给他们时间做出正确的响应。根据您的 init 系统,您可以将 init 系统提升一个级别。以下是级别表
+--------------------+---------------------------------------- --------------------------+------------------------ -------------------------------------------------- ------------------+ | Sysvinit 运行级别 | Systemd 目标 |笔记| +--------------------+---------------------------------------- --------------------------+------------------------ -------------------------------------------------- ------------------+ | 0 | runlevel0.target、poweroff.target |停止系统。 | | 1、s、单| runlevel1.target、rescue.target |单用户模式。 | | 2, 4 | runlevel2.target、runlevel4.target、多用户.target |用户定义/站点特定的运行级别。默认情况下,与 3 相同。 | 3 | runlevel3.target,多用户.target |多用户,非图形化。用户通常可以通过多个控制台或通过网络登录。 | | 5 | runlevel5.target,图形.target |多用户、图形化。通常具有运行级别 3 的所有服务以及图形登录。 | | 6 | runlevel6.target、reboot.target |重启 | |紧急|紧急目标 |应急外壳| +--------------------+---------------------------------------- --------------------------+------------------------ -------------------------------------------------- ------------------+
我之所以说要友善,是因为你不能在没有警告的情况下这样做。如果一个用户正在多用户系统上工作,并且另一个具有适当权限的用户使用您的软件,则该用户工作将被立即踢出系统(并因此丢失所有工作),直到重新启动等。
正如 Goldilocks 所说,这是使用用户空间方法得到的最接近的结果。所有其他代码都存储在内核中,我目前找不到,但这是驱动器电源管理相关文档,在Linux 内核档案