지난 포스팅에서 컴퓨터 시스템상의 OS의 위치를 설명하기 위해 컴퓨터 시스템의 구성 요소를 살펴보았는데요.
컴퓨터 시스템은 이렇게 구성되어있습니다.

이 그림을 통해 알수있듯 어떤 사용자나 응용 소프트웨어라도 직접 하드웨어에 접근하는 것은 허용되지 않습니다.
반드시 운영체제를 통해서 접근해야하는데 이렇듯 운영체제는 응용 소프트웨어와 하드웨어 사이의 중계역할을 수행합니다.
운영체제는 프로그램을 실행시킬 때 해당 프로그램을 위한 4개의 공간을 제공합니다.

컨텍스트(Context) 란 어떤 프로그램이 실행중인 일체의 상황을 뜻한다. 즉 프로세스나 스레드가 실행 중인 상태와 관련된 모든 정보를 의미한다. 이는 프로세스나 스레드가 실행을 멈추고 다른 작업으로 전환될 때, 나중에 다시 실행을 재개할 수 있도록 하기 위해 저장되는 정보이다.
운영체제가 현재 실행중인 프로그램 A의 컨텍스트를 저장해두고,
다른 프로그램인 B를 실행 시키기 위해 프로그램 B에 저장된 컨텍스트를 CPU로 옮기는 것을 컨텍스트 스위칭(Context Switching)이라고 한다.
이때 컨텍스트 정보들은 PCB(Process Control Block)에 저장된다.

사진 출처 : 명품 운영체제
운영체제는 도구/GUI, 커널, 드라이버들로 구성되는 소프트웨어이다.
사진 출처 : 명품 운영체제
도구 소프트웨어는 User가 컴퓨터를 편하게 사용할 수 있도록 운영체제 패키지에 포함되어 제공되는 프로그램이다.
Window에는 파일탐색기, 제어판, 작업관리자와 같은 프로그램이 있다.
리눅스에는 쉘(Shell)이 있다.
커널은 운영체제의 핵심 부분이다. 커널은 부팅 후부터 메모리에 상주하며 CPU나 캐시, 메모리와 같은 하드웨어를 관리한다.
- 프로세스와 스레드 관리
- 메모리 관리
- 파일 시스템 관리
- 디바이스 드라이버를 호출하여 장치 입출력
이러한 핵심 기능들이 커널 코드에 의해 실행된다.
디바이스 드라이버는 장치를 직접 제어하는 소프트웨어이다.
예를들어 마우스의 클릭, 움직임을 인지하는 마우스 드라이버
키보드에서 사용자가 입력한 키를 읽어오는 키보드 드라이버 등
다양한 드라이버가 존재한다.
시스템 호출은 커널과 응용프로그램 사이의 인터페이스로
응용프로그램에서 커널 코드를 실행하는 기법이다.
OS는 하드웨어를 직접적으로 관리하기 때문에 응용 프로그램은 커널에 작성된 함수를 직접 호출할 수 없다.
응용프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 활용할 수 있다.
일반적으로 시스템 호출 라이브러리에 들어있는 시스템 호출 함수를 호출해서 사용한다.
시스템 호출은 소프트웨어 인터럽트의 일종이다.
인터럽트는 하드웨어 장치들이 CPU에게 하드웨어 신호(인터럽트 신호)를 물리적으로 발생시켜
입출력 완료나 타이머 완료 등을 CPU에게 알리는 방법이다.
CPU가 인터럽트 신호를 받게 되면 수행중인 작업을 멈추고(이때 수행중이던 프로세스의 정보는 PCB에 저장) 인터럽트의 요청을 처리하는 코드를 실행한다. 이 코드를 ISR(Interrupt Service Routine)이라고 한다.
이러한 인터럽트에는 하드웨어 인터럽트(외부 인터럽트) / 소프트웨어 인터럽트(내부 인터럽트)가 있다.
하드웨어 인터럽트(외부 인터럽트)
외부 장치가 발생시키는 인터럽트로, I/O 작업, 타이머, 전원 관리 등 다양한 이벤트를 처리한다.
소프트웨어 인터럽트(내부 인터럽트)
프로그램 내에서 명령어로 발생시키는 인터럽트로, 시스템 호출, 트랩, 예외 등이 있다.
다중사용자/다중프로세스가 실행되기 때문에 현재의 운영체제는 응용프로그램과 운영체제 커널의 메모리 영역을 확실하게 구분하기 위해
사용자 공간과 커널 공간으로 나누었다.
또한 응용 프로그램이 커널 공간을 접근할 수 없도록 시스템의 실행모드를 사용자 모드와 커널 모드로 나누었다.
또한 응용 프로그램은 사용자 모드에서만 실행, 커널 코드는 커널 모드에서만 실행하도록 나누었다.
32비트 Windows 운영체제에서 전체 4GB의 메모리 영역에 대해 하위 2GB는 사용자 공간, 상위 2GB는 커널 공간으로 나뉜다.

이렇게 메모리를 사용자 공간과 커널 공간으로 나누는 이유는 응용 프로그램으로부터 커널 코드와 데이터를 지키기 위함이다.
커널이 개방되어 있으면 바이러스 침범, 시스템 훼손, 시스템 중단등의 심각한 문제가 발생할 수 있기 때문이다.