L4マイクロカーネルファミリー

**L4マイクロカーネルファミリー**は第二世代マイクロカーネルのファミリーで、一般的にはUnix系のオペレーティングシステム (OS) の実装に使われるが他の様々なシステムにも使われる。前身のL3マイクロカーネルと同じように、ドイツのコンピュータ科学者ヨッヘン・リートケによってそれ以前のマイクロカーネルベースのオペレーティングシステムの性能の低さを解決する答えとしてL4は作られた。リートケは性能を最優先に設計したシステムであれば実用的なマイクロカーネルを作ることができるのではないかと考えた。彼のインテルi386のアセンブリ言語でハードコードした最初の実装はコンピュータ産業界の関心を引いた。これを始めとしてL4はプラットフォーム非依存、セキュリティの改善、分離、堅牢性に向けた開発が行われた。

オリジナルのL4カーネルインターフェース(ABI)やその後継がいくつも再実装されている。L4KA::Pistachio(カールスルーエ工科大学)、 L4/MIPS(ニューサウスウェールズ大学)、 Fiasco(ドレスデン工科大)，WrmOS(WrmLab)などがある。このためL4はリートケの最初の実装だけを指すのではなくファミリーの名前になっている。
現在ではオリジナルのL4とその改良版のカーネルインターフェースを持つマイクロカーネルファミリーが該当する。L4は広く開発が行われている。一つのバリエーションであるOKL4は(現 ジェネラル・ダイナミクス・ミッション・システムズ)で開発され数十億台のモバイル機器に使われた。

## 設計理念
リートケによるマイクロカーネルの一般的な設計指針は以下のようなものである

ある概念をマイクロカーネル内で実現することが許されるのは、それをカーネルの外に移した場合、すなわち競合する実装が可能となることでシステム必須の機能が妨げられる場合だけである

この考え方に基づいてL4マイクロカーネルはわずかな基本的機構を提供する
* アドレス空間（抽象化されたページテーブルとメモリ保護の提供）
* スレッドとスケジューリング（抽象化された実行と一時的な保護の提供）
* プロセス間通信（分離された領域間の制御された通信）

## 歴史
Machのような第一世代マイクロカーネルのパフォーマンスの低さから、1990年代半ばに多くの開発者がマイクロカーネルについての考え方全体の再検討を行った。Machで使われる非同期のカーネル内バッファリングプロセス間通信が低い性能の原因の一つであることが分かった。このためMachベースのオペレーティングシステム開発者はファイルシステムやデバイスドライバのような時間的な制約が大きい要素をカーネルの中に戻した（XNU参照）。これはいくらかのパフォーマンス改善をもたらすが、真のマイクロカーネルの極小原則（とその利点の大部分）に大きく反する。

Machのボトルネックの詳細な分析によれば、ワーキングセットが大きすぎる事を示している。IPCコードはメモリ空間的な局所性が特に低い。それが非常に多くのカーネル内のキャッシュミスの原因になっている。この分析により、効率のよいマイクロカーネルでは性能最優先のコードの大部分は少なくとも（第一レベル）キャッシュに収まるものでなくてはならず、できればキャッシュのわずかな部分を占める程度であるべき、という原則が導かれた。

### L3
ヨッヘン・リートケは、パフォーマンスに充分注意を払い、（プラットフォーム非依存性に反する形で）マシン固有の設計を行い、うまく作られた小さなIPCレイヤーを使う設計ならば実際のパフォーマンスが大幅に向上することを証明した。 Machの複雑なIPCシステムの代わりに、彼のL3マイクロカーネルはオーバーヘッドを最小限にして単純なメッセージを渡すだけにした。 必要なセキュリティポリシーの定義と実装は、ユーザー空間のサーバーの任務とみなされた。 カーネルの役割は、ユーザーレベルのサーバーがポリシーを実施するのに必要なメカニズムを提供することだけとされた。 1988年に開発されたL3は、例えばTÜV SÜD（ドイツの検査技術協会）などで長く使用され安全で堅牢なオペレーティングシステムであることを示した。

