Skip to content

Latest commit

 

History

History
59 lines (47 loc) · 7.97 KB

홍준식_Interrupt_System_Call.md

File metadata and controls

59 lines (47 loc) · 7.97 KB

Kernel

커널 이미지
커널은 컴퓨터 하드웨어와 프로세스를 잇는 인터페이스이다.

  • 메모리 관리
  • 프로세스 관리
  • 디바이스 드라이버
  • 시스템 콜 및 보안 커널은 메모리에 상주하며 CPU에 명령을 내린다.

시스템에서 실행되는 코드는 커널모드 혹은 사용자 모드로 실행된다.

User Mode

프로그램이 부팅될 때에 프로그램은 User Mode로 실행된다.
User Mode 프로그램이 실행될 때에 OS에 의하여 프로세스와 가상 메모리가 생성된다.
User Mode를 사용한 프로그램은 시스템 자원에 직접 접근할 수 없다.
시스템 자원에 접근하기 위해서 System Call을 통하여 Kernel Mode로 전환하고 자원을 요청한다.

Kernel Mode (Privileged Mode)

프로그램이 하드웨어에 마음대로 접근하는 것을 제어한다.
User Mode의 프로그램이 하드웨어에 접근하고 싶을 때, System Call을 이용하여 Kernel Mode로 전환하고 하드웨어에 접근한 후에, CPU는 다시 User Mode로 전환한다.
User Mode Kernel Mode
User Mode와 Kernel Mode는 CPU에 존재하는 Mode Bit를 통하여 구분한다.
Mode Bit가 0이면 Kernel Mode, 1이면 User Mode이다.

커널 모드는 모든 프로세스가 하나의 가상 메모리를 공유하는 반면, 사용자 모드는 모든 프로세스가 각각의 가상 메모리 공간을 가진다.
System Crash가 커널 모드에서 발생하면 모든 것을 다운되게 만들지만 사용자 모드에서의 System Crash는 세션을 재실행시키는 것으로 복구할 수 있다.

즉 사용자 모드가 더 System Crash에 더 안전하고, 잘못된 하드웨어 호출로부터 안전하여 대부분의 프로그램은 사용자 모드에서 실행된다.

스위칭

사용자 모드에서 커널 모드로 전환하기 위한 과정은 다음과 같다. (ARM 프로세스)

  1. Glibc 라이브러리의 함수를 호출한다.
  2. Glibc 라이브러리는 각기 다른 아키텍쳐마다 적절한 방법의 System Call을 호출하는 방법을 알고 있어서 시스템 콜 도입을 위한 적절한 ABI(Application Binary Interface)를 전달한다.
  3. Glibc는 해당 아키텍쳐의 SWI instruction(Software Interrupt Instruction)를 호출하고 CPSR 레지스터의 Mode bit와 벡터 주소를 0x08로 업데이트 함으로서 Supervisor 모드로 전환한다.
  4. MMU(Memory Management Unit)은 이제 커널 가상 메모리의 접근과 실행을 허용한다.
  5. Vector 주소 0x08로부터 프로세스는 SW Interrupt handler routine(vector_swi())을 호출한다.
  6. vector_swi에서 SCNO(System Call Number)를 SWI 명령에 따라 가져오고 적절한 system call를 호출한다.
  7. 시스템 콜이 호출되고 나서 사용자 공간의 레지스터는 사용자 모드를 호출하기 이전으로 복구된다.

System Call

사용자 프로그램이 운영 체제의 커널이 제공하는 서비스에 접근하기 위한 인터페이스이다.
UNIX 기반의 시스템에서는 주로 C library(glibc)를 통하여 호출할 수 있다. 참조

Interrupt

CPU가 프로그램을 실행할 때에 예외 상황이 발생하여 처리가 필요한 경우 마이크로프로세서에게 알려 처리를 할 수 있도록 하는 것이다.
마이크로프로세서는 인터럽트를 감지하면 실행중인 기계어 코드를 중단하고 인터럽트 처리를 위한 ISR(Interrupt Service Routine)을 수행한다.
이때 ISR은 현재 진행중인 프로그램의 레지스터를 스택에 옮겨두고 해당 일을 수행한다.

일반적으로 모든 예외 상황을 인터럽트라고 통칭하지만 Trap과 Interrupt로 구분하기도 한다.

Interrupt

인터럽트는 하드웨어에서 발생하는 것으로 비동기적이다.
Keyboard Interrupt나 I/O Interrupt, 네트워크 패킷 수신 Interrupt 등이 있다.

Trap

트랩은 사용자 프로그램에서 OS의 기능을 사용하기 위해 발생한다.
소프트웨어가 생성하는 인터럽트로 0으로 나누거나 잘못된 메모리 액세스 등의 오류로 인하여 혹은 OS에 대한 요청을 할때에 발생한다.
발생 시점이 프로그램의 일정한 지점이기 때문에 동기적이다.