1장. 펜티엄 프로세서의 interrupt mechanism

차례
1.1. Interrupt Descriptor Table(IDT)
1.1.1. IDTR
1.1.2. Interrupt Descriptor Table Structure
1.2. Context Change and Stack Handling

인텔의 프로세서(특히 펜티엄)는 프로그램의 실행을 가로채기(interrupt) 위한 mechanism 으로 두가지를 제공한다. 하나는 interrupt 에 의한 방법이며, 또 하나는 exception(예외 상황) 에 의한 방법이다.

interrupt 는 일반적으로 I/O 디바이스들에 의해서 토글되어지는 비동기 이벤트를 통칭하는 용어이다. 인터럽트가 프로세서에서 실행되는 프로그램의 실행을 '가로채는' 경우는, 두가지가 있다. 한가지는 실제의 하드웨어로 부터의 인터럽트로써, 이 경우는 프로세서의 INTR 핀을 통해서 시그널이 들어오게 된다. 이 시그널은 일반적으로 외부의 I/O 장치들로부터 오는 것이다. 나머지 한가지의 경우는 프로그래머가 발생시킨 'software' 인터럽트이다. 이 경우는 프로그래머가 'int' 어셈블리 인스트럭션을 이용해서 발생시키는 경우가 되겠다.

execption(예외상황) 은 경우가 약간 다른데, 이 경우는 프로세서가 미리 정의되어 있는 조건을 감지(detection) 했을 경우이다. 미리 정의되어 있는 조건들이라고 하면, 이를테면, 페이지 폴트 [1] 예외상황(execption) 이나 devide by 0 등과 같은 예외상황이 있다. 어쨌든, 이와같은 미리 정의되어 있는 예외상황들이 발생하면, 프로세서는 그에 해당하는 정의된 핸들러를 실행시키고, EIP 레지스터에 있는 다음 실행할 인스트럭션의 주소 등을 exception 의 종류에 따라서 한 인스트럭션 앞으로 옮겨서 다시 instruction fetch cycle 을 시작한다든지 혹은 그 다음 인스트럭션을 fetch 해서 실행한다든지 하는 조치를 취하게 된다.

주석

[1]

페이지 폴트의 경우에는 운영체제에서 매우 유용하게 사용한다. 리눅스의 경우에는 주로 페이징에 의존하는 메모리 관리 시스템을 사용하는데, 이 경우, 사용자 프로세스 혹은 프로세서 상에서 실행되는 프로그램이 현재 '실'메모리에 올라와 있지 않은, 즉, 디스크에 스왑 되어 있는 등 '실' 메모리에 존재하지 않는 주소 영역에 접근하려는 시도를 하면, 프로세서는 페이지 폴트 execption 을 발생시키게 되며, 이로 인해 리눅스의 page fault exception handler 가 실행되어서 메모리 스와핑이 일어나게 되며, 디스크 등의 장치에 swap out 되어 있는 메모리의 data가 실제의 메모리로 읽어들여지게 된다.