[1000줄 OS 구현하기] 커널 패닉
2025. 2. 3. 23:27ㆍCS/OS
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!!!
'CS > OS' 카테고리의 다른 글
[1000줄 OS 구현하기] 예외 (0) | 2025.02.05 |
---|---|
[1000줄 OS 구현하기] C 표준 라이브러리 (0) | 2025.02.03 |
[1000줄 OS 구현하기] Hello World! (1) | 2025.02.03 |
[1000줄 OS 구현하기] Boot (0) | 2025.01.21 |
[1000줄 OS 구현하기] RISC-V Assembly (0) | 2025.01.17 |