System call 도 Interrupt 인가요??
글쓴이: jsharp / 작성시간: 일, 2008/08/03 - 2:48오후
음.. 프로그램도 초보고 KLDP 도 초보입니다..;;;
여기다가 이런 글을 쓰는게 맞는건지도 모르겠네요...
음.. System call 은 Application에서 Kernel로 접근하는 거고..
Interrupt는 주로 하드웨어에서 Kernel로 접근하는 거니까..
또 처리루틴도.. Interrupt가 발생하면 그 전에 하던일을 멈추고 interrupt를 처리하게 되지만
System call이 호출되는건 Application에서 접근하는것이니까 Scheduler에 선택되고 나서 처리가 되는거니
두개가 당연히 다른거다.. 라고 생각했는데
IDT(Interrupt Description Tabel)을 보니까 0x80에 System call 이 있네요..
System call도 Interrupt의 한 부분인건가요??
또 Interrupt나 System call이나 처리과정에서 다른 Interrupt가 발생하지 못하도록 막는 과정이 있잖아요.
그럼 그 사이가 비록 짧은 시간이긴 하지만 그 사이에 Interrupt가 발생하면
무시되게 되는건가요? 아니면 어디 Queue 같은곳에 쌓이게 되나요?
Forums:
인터럽트에는
인터럽트에는 컨텍스트가 유지되는 인터럽트가 있고, 유지되지 않는 인터럽트가 있습니다. 이게 명칭을 붙이기 나름인데 인텔의 경우는 전자를 예외, 후자를 인터럽트라고 부르고 있다고 합니다(Understanding linux kernel에서)
예를 들어,
1) 시스템 콜을 호출한다거나, 0으로 나누는 명령이 떨어진 등등은 현재 프로세스 컨텍스트를 유지할 수 있고,
2) 하드웨어에서 들어온 인터럽트 같은 것들은 프로세스 컨텍스트를 유지할 수 없습니다.
그런데, CPU는 이 둘을 비슷한 메커니즘으로 처리하기 때문에 IDT에 시스템 콜도 들어가 있습니다. 커널 입장에서는 다르게 처리할 수도 있지만, CPU 입장에서는 거의 동일하게 처리되는 거죠.
음 다시 책을 찾어보니 전자를 동기적 인터럽트라고 하고, 후자를 비동기적 인터럽트라고 되어 있네요(역시 Understading linux kernel에서)
예 그렇습니다. 그런데 유저 모드에서 커널 모드로 전환하려면 결국 특정 CPU 인스트럭션이 필요하고 이 인스트럭션은 현재 유저 주소 공간에 있는 실행 코드가 아닌, 커널 주소 공간에 있는 실행 코드로 실행 경로를 "점프시켜야" 합니다. 그냥 점프를 하면 보호 모델이 깨지는 것이므로, CPU에 인터럽트를 걸어야 하는 거죠. 굳이 인터럽트가 아닌 다른 방법을 고안하겠다고 한다면 못 할것도 없습니다만, 하는 짓이 일반적인 인터럽트와 비슷하니까요.
감사합니다
감사합니다 >_<
댓글 달기