[OS] Interrupt / System call

BaeRonui·2022년 2월 11일
0

OS

목록 보기
5/14

Interrupt

Interrupt 이전에 Polling

Polling는 대상을 주기적으로 감시하여 상황이 발생하면 해당처리 루틴을 실행해 처리한다. 사용자가 명령어를 사용해 pin의 값을 계속 읽어나가 변화를 알아내는 방식으로 overhead가 생기게 된다.
이러한 점을 개선하기 위해 MCU(Micro-Control Unit)단에서 이를 감지하여 변화시에만 일정한 동작을 하도록 하는 방식을 채택하였고, 이것이 Interrupt이다.

Interrupt 란?

프로그램을 실행하던 도중에 하드웨어/소프트웨어 에서 문제가 생기면, 문제를 우선 처리할 필요성이 생긴다. 문제를 처리하기 위해 CPU에 특정 작업을 즉시 실행하도록 하는 것이 Interrupt 이다.
Interrupt가 발생을 하면 ISR(Interrupt Service Routine)을 실행을 하여 Interrupt를 처리를 한다. 실행중이던 작업은 stack에 저장하고, Interrupt 처리가 끝나게 되면 stack에서 실행중이던 주소값, 레지스터값 등을 받아온 후 작업을 계속하게 된다.
Interrupt는 크게 3가지로 나눌 수 있다.

1. External Interrupt

  • Power fail interrupt
  • Machine check interrupt
  • External signal interrupt
    • timer interrupt
    • key board interrupt
      * 외부장치로부터 interrupt request가 오는 경우
  • I/O Interrupt
    • I/O data에 이상이 생기는 경우
    • I/O device가 데이터 전송을 요구하거나, 전송이 끝나 다음 동작을 해야할 경우

2. Internal Interrupt(= Trap)

프로그램을 잘못짜면 발생한다.

  • Division by Zero
  • overflow / underflow
  • 기타 Exception

3. Software Interrupt(SVC: SuperVisor Call)

외부, 내부 interrupt 와는 흐름이 다르다.
위 두 내용은 asynchornize 하게 뙇하고 발생하는데, Software Interrupt는 사용자가, 프로그램이 SuperVisor Call을 발생하여 Exception을 일으킬 수 있다는 것을 의미한다.

SWI를 이용하는 2가지 예시

  1. System Call
  2. Semi hosting
    target에서 수행되는 코드중 I/O에 관련되는 코드를 캡쳐해서 I/O를 target에서 수행하는 것이 아니라 debugger를 구동하는 호스트 시스템에서 수행하게 하는 기능이다.

왜 SWI를 사용할까?

사용자는 Kernel mode를 직접적으로 사용할 수 없지만, I/O Device등을 직접적으로 사용할 수는 없다. 그렇기에, SWI 방식을 이용하여, User Mode에서 작동하는 일반적인 application이 SVC 모드에서 돌아가는 kernel에게 service를 요청하게 된다.

System Call

// 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

운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.

작동 과정

  1. Assembly code 실행
  2. System interrupt 명령어 호출
  3. IDT(Interrupt Descripter Table) 참조
  4. 0X80에 있는 sytstem_call() 함수에서 eax에 담겨있는 number에 매칭되는 kernel function을 호출한다.
  5. 해당 kernel function을 수행한 후 user mode로 전환이 된다.
  6. 다음 프로세스를 진행한다.

왜 int 0x80 하나만 System call이냐?

Compatibility
문제가 생기면 저거만 수정하면 되기 때문이다.

profile
iOS / Swift 였던것 이젠 BE

0개의 댓글