2012-11-19 1 views
5

이것은 관련이있다 : https://stackoverflow.com/a/13413099/1284631Linux reboot() 시스템 호출 : kernel_halt() 다음에 do_exit (0)을 호출하는 이유는 무엇입니까?

지금, 질문은 다음과 같습니다

재부팅() 시스템 호출, LINUX_REBOOT_CMD_HALT 매개 변수를 사용하여 호출 할 때 (여기 참조 : http://lxr.linux.no/linux+v3.6.6/kernel/sys.c#L480) 왜 이미 kernel_halt()라고 한 후 do_exit(0)를 호출, 전화 kernel_halt()은 (http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/process.c#L519 참조)을 native_machine_halt() (여기를 참조하십시오 : http://lxr.linux.no/linux+v3.6.6/arch/x86/kernel/reboot.c#L680 참조)의 일부로 호출합니다.

또는 stop_this_cpu()이 절대로 돌아 오지 않는 것 같습니다 (무한 루프로 끝납니다).

따라서 kernel_halt()이 작업을 수행하지 않아 반환되는 경우에만 호출되는 do_exit(0)입니까? 대신 panic()을 직접 쓰지 않는 이유는 무엇입니까?

+0

패닉 커널 설치 중단, 종료, 아마도 재부팅 –

+0

@eicto : 예, 동의합니다. 내 게시물의 끝 부분에서 같은 말을했습니다. 진짜 질문은 : do_exit (0) * 호출이 panic() 전에 호출되는 이유는 무엇입니까? 커널을 멈추게하거나 종료하거나 다시 부팅하려면 panic()을 직접 호출하지 않는 것이 좋습니다. – user1284631

답변

2

몇 가지 아이디어 :

  • 그것은 kernel_halt() 내가 어떤 생각하지 수 있지만 실제로 합법적 인 이유로 중단을 거부하는 것이 될 수있다.
  • kernel_halt()는 커널보다 높은 또는 동등한 수준의 하이퍼 바이저 또는 무언가에 의해 호출하도록 설계 될 수있다 (아마도 사용자 정의 SMI 코드?)
  • 는 아마도 kernel_halt() 기능 일찍 반환, "예약"를 중단하고, 일부 하드웨어에서는 나중에 실제 정지가 발생합니다. 어셈블리에서 DOS에서 ATX 전원을 끄는 것에 대해 읽은 것을 기억합니다. outb 명령어를 사용하여 전원을 차단하지만 실제로는 나중에 nops, 끝없는 루프 또는 hlt을 실제 전원으로 사용해야합니다. 몇 사이클 후에 off가 발생할 수 있습니다.
  • 호출 프로세스는 커널 패닉이 아닌 다른 방법으로 재부팅하는 오류를 처리하려고 할 수 있습니다.
+0

감사합니다. 감사합니다. – user1284631

관련 문제