Apple 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)を導入: root権限でもシステムファイルを変更不可
- 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は1つのカーネルバイナリとしてリンクされ、同一アドレス空間で動作する
- カーネル内部ではMach関数とBSD関数はメッセージを介さず直接呼び出され、UNIXシステムコールは他の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 schedulingに対応
- 電力管理との協調: Idleスレッド、タイマー結合、省電力状態移行などを通じてモバイル性能を最適化
メモリ管理と仮想メモリ
- Mach VMはXNUメモリシステムの中核構成であり、強力で柔軟な設計を持つ
- 仮想アドレス空間はcopy-on-writeベースで、fork() 時に効率的なメモリ複製が可能である
- メモリオブジェクト(Memory Object)とPager構造:
dynamic_pagerユーザー空間デーモンがswap領域を管理する- ファイルマッピングはvnode pagerを通じてカーネル内で処理される
- Mavericks以降は圧縮メモリを導入: メモリ不足時にディスクスワップの代わりにページを圧縮して保持
- pmap: 各アーキテクチャの物理メモリとページテーブルを管理するマシン依存層
- カーネルは別個のアドレス空間を持ち、一部領域は固定(wired)メモリに設定される
- macOSはデバッグ用guard page、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互換性と安定したUnix環境を提供する
- AppleはMach IPCを通じて必要に応じて機能をユーザー空間へ分離し、カーネル内部は効率性のために直接接続している
- ドライバ(User-space DriverKit)、仮想化(Hypervisor.framework)、スケジューラ(QoS)、メモリ管理(Compressed Memory)など多層アーキテクチャを基盤に、現代システムの要求へ柔軟に対応している
- DarwinとXNUはNeXTSTEPから出発し、数億台のAppleデバイスのコアへ発展しており、今も進化を続けている
まだコメントはありません。