Linux 커널의 시스템 종료 내부는 어떻게 작동합니까?

Linux 커널의 시스템 종료 내부는 어떻게 작동합니까?

나는 시스템이 종료될 때 사용자 공간과 init 시스템(전통적인 init sysV /upstart/systemd)이 어떻게 작동하는지 대략적으로 알고 있습니다. (본질적으로 "그만해!", "이제 그만해", "멈추려면 죽여야 해"라는 연속적인 명령이 나오고 기다려요... 일이 벌어지고 있습니다.)

어쨌든, 커널에서 시스템 종료가 어떻게 작동하는지 전혀 모르겠습니다(거기서 많은 일이 벌어지고 있을 것임에 틀림없습니다).

커널 문서를 살펴 보았습니다.https://www.kernel.org/doc/htmldocs/심지어 사용NSA의 친구 찾기 도구먼저 그것이 어떻게 작동하는지 이해하겠습니다.

SE U+L도 검색해봤는데 아무것도 없네요(무시한건가요?)

어쨌든, 이 질문은 다소 어려울 수 있지만 이 Q&A 네트워크에서 답할 가치가 있습니다. 더 많은 사람들이 Linux 커널이 종료되면 어떻게 되는지 알고 싶어 하기 때문입니다.

또한 좀 더 자세한 설명에 대한 링크가 변경될 수도 있습니다.

대답에는 어떤 시스템 호출과 사용할 커널 신호가 포함될 수 있습니까?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c x86에서 사용하는 재부팅 관련 파일인 것 같습니다(벌써 종료 직전이군요?)

어쩌면 여기에서 발견된 스니펫이 있을 수도 있습니다.http://lxr.free-electrons.com/source/kernel/reboot.c#L176 설명을 제공하는 데 사용할 수 있습니다

176 잘못된 kernel_power_off(잘못됨)
177 {
178화
179 if (pm_power_off_prepare)
180 pm_power_off_prepare();
181화
182 syscore_shutdown();
183 pr_emerg("정전\n");
184화
[185 장]
186}
187 EXPORT_SYMBOL_GPL(커널 전원 끄기);

답변1

Linux 커널 작동 방식을 이해하기 위한 주요 리소스는 다음과 같습니다.

  1. 문서.
  2. Linux 주간 뉴스 기사.
  3. 원천. 이해하기 쉬운 복잡한 짐승입니다.LX, Linux 상호 참조. LXR 변종은 다음에서 실행됩니다.lxr.linux.no다른 것보다 낫지만 종종 다운되는 경우도 있습니다.

이 경우 문서나 LWN에서 중심적으로 관련된 내용을 찾을 수 없으므로 LXR입니다.

