メモリ保護技術
概要
組込みシステムの多機能化、高性能化が進む中、単体のシステム自体が複雑化する一方で、異なるシステムを統合するケースが増えてきました。このとき、統合するソフトウェアは様々な信頼度を持つので、相互のメモリ破壊を防止するために、システムレベルで保護する仕組みが必要になってきています。他方、統合化されたシステムを実現するために、個々のソフトウェアどうしの連携が容易である必要があります。
eT-Kernel Multi-Core Edition Memory Partitioningは、こうしたニーズを受けて開発されたメモリ保護機能です。マルチコアシステムの信頼性と品質の確保を支援します。車載機器、航空・宇宙機器、ハイエンドのコンシューマ機器・OA機器など、Memory Management Unit(MMU)を利用する信頼性と品質へのニーズが高い大規模・高機能なシステムで、特に有効に機能します。
アーキテクチャ
eT-Kernel/ExtendedやeT-Kernel/POSIXなどのプロセスモデルのOSを使えば、プロセスによるカーネルや他のプロセスのメモリ破壊は防止できますが、カーネルアプリケーション(以下、カーネルアプリ)からカーネルやプロセスのメモリを保護する手段がありませんでした。ここでいうカーネルアプリとは、CPUのカーネルモード(特権モード)で動作するデバイスドライバや割り込みハンドラ、ミドルウェアなどのことを言います。eT-Kernel Multi-Core Edition Memory Partitioningは、「カーネルプロテクション」と「コアパーティショニング」の2つの技術で、この問題を解決します。


カーネルプロテクション
カーネルプロテクションは、カーネルをデバイスドライバなどのカーネルアプリから保護する技術です。従来CPUが提供するカーネルモード(特権モード)、ユーザモード(非特権モード)に加え、新たに「システムモード」を追加しました。システムモードで動くプログラムは、プロセスのメモリにはアクセスできますが、カーネルのメモリへのアクセス権限をもちません。カーネルアプリはこのシステムモードで動作させます。もし、カーネルのメモリにアクセスしようとすると、例外マネージャが捕捉してユーザ定義のエラー処理を実行します。このとき、例外マネージャ機能が提供するさまざまな例外情報を利用して、統合的なエラー処理が可能です。システムモードで動作させる場合、カーネルアプリへの変更は必要ありませんので、既存のデバイスドライバやミドルウェアがそのまま再利用できます。
これにより、カーネルのメモリを破壊できるソフトウェアはカーネル以外に存在しないため、カーネルは完全に保護された状態を実現できます。

コアパーティショニング
コアパーティショニングは、ソフトウェアを「パーティション」として分離し、パーティション間でメモリアクセスを防止するための技術です。これにより、システムモードで実行されるカーネルアプリによる、他のパーティションのメモリ破壊を防止できます。eT-Kernel Multi-Core Editionのブレンドスケジューリングは、4つのスケジューリングモードを提供していますが、同一のスケジューリングモードでスケジューリングされ、同じCPUコア(またはCPUコアのグループ)上で動作するタスクセットを「スケジューリングユニット」と呼びます。コアパーティショニングでは、スケジューリングユニットごとにパーティションを作成しますので、パーティションとスケジューリングユニットが指すソフトウェアの範囲は同一になります。

タスクやプロセスも同様に他のパーティション内のメモリにアクセスできないため、作成も同一のパーティション内にしかできません。またプログラムのロードは、ロード処理を行うタスクが属するパーティション内に対してのみ可能です。さらに、他のパーティション内のデバイスドライバやミドルウェアなどの起動も、原則としてできない点も注意が必要です。なおデバイスドライバやミドルウェアをパーティション間で共有する方法を別に用意しています。
特長
異なる信頼度を持つシステムの安全な統合を可能に
カーネルプロテクションとコアパーティショニングにより、異なる信頼度を持つシステムを安全に統合することができます。
ソフトウェア資産の再利用を促進
eT-Kernel Multi-Core Edition Memory Partitioningでは、デバイスドライバやミドルウェアなどのカーネルアプリは、既存のものをそのまま変更せずに再利用できます。また、シングルプロセッサ向けのソフトウェア資産、AMP型システムのソフトウェア資産も安全に再利用できます。もしそれらが予期しない動作をした場合でも、例外マネージャ機能がエラーを捕捉するため、他のパーティションやカーネルのメモリ破壊を検出できます。このためデバッグ時に不具合を発見しやすくなり、システムの信頼性、品質を向上できます。
パーティション間のスムースな連携が容易
パーティション間通信を可能にする2種類のAPIを用意しています。
タスク/プロセス間通信API
シングルコア向けのものと同様のタスク間同期通信・排他APIを、パーティションをまたいだタスク/プロセス間で利用できます。例えば、POSIXの名前付きサービス(名前付きパイプや名前付きセマフォなど)も利用できますし、論理ファイルシステム(LFS)を利用して物理ファイルシステムを複数プラグインすればファイルへの透過的なアクセスも可能です。メッセージボックスやPOSIX APIのメモリベースオブジェクト(mutex、condvarなど)は、パーティション間の共有メモリを利用して使用できます。これにより、シングルコア向けソフト資産でも、マルチコア向けソフト資産でも、再利用が容易です。また、パーティション間でソフトウェアコンポーネントを移動させやすいといったメリットもあります。
パーティション間共有メモリ
複数のパーティション間で使える共有メモリです。mallocライブラリのほかに、もう1種類のメモリ獲得用システムコールが追加されています。MPCoreなどの、キャッシュコヒーレンシの特長を生かせます。
デバイスドライバ、ミドルウェアの共有が可能
ひとつのシステム内の異なる信頼度を持つソフトウェアは原則として、デバイスドライバ、ミドルウェアなどのカーネルアプリを、パーティションを超えて共有することはできませんが、パーティションごとに複数のカーネルアプリを持つことが困難であったり、システム要件上どうしても共有が必要であったりするケースがあります。このようなニーズに対応するために、eT-Kernel Multi-Core Edition Memory Partitioningでは「カーネルリンクエリア」を用意しています。このエリアに配置されたデバイスドライバ、ファイルシステムなどのミドルウェアは、すべてのパーティションのアプリケーションから利用できます。この共有プログラムは、カーネルメモリ以外の、すべてのパーティション内のローカルメモリにアクセスできますが、カーネル以外のアプリケーションからアクセスされることはありません。ただしこのエリアに配置されたプログラムは、パーティション内のメモリを破壊してしまう危険性があるため、非常に高い信頼度が求められます。
開発環境「eBinder」を使って、すべてのパーティションを統合的にデバッグ可能
eT-Kernel Multi-Core EditionただひとつのOSがすべてのパーティションを管理していますので、eBinderを使って、eT-Kernel Multi-Core Edition Memory Partitioningを利用しない場合と同様の手法で統合的にデバッグできます。
ハイパーバイザの課題を克服
メモリ保護機能を実現するにはサーバ分野で発達したハイパーバイザを用いる手法もありますが、eT-Kernel Multi-Core Edition Memory Partitioningは、ハイパーバイザの下記のような課題を解決しています。
- パーティション間のスムースな連携
- パーティション間でのソフトウェアの再配置/再利用
- デバイスドライバやミドルウェアなどカーネルアプリの再利用
- eT-Kernel Multi-Core EditionひとつのOSによるシステム構成 など