### L4
L3を使った経験から、リートケはいくつかの他のMachの発想も間違っていると結論づけた。マイクロカーネルの概念をさらに単純化して、高性能化を主眼に設計した最初のL4カーネルを開発した。少しでも性能を出せるように、カーネル全体をアセンブリ言語で記述した結果、IPCはMachの20倍高速になった。このような劇的な性能の向上は、オペレーティングシステムでは稀なことでリートケの業績は新たなL4の実装のきっかけとなり、ドレスデン工科大学やニューサウスウェールズ大学などの大学やリートケが1996年に働き始めるIBMなどのいくつもの研究施設でのL4ベースのシステムの研究が始められた。リートケはIBMのトーマス・J・ワトソン研究所で同僚と共にL4とマイクロカーネルシステム一般の研究と特にSawmill OSの研究を続けた。
### L4Ka::Hazelnut
1999年、リートケはカールスルーエ大学のシステムアーキテクチャグループを引き継ぐ形でマイクロカーネルシステムの研究を続けた。高級言語による高性能マイクロカーネルの構築が可能であることを証明するためにグループはIA-32およびARMベースのマシンで動作するカーネルのC++版である**L4Ka::Hazelnut**を開発した。この試みは成功し、性能は依然許容範囲とみなされた。そのためアセンブリ言語だけの版のカーネルは実質的に開発中止になった。
### L4/Fiasco
L4Kaの開発と並行して1998年にTUドレスデン（ドレスデン工科大学）のオペレーティングシステムグループが**L4/Fiasco**と呼ばれるL4カーネルインターフェースの独自のC++実装の開発を始めた。L4Ka::Hazelnutはカーネル内では全く並行動作を認めず、その後継のL4Ka::Pistachioでは特定の割り込みポイントでのみ割り込みが許可されるのに対してL4/Fiascoは割り込みのレイテンシを小さくするために（極めて小さいアトミック処理の部分を除いて）完全プリエンプティブであった。これはTUドレスデンで開発されていたハードリアルタイム処理が可能なオペレーティングシステムDROPSの基礎として使うための必要性からであった。しかし、完全プリエンプティブな設計の複雑さのためFiascoの後継版のカーネルでは限られた割込みポイントを除いてカーネル内では割込みを禁止する従来のL4の方針に戻された。

## プラットフォームの非依存化

### L4Ka::Pistachio
L4Ka::PistachioとFiascoの後期バージョン（1.1以降）がリリースされるまでは全てのL4マイクロカーネルは本質的に根本的なところでCPUアーキテクチャに密接に結びつけられていた。L4開発の次の大きな変革は、高い移植性を得ながら高性能を維持するプラットフォームに依存しないAPIの開発であった。カーネルの基本的な考え方は同じであるが新しいAPIは、マルチプロセッサへのより良い対応、スレッドとアドレス空間の間の制約の緩和、ユーザーレベルスレッドコントロールブロック（UTCB）と仮想レジスタの導入など、それ以前のL4のバージョンからは多数の大きな違いがある。2001年の初めに新しいL4 API（バージョンX.2 、バージョン4と呼ばれることもある）をリリースした後、カールスルーエ大学のシステムアーキテクチャグループは新しいカーネル**L4Ka::Pistachio**の実装を行った。これは性能と移植性の両方を重視して完全にゼロから書き直された。二条項BSDライセンスでリリースされている。

### L4/Fiascoの初期バージョン以降
L4/Fiascoは何年にも渡って大きく改良が続けられた。
* Ver.1.1 x86, ARMのいくつかのアーキテクチャをサポートした
* Ver.1.2 APIの拡張（1.0はv2とX.0 API）
** 例外IPC CPU例外をユーザーアプリケーションに送信可能
** バージョンX.2形式のUTCB
** ローカルIPC
**  システムコールの細かい制御が可能

またFiascoはLinuxのシステムコールへのインターフェースが用意され、Linuxのユーザランドで動かすことができる（Fiasco-UX）。2018年現在、マイクロカーネルFiasco.OCと基本的なユーザー環境のL4Reとしてx86、x86_64、ARM、MIPSのアーキテクチャをサポートして開発が続けられている。L4Re上ではLinuxカーネルを動かすことができる（）。

