커널에서 신호를 처리하는 방법. 커널 스레드/프로세스에 종료 신호를 보내면 내부적으로 무슨 일이 발생합니까? 커널 프로세스 충돌은 커널이 항상 패닉을 의미한다는 것을 의미하며, 그렇지 않은 경우 코어 덤프를 생성합니다.
답변1
스레드가 커널 모드에서 코드를 실행하면 신호가 대기열에 추가됩니다. 즉, 커널은 신호가 전송되었음을 기억하지만 그에 따라 조치를 취하지는 않습니다. 커널 스레드가 이벤트를 기다릴 때 신호에 의해 대기가 중단될 수 있습니다. 이는 커널 코드 작성자에 따라 다릅니다. 예를 들어 Linux 커널 API에는 다음과 같은 기능 쌍이 있습니다.wait_event
그리고wait_event_interruptible
;스레드가 신호를 수신하면 "중단 가능한" 함수만 즉시 반환됩니다.
커널 코드는 커널 메모리나 하드웨어 장치를 일관성 없는 상태로 둘 수 있으므로 신호에 의해 중단될 수 없습니다. 따라서 코드는 항상 정리될 기회가 있습니다.
Linux 커널 스레드(예: 스레드~의커널(프로세스 목록에 해당 실행 파일이 나열되어 있지 않음)은 신호를 전혀 수신할 수 없습니다. 보다 정확하게는 커널 스레드에 전달된 모든 신호가 무시됩니다.
커널 코드 충돌은 충돌을 일으킨 코드 부분에 따라 패닉을 일으킬 수도 있고 그렇지 않을 수도 있습니다. 예를 들어, Linux는 드라이버 코드 충돌로부터 복구를 시도하지만 이것이 가능한지 여부는 무엇이 잘못되었는지에 따라 달라집니다. 커널 코드 충돌은 커널 및 시스템 구성에 따라 덤프를 생성할 수도 있고 생성하지 않을 수도 있습니다.커널 크래시 덤프기구.