운영체제에서 kernel은 가장 핵심적인 구성 요소이다.
CPU scheduling, memory management, process management, file system, device driver 등 하드웨어와 소프트웨어 사이의 모든 자원 관리는 kernel이 담당한다.
kernel을 설계하는 방식에는 여러 철학이 존재하지만, 대표적으로 Monolithic Kernel과 Microkernel 구조가 있다.
Monolithic Kernel은 운영체제의 대부분 기능을 kernel space에서 실행하는 구조이다.
Microkernel은 kernel에 최소한의 기능만 남기고, 나머지 기능은 user space에서 실행하는 구조이다.
file system, device driver, network service 등은 user space에서 server 형태로 실행되며, kernel과는 IPC로 통신한다.

| 항목 | Microkernel | Monolithic Kernel |
|---|---|---|
| Size | 작음 | 큼 |
| Execution | 느림 | 빠름 |
| Extensibility | 높음 | 낮음 |
| Stability | service failure가 kernel에 영향 없음 | service failure 시 entire system crash |
| Code Complexity | 높음 | 낮음 |
| Example | QNX, Symbian, L4Linux | Unix, Linux, BSD, Windows |
Linux는 전통적인 Monolithic Kernel 구조를 사용한다.
하지만 단순한 monolithic kernel이 아니라, modular monolithic kernel에 가깝다.
👉 Linux는
Microkernel의 장점을 부분적으로 수용한 고성능 Monolithic Kernel이라고 볼 수 있다.
object file 형태로 존재하며, runtime에 kernel에 link(적재)될 수 있는 코드
많은 kernel 기능이 kernel build time에 built-in 또는 module로 선택 가능
예: device drivers, network protocols, file systems 등
커널을 전부 다시 컴파일하는 방식은 비효율적
make는 여러 component file로 이루어진 program을 대상으로

어디가 바꼈는지 일일히 다 쳐야함

Makefile: dependency 기반 빌드 규칙을 정의하는 텍스트 파일
make는 이 규칙을 읽고, 변경된 부분만 다시 compile한다
target : dependency
command
각 요소의 의미는 다음과 같다.
target
.o), executable filedependency
command
macro
intro_exe : job.o hobby.o main.o
gcc -o intro_exe job.o hobby.o main.o
job.o : job.c
gcc -c -o job.o job.c
hobby.o : hobby.c
gcc -c -o hobby.o hobby.c
main.o : main.c
gcc -c -o main.o main.c
clean :
rm *.o intro_exe
intro_exe는 job.o, hobby.o, main.o에 의존
각 .o 파일은 대응되는 .c 파일에 의존
make 실행 시:
.c 파일에 해당하는 .o만 다시 compilemake clean 실행 시:
build 환경을 초기화할 때 사용
👉 이 구조가 Linux kernel build의 기본 뼈대
위 Makefile의 문제점: 중복
compiler 이름이나 target 이름이 바뀌면 여러 줄을 수정해야 함 -> macro를 사용
CC = gcc
TARGET = intro_exe
$(TARGET) : job.o hobby.o main.o
$(CC) -o $(TARGET) job.o hobby.o main.o
job.o : job.c
$(CC) -c -o job.o job.c
hobby.o : hobby.c
$(CC) -c -o hobby.o hobby.c
main.o : main.c
$(CC) -c -o main.o main.c
clean :
rm *.o intro_exe
CC만 바꾸면 compiler 교체 가능TARGET만 바꾸면 executable 이름 변경 가능파일 수가 더 많아지면 object file 목록도 한 곳에서 관리하는 게 좋다.
CC = gcc
TARGET = intro_exe
OBJECTS = job.o hobby.o main.o
all : $(TARGET)
$(TARGET) : $(OBJECTS)
$(CC) -o $@ $(OBJECTS)
clean :
rm *.o intro_exe
OBJECTSall targetmake만 입력해도 실행됨all : App1 App2
$intro_exe👉 이 패턴은 kernel Makefile에서도 그대로 사용된다.
전체 compile ❌
변경된 부분만 incremental build ⭕