(본 글은 다음 링크를 참조하였습니다.)
https://github.com/gyoogle/tech-interview-for-developer?tab=readme-ov-file
커널(Kernel)
컴퓨터와 전원을 켜면 운영체제는 이와 동시에 수행된다. 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 해당 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야한다.
하지만 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라가면 한정된 메모리 공간의 낭비가 심할 것이다.
따라서 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다. 이 때 메모리에 상주하는 운영체제의 부분을 커널(Kernel)이라고 한다.
즉, 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다.
(그래서 보통은 '운영체제'라고 하면 Kernel을 뜻하기도 한다)
CPU 모드
CPU는 사용자 애플리케이션 (User Application)이 시스템을 손상시키는 것을 방지하기 위해 2가지 모드를 제공한다.
CPU에 있는 Mode bit로 모드를 구분하여 0은 커널모드(Kernel Mode), 1은 사용자 모드(User Mode)로 나뉘어서 구동된다.
운영체제에서 프로그램이 구동되는데 있어서 파일을 읽어오거나, 쓰거나, 혹은 화면에 메시지를 출력하는 등 많은 부분이 커널 모드를 사용한다.

위 그림과 같이 user process는 User Mode에서 실행되다가 시스템 자원을 사용해야할 때 시스템 콜을 호출해서 Mode bit = 0으로 설정 후 커널 모드로 전환하여 작업을 수행하고 완료 후 다시 Mode bit = 1로 설정 후 사용자 모드로 전환한다.
시스템 콜 (Sytem Call)
OS는 다양한 서비스들을 수행하기 위해 하드웨어를 직접적으로 관리한다. 이와 반면 응용 프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다. OS가 제공하는 이러한 인터페이스를 '시스템 콜 (System Call)이라고 한다.
시스템 콜은 이러한 커널 영역의 기능을 사용자 모드가 사용 가능하게, 즉, 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 할 수 있게 해준다.
(즉, 사용자가 응용프로그램에서 시스템 콜을 통해 원하는 기능을 수행할 수 있음)
보통 직접적으로 시스템 콜을 사용하기 보다는 API(라이브러리 함수)를 통해 사용한다.
위 그림처럼 운영체제(OS)는 메모리에 프로그램 적재, I/O 처리, 파일 시스템 처리 등 여러 서비스들을 제공하지만, 사용자 프로세스는 이에 직접적인 접근을 못하기 때문에 시스템 콜 호출을 통해 위 서비스를 제공받을 수 있다.
시스템 콜 종류 (6가지)
1. 프로세스 제어 (Process Control)
2. 파일 조작 (File Manipulation)
3. 장치 관리 (Device Manipulation)
4. 정보 유지 (Information Maintenance)
5. 통신 (Communication)
6. 보호 (Protection)
시스템 콜 C언어 예제
#include <stdio.h> int main() { ... printf("Hello World!"); ... return 0; }
printf 함수를 호출했다.
