5. 예외(Exception)
예외는 프로그램이 프로그램 혹은 시스템에 문제를 일으킬만한 명령을 실행시킬 때, CPU가 문제 해결을 하기 위해 인터럽트를 일으키는 것입니다.
Protected mode에서 예외는 하드웨어, 인터럽트, 소프트웨어 인터럽트와 같은 IDT를 사용합니다.
전체 예외의 종류는 다음과 같습니다.
# Exception Exception handler Signal
0 Divide error divide_error( ) SIGFPE
1 Debug debug( ) SIGTRAP
2 NMI nmi( ) None
3 Breakpoint int3( ) SIGTRAP
4 Overflow overflow( ) SIGSEGV
5 Bounds check bounds( ) SIGSEGV
6 Invalid opcode invalid_op( ) SIGILL
7 Device not available device_not_available( ) None
8 Double fault doublefault_fn( ) None
9 Coprocessor segment overrun coprocessor_segment_overrun( ) SIGFPE
10 Invalid TSS invalid_TSS( ) SIGSEGV
11 Segment not present segment_not_present( ) SIGBUS
12 Stack segment fault stack_segment( ) SIGBUS
13 General protection general_protection( ) SIGSEGV
14 Page Fault page_fault( ) SIGSEGV
15 Intel-reserved None None
16 Floating-point error coprocessor_error( ) SIGFPE
17 Alignment check alignment_check( ) SIGBUS
18 Machine check machine_check( ) None
19 SIMD floating point simd_coprocessor_error( ) SIGFPE
다음 코드는 첫번째 인터럽트 디스크립터에 divide error 를 처리하는 인터럽트 루틴에 관련된 디스크립터를 등록하는 것입니다.
mov edi, 0 lea esi, [idt_zero_divide] mov cx, 8 rep movsb |
다음 코드는 인터럽트 디스크립터를 작성한 코드입니다. Isr_zero_divide를 인터럽트 서비스 루틴으로 설정하였습니다.
Idt_zero_divide: dw isr_zero_divide dw 0x08 db 0 db 0x8E dw 0x0001 |
isr_zero_divide: push gs push fs push es push ds pusad pushfd
mov al, 0x20 out 0x20, al
mov ax, VideoSelector move s, ax move di, (80*6*2) lea esi, [msg_isr_zero+divide] call printf
jmp $
popfd popad pop ds pop es pop fs pop gs |
'Operating Systems > OS 커널 제작' 카테고리의 다른 글
5. Task Switching (2) – 태스크 스위칭 (0) | 2015.01.26 |
---|---|
5. Task Switching (1) - TSS (0) | 2015.01.22 |
4. Interrupt 와 Exception (3) – 인터럽트 핸들러 (0) | 2015.01.19 |
4. Interrupt 와 Exception (2) - PIC (0) | 2015.01.18 |
3. Protected Mode (3) (0) | 2015.01.17 |