userland 코드가 마지막으로 하는 일은 호출입니다.reboot시스템 호출. 4개의 매개변수가 필요하므로 LXR에서 검색하면 SYSCALL_DEFINE4(reboot결과는 다음과 같습니다.kernel/reboot.c. 호출자의 권한과 매개변수를 확인한 후 시스템 호출 진입점은 kernel_restart재시작, kernel_halt긴밀한 루프에서 중지, kernel_poweroff시스템 전원 끄기 등 여러 기능 중 하나를 호출합니다 kernel_kexec.새로운 커널로 교체(컴파일된 경우) 또는 hibernate정전 전에 메모리를 디스크에 저장합니다.

kernel_restart,kernel_halt그리고 kernel_power_off굉장히 유사한:

  1. 통과reboot_notifier_list, 커널 구성 요소가 사용할 수 있는 후크 목록입니다.등록하다전원이 꺼지면 코드를 실행합니다. 이 단계에서는 소수의 드라이버만 코드를 실행해야 하며, 대부분은 감시 장치입니다.
  2. 설정system_state바꾸다.
  3. 장애를 입히다 사용자 모드 도우미, 더 이상 사용자 코드가 시작되지 않도록 합니다. (이 단계에서도 기존 프로세스가 계속 존재할 수 있습니다.)
  4. 부르다device_shutdown시스템의 모든 장치를 해제하거나 종료합니다. 많은 운전자가 이 단계에 갇히게 됩니다.
    이 시점에 아직 마운트된 파일 시스템은 사실상 강제로 마운트 해제됩니다. 시스템 호출 호출자는 완전한 제거를 담당합니다.
  5. 전원 끄기의 경우에만 ACPI가 구성된 경우 코드 실행이 발생할 수 있습니다.ACPI 진입 준비 상태 S5(소프트 종료).
  6. 다중 CPU 컴퓨터에서는 어떤 CPU가 시스템 호출을 호출했는지에 관계없이 모든 CPU에서 코드가 실행될 수 있습니다.migrate_to_reboot_cpu특정 CPU로 전환하면 스케줄러가 다른 CPU에 코드를 디스패치할 수 없습니다. 그 후에는 하나의 CPU만 실행됩니다.
  7. syscore_shutdown통화 shutdown방법등록된 syscore 작업. 나는 이것이 대부분 인터럽트를 비활성화하는 것에 관한 것이라고 생각합니다. shutdown메소드가 있는 후크는 거의 없습니다.
  8. 정보 메시지 녹음 - 백조의 노래.
  9. 마지막으로 다음을 호출하여 기계에 의존하는 방식으로 휴식을 취합니다.machine_restart,machine_halt또는machine_power_off.

이것동면암호다음 단계를 수행하십시오.

  1. 반복전원 관리 후크.
  2. 파일 시스템을 동기화합니다.
  3. 모든 사용자 비밀번호를 동결하세요.
  4. 장치 핫 플러그 ​​방지.
  5. 공간을 교환하기 위해 시스템 상태를 덤프합니다.
  6. 모든 일이 잘된다면최대 절전 모드 하드웨어. 여기에는 kernel_restart, kernel_halt, kernel_power_off, 또는 일부 플랫폼별 절전 메서드 호출이 포함될 수 있습니다 .

시스템을 종료하는 또 다른 방법은 다음과 같습니다.machine_emergency_restart. 이는 다음으로 인해 발생합니다.마법 시스템 요청열쇠B. 버튼에는 O다양한 기능이 있습니다.그것은 전화한다kernel_power_off.

시스템을 종료하여 종료할 수도 있습니다.공황즉, 복구할 수 없는 오류입니다. 패닉은 메시지를 기록한 다음 시스템 재부팅을 시도합니다(하드웨어 감시 또는 긴급 재부팅을 통해).

답변2

이것은 단지 부분적인 답변일 뿐이며, 더 자세하고 명확한 다른 답변을 반드시 초대하겠습니다.

이 답변의 내용은 kernel/reboot.c3.13 Linux 커널 파일에서 가져온 것입니다(이름이 shutdown.c가 아니라 재부팅.c이므로 첫 번째 추측이 아닐 수도 있음).

어쨌든 기본적으로 시스템 종료 프로세스를 나타내는 세 가지 함수가 있습니다.

  • void kernel_halt(void)// 시스템이 정지된 상태로 종료됩니다.
  • void kernel_power_off(void)// 시스템 종료로 종료
  • void kernel_restart(char *cmd)// 시스템을 종료하고 다시 시작합니다.

이러한 기능은 매우 간단하므로 여기에 전체적으로 붙여넣을 수 있습니다. 해당 코드는 커널 종료 중에 수행된 단계를 가장 잘 보여줍니다. (이 리뷰는 제가 작성한 것이며 100% 이상적이거나 정확하지 않을 수 있습니다. 확신이 있는지 직접 확인하시기 바랍니다. 간단합니다. 한번 시도해 보세요.

void kernel_halt(void)

잘못된 커널 정지(invalid)
{
    // 첫 번째 단계:
    // a) 재부팅/종료 시 실행되도록 등록된 호출 함수/콜백
    // b) system_sate를 SYSTEM_HALT로 설정합니다.
    // c) userspacetool 상호작용을 중지합니다.
    // d) device_shutdown() 함수 호출
    kernel_shutdown_prepare(SYSTEM_HALT);

    // 2단계: 다중 CPU 시스템에는 이것이 필요하다고 생각합니다.
    migration_to_reboot_cpu();

    // 세 번째 단계:
    // syscore_shutdown - 등록된 모든 시스템 코어 종료 콜백을 실행합니다.
    syscore_shutdown();

    // 네 번째 메시지
    pr_emerg("시스템이 중지되었습니다\n");
    kmsg_dump(KMSG_DUMP_HALT);

    // 5번째 호출 아키텍처별 CPU-halt-code
    machine_halt();
}

모든 것은 sys_reboot시스템 호출을 통해 시작되는데, 재부팅뿐만 아니라 종료도 고려하면 어쨌든 종료 프로세스에 직접 연결되는 것은 아닙니다.

관련 정보