Interrupts, Dual Mode

12 분 소요

Interrupt

CPU 가 지금 처리하는 Process 를 잠깐 중단하고 다른 작업을 하도록 하는 요청.

  • Interrupt 가 없다면 Process 가 끝날 때 까지 CPU 는 다른일을 못할 것임.
  • 이러한 Interrupt 가 발생 시 Kernel Mode 로 전환되고 ISR 을 수행함
  • 원래는 하드웨어와의 소통 수단이었는데 소프트웨어로도 확장됨

Instruction Boundary 에서 수행됨.

  • 즉 명렁어 중간에 수행되지 않는다는 소리.

ISR

하던 작업을 멈추고 시작할 작업 또는 함수를 ISR(Interrupt Service Routine) 또는 Interrupt Handler 라고 부름.

  • 이러한 루틴은 OS 의 일부로 Kernal 에 존재함
  • OS 에 기본적으로 있거나 혹은 Device Driver 로 탑재함.

IVT / IDT

이러한 함수가 저장된 공간을 IVT(Interrupt Vector Table) 또는 IDT(Interrupt Description Table) 라고함.

  • 위 둘의 차이점
    • 전자는 Real Mode, 곧 부팅할 때 쓰고
    • 후자는 Protected Mode 에서 쓰며 더 복잡한 정보를 가짐
  • BIOS 가 메모리에 OS 를 올리면서 메모리의 특정한 주소에 저장됨.
  • 보통 256 의 크기를 가지며 Register 에 따라서 다양한 동작을 할 수 있게 함.

설명

대충 다음의 단계를 거침

  1. Interrupt Occur
  2. After current instruction finished, save Current State(PCB)
  3. Look IVT/IDT and goto ISR
  4. After ISR Finished, Resume or Stop Process

우선순위에 따라 Maskable / NMI(Non Maskable) 로 나뉨

  • NMI 에서 대표적인게 Timer Interrupts 로 지연이 안되고 우선순위가 가장 높음.
  • 동시에 여러 Interrupts 가 발생시 우선순위에 따라 순서대로 처리됨.
  • 관련된 작업은 NVIC(Nested Vecctor Interrupt Control) 등에서 처리됨

크게 Hardware / Software Interrupts 로 나뉨.

  • 후자는 함수의 SubRoutine 처럼 쓰이지만, 전자는 Context Switching 에 더 가까움.

Hardware

Software-Interrupt 와 대조되는 맥락일 때 그냥 Interrupt 를 말하면 이걸를 의미함.

프로세스 외적인 원인이므로 Cpu Clock 과 비동기적이라서 Asynchronous 하다고 함.

  • Instruction 간의 Execution Boundary 에서 처리되게 됨.

대표적인 예를 들자면

  • Timer
    • 1초에 18번인가 Interrupt 를 발생해 Multi-Process 등을 가능하게 함.
  • I/O
    • Keyboard 입력, 이어폰 잭 꼽기 등에서 일어남.

Software

Software Interrupts 는 또 나뉘는데 정확히 합의된 정의는 없음. 자세한건 Wiki 참고

  • 명확히 정의된 맥락이 아니면 Trap, Syscall 과 비슷하게 받아드리면 됨.

Process 를 실행하면서 발생하며 특정 Instruct 이후에 바로 수행되므로 Synchronous

설명하기 편하게 나누자면 크게 2가지 분류가 있음.

  1. Program Check Interrupt
    • Devide by Zero, Overflow / Underflow
    • Program call Wrong Instruction
  2. Syscall

Dual Mode

보안, 시스템 안정성 등을 위해 중요한 명령(Privileged Instruction)은 OS 만이 사용할 수 있으며, User Program 에서 관련 명령이 필요시 OS 에게 대행시킴.

  • CPL 이 Kernal Mode 가 아닐 때
  • Privileged Instruction 을 수행하려고 하면
  • Interrupt 을 던짐
  • 대신 System Call 을 통해서 Kernal 이 대신 수행해야함.

CPL

User mode / Kernal mode 전환에서 사용되는 것이 CPL(Current Privileged Level) 임.

Mode bit, Monitor bit 등으로 불리는 CPL 이 저장되는 위치는 운영체제마다 다름.

  • x86 의 경우 segment register 중 하나인 cs 에 저장이 되어 있음. Related SO

체크하는 방법(블로그에서 읽은거라 확실한지는 몰?루)

Privileged Instruction

Kernel Mode 에서만 가능한 명령을 Privileged Instruction(특권 명령) 이라 함.

  • 즉 어셈블리어에서 할 수 있는걸 생각하면 생각 외로 별로 없음.

보안이 필요한 명령들이 해당되며 아래 외에도 매우 많음.

  • I/O 관련 => in, out
  • Timer => Set Timer Value
  • Memory 관련 => MMU, allocate, free
  • IPC(Inter Process Communication)
  • User Mode Switch, Turn off Interrupts

RISC-V 는 User / Privileged ISA 로 나누었음.

SystemCall

User Program 이 Privileged Instruction 이 필요할 때가 있음.

  • 이는 Interrupt 를 발생시켜 특정한 ISR 를 수행시키는 방법으로 동작함
  • 이를 위한 Interface 가 System Call 으로 Libray Call대조됨
  • 특정 환경에서는 SVC(SuperViser Call) 이라고도 부르기도 함..
  • C 같은 고급언어에서는 바로 사용이 안되고 관련 dll 등에서 제공하는 API 를 통함

작동원리

  • x64-86 의 ISA 중에 INT 라는 명령어가 있음.
    • 예외를 발생시키는 명령어이며, operand 로 IDT 의 번호를 받음.
    • 0x80 이 SystemCall 을 의미함
  • 256 개의 고정된 크기를 갖는 IDT 에서 어떻게 다양한 OS 의 기능이 수행될까?
    • OS 가 수행할 함수의 주소가 저장된 System Call Table 이 따로 있음.
    • Register 의 값들로 System Call Table 을 조회함.
    • Register 는 인자 및 리턴값으로도 사용됨.
  • Related SO
  • Display Key Input Exam
  • 단국대의 관련 설명

댓글남기기