티스토리 뷰

 이전 포스트에서 언급했던 것처럼 시스템 자원이 계속 입력만을 감시하는 낭비를 막기 위해서 interrupt라는 개념을 도입했다, 간단하게 말하면 프로세서의 귀를 막고 직접적인 간섭이 있지 않는 한은 관여하지 않게끔 하는 내용이다. 이밖에도 Exception이라는 비슷한 개념도 있는데 이 차이는 발생하는 주체가 다르다는 것이다.  Interrupt는 외부 장치나 소프트웨어의 간섭으로 인해 프로세서가 관여하는 형식이기에 주체가 당연히 프로세서가 아닌 외부 장치이겠지만, Exception은 프로세서가 오류가 발생했을 때가 알아서 처리되는 동작이기에 주체는 프로세서가 된다. 

 아무튼 이런 걸 다루는 것들을 handler라고 하는데 보통은 프로세서가 관여하기 전의 상태를 담고 있어서 interrupt나 Exception이 처리되고 난 후로 복귀할 수 있는 구조로 되어 있다.

 프로세서에는 사전에 정의된 인터럽트에 대한 목록이 벡터 테이블로 정의 되어 있으며, protect mode와 IA-32e mode에서는 특별히 Interrupt Descriptor Table(IDT) 라는 이름으로 불린다.


아무래도 프로세서와 관련된 동작이 주를 이루기 때문에 권한에 따른 동작의 차이가 발생한다. 당연히 권한이 낮은 부류(유저)는 높은 부류가 처리하는 인터럽트 테이블을 인지하지 못하고 새로운 스택으로 전환되는데 이걸 Stack Switching이라고 한다. 여기에 Interrupt Stack Table이라는 것까지 붙여서 기존의 Stack Switching 방식에서 발생하는 문제를 해소하는 방법도 나오게 된다.



위의 이미지에서도 정상적으로 입력이 처리되고 화면상으로 뿌려준다. 코드 내부에 의미없는 interrupt를 삽입한 후 특정 동작후 출력되게끔 했다.



이렇게 interrupt가 걸린 상태에선 어떠한 입력도 줄 수 없고, 프로세서는 사전에 정의한 IDT의 내용에 따라서 동작하게 된다. 


참 어렵다...

(64비트 멀티코어 OS 원리와 구조에서 발췌,,)

댓글