Linux 内核中的哪个函数执行关机操作?

Linux 内核中的哪个函数执行关机操作?

我不是问如何关闭。我想问一下怎么断电

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 或 Subshel​​l 来控制功率级别。使用此方法时,您必须善待用户,并给他们时间做出正确的响应。根据您的 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 内核档案

相关内容