2P by GN⁺ 13일전 | ★ favorite | 댓글과 토론
  • 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 기기의 코어로 발전하였으며, 계속해서 진화 중임