[OS 개발 14] 인터럽트와 예외처리(4) 예외처리 구현하기


1. 예외처리 코드


 

예외 처리 코드는 이전 인터럽트 코드에서 일부를 추가하였습니다. 특히 Boot.asm은 지난 포스팅에서 사용했던 Boot.asm을 사용하면 되겠습니다. 단, 코드에서 다음과 같이 2섹터를 사용하기 위해 al에 넣을 값을 2로 바꿔주기만 했습니다.

 

Boot.asm

 

 

 

커널부분에서는 일부 내용이 추가되었는데, 대부분 이전 포스팅을 참고하면 해석 가능합니다. 바뀐 부분 중에서 일부 설명이 필요한 부분만 흰색으로 구역을 설정했고, 이에 대한 내용은 그 아래 설명에서 확인하면 될 것 같습니다.

 

Kernel.asm

 

 

 


2. 코드 분석


설명1

이 부분도 이전에 설명했던 인터럽트 코드와 비슷하게 해석하면 되겠지만, 0으로 나누는 divide 예외는 IRQ 0번이므로 0값을 edi에 넘겼습니다.


 

 

설명2

여기에서 나누기 연산을 통한 예외처리를 확인해보기 위해 div 명령으로 나누기 연산을 시도합니다.

 

 

설명3

마지막으로 이번 프로그램은 그 크기가 512바이트를 넘어가기 때문에, 그 크기를 1024로 늘려서 0으로 채우도록 했습니다.

 


3. 실행하기


 

이제 코드를 컴파일하고 실행해보도록 하겠습니다 (컴파일 방법은 앞에서 많이 다루었으므로 따로 정리하지 않겠습니다)

그러면 다음과 같은 화면이 뜨며, 이때 타이머, 키보드 인터럽트가 전혀 먹히지 않으면 성공입니다.

 

 

 

예외처리를 끝으로 IDT와 예외처리 챕터를 모두 살펴보았습니다. 사실 인터럽트에서 PIC와 같은 내용은 좀 더 내용이 깊어질 수 있는데, 너무 많은 내용을 다루다보면 자칫 이번 챕터에서 구현하고자 하는 목표에서 벗어날 수 있을 것 같습니다. 따라서 이번 챕터에서는 최대한 인터럽트와 예외처리에 직접적 관련이 있는 사실들을 주로 다루고자 했습니다. 

 


 


TAGS.

Comments