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/kernel/tboot.c)

이 CPU 중지(null)(아치/x86/kernel/process.c) CPU의 IRQ를 비활성화하고 CPU를 오프라인으로 설정합니다.

pm_power_off()(아치/x86/kernel/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

전통적으로 소프트웨어는 쉘이나 서브쉘에 명령을 전달하여 전력 수준을 제어할 수 있습니다. 이 방법을 사용할 때에는 사용자를 잘 대해주고 사용자가 올바르게 반응할 수 있는 시간을 주어야 합니다. 초기화 시스템에 따라 초기화 시스템을 한 수준 높일 수 있습니다. 다음은 레벨 테이블입니다.

+---------+--------------- ----- ------------ -------------+------ ---- ------------- ------- ------- ------------- ----+
| Sysvinit 런레벨 대상 |
+---------+--------------- ----- ------------ -------------+------ ---- ------------- ------- ------- ------------- ----+
| 0 | runlevel0.target, poweroff.target | |
| 1, s, 단일 | runlevel1.target, Rescue.target |단일 사용자 모드. |
| 2, 4 | runlevel2.target, runlevel4.target, multiuser.target | 기본적으로는 3과 동일합니다.
| 3 | runlevel3.target, multi-user.target 다중 사용자, 비그래픽 | 사용자는 일반적으로 여러 콘솔이나 네트워크를 통해 로그인할 수 있습니다. |
| 5 | runlevel5.target, 그래픽.대상 | 일반적으로 모든 서비스 및 그래픽 로그인에 대해 런레벨 3이 있습니다. |
| 6 | runlevel6.target, 재부팅.대상 |다시 시작 |
|긴급|긴급 대상|긴급 쉘|
+---------+--------------- ----- ------------ -------------+------ ---- ------------- ------- ------- ------------- ----+

내가 친절하라고 말하는 이유는 경고 없이는 그렇게 할 수 없기 때문입니다. 한 사용자가 다중 사용자 시스템에서 작업하고 있고 적절한 권한을 가진 다른 사용자가 귀하의 소프트웨어를 사용하는 경우 해당 사용자는 다시 시작할 때까지 시스템에서 즉시 쫓겨납니다(따라서 모든 작업을 잃게 됩니다).

Goldilocks가 말했듯이 이는 사용자 공간 방법을 사용하여 얻을 수 있는 가장 가까운 결과입니다. 다른 모든 코드는 커널에 저장되어 있는데 현재는 찾을 수 없지만 이것은드라이브 전원 관리 관련 문서,존재하다리눅스 커널 아카이브

관련 정보