XNUは、
Appleが開発・利用している
オペレーティングシステムカーネルであり、macOSの基盤を担っています。オープンソース
ソフトウェアであるDarwinの一部として公開されており、その名前「XNU」は「X is Not Unix」の略称です。
デザイン
XNUは、モノリシック
カーネルとマイクロ
カーネルの両方の特徴を併せ持つハイブリッド
カーネルです。マイクロ
カーネルの持つモジュール性や
メモリ保護の利点と、モノリシック
カーネルの持つ高速な実行性能を両立させることを目指しています。現在、XNUはARM、
IA-32、x64、
PowerPCベースのプロセッサ上で、シングルプロセッサおよびSMP(
対称型マルチプロセッシング)環境で動作します。
XNUの中核をなす
Machは、シンプルなマイクロ
カーネルであり、OSのコア機能を柔軟な
プロセスとして分割して実行できます。これにより、
Machカーネル上で複数のOSを並行して実行することも可能です。しかし、
カーネル/ユーザモードの切り替えや、マイクロ
カーネルのアドレス空間とデーモン間でのメッセージのやり取りによるオーバーヘッドが発生し、パフォーマンスが低下することがあります。macOSではこの問題を解決するため、BSDの機能を
Machのコアに組み込み、
Machと従来のBSD
カーネル両方の利点と欠点を併せ持つ形となっています。
Machは、
カーネルスレッド、
プロセス管理、プリエンプティブ・マルチタスク、メッセージパッシング(
プロセス間通信)、
メモリ保護、
仮想記憶、ソフトリアルタイム処理、
カーネルデバッグ、コンソールI/Oなどの機能を提供します。
BSD
カーネルのBSD部分は、
POSIX API(BSDシステムコール)、
Machタスク上でのUnix
プロセスモデル、基本的なセキュリティポリシー、ユーザIDとグループID、アクセス権限、
プロトコルスタック、
仮想ファイルシステム、HFS/HFS+といったローカルファイルシステム、NFS(
Network File System)クライアントとサーバー、暗号化フレームワーク、
UNIX System V
プロセス間通信、監査サブシステム、強制アクセス制御、およびいくつかのロックプリミティブを提供します。
I/O Kit
I/O Kitは、
C++のサブセットで記述されたデバイスドライバフレームワークです。
オブジェクト指向設計を採用しており、ドライバのクラスに共通する機能を提供することで、少ないコードでより迅速にドライバを開発できるようにします。I/O Kitはマルチスレッドに対応しており、SMP環境での動作を保証し、ホットプラグや動的なデバイスの配置を可能にします。システムの安定性を高めるため、多くのドライバはユーザ空間で実行するように設計されています。ユーザ空間で動作するドライバがクラッシュしても
カーネル全体がクラッシュすることはありません。一方、
カーネル空間で動作するドライバがクラッシュすると、
カーネル全体がクラッシュする可能性があります。
カーネル空間で動作するドライバの例としては、ディスクアダプタやネットワークアダプタのドライバ、グラフィックドライバ、USBやFireWireコントローラのドライバ、仮想マシンのドライバなどがあります。
共有資源の保護
マルチプロセッサ環境で安全に動作するためには、ファイルやデータ構造などの共有資源へのアクセスを直列化し、同一時間内に複数のアクセスによって資源が変更されないようにする必要があります。共有資源への同時アクセスを防ぐ手法として、
不可分操作、スピンロック、クリティカルセクション、
排他制御、シリアライジングトークンなどが用いられます。
歴史
NeXT社時代
XNUは、もともとNeXT社がNeXTSTEP OSのために開発しました。
カーネギーメロン大学が開発した
Machカーネル2.5に、4.3BSDのコンポーネントと、ドライバ記述のための
オブジェクト指向APIであるDriver Kitを組み合わせたハイブリッド
カーネルでした。
NeXTが
Appleに買収された後、
Machコンポーネントはバージョン3.0へ、BSDコンポーネントはFreeBSDプロジェクト由来のコードにアップグレードされました。また、Driver Kitは、
C++ APIであるI/O Kitに置き換えられました。
K32/K64
Mac OS X 10.6 Snow Leopard(Darwinバージョン10)以降、XNUは
32ビット版のK32と
64ビット版のK64の2つに分かれました。K32では
64ビットアプリケーションをユーザランドで実行可能ですが、K64は、32GBを超える実メモリ(RAM)を扱うことができ、より大きなキャッシュバッファを扱うことでI/Oパフォーマンスが向上します。また、大きなDMAバッファを複数使用する場合でも、すべてのデバイスを
64ビット空間に配置できるため、高性能なネットワークデバイスや複数のGPUを使用する際のパフォーマンスが向上します。
64ビットカーネルをサポートする機種では、起動時に6と4キーを押し続けることでK64で起動できます。K64は
32ビットアプリケーションを実行できますが、
32ビットカーネル機能拡張(KEXT)は実行できないため、これらを読み込めるようにするにはK64に対応させる必要があります。
脚注
外部リンク