[1000줄 OS 구현하기] 커널 패닉

커널 패닉 (Kernel Panic) | OS in 1,000 Lines


1. 커널 패닉

커널 패닉은 운영체제의 커널에서 복구할 수 없는 치명적인 오류가 발생했을 때 시스템이 안전하게 작동할 수 없다고 판단하여 즉시 작동을 중지하는 상태를 말합니다.

블루스크린과 같다고 생각하면 된다.

?? : 쵸비상!

이번 챕터에서는 크리티컬 한 오류가 발생하면 커널이 동작을 멈추도록 구현해 보았다.

  • kernel.h
#define PANIC(fmt, ...)                                                        \
    do {                                                                       \
        printf("PANIC: %s:%d: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__);  \
        while (1) {}                                                           \
    } while (0)
Code language: PHP (php)
매크로설명동작
__FILE__현재 소스 코드 파일의 이름을 나타내는 매크로컴파일러가 자동으로 현재 파일 이름으로 대체
__LINE__현재 소스 코드의 라인 번호를 나타내는 매크로컴파일러가 자동으로 해당 라인 번호로 대체
__VA_ARGS__가변 인자(Variable Arguments)를 나타내는 매크로.fmt다음에 오는 모든 추가 인자들을 포함여러 개의 인자를 전달

PANIC 매크로는 문제가 발생한 소스 파일, 라인과 기타 정보를 출력한다.

출력 후 while (1) {}의 무한 루프에 빠진다.

각 줄 끝의 역슬래시(\)를 반드시! 넣어줘야 한다.

매크로 전개 시에는 줄 바꿈이 무시된다.

  • do {…} while (0) : 동작 범위를 명확하게 하기 위함.
  • ##__VA_ARGS__ : ##는 가변 인자가 비어 있을 경우, 불필요한 쉼표(,)를 제거.

2. 패닉

이제 의도적으로 패닉을 발생시켜 보자.

  • kernel.c
void kernel_main(void) {
    memset(__bss, 0, (size_t) __bss_end - (size_t) __bss);

    PANIC("panic!!!");
    printf("unreachable here!\n");
}
Code language: JavaScript (javascript)

이제 운영체제에서 문제가 발생해도 쉽게 디버깅할 수 있게 되었다.

PANIC: kernel.c:36: panic!!!
Code language: CSS (css)

댓글 남기기