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

2025. 2. 3. 23:27CS/OS

 

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

 

operating-system-in-1000-lines.vercel.app

 


1. 커널 패닉

 

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

 

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

 

?? : 쵸비상!

 

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

 

  • kernel.h
#define PANIC(fmt, ...)                                                        \
    do {                                                                       \
        printf("PANIC: %s:%d: " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__);  \
        while (1) {}                                                           \
    } while (0)
매크로 설명 동작
__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");
}

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

 

PANIC: kernel.c:36: panic!!!