2 ポイント 投稿者 GN⁺ 2025-04-06 | まだコメントはありません。 | WhatsAppで共有
  • 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デバイスのコアへ発展しており、今も進化を続けている

まだコメントはありません。

まだコメントはありません。