### ニューサウスウェールズ大学とNICTA
開発はニューサウスウェールズ大学（UNSW）でも続けられいくつかの64ビットプラットフォームでL4実装が行われた。この結果が**L4/MIPS**と**L4/Alpha**である。リートケのオリジナルは遡って**L4/x86**と呼ばれる。UNSWのカーネル（アセンブリ言語とCで書かれている）はリートケのオリジナル同様ゼロから書き起こされたもので移植性が考慮されていなかった。高い移植性を持つL4Ka::PistachioのリリースによりUNSWのグループは自分たちのカーネルを放棄してL4Ka::Pistachioを高度に最適化する事を選んだ。その成果にはその時点での最高速のメッセージパッシングの報告（Itaniumアーキテクチャで36サイクル）もあった。また、ユーザーレベルデバイスドライバがカーネル内のドライバと同等に動作することを実証した。さらにx86、ARM、MIPSの各プロセッサで動くL4上の移植性の高いLinuxであるを開発した。XScaleプロセッサにおいてWombatは本来のLinuxに比較してコンテクストスイッチのコストが1/30となることを実証した。

UNSWグループは後に拠点を（オーストラリアの公的情報通信分野研究機関）に移しL4Ka::Pistachioから分岐した新しいL4、**NICTA::L4-embedded**を開発した。これは名前が示すように商用の組み込みシステム向けで、メモリの使用量を少なくすることを優先して実装され、複雑さを抑えることを目指した。プリエンプションポイントなしでも高いリアルタイム応答性を維持するため、ほとんど全てのシステムコールは十分短時間で終了するようにAPIは変更された。

## 商業的展開
2005年11月、NICTAはクアルコム社の移動局モデムチップセット（Mobile Station Modem：MSM）にNICTA版L4を供給することを発表した。これにより2006年後半以降の携帯電話でL4が使われる事になった。2006年8月、UNSWのジャーノット・ハイザー教授と組み込み用リアルタイムOSリーダーのスピンアウトにより（OK Labs）が設立され、商業目的のL4のサポートを行い、OKL4というブランド名の商業利用向けのL4の開発もNICTAと密接に協力して行った。2008年4月にリリースされたOKL4バージョン2.1は一般利用可能なバージョンのL4でCapability-based securityを特徴に持っていた。2008年10月にリリースされたOKL4 3.0は最後のオープンソース版OKL4である。これ以降のバージョンのOKL4はクローズドソースでネイティブハイパーバイザとして動くように書き換えられOKL4 Microvisorと呼ばれるようになった。OK LabsはまたWombatの後継の準仮想化LinuxをOK:Linuxとして供給し、準仮想化したSymbian OSとAndroidの供給も行った。OK LabはNICTAから**seL4**の権利も取得した。OKL4の出荷は2012年初めには15億台を超えた。ほとんどはクアルコムのワイヤレスモデムチップである。他のものには車載インフォティメントシステムが含まれる。A7以降のAシリーズやTシリーズ、Mシリーズ、SシリーズといったAppleのSoCに含まれるSecure EnclaveコプロセッサではNICTAが2006年に開発したL4-embeddedカーネルベースのL4オペレーティングシステムが動作している。これは現在、全てのiOSデバイスおよびAppleシリコンを搭載したMacやApple WatchでL4が出荷されていることを意味し、2021年の総出荷量はおよそ22億台とされる。

## 高度な保証：seL4
2006年にNICTAのグループは**seL4**と呼ばれる第3世代マイクロカーネルの設計を開始した。これはコモンクライテリア（Common Criteria：略称CC  ISO/IEC 15408規格）を満たす、あるいはそれ以上のセキュリティ要件を満たすために高い安全性と信頼性が得られるような基本方針で設計された。最初からカーネルの形式的証明を目指して開発を行った。性能と検証の時に相反する要求を満たすために、チームはHaskellで書かれた実行可能な定義からソフトウェアによる処理を行いその結果を用る方法をとった。seL4ではオブジェクトのアクセス権についての形式的推論を可能にするために capability-basedアクセス制御 を用いている。

機能の正しさの形式的証明は2009年に完了した。この証明はカーネルの実装がその定義に対して正しいことを示し、従ってデッドロック、ライブロック（あるプロセスがbusy状態のまま実行権を放さなくなってしまう状態を指す）、バッファオーバーフロー、数値演算の例外、初期化していない変数の使用などの実装バグの無いことを意味する。seL4は汎用のOSカーネルとしては初めて証明されたという主張がなされている。

