Polling
는 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리한다. 사용자가 명령어를 사용해 pin의 값을 계속 읽어나가 변화를 알아내는 방식으로 overhead가 생기게 된다.
이러한 점을 개선하기 위해 MCU(Micro-Control Unit)단에서 이를 감지하여 변화시에만 일정한 동작을 하도록 하는 방식을 채택하였고, 이것이 Interrupt이다.
프로그램을 실행하던 도중에 하드웨어/소프트웨어 에서 문제가 생기면, 문제를 우선 처리할 필요성이 생긴다. 문제를 처리하기 위해 CPU에 특정 작업을 즉시 실행하도록 하는 것
이 Interrupt 이다.
Interrupt가 발생을 하면 ISR(Interrupt Service Routine)을 실행을 하여 Interrupt를 처리를 한다. 실행중이던 작업은 stack에 저장하고, Interrupt 처리가 끝나게 되면 stack에서 실행중이던 주소값, 레지스터값 등을 받아온 후 작업을 계속하게 된다.
Interrupt는 크게 3가지로 나눌 수 있다.
프로그램을 잘못짜면 발생한다.
외부, 내부 interrupt 와는 흐름이 다르다.
위 두 내용은 asynchornize 하게 뙇하고 발생하는데, Software Interrupt는 사용자가, 프로그램이 SuperVisor Call을 발생하여 Exception을 일으킬 수 있다는 것을 의미한다.
사용자는 Kernel mode를 직접적으로 사용할 수 없지만, I/O Device등을 직접적으로 사용할 수는 없다. 그렇기에, SWI 방식을 이용하여, User Mode에서 작동하는 일반적인 application이 SVC 모드에서 돌아가는 kernel에게 service를 요청하게 된다.
// Linux에서의 System Call 호출
// eax : systemcall number 주소가 저장됨
// ebx : systemcall argument 주소가 저장됨.
// argument 순서는 EBX, ECX, EDX, ESI, EDI
// return 값은 EAX에 저장이 된다
// int 0x80 : System Call 호출
mov eax, 1
mov ebx, 0
int 0x80
운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
Compatibility
문제가 생기면 저거만 수정하면 되기 때문이다.