XNU

XNUは、Appleが開発・利用しているオペレーティングシステムカーネルであり、macOSの基盤を担っています。オープンソースソフトウェアであるDarwinの一部として公開されており、その名前「XNU」は「X is Not Unix」の略称です。

デザイン


XNUは、モノリシックカーネルとマイクロカーネルの両方の特徴を併せ持つハイブリッドカーネルです。マイクロカーネルの持つモジュール性やメモリ保護の利点と、モノリシックカーネルの持つ高速な実行性能を両立させることを目指しています。現在、XNUはARM、IA-32、x64、PowerPCベースのプロセッサ上で、シングルプロセッサおよびSMP(対称型マルチプロセッシング)環境で動作します。

Mach


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を組み合わせたハイブリッドカーネルでした。

Apple買収後

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に対応させる必要があります。

脚注



外部リンク


もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。