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

 

+ Recent posts