---
title: "PatchworkOS: C와 어셈블리로 밑바닥부터 만든 x86_64 운영체제"
published: 2025-12-06T23:33:23.000Z
canonical: https://jeff.news/article/526
---
# PatchworkOS: C와 어셈블리로 밑바닥부터 만든 x86_64 운영체제

POSIX를 따르지 않는 모듈형 OS로, Plan9 영감의 'everything is a file' 철학을 극단까지 밀어붙인 설계. EEVDF 스케줄러, 페이지 테이블 임베딩 메모리 관리(Linux 대비 5배 빠른 map/unmap), 네임스페이스 기반 보안 모델 등 독자적 설계가 특징이며 실제 하드웨어에서 DOOM까지 구동됨.

- PatchworkOS는 POSIX를 따르지 않는 x86_64용 모듈형 운영체제임. Plan9에서 영감받아 "everything is a file" 철학을 극단적으로 밀어붙인 설계가 특징
- 교육용 OS(xv6)와 프로덕션 OS(Linux) 사이의 중간 지점을 목표로 하며, 실제 하드웨어(ThinkPad E495)에서 돌아감. DOOM도 돌아감
- MIT 라이선스, C와 어셈블리로 작성. 커스텀 ACPI 구현, AML 파서, 프레임버퍼 이미지 포맷, 폰트 포맷, 쉘 유틸리티, 데스크톱 환경까지 전부 자체 구현

## 커널 아키텍처

- 모듈형 커널 설계로, 커널을 여러 작은 모듈로 분리해 런타임에 로드/언로드 가능. SMP 부트스트래핑까지 모듈로 분리되어 있음
- 스케줄러는 Linux 최신 커널과 동일한 EEVDF 알고리즘 사용. Augmented Red-Black Tree로 구현해서 O(log n) 보장. 선점형(preemptive) + 틱리스(tickless) 방식
- 멀티스레딩 + SMP 지원, fine-grained locking 적용. RCU, 뮤텍스, R/W 락, 시퀀셜 락, futex 등 동기화 프리미티브 구비
- 메모리 관리는 페이지 테이블에 메타데이터를 직접 임베딩하는 방식으로 물리/가상 메모리 매니저 모두 페이지당 O(1) 달성

## "Everything is a File" 철학

- 소켓 생성: `/net/local/seqpacket` 파일을 open하면 소켓이 만들어지고 ID가 문자열로 반환됨. `/net/local/[id]/data`로 데이터 송수신, `/net/local/[id]/ctl`로 bind/listen 같은 명령 전달
- 파일 플래그를 경로에 포함시키는 방식: `open("/path:nonblock")`처럼 사용. POSIX의 flags 인자가 필요 없음
- 퍼미션도 경로로 지정: `open("/path/rw")` 식으로 read/write 권한 명시
- `spawn()` 시스템콜로 프로세스를 suspended 상태로 생성한 뒤, `/proc/[pid]/ctl` 파일에 명령을 써서 stdio 리다이렉션, 환경변수 설정 등을 처리. fork()/vfork()의 COW 문제나 CreateProcess()의 비대함을 피한 설계
- 시그널 대신 "Notes" 시스템 도입. 정수 대신 문자열을 보내기 때문에 `"pagefault at 0x40013b due to stack overflow at 0x7ffffff9af18"` 같은 상세 정보가 그대로 전달됨. POSIX의 "SIGSEGV"만 던져주는 것과는 차원이 다름

> [!NOTE]
> 핵심 설계 원칙은 "조합 가능성(composability)". 작은 파일 기반 빌딩블록들이 결합되면서 복잡한 동작이 자연스럽게 만들어지는 구조임. 예: `/proc/[pid]/wait` 파일을 poll()하면 여러 프로세스 동시 대기가 가능해지는 식.

## 보안 모델

- ACL이나 사용자 ID가 없음. 대신 프로세스별 마운트포인트 네임스페이스를 이용한 pseudo-capability 모델 채택
- 프로세스가 볼 수 있는 파일/디렉토리 자체가 곧 권한이 되는 구조. 소켓을 차단하고 싶으면 `/net` 디렉토리를 네임스페이스에서 빼면 됨
- "Box"라 불리는 컨테이너화 시스템 제공. 매니페스트 파일(ini 스타일)로 접근 가능한 디렉토리를 선언
- DOOM box 예시: 딱 4개 디렉토리만 바인딩(실행파일, WAD 데이터, 소켓, `/dev/const/zero`). 사용자 파일, 디바이스, 파이프, 공유 메모리 전부 접근 불가
- `share()`/`claim()` 시스템콜로 일회용 키 기반 fd 전달 구현. UNIX의 SCM_RIGHTS 대체

## 벤치마크

- ThinkPad E495(Ryzen 5 3600X, 32GB RAM)에서 실제 하드웨어 벤치마크 수행. 비교 대상은 Fedora 40, Linux 커널 6.14.5
- 메모리 map/unmap 테스트에서 PatchworkOS가 전 구간에서 Linux보다 빠름
- 1500 페이지 기준: PatchworkOS ~7.5초 vs Linux ~37.7초. 대략 **5배 빠른** 성능
- 이유: 페이지 테이블에 메타데이터를 직접 임베딩해서 별도 구조체 없이 O(1) 접근. 페이지 테이블이 이미 CPU 캐시에 있을 확률이 높아서 캐시 효율도 좋음
- 단, Fedora 쪽이 백그라운드 프로세스와 보안 기능이 훨씬 많으니 완전한 사과 대 사과 비교는 아님

> [!NOTE]
> 스케줄러는 아직 정식 벤치마크 전이지만, 1000개 이상 스레드가 CPU 100%로 돌아가는 중에도 DOOM이 플레이 가능한 수준이라고 함.

## 기타 특징

- 커스텀 ACPI 구현: AML 파서 포함, PS/2 드라이버 예시처럼 하드코딩 대신 ACPI에서 디바이스 리소스를 동적으로 가져오는 방식
- 쉘 유틸리티들은 POSIX 이름을 빌려왔지만 drop-in replacement는 아님. 파일 플래그 시스템에 의존해서 유틸리티 자체는 최대한 단순하게("dumb") 유지
- GRUB 루프백 디바이스 설정으로 USB 없이 듀얼부팅처럼 테스트 가능
- 현재 제한사항: RAM 디스크만 지원(USB 지원 대기 중), x86_64만 지원
- TODO: 비동기 I/O(io_uring 스타일), 9P 파일 서버, LUA 포팅, USB 지원 등

## 핵심 포인트

- Linux과 동일한 EEVDF 스케줄러를 Augmented Red-Black Tree로 구현, O(log n) 보장
- 메모리 map/unmap 벤치마크에서 1500 페이지 기준 Linux 대비 약 5배 빠른 성능(7.5초 vs 37.7초)
- 소켓, 프로세스 제어, 시그널 등 모든 것을 파일 경로 기반 API로 통일
- ACL/UID 없이 프로세스별 마운트포인트 네임스페이스로 보안 구현, Box 컨테이너화 시스템 제공
- POSIX 시그널 대신 문자열 기반 Notes 시스템으로 상세한 오류 정보 전달

## 인사이트

xv6와 Linux 사이의 교육적 중간 지점을 목표로 하면서도, 페이지 테이블 메타데이터 임베딩이나 파일 경로 기반 플래그 등 실용적으로 흥미로운 설계 실험들이 포함되어 있어 OS 설계에 관심 있는 개발자에게 좋은 참고 자료가 될 수 있음.
