인터럽트(2) 예외(SW적 인터럽트)의 분류

Jin Hur·2021년 11월 16일
0
post-custom-banner

reference:

  • "리눅스 커널 내부구조" / 백승재, 최종무
  • "Operating Systems: Three Easy Pieces" / Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau

예외(SW적 인터럽트) 발생 조건 예시

page fault

응용 프로그램 수준 태스크가 수행되다가 'page fault error'가 발생하면 리눅스 커널은 폴트가 발생한 주소에 해당되는 데이터를 메모리에 적재하고 현재 태스크의 페이지 테이블을 수정해 준 뒤, 폴트를 발생시킨 프로그램의 기계명령어를 다시 수행시켜준다.

devide by zero

devide by zero error가 발생한 경우, 예외을 처리하고 다시 이 명령어를 수행해 시킬 필요가 없다.
결국 같은 예외라 할지라도 어떤 예외냐에 따라서 구분할 필요가 있다.


예외의 분류

1. fault

이 경우 리눅스 커널은 fault를 일으킨 명령어 주소를 eip에 넣어 두었다가 해당 핸들러가 종료되고 나면 eip에 저장되어 있는 주소부터 다시 수행을 시작한다.

2. trap

이 경우 리눅스 커널은 trap을 일으킨 명령어의 다음 주소를 eip에 넣어 두었다가 인터럽트 처리 이후 저장한 '다음 주소'부터 다시 수행한다. 시스템 콜이 대표적인 예이다.

3. abort

심각한 에러인 경우이므로 eip값을 저장해야할 필요가 없으며, 현재 태스크를 강제 종료시키면 된다.

각각의 핸들러가 모두 수행된 뒤, 리눅스 커널은 수행 중이던 태스크의 어디로 제어를 넘겨야 할지, 다른 태스크를 수행시켜야 할지를 결정해야 한다. 이는 각각의 핸들러의 리턴 함수를 따로 작성함으로써 이뤄진다.

post-custom-banner

0개의 댓글