seL4は、カーネルリソースの管理に新しい方法をとっている。カーネルリソースの管理はユーザーレベルに任され、ユーザーリソースと同じCapability-based securityのアクセス制御を受ける。このモデルはチューリッヒ工科大学による研究OSのでも採用されたもので、プロパティ分離についての推論を容易にして、seL4がコアセキュリティプロパティの完全性と秘匿性を強制することを後に証明することを可能にするものとなった。NICTAのチームはCから実行可能な機械語への変換の正確さの確認を行い、seL4のトラステッド・コンピューティング・ベースからコンパイラを取り除いた。これは実行可能なカーネルにおいて高度なセキュリティが証明されているという事である。seL4はまた、ハードリアルタイムシステムに必須な完全性と最悪ケースにおける正確な実行時間の解析を行ったと最初に公表された保護モードのOSカーネルである。

2014年7月29日、とジェネラル・ダイナミクス・は隅から隅まで検証されたseL4をオープンソースでリリースした。カーネルコードと検証コードはGPLv2で提供され、ほとんどのライブラリとツールは2条項BSDライセンスで提供されている。研究者のコメントによれば、ソフトウェアの形式的証明のコストはより高い信頼性を提供するにもかかわらず従来の「高度な保証」を有するソフトウェアを設計するコストよりも低いとしている。具体的には、従来の「高度な保証」を有するソフトウェアでは1行あたりのコストは1000米ドルであるのに対し、開発中のseL4の1行あたりのコストは400米ドルと見積もられた。

NICTAはアメリカ国防高等研究計画局(DARPA)の高保証サイバー軍事システム(High-Assurance Cyber Military Systems(HACMS))計画の下でプロジェクトパートナーのロックウェル・コリンズ社、ガロア社、ミネソタ大学、ボーイング社と共同でseL4ベースの高保証ドローンを保証ツールとソフトウェアと共に開発した。これはボーイングで開発中の操縦も可能な自律型無人ヘリコプターボーイング AH-6への技術移転も計画されていた。最終的なHACMS技術のデモンストレーションは2017年4月、バージニア州スターリングで行われた。

DARPAはまたジョン・ランチベリー博士の提唱でseL4に関連した中小企業技術革新研究プログラム(SBIR)による出資を行った。seL4によるSBIRを受けた企業にはDornerWorks、Techshot、Wearable Inc、Real Time Innovations、Critical Technologiesなどがある。

## その他の研究開発
OskerはHaskellで書かれたOSで、L4の仕様で作られていた。このプロジェクトはマイクロカーネルの研究ではなく関数型プログラミング言語によるOS開発を目的とした。

CodeZeroは組み込みの仮想化とネイティブOSサービスのためのL4マイクロカーネル。これはGPLライセンス版と開発者によって2010年に分岐したクローズドソース版があった。

F9マイクロカーネルはARM Cortex-M3/M4プロセッサの消費電力、メモリ保護に徹底的に注力したゼロから開発されたBSDライセンスのL4実装。

Fiasco.OCは前身のL4/Fiascoから進化した第3世代マイクロカーネル。Fiasco.OCはcapability basedでマルチコアシステムをサポートし、ハードウェア支援による仮想化に対応する。完全に再設計されたユーザーランド環境はL4 Runtime Environment (L4Re)と呼ばれる。クライアント／サーバ通信フレームワーク、共通サービス機能、仮想ファイルシステム基盤、libstdc++やpthread等の一般的なCライブラリなど、マルチコンポーネントシステムを構築するための環境を提供する。これはマルチアーキテクチャ仮想化Linuxシステムのも提供する。L4ReとFiasco.OCは以前のシステムのL4EnvとL4/Fiascoを置き換えたものでx86（IA-32とAMD64）、ARM、MIPSで動作する。

NOVA Microhypervisorは小さなtrusted computing baseを持つセキュアで効率の良い仮想化環境を構築するための研究プロジェクト。 NOVAはマイクロハイパーバイザー、ユーザーレベルの仮想マシンモニタ、NUL(Nova User-Level environment)という非特権でコンポーネント化されたマルチサーバーユーザー環境から構成される。NOVAはx86ベースのマルチコアシステムで動作する。

WrmOSはオープンソースでL4ベースのリアルタイムオペレーティングシステム(RTOS)。カーネルは標準ライブラリとネットワークスタックで実装されている。SPARC、ARM、x86、x86_64のアーキテクチャをサポートする。WrmOSはL4 Kernel Reference Manual Version X.2に基づいている。WrmOS上で準仮想化されたLinuxカーネル（w4linux）が動いている。

## 脚注

## 関連項目

*マイクロカーネル
*分散オペレーティングシステム

## 外部リンク
*The L4 µ-Kernel Family 
*L4Linux : Linux on L4 
*L4Android