애플 Darwin OS 및 XNU 커널 심층 분석
(tansanrao.com)- Apple의 Darwin 운영체제는 macOS, iOS 등 Apple의 현대적인 OS들의 기반이 되는 Unix 계열 코어 구성임
- 핵심은 XNU 커널로, "X is Not Unix"라는 이름의 하이브리드 커널임
- Mach 마이크로커널의 구조와 BSD Unix의 요소를 결합해 성능과 모듈화를 균형 있게 구현함
- 이 글에서는 Mach과 BSD의 뿌리부터 시작해 Apple Silicon에서의 최신 진화까지 Darwin과 XNU의 구조적 발전 과정을 설명함
- 커널의 핵심 구성(IPC, 스케줄링, 메모리 관리, 가상화 등)과 현대 하드웨어에 맞춘 적응을 분석함
Mach 마이크로커널의 기원 (1985–1996)
- Mach는 1985년 Carnegie Mellon University에서 Richard Rashid와 Avie Tevanian에 의해 시작됨
- UNIX 커널의 복잡성을 줄이기 위해 핵심 기능만 제공하는 마이크로커널로 설계됨
- 메모리 관리, 스레드 기반 스케줄링, 메시지 기반 IPC 등 저수준 기능만 제공하고, 파일 시스템, 네트워크 등은 사용자 공간 서버로 분리함
- Mach 2.5는 일부 BSD 커널 코드와 함께 커널 공간에서 실행되어 성능을 보완함
- Mach 3.0은 진정한 마이크로커널로 전환되며, BSD의 메모리 관리에도 영향을 미침
- Mach는 작업(Task)과 스레드(Thread)의 개념을 도입하고, 효율적인 가상 메모리 모델을 구현함
- NeXT(1985년 Steve Jobs 설립)는 Mach 2.5 + 4.3BSD 기반으로 NeXTSTEP OS를 개발함
- NeXTSTEP의 커널은 Mach과 BSD를 커널 공간에서 결합해 하이브리드 구조를 구성함
- 드라이버는 Objective-C 기반의 DriverKit으로 개발되며 객체 지향적인 접근을 시도함
- Apple은 1996년 NeXT를 인수하며 NeXTSTEP과 Mach/BSD 기반의 XNU 커널을 가져옴
- Mac OS X의 초기 버전(Rhapsody)은 NeXT의 커널 구조를 기반으로 개발됨
Mac OS X의 초기 진화 (1997–2005)
- Apple은 OSFMK 7.3 기반 Mach 3.0 코드를 XNU에 통합하고, BSD 계층을 FreeBSD와 4.4BSD 코드로 업데이트함
- 성능 개선과 하드웨어 지원 확대를 위해 BSD와 Mach의 기능을 내장한 하이브리드 구조 유지
- 새로운 드라이버 프레임워크 I/O Kit 도입: Objective-C 대신 C++ 기반으로 성능 최적화 및 핫플러깅 지원
- 주요 버전 특징 요약:
- 10.1 Puma (2001): 실시간 스레드 지원, 성능 향상
- 10.2 Jaguar (2002): IPv6, IPSec, Bonjour, HFS+ 저널링 도입
- 10.3 Panther (2003): FreeBSD 5 기반 커널 개선, 멀티코어 지원을 위한 fine-grained locking 도입
- XNU는 PowerPC를 기본 지원하면서도 x86 지원 코드도 유지하여 향후 전환을 준비함
- 10.4 Tiger (2005): UNIX 03 인증 획득, Intel 전환 기반 마련, kqueue/kevent 이벤트 시스템 도입
64비트, 멀티코어, iPhone OS 시기 (2005–2010)
-
10.5 Leopard (2007):
- x86_64 지원 및 64비트 드라이버 가능
- ASLR, 샌드박스, DTrace 등 보안 및 디버깅 기능 강화
- 마지막 PowerPC 정식 지원
-
iPhone OS 1 (2007):
- Darwin 9 기반, XNU를 ARM에 이식
- 메모리 부족 대응을 위한 Jetsam 메커니즘 도입
- 전체 앱 샌드박스 및 코드 서명 필수화
-
10.6 Snow Leopard (2009):
- Intel 전용, 완전한 64비트 커널 지원
- Grand Central Dispatch 도입: 커널과 협업하는 유저 공간 태스크 병렬화 프레임워크
- OpenCL 통합 및 GPU 연산 지원
-
iOS 4 (2010):
- 멀티태스킹 및 우선순위 기반 스케줄링 도입 (백그라운드/포그라운드 구분)
macOS 및 iOS의 현대화 (2011–2020)
-
10.8~10.9 (2012–2013):
- Compressed Memory 도입으로 RAM 사용 최적화
- Timer Coalescing으로 CPU 절전 강화
- App Nap, QoS 등 에너지 효율 중심 스케줄링 발전
-
10.10~10.11 (2014–2015):
- SIP(System Integrity Protection) 도입: 루트 권한도 시스템 파일 변경 불가
- watchOS, tvOS 등 다양한 기기에서 XNU 확장 가능성 확보
- ARM64 지원 및 32비트 ARM 폐기 준비 시작
-
10.12~10.14 (2016–2018):
- APFS(Apple File System)로 파일 시스템 전환
- 스냅샷, 클로닝, 암호화 지원
- kext 보안 강화: 사용자 승인 필요, 코드 서명 검사 강화
-
10.15 Catalina (2019):
- DriverKit 도입: 드라이버를 유저 공간에서 실행 (microkernel 철학 회귀)
- 시스템 볼륨을 읽기 전용으로 분리하여 보안 강화
Apple Silicon 시기 (2020–현재)
-
macOS 11 Big Sur (2020):
- ARM64 기반 Apple Silicon(M1) 지원
- big.LITTLE CPU 스케줄링 지원: QoS 기반으로 효율/성능 코어 분배
- Mach VM 구조가 통합 메모리 아키텍처에 적합
-
보안 및 가상화 강화:
- PAC(포인터 인증), MTE(메모리 태깅) 등 ARM 하드웨어 보안 기능 지원
- Apple Silicon의 하이퍼바이저 기능 기반으로 새로운 가상화 프레임워크 도입
- macOS에서 개발자용 경량 VM 구동 가능 (유저 공간 제어)
-
통합 플랫폼 구조:
- XNU는 macOS, iOS, watchOS, tvOS, bridgeOS, visionOS 등 모든 Apple 플랫폼의 커널로 사용됨
- Mach의 플랫폼 추상화 덕분에 다양한 CPU 아키텍처에 쉽게 적응 가능
XNU의 주요 연혁 요약
- 1989 - NeXTSTEP 1.0 - Mach 2.5 + BSD의 XNU 하이브리드 도입
- 1996 - Apple, NeXT 인수 - Mach 3.0 + FreeBSD 기반의 Rhapsody 개발 시작
- 2001 - Mac OS X 10.0 - XNU 커널 구조 정립 및 초기 성능 개선
- 2005 - 10.4 Tiger - UNIX 인증, Intel 전환 대비
- 2007 - 10.5 Leopard - 64비트 지원, 보안 기능 강화, iPhone OS 등장
- 2009 - 10.6 Snow Leopard - 완전한 Intel 전환 및 GCD 도입
- 2011 - 10.7 Lion - 64비트 커널 강제화, 샌드박싱 확대
- 2013 - 10.9 Mavericks - 메모리 압축 및 QoS 스케줄링 도입
- 2015 - 10.11 El Capitan - SIP 도입, watchOS 등 기기 확장
- 2017 - 10.13 High Sierra - APFS 기본 적용, Kext 보안 강화
- 2019 - 10.15 Catalina - DriverKit으로 드라이버를 유저 공간에서 실행
- 2020 - 11 Big Sur - Apple Silicon 지원, 새로운 가상화 구조 도입
- 2022 - 13 Ventura - M1 Max 등 고성능 코어 대응 스케줄링 개선
- 2024 - 14 Sonoma - M2/M3 최적화 및 Memory Tagging 지원
XNU 커널 구조와 설계
하이브리드 커널 설계: Mach + BSD 통합
- XNU는 마이크로커널(Mach)과 모놀리식 커널(BSD)의 특성을 모두 지닌 하이브리드 커널 구조를 가짐
- Mach는 저수준 기능(스레드, 메모리, IPC 등)을 추상화하고 모듈화하며, BSD는 전체 UNIX 시스템 콜과 API를 커널 공간에서 직접 실행함
- BSD와 Mach는 하나의 커널 바이너리로 링크되어 동일한 주소 공간에서 실행됨
- 커널 내부에서 Mach 함수와 BSD 함수는 메시지 없이 직접 호출되며, UNIX 시스템 콜은 다른 유닉스 커널 수준의 성능으로 처리됨
- 예시:
read()
시스템 콜 호출 시, BSD 파일 시스템 코드가 커널에서 직접 실행됨
Mach의 역할
- 스레드, 태스크 관리, 컨텍스트 스위칭, 스케줄링 큐, 타이머 등 커널 핵심 인프라 제공
- Mach 포트를 통한 메시지 기반 IPC 제공 (프로세스 간 메모리 공유 및 큰 버퍼 전송 지원)
- 메모리 객체, copy-on-write 최적화, 주소 공간 추상화 등 고급 가상 메모리 관리 기능 구현
BSD의 역할
- 프로세스 및 PID, 신호, 사용자 ID, POSIX API, 파일 시스템, 네트워크 스택, UNIX IPC 등 UNIX 기능 제공
- FreeBSD 기반의 BSD 코드에서 유래, OpenBSD/NetBSD 기능도 포함
- 보안 프레임워크(KAuth, MAC), sandbox, SIP, 코드 서명 검증 등 보안 정책 구현
- 시스템 콜 구현:
fork()
는 Mach에서 VM 복제, BSD에서 파일 디스크립터 복제 등 수행 - 파일 시스템(VFS), 네트워크, signal 처리, POSIX 스레드 등 대부분의 UNIX 기능 담당
I/O Kit
- 커널 공간에서 실행되는 객체 지향 드라이버 프레임워크 (C++의 Embedded Subset 사용)
- 장치 계층 구조를 정의하고 각 드라이버가 이를 상속하여 구현
- 사용자 공간에서 접근 가능한 user client 인터페이스 제공
- 커널 동기화 및 스레드 제어는 Mach 기능을 사용하며, 파일 시스템, 네트워크 드라이버는 BSD와 연결됨
- 드라이버는 Kext로 동적 로딩 가능하며, Mach-O 포맷으로 커널 메모리에 로딩됨
Mach IPC와 메시지 전달
- Mach 포트는 커널과 사용자 공간 사이, 혹은 사용자 프로세스 간의 주요 IPC 메커니즘
- 각 프로세스는 Mach 포트를 통해 제어할 수 있으며, launchd 같은 시스템 데몬이 포트를 통해 프로세스를 제어함
- Grand Central Dispatch, XPC 등 macOS의 고급 기능은 Mach 메시지를 기반으로 구현됨
- Mach 메시지는 포트 권한 시스템이 있어 보안성이 높고, 포트 전송, 공유 메모리 전송이 가능함
- MIG(Mach Interface Generator)는 커널과 사용자 간 메시지 기반 RPC 코드 자동 생성에 사용됨
- DriverKit은 Mach IPC 기반으로 커널과 사용자 공간 드라이버 간 통신을 구현함
스케줄러 및 스레드 관리
- Mach 기반의 우선순위 기반 라운드로빈 스케줄러에서 진화
- 각 CPU는 개별 Run Queue를 가지며, 스레드는 우선순위 기반으로 스케줄됨
- iOS 도입 이후 앱 역할(백그라운드/포그라운드)에 따른 스케줄링 정책 도입
- QoS(Quality of Service) 클래스 기반 스케줄링: 사용자 인터랙티브, 백그라운드 등 작업 유형에 따라 우선순위 조정
- Apple Silicon에서는 QoS에 따라 효율 코어/고성능 코어에 스레드를 할당
- 실시간 스레드(오디오 등)는 실시간 큐를 통해 우선 실행되며, macOS 10.4부터 deadline 스케줄링 지원
- 전력 관리 협업: Idle 스레드, 타이머 결합, 절전 상태 진입 등을 통한 모바일 성능 최적화
메모리 관리와 가상 메모리
- Mach VM은 XNU 메모리 시스템의 핵심 구성으로, 강력하고 유연한 설계를 가짐
- 가상 주소 공간은 copy-on-write 기반이며, fork() 시 효율적 메모리 복제가 가능함
- 메모리 객체(Memory Object)와 페이저(Pager) 구조:
-
dynamic_pager
사용자 공간 데몬이 swap 영역을 관리함 - 파일 매핑은 vnode pager를 통해 커널 내에서 처리
-
- Mavericks부터는 압축 메모리 도입: 메모리 부족 시 디스크 스왑 대신 페이지를 압축해 보존
- pmap: 각 아키텍처의 물리 메모리와 페이지 테이블을 관리하는 머신 종속 계층
- 커널은 별도 주소 공간을 가지며 일부 영역은 고정(wired) 메모리로 설정됨
- macOS는 디버깅용 가드 페이지, zero-fill 할당, 분할 보호 등을 통해 메모리 보안을 강화함
- Mach VM은 공유 메모리, Inheritance 설정 등을 통해 프레임워크 공유 등을 효율적으로 처리함
- Apple Silicon에서는 GPU와 메모리 공간이 통합되어 있어 Mach VM이 메모리 특성을 기반으로 할당 최적화 수행
가상화 지원
- XNU는 초기에 하이퍼바이저 기능이 없었지만, OS X 10.10부터 Hypervisor.framework를 통해 가상화 지원 시작
- Intel 기반에서는 VT-x를 활용해 사용자 공간 VM을 실행할 수 있게 됨
- ARM 기반 Apple Silicon에서는 Virtualization.framework를 통해 EL2 가상화 기능 활용
- 커널 내부 하이퍼바이저는 가상 메모리, vCPU 트랩 처리, 스케줄링 등을 담당
- XNU의 스레드와 Mach 태스크 구조를 활용해 vCPU를 호스트 스레드로 처리
- macOS에서 Rosetta 2와 같은 x86 에뮬레이션 기능도 제공하며, syscall 트랜슬레이션과 ABI 호환성 제공
- iOS 15부터는 제한된 형태로 iOS에서도 가상화 허용 (개발자 모드 필요)
보안 컴퓨팅 구조
-
Secure Enclave:
- Apple SoC에 통합된 독립된 보안 서브시스템
- sepOS라는 별도 마이크로커널을 실행하며, 생체 정보, 암호 키 등을 보호
- 메인 커널이 손상되어도 격리된 보안 처리를 유지함
-
Exclaves:
- macOS 14.4 및 iOS 17부터 도입된 새로운 격리 영역
- Apple ID 인증, 오디오 버퍼, 센서 데이터 등 민감 자원을 메인 커널 외부 영역으로 분리
-
ExclaveKextClient.kext
등 전용 Kext와 프레임워크로 제어 - 커널이 손상되어도 exclave 영역은 독립적으로 보호됨
- enclave는 시스템 내부에 포함된 영역이고, exclave는 시스템 외부에 연결된 분리 영역이라는 개념을 반영함
결론
- XNU는 마이크로커널과 모놀리식 커널의 장점을 절충한 실용적인 하이브리드 구조를 가진 커널임
- Mach의 추상화 계층은 다양한 CPU 아키텍처 전환과 시스템 확장을 가능하게 하며, BSD는 POSIX 호환성과 안정된 유닉스 환경을 제공함
- Apple은 Mach IPC를 통해 필요할 때 사용자 공간으로 기능을 분리하고, 커널 내부는 효율성을 위해 직접 연결함
- 드라이버(User-space DriverKit), 가상화(Hypervisor.framework), 스케줄러(QoS), 메모리 관리(Compressed Memory) 등 다층적인 아키텍처를 기반으로 현대 시스템 요구에 유연하게 대응함
- Darwin과 XNU는 NeXTSTEP에서 출발해 수억 대의 Apple 기기의 코어로 발전하였으며, 계속해서 진화 중임