(57)【特許請求の範囲】
【請求項１】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するために、前記メモリにマイクロカーネルをロードするステップと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして前記マイクロカーネルを用いて形成するステップと、
前記テンプレート領域をタスクにマッピングすることによって、前記属性の組を有し前記テンプレート領域を指すタスク・ポインタを有する前記タスクを、前記メモリ内に前記マイクロカーネルを用いて形成するステップと、
前記テンプレート・ポインタと前記タスク・ポインタとによって、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立するステップと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するために前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立するステップと
を含む、マイクロカーネル・アーキテクチャ・データ処理システムのためのメモリ管理方法。
【請求項２】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記メモリ内の特殊オブジェクトとしてのテンプレート領域と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立することと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するために前記テンプレート領域に対して仮想記憶動作を実行し、これによって前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立するための手段と
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項３】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
前記データ処理システムの前記メモリに、選択されたオペレーティング・システム・パーソナリティ・プログラムをロードするステップと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記選択されたオペレーティング・システム・パーソナリティ・プログラムから前記マイクロカーネルに呼出しを送るステップと、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングし、前記テンプレート・ポインタと前記タスク・ポインタによって前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立することによって、前記メモリ内で前記マイクロカーネルを用いて形成するステップと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立するステップと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム内で選択されたオペレーティング・システム・パーソナリティ・プログラムを走行させる方法。
【請求項４】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内の選択されたオペレーティング・システム・パーソナリティ・プログラムと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成される前記メモリ内のテンプレート領域と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立することと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立する手段と
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項５】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
前記データ処理システムの前記メモリにパーソナリティ・ニュートラル・サービス・プログラムをロードするステップと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記パーソナリティ・ニュートラル・サービス・プログラムから前記マイクロカーネルに呼出しを送るステップと、
前記属性の組を有し、前記テンプレート領域を指すテンプレート・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングすることによって、前記メモリ内に前記マイクロカーネルを用いて形成するステップと、
前記テンプレート・ポインタと前記タスク・ポインタとによって、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立するステップと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間に第２マッピング関係を確立するステップと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム内でパーソナリティ・ニュートラル・サービス・プログラムを走行させる方法。
【請求項６】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内のパーソナリティ・ニュートラル・サービス・プログラムと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成された前記メモリ内のテンプレート領域と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
前記テンプレート・ポインタと前記タスク・ポインタが、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立することと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立する手段と
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項７】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
前記データ処理システムの前記メモリにアプリケーション・プログラムをロードするステップと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記アプリケーション・プログラムから前記マイクロカーネルに呼出しを送るステップと、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングすることによって、前記メモリ内で前記マイクロカーネルを用いて形成するステップと、
前記テンプレート・ポインタと前記タスク・ポインタによって、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立するステップと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立するステップと
を含む、マイクロカーネル・アーキテクチャ・データ処理システムでアプリケーション・プログラムを走行させる方法。
【請求項８】
データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内のアプリケーション・プログラムと、
仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成された前記メモリ内のテンプレート領域と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスク・ポインタにマッピングすることによって形成される、前記メモリ内の前記タスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第１マッピング関係を確立することと、
前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第２マッピング関係を確立する手段と
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項９】
プログラムされた命令を記憶するための補助記憶手段と、
前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
仮想アドレス空間を定義する属性の組と、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタとを有する、前記メモリ手段内のテンプレート領域と、
前記メモリ手段内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
前記マイクロカーネル手段が前記テンプレート領域をタスクへマッピングすることによって形成される、前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記メモリ手段内の前記タスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第１マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
前記プロセッサ手段内での実行のため、前記第１マッピング関係を使用して、前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッド・オブジェクトと、
前記キャッシュ・オブジェクトに向かう前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記キャッシュ・オブジェクトとの間の前記第１マッピング関係を変更する手段と
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項１０】
プログラムされた命令を含むキャッシュ・オブジェクトを記憶するためのメモリ手段と、
属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内でタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内のタスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第１マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
前記プロセッサ手段内での実行のため、前記第１マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッドと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項１１】
プログラムされた命令を記憶するための補助記憶手段と、
前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内にタスクを形成するための、前記メモリ手段内のマイクロカーネル手段と、
前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内のタスクと、
前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第１マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
前記プロセッサ手段内での実行のため、前記第１マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッドと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項１２】
プログラムされた命令を記憶するための補助記憶手段と、
前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
属性の組を有し、前記キャッシュ・オブジェクトに向かう第１テンプレート・ポインタと第２テンプレート・ポインタとを有する、前記メモリ手段内のテンプレート領域と、
前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内にタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
前記属性の組を有し、前記テンプレート領域を指す第１タスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内の第１タスクと、
前記第１テンプレート・ポインタと前記第１タスク・ポインタとが、前記第１タスクと前記キャッシュ・オブジェクトとの間の第１マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合された第１プロセッサ手段と、
前記第１プロセッサ手段内での実行のため、前記第１マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第１タスクに関連する前記メモリ手段内の第１スレッドと、
前記属性の組を有し、前記テンプレート領域を指す第２タスク・ポインタを有する、前記マイクロカーネル手段によって形成された前記メモリ手段内の第２タスクと、
前記第２テンプレート・ポインタと前記第２タスク・ポインタとが、前記第２タスクと前記キャッシュ・オブジェクトとの間の第２マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合された第２プロセッサ手段と、
前記第２プロセッサ手段内での実行のため、前記第２マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第２タスクに関連する前記メモリ手段内の第２スレッドと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【請求項１３】
プログラムされた命令を記憶するための補助記憶手段と、
前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内でタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
前記属性の組を有し、前記テンプレート領域を指す第１タスク・ポインタを有する、前記マイクロカーネルによって形成される前記メモリ手段内の第１タスクと、
前記第１テンプレート・ポインタと前記タスク・ポインタとが、前記第１タスクと前記キャッシュ・オブジェクトとの間のマッピング関係を確立することと、前記プログラムされた命令を実行するための、前記メモリ手段に結合された第１プロセッサ手段と、
前記第１プロセッサ手段内での実行のため、前記マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第１タスクに関連する前記メモリ手段内の第１スレッドと、
前記属性の組を有し、前記テンプレート領域を指す第２タスク・ポインタを有する、前記マイクロカーネル手段によって形成された前記メモリ手段内の第２タスクと、
前記テンプレート・ポインタと前記第２タスク・ポインタとが、前記第２タスクと前記キャッシュ・オブジェクトとの間の前記マッピング関係を確立することと、
前記プログラムされた命令を実行するための、前記メモリ手段に結合された第２プロセッサ手段と、
前記第２プロセッサ手段内での実行のため、前記マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第２タスクに関連する前記メモリ手段内の第２スレッドと
を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
ここに開示される発明は、広義にはデータ処理システムに関し、具体的にはデータ処理システム用のオペレーティング・システムの改善に関する。
【０００２】
【従来の技術】
オペレーティング・システムは、コンピュータ上で稼動する最も重要なソフトウェアである。汎用コンピュータのすべてが、他のプログラムを実行させるためのオペレーティング・システムを有する必要がある。通常、オペレーティング・システムは、キーボードからの入力の認識、表示画面への出力の送出、ディスク上のファイルやディレクトリの記録、ディスク駆動装置やプリンタなどの周辺装置の制御などの基本的なタスクを実行する。より複雑なシステムの場合、オペレーティング・システムは、より大きな責任と能力とを有する。これによって、同時に実行される異なるプログラムやユーザが、互いに干渉しないことが保証される。また、オペレーティング・システムは、通常はセキュリティの責任も有し、これによって、許可されていないユーザがそのシステムをアクセスできないことを保証する。
【０００３】
オペレーティング・システムは、マルチユーザ・オペレーティング・システム、マルチプロセッサ・オペレーティング・システム、マルチタスク・オペレーティング・システムおよびリアルタイム・オペレーティング・システムとして分類することができる。マルチユーザ・オペレーティング・システムでは、複数のユーザが同時にプログラムを実行させることができる。一部のオペレーティング・システムは、同時に数百人から数千人のユーザを受け入れる。マルチプロセッシング・プログラムを用いると、単一のユーザが同時に複数のプログラムを実行させることができるようになる。実行されるプログラムのそれぞれを、プロセスと呼ぶ。ほとんどのマルチプロセッシング・システムは、複数のユーザをサポートする。マルチタスク・システムでは、単一のプロセスで複数のタスクを実行させることができる。「マルチタスク」と「マルチプロセッシング」にはわずかに異なる意味があるが、一般的な用語では、この２つが交換可能に使用されることがしばしばである。マルチタスクとは、同時に複数のタスクを実行する能力であり、１つのタスクが１つのプログラムである。マルチタスキングでは、１つの中央処理装置だけが使用されるが、この中央処理装置が、あるプログラムから別のプログラムへ非常にすばやく切り替えられるので、すべてのプログラムが同時に実行されているようにみえる。マルチタスキングには、プリエンプティブ（ｐｒｅｅｍｐｔｉｖｅ、先取り式）とコオペラティブ（ｃｏｏｐｅｒａｔｉｖｅ、協調式）という２つの基本タイプがある。プリエンプティブ・マルチタスキングでは、オペレーティング・システムが、ＣＰＵタイム・スライスを各プログラムに分配する。コオペラティブ・マルチタスキングでは、各プログラムが、必要なだけいつまでもＣＰＵを制御することができる。しかし、あるプログラムがＣＰＵを使用していない場合、そのプログラムは、他のプログラムに一時的にＣＰＵの使用を許可することができる。たとえば、ＯＳ／２（登録商標）とＵＮＩＸ（登録商標）オペレーティング・システムは、プリエンプティブ・マルチタスキングを使用し、マッキントッシュ（Ｍａｃｉｎｔｏｓｈ、登録商標）コンピュータ用のマルチファインダ（ＭｕｌｔｉＦｉｎｄｅｒ、登録商標）オペレーティング・システムは、コオペラティブ・マルチタスキングを使用する。マルチプロセッシングとは、コンピュータ・システムの、同時に複数のプロセスまたはプログラムをサポートする能力を指す。マルチプロセッシング・オペレーティング・システムでは、複数のプログラムを同時に走行させることができる。マルチプロセッシング・システムは、オペレーティング・システムが競合するプロセスに正当な形で資源を割り振らなければならないので、シングルプロセス・システムよりはるかに複雑である。リアルタイム・オペレーティング・システムは、入力に即座に応答する。ＤＯＳやＵＮＩＸなどの汎用オペレーティング・システムは、リアルタイムではない。
【０００４】
オペレーティング・システムは、アプリケーション・プログラムが走行する基礎となるソフトウェア・プラットホームを提供する。アプリケーション・プログラムは、特定のオペレーティング・システムの上で走行するように特別に記述される必要がある。したがって、オペレーティング・システムの選択によって、実行可能なアプリケーションの大部分が決定される。ＩＢＭ互換パーソナル・コンピュータの場合、オペレーティング・システムの例として、ＤＯＳ、ＯＳ／２（登録商標）、ＡＩＸ（登録商標）およびＸＥＮＩＸ（登録商標）がある。
【０００５】
ユーザは通常、１組のコマンドを介してオペレーティング・システムと対話する。たとえば、ＤＯＳオペレーティング・システムには、ファイルをコピーするためのＣＯＰＹコマンドやファイル名を変更するためのＲＥＮＡＭＥコマンドなどのコマンドが含まれる。コマンドは、コマンド・プロセッサまたはコマンド・ライン・インタープリタと呼ばれるオペレーティング・システムの一部によって受け取られ、実行される。
【０００６】
パーソナル・コンピュータ用には、ＣＰ／Ｍ（登録商標）、ＤＯＳ、ＯＳ／２（登録商標）、ＵＮＩＸ（登録商標）、ＸＥＮＩＸ（登録商標）、ＡＩＸ（登録商標）など、多数の異なるオペレーティング・システムが存在する。ＣＰ／Ｍは、小型コンピュータ用の最初のオペレーティング・システムの１つである。ＣＰ／Ｍは、当初は広い範囲のパーソナル・コンピュータで使用されたが、最終的にＤＯＳにとってかわられた。ＤＯＳは、ＩＢＭ互換パーソナル・コンピュータのすべてで走行する、シングル・ユーザ、シングル・タスクのオペレーティング・システムである。ＤＯＳの後継オペレーティング・システムであるＯＳ／２は、インテル（Ｉｎｔｅｌ）社の８０２８６以降のマイクロプロセッサを使用するＩＢＭ互換パーソナル・コンピュータ上で走行する、かなり強力なオペレーティング・システムである。ＯＳ／２は、全般的にＤＯＳと互換であるが、たとえばマルチタスキングや仮想メモリのサポートなど、多くの追加機能を含む。ＵＮＩＸとＵＮＩＸベースのＡＩＸは、広範囲のパーソナル・コンピュータおよびワーク・ステーション上で走行する。ＵＮＩＸとＡＩＸは、ワーク・ステーション用の標準オペレーティング・システムとなっており、強力なマルチユーザ、マルチプロセッシング・オペレーティング・システムである。
【０００７】
１９８１年にＩＢＭパーソナル・コンピュータが米国で初めて公表された時、ＤＯＳオペレーティング・システムは、約１０ＫＢの記憶域を専有していた。それ以来、パーソナル・コンピュータは、はるかに複雑になり、はるかに大きなオペレーティング・システムが必要になった。たとえば現在、ＩＢＭパーソナル・コンピュータ用のＯＳ／２オペレーティング・システムは、２２ＭＢもの記憶域を占める可能性がある。パーソナル・コンピュータは、時の流れに伴ってますます複雑かつ強力になるが、これらのシステムに関連する記憶装置にかなりの記憶ペナルティを課すことなしに継続的にオペレーティング・システムのサイズと複雑さを増大させることは、明らかに不可能である。
【０００８】
オペレーティング・システムのサイズのこの増加速度は擁護できないので、１９８０年代にカーネギー・メロン（Ｃａｒｎｅｇｉｅ  Ｍｅｌｌｏｎ）大学でＭＡＣＨプロジェクトが行われた。この研究の目標は、新たに生まれる現代のコンピュータ・アーキテクチャをコンピュータ・プログラマが利用できるようにし、なおかつカーネル・オペレーティング・システムのサイズと機能の数を減らした、新しいオペレーティング・システムを開発することであった。カーネルとは、オペレーティング・システムのうちで、ハードウェア資源の割振りなどの基本機能を実行する部分である。ＭＡＣＨカーネルの場合、５つのプログラミング・アブストラクション（Ｐｒｏｇｒａｍｍｉｎｇ  ａｂｓｔｒａｃｔｉｏｎ）が、システムの基本構成要素として確立された。これらは、通常の複雑な動作をカーネルの外部で構築できるようにするための有用なシステムを作るために最小限必要なものとして選択された。カーネギー・メロンＭＡＣＨカーネルは、リリース３．０でサイズを減らされ、ＭＡＣＨマイクロカーネルと呼ばれる完全に機能するオペレーティング・システムになった。ＭＡＣＨマイクロカーネルには、タスク、スレッド、ポート、メッセージおよびメモリ・オブジェクトというプリミティブがある。
【０００９】
タスクとは、ＭＡＣＨマイクロカーネル内で２つの別々の構成要素に分割される従来のＵＮＩＸプロセスである。その第１の構成要素がタスクであり、これには、協働する実体のグループ用の資源のすべてが含まれる。あるタスクに含まれる資源の例が、仮想メモリと通信ポートである。タスクは、資源の受動的な集合であり、プロセッサ上では走行しない。
【００１０】
ＵＮＩＸプロセスの第２の構成要素がスレッドであり、これは、能動的な実行環境である。各タスクは、スレッドと呼ばれる１つまたは複数の同時に実行される計算をサポートできる。たとえば、マルチスレッド・プログラムでは、１つのスレッドを科学計算の計算に使用し、もう１つのスレッドをユーザ・インターフェースの監視に使用することができる。ＭＡＣＨタスクは、すべてが同時に走行する多数の実行スレッドを有することができる。ＭＡＣＨプログラミング・モデルの威力の多くが、１タスク内のすべてのスレッドがそのタスクの資源を共用するという事実に由来する。たとえば、これらのスレッドのすべてが、同一の仮想メモリ（ＶＭ）アドレス空間を有する。しかし、１タスク内の各スレッドは、それ自体の私有実行状態を有する。この状態は、汎用レジスタ、スタック・ポインタ、プログラム・カウンタ、フレーム・ポインタなどのレジスタの組からなる。
【００１１】
ポートとは、スレッドがそれを介して互いに通信する通信チャネルである。ポートは資源であり、タスクによって所有される。スレッドは、タスクに属することによってポートへのアクセス権を得る。協働するプログラムは、あるタスクのスレッドに別のタスクのポートへのアクセス権を与えることができる。ポートの重要な特徴は、ポートの位置が透過的であるということである。この能力のおかげで、プログラムを修正せずにネットワークを介してサービスを分散することが簡単になる。
【００１２】
メッセージは、異なるタスクのスレッドが互いに通信できるようにするのに使用される。メッセージには、所与のクラスまたは型のデータの集合が含まれる。このデータには、数や文字列などのプログラム固有データから、タスクから別のタスクへのポートの転送機能などのＭＡＣＨ関連データまでが含まれる。
【００１３】
メモリ・オブジェクトとは、ＭＡＣＨマイクロカーネルの鍵となる特徴である、従来のオペレーティング・システム機能をユーザ・レベル・プログラムで実行する能力をサポートするアブストラクション（ａｂｓｔｒａｃｔｉｏｎ）である。たとえば、ＭＡＣＨマイクロカーネルは、ユーザ・レベル・プログラムで仮想メモリページング・ポリシーをサポートする。メモリ・オブジェクトは、この能力をサポートするためのアブストラクションである。
【００１４】
これらの概念のすべてが、ＭＡＣＨマイクロカーネル・プログラミング・モデルの基礎であり、カーネル自体で使用される。カーネギー・メロン大学のＭＡＣＨマイクロカーネルのこれらの概念および他の特徴は、ボイキン（Ｊｏｓｅｐｈ  Ｂｏｙｋｉｎ）他著、”Ｐｒｏｇｒａｍｍｉｎｇ  Ｕｎｄｅｒ  ＭＡＣＨ”，  Ａｄｄｉｓｏｎ  Ｗｅｓｓｅｌｙ  Ｐｕｂｌｉｓｈｉｎｇ  Ｃｏｍｐａｎｙ，  Ｉｎｃｏｒｐｏｒａｔｅｄ、１９９３年に記載されている。
【００１５】
ＵＮＩＸパーソナリティをサポートするためのマイクロカーネルの使用に関する追加の議論は、アセッタ（Ｍｉｋｅ  Ａｃｃｅｔｔａ）他著の論文、”ＭＡＣＨ：  Ａ  Ｎｅｗ  Ｋｅｒｎｅｌ  Ｆｏｕｎｄａｔｉｏｎ  ｆｏｒ  ＵＮＩＸ  Ｄｅｖｅｌｏｐｍｅｎｔ”，  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  Ｓｕｍｍｅｒ  １９８６  ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ，  Ａｔｌａｎｔａ，  Ｇｅｏｒｇｉａに記載されている。この話題に関するもう１つの技術論文が、ゴラブ（Ｄａｖｉｄ  Ｇｏｌｕｂ）他著、”ＵＮＩＸ  ａｓ  ａｎ  Ａｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍ”，  Ｐｒｏｃｅｅｄｉｎｇｓ  ｏｆ  ｔｈｅ  Ｓｕｍｍｅｒ  １９９０  ＵＳＥＮＩＸ  Ｃｏｎｆｅｒｅｎｃｅ，  Ａｎａｈｅｉｍ，  Ｃａｌｉｆｏｒｎｉａである。
【００１６】
現在のマイクロカーネル実施態様に関する問題の１つが、仮想記憶動作（ｍｅｍｏｒｙ  ｏｐｅｒａｔｉｏｎ）のすべてがタスクに基づくということである。仮想メモリ呼出しの多くが、必ずしも単一のタスクに制限されるものではないので、これは不適切な要件である。また、これによって、重大な機密漏れが導入される。あるタスクの代わりに別のタスクが仮想メモリサブシステムの一部を操作できるようにするためには、あるタスクの制御ポートを別のタスクに与えなければならない。あるタスクの制御ポートを与えられたならば、そのタスクは、第１のタスクのセキュリティを破ることができる。さらに、仮想メモリ機能のすべてをタスク上で動作させることによって、必ずしもタスク操作の一部である必要がない仮想メモリ呼出しのすべてに関して、タスク・インターフェースが過度に複雑になる。現在のマイクロカーネル用仮想メモリインターフェースのもう１つの問題は、それらの多くが、メモリの範囲に対して動作することである。タスクは、多くのメモリ範囲からなる場合があるので、このインターフェース定義には、複数のメモリ範囲に対する動作を自然に制限するものが存在しない。たとえば、予約されているメモリの範囲がある場合、予約済みの範囲とそれに隣接する未予約の範囲にまたがるメモリ割振りなどの動作を防止するための明白な制限はない。このため、メモリ内のオブジェクトの内容が破壊されるという望ましくない結果が生じる。
【００１７】
【発明が解決しようとする課題】
したがって、本発明の目的は、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【００１８】
本発明のもう１つの目的は、従来技術で可能であったものよりも仮想記憶動作が単純化されている、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【００１９】
本発明のもう１つの目的は、タスクに関するセキュリティを強化された、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【００２０】
本発明のもう１つの目的は、メモリ内で定義されたオブジェクトの破壊に対してより強く抵抗する、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【００２１】
【課題を解決するための手段】
上記その他の目的、特徴および長所は、本明細書に記載の発明に従うマップ済み領域および未マップ領域を管理するための方法および装置によって達成される。
【００２２】
本発明は、マイクロカーネル・アーキテクチャ用のメモリ管理方法およびマイクロカーネル構造自体である。本発明は、特殊オブジェクトとしてメモリ内でマイクロカーネルによって定義されるテンプレート領域を特徴とする。このメモリ管理方法では、マイクロカーネルが、データ処理システムのメモリにロードされた後に、メモリ内でタスク・コンテナの作成を開始できる。これは、まず、メモリ内の特殊オブジェクトとしてテンプレート領域を形成し、各テンプレート領域が、対応するタスク・コンテナを定義する属性の組を有するようにすることによって行われる。この属性によって、仮想メモリ、データ、通信ポートなど、あるタスクがそのスレッドによる使用のために使用可能な資源を指定することができる。その後、マイクロカーネルは、テンプレート領域によって指定された属性をタスクにマッピングすることによって、メモリ内でタスクを形成することができる。マイクロカーネルは、テンプレート領域に基づいてタスク用の仮想アドレス空間を定義する。その後、マイクロカーネルがテンプレート領域に対する仮想記憶動作を実行する時には、その仮想記憶動作の効果が、マッピング関係によってタスクに明示される。
【００２３】
マイクロカーネルは、テンプレート領域からのサイズ属性と、タスクの開始仮想アドレスとを使用して、仮想アドレスでのタスクを表すデータ構造を定義する。マイクロカーネルは、テンプレート領域からの属性を使用して、タスクのスレッドが動作を行うことのできる、タスク用の仮想アドレス空間を定義する。また、マイクロカーネルは、タスクのタスク名を定義し、そのタスクが通信チャネルとして使用するためのメモリ内のポート名前空間を形成する。マイクロカーネルは、テンプレート領域からの属性の組を使用して、そのタスク用のポート名前空間に関するアクセス権を定義する。その後、マイクロカーネルは、タスクの仮想アドレス空間から命令を取り出すために、そのタスク用のメモリ内にスレッド・オブジェクトを形成することができる。
【００２４】
本発明によれば、マイクロカーネルは、テンプレート領域を指す、タスク用の第１ポインタを定義する。テンプレート領域内には、ＰＭＡＰと呼ばれるマッピング・テーブルを直接または間接に指す第２ポインタがある。ＰＭＡＰによって、第２ポインタの仮想アドレス値が、そのタスクが使用するデータのページを含むメモリ内のキャッシュ・オブジェクトの物理アドレスに変換される。時々、あるタスクのデータ資源に変更を加えることが所望される。これは、テンプレート領域内の第２ポインタによって表される仮想アドレス値を変更することによって達成される。変更された第２ポインタは、ＰＭＡＰ内の異なる変換値を指すことができ、これによって、望みどおりの異なるページやキャッシュ・オブジェクトのアドレッシングがもたらされる。しかし、タスクの内容自体に変更を加える必要はない。キャッシュ・オブジェクト内のデータなどのタスク資源は、テンプレート領域内の第２ポインタを介してタスクによってアドレッシングされる。マイクロカーネルが、テンプレート領域から複数のタスクを定義している場合、テンプレート領域内の第２ポインタを変更することによって、そのテンプレート領域を指す複数のタスクから使用可能な資源の大域的な変更がもたらされる。タスクによってアドレッシングされるデータ・ページは、タスクのそれぞれの内容を変更するのではなく、テンプレート領域内の第２ポインタを１回だけ変更することによって変更できる。この形で、単一のテンプレート領域を複数のタスクに同時にマッピングすることができる。各タスクから、このテンプレート領域に対して行われた変更のすべてが見える。これによって、同一のテンプレート領域から生成されたタスクによる、特性の共用が可能になる。
【００２５】
テンプレート領域は、すべての仮想記憶動作が向けられるオブジェクトである。かつてのＭＡＣＨマイクロカーネルでは、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作を、その動作が実施されるテンプレート領域に向けることによって、仮想記憶動作の共用がはるかに簡単に達成される。というのは、各タスク内の領域のマッピングではなく、１つの領域に対して変更が行われるからである。
【００２６】
【実施例】
パートＡ  マイクロカーネル・システム
第１節  マイクロカーネルの原理
図１は、マイクロカーネル１２０とパーソナリティ・ニュートラル・サービス（ＰＮＳ）１４０が、さまざまなハードウェア・プラットホーム上で複数のオペレーティング・システムのパーソナリティ・サーバ１５０を走行させる方法を示す、マイクロカーネル・システム１１５の機能ブロック図である。
【００２７】
図１に示されたホスト多重プロセッサ１００には、たとえばディスク駆動装置、読取り専用光学記憶装置、読み書き可能光学記憶装置または他の大量記憶装置とすることができる補助記憶装置１０６にバス１０４によって接続されたメモリ１０２が含まれる。やはりバス１０４に接続されているのが、キーボード、モニタ表示装置、遠隔通信アダプタ、ローカル・エリア・ネットワーク・アダプタ、モデム、マルチメディア・インターフェース装置または他の入出力装置に接続することができる入出力アダプタ１０８である。やはりバス１０４に接続されているのが、第１のプロセッサＡ  １１０と第２のプロセッサＢ  １１２である。図１に示された例は、２つの単一プロセッサであるプロセッサＡ  １１０とプロセッサＢ  １１２が共通のメモリ１０２アドレス空間を共用する対称多重プロセッサ構成である。単一プロセッサまたは多重プロセッサの他の構成を、同等に適した例として示すことができる。プロセッサは、たとえばインテル社の３８６ＣＰＵ（登録商標）、インテル社の４８６ＣＰＵ（登録商標）、ペンティアム（Ｐｅｎｔｉｕｍ、登録商標）プロセッサ、パワーＰＣ（ＰｏｗｅｒＰＣ、登録商標）プロセッサまたは他の単一プロセッサ装置とすることができる。
【００２８】
メモリ１０２には、マイクロカーネル・システム１１５が記憶され、このマイクロカーネル・システム１１５には、マイクロカーネル１２０、パーソナリティ・ニュートラル・サービス１４０およびパーソナリティ・サーバ１５０が含まれる。マイクロカーネル・システム１１５は、メモリ１０２に記憶されたアプリケーション・プログラム１８０のためのオペレーティング・システムとして働く。
【００２９】
本発明の１目的は、ＵＮＩＸやＯＳ／２などの従来のオペレーティング・システムと同様に振る舞うオペレーティング・システムを提供することである。言い換えると、このオペレーティング・システムは、ＯＳ／２やＵＮＩＸまたは他の従来のオペレーティング・システムのパーソナリティを有する。
【００３０】
マイクロカーネル１２０には、ホスト多重プロセッサ１００の最高優先状態で走行する、この計算機の基本動作を制御するシステム・ソフトウェアの小さなメッセージ受渡し核が含まれる。マイクロカーネル・システム１１５には、マイクロカーネル１２０と、パーソナリティ・ニュートラル・サービス１４０を提供するサービスおよびデバイス・ドライバの組とが含まれる。その名が示すように、パーソナリティ・ニュートラル・サービスとデバイス・ドライバは、ＵＮＩＸやＯＳ／２などのパーソナリティに依存しない。これらは、マイクロカーネル１２０に依存し、また、互いに依存する。パーソナリティ・サーバ１５０は、マイクロカーネル１２０のメッセージ渡しサービスを使用して、パーソナリティ・ニュートラル・サービス１４０と通信する。たとえば、ＵＮＩＸ、ＯＳ／２または他のパーソナリティ・サーバは、パーソナリティ・ニュートラル・ディスク・ドライバにメッセージを送り、そのディスクから１ブロックのデータを読み取るよう要求することができる。このディスク・ドライバは、そのブロックを読み取り、それをメッセージに入れて返す。メッセージ・システムは、ポインタ操作によって大量のデータをすばやく転送できるように最適化されており、データ自体はコピーされない。
【００３１】
そのサイズと、標準的なプログラミング・サービスおよび特徴をアプリケーション・プログラムとしてサポートする能力のおかげで、マイクロカーネル１２０は、標準的なオペレーティング・システムより単純である。マイクロカーネル・システム１１５は、さまざまな形で構成されるモジュラー片に分解され、小さな片にモジュラー片を追加することによってより大きなシステムを作成できるようになっている。たとえば、各パーソナリティ・ニュートラル・サービス１４０は、論理的に分離されており、さまざまな形で構成することができる。各サーバは、アプリケーション・プログラムとして走行し、アプリケーション・デバッガを使用してデバッグすることができる。各サーバは、別々のタスク内で走行し、サーバのエラーは、そのタスクの中に閉じこめられる。
【００３２】
図１には、プロセス間通信モジュール（ＩＰＣ）１２２と、仮想メモリモジュール１２４と、タスクおよびスレッド・モジュール１２６と、ホストおよびプロセッサ・セット１２８と、入出力サポートおよび割込み１３０と、マシン依存コード１２５とを含むマイクロカーネル１２０が示されている。
【００３３】
図１に示されたパーソナリティ・ニュートラル・サービス１４０には、マスタ・サーバ、初期設定および命名を含む多重パーソナリティ・サポート１４２が含まれる。パーソナリティ・ニュートラル・サービスには、デフォルト・ページャ１４４も含まれる。パーソナリティ・ニュートラル・サービスには、多重パーソナリティ・サポートとデバイス・ドライバを含むデバイス・サポート１４６も含まれる。パーソナリティ・ニュートラル・サービスには、ファイル・サーバ、ネットワーク・サービス、データベース・エンジンおよびセキュリティを含む他のパーソナリティ・ニュートラル・プロダクト１４８も含まれる。
【００３４】
パーソナリティ・サーバ１５０は、たとえば主要パーソナリティ１５２であり、これは、たとえばＵＮＩＸパーソナリティとすることができる。主要パーソナリティには、ＵＮＩＸサーバになるはずの主要パーソナリティ・サーバ１５４と、ＵＮＩＸ主要パーソナリティをサポートするはずの他の主要パーソナリティ・サービス１５５が含まれる。代替パーソナリティ１５６は、たとえばＯＳ／２とすることができる。代替パーソナリティ１５６には、ＯＳ／２パーソナリティの特徴を表すはずの代替パーソナリティ・サーバ１５８と、ＯＳ／２用の他の代替パーソナリティ・サービス１５９が含まれる。
【００３５】
図１に示された、ＵＮＩＸ主要パーソナリティの例に関連する主要パーソナリティ・アプリケーション１８２は、ＵＮＩＸオペレーティング・システム・パーソナリティである主要パーソナリティ１５２の上で走行するはずのＵＮＩＸタイプのアプリケーションである。図１に示された代替パーソナリティ・アプリケーション１８６は、ＯＳ／２代替パーソナリティ・オペレーティング・システムである代替パーソナリティ１５６の上で走行するＯＳ／２アプリケーションである。
【００３６】
図１には、マイクロカーネル・システム１１５の実装が、プロセッサ・タイプからプロセッサ・タイプへ完全に可搬であるコードと、実行中の特定の計算機のプロセッサのタイプに依存するコードに注意深く分離されていることが示されている。また、装置に依存するコードはデバイス・ドライバに分離されている。しかし、デバイス・ドライバのコードは、装置依存ではあるが、必ずしもプロセッサ・アーキテクチャに依存するとは限らない。１タスクあたり複数のスレッドを使用することによって、特定の計算機が多重プロセッサであることを必要とせずに多重プロセッサの使用を可能にするアプリケーション環境がもたらされる。単一プロセッサ上では、異なるスレッドは異なる時刻に走行する。多重プロセッサのために必要なサポートのすべてが、小さく単純なマイクロカーネル１２０に集中している。
【００３７】
この節では、マイクロカーネル・システム１１５の構造の概観を提供する。後の節で、この構造の構成要素のそれぞれを詳細に説明し、マイクロカーネル・システム１１５のサービスを使用する新しいプログラムを作るのに必要な技術を説明する。
【００３８】
マイクロカーネル・システム１１５は、オペレーティング・システムのための新しい基礎である。これは、次の特徴を有するオペレーティング・システム開発用の理解しやすい環境を提供する。
・多重パーソナリティのサポート
・拡張可能なメモリ管理
・プロセス間通信
・マルチスレッド
・マルチプロセッシング
【００３９】
マイクロカーネル・システム１１５は、純粋カーネルとして実装されたカーネル・サービスの簡潔な組と、ユーザ・レベル・サーバの組として実装されるオペレーティング・システム・パーソナリティを作るための拡張サービスの組とを提供する。
【００４０】
マイクロカーネル・システム１１５の目標には、下記が含まれる。
・複数のオペレーティング・システム・パーソナリティが互いに協調して働けるようにすること
・デバイス・ドライバやファイル・システムなどの低水準システム要素のための共通プログラミングを提供すること
・オペレーティング・システムとユーザ・アプリケーションの両方で並列性を利用すること
・柔軟なメモリ共用を有する、大きく、潜在的に疎なアドレス空間をサポートすること
・透過的なネットワーク資源アクセスを可能にすること
・ＯＳ／２やＵＮＩＸなどの既存のソフトウェア環境と互換であること
・可搬であること（３２ビット・プラットホームと６４ビット・プラットホームに対して）
【００４１】
マイクロカーネル・システム１１５は、下記の概念に基づく。
・多くの従来のオペレーティング・システム機能（たとえば、ファイル・システムやネットワークのアクセス）を実行するユーザ・モード・タスク
・オペレーティング・システムを作成するためのユーザ・レベル実行時サービスの基本セット
・単純で拡張可能な通信カーネル
・オブジェクト参照としての通信チャネルを有するオブジェクト基礎
・同期式および非同期式のプロセス間通信を使用する、クライアント／サーバ・プログラミング・モデル
【００４２】
マイクロカーネル・システム１１５の基礎は、単純で拡張可能な通信カーネルを提供することである。マイクロカーネル・システム１１５の目的は、ユーザ空間またはカーネル空間のいずれかでの、最小量のカーネル固有機能を用いる、柔軟なサービスの構成を可能にすることである。このカーネルは、タスク対タスク通信の他に、下記を含む他のサポートを提供しなければならない。
・制御点の管理（スレッド）
・資源割当て（タスク）
・タスク用アドレス空間のサポート
・物理メモリ、プロセッサ、割込み、ＤＭＡチャネル、クロックなどの物理資源の管理
【００４３】
ユーザ・モード・タスクは、資源の使用に関するポリシーを実施する。カーネルは、このポリシーを実行するための機構を提供するにすぎない。論理的にカーネルの上にあるのが、パーソナリティ・ニュートラル・サービス１４０層である。パーソナリティ・ニュートラル・サービスは、Ｃ実行時環境を提供する。これには、文字列関数などの基本構造と、下記を含むサーバの組が含まれる。
・名前サーバ  クライアントがサーバを見つけられるようにする
・マスタ・サーバ  プログラムのロードと開始を可能にする
【００４４】
カーネル・アブストラクション（Ｋｅｒｎｅｌ  Ａｂｓｔｒａｃｔｉｏｎｓ）
マイクロカーネル・システム１１５の目標の１つは、カーネル自体によって提供されるアブストラクションを最小にすることであるが、これは、これらのアブストラクションに関連するセマンティックスにおける最小化ではない。提供されるアブストラクションのそれぞれが、それに関連するセマンティックスの組と、他のアブストラクションとの相互作用の複雑な組を有する。このため、鍵となる発想の識別が困難になる可能性がある。主なカーネル・アブストラクションは、次の通りである。
・タスク  資源割振りの単位であり、大きなアクセス空間とポート権を有する
・スレッド  ＣＰＵ利用の単位であり、軽量（低オーバーヘッド）である
・ポート  通信チャネルであり、送出／受取りの能力または権利を介してのみアクセス可能である
・メッセージ  データ・オブジェクトの集合
・メモリ・オブジェクト  メモリ管理の内部単位
（タスク、スレッド、ポート、メッセージおよびメモリ・オブジェクトの概念の詳細な説明については、第２節「アーキテクチャ・モデル」を参照されたい）
【００４５】
タスクとスレッド
マイクロカーネル・システム１１５は、従来のプロセスという概念は提供しない。というのは、オペレーティング・システム環境のすべてが、プロセスに関するかなりのセマンティックス（ユーザＩＤ、シグナル状態など）を有するからであり、これらの拡張されたセマンティックスを理解もしくは提供することは、マイクロカーネルの目的ではないからである。
【００４６】
多くのシステムでは、プロセスが制御の実行点と同等とみなされる。一部のシステムはそうではない。
【００４７】
マイクロカーネル１２０は、オペレーティング・システム環境のプロセスとは別に、複数の制御点をサポートする。マイクロカーネルは、次の２つの概念を提供する。
・タスク
・スレッド
（タスクおよびスレッドという概念の詳細な説明については、第２節「アーキテクチャ・モデル」を参照されたい）
【００４８】
メモリ管理
カーネルは、多少のメモリ管理を提供する。メモリは、タスクに関連付けられる。メモリ・オブジェクトは、タスクがメモリ管理に対する制御を得るのに利用する手段である。マイクロカーネル・システム１１５は、大きな、潜在的に疎な仮想アドレス空間をサポートする機構を提供する。各タスクは、関連アドレス・マップを有し、この関連アドレス・マップが、カーネルによって維持され、タスクのアドレス空間内の仮想アドレスから物理アドレスへの変換を制御する。仮想メモリ・システムの場合と同様に、所与のタスクの全アドレス空間の内容が、同一の時刻に物理メモリ内に完全に常駐していなくてもよく、タスクの仮想アドレス空間のためのキャッシュとして物理メモリを使用するための機構が存在しなければならない。従来の仮想メモリ設計と異なり、マイクロカーネル・システム１１５は、キャッシュ動作自体のすべてを実施するわけではない。マイクロカーネル・システムは、これらの機構に関与する能力をユーザ・モード・タスクに与える。パーソナリティ・ニュートラル・サービスには、ユーザ・タスクと、メモリに関するページング・サービスを提供するデフォルト・ページャ１４４が含まれる。
【００４９】
マイクロカーネル・システム１１５内の他の資源と異なり、仮想メモリは、ポートを使用した参照はされない。メモリは、特定のタスクのアドレス空間内の指標として仮想アドレスを使用することだけによって参照できる。あるタスクのアドレス空間を定義するメモリと関連アドレス・マップは、他のタスクと部分的に共用することができる。タスクは、そのアドレス空間内で新しいメモリ範囲を割り振り、メモリ範囲の割振りを解除し、メモリ範囲に対する保護を変更することができる。タスクは、範囲に対する継承特性を指定することもできる。新タスクは、既存タスクを基礎として指定し、これから新タスク用のアドレス空間を構築することによって作成される。既存タスクのメモリの範囲のそれぞれの継承属性によって、新タスクがその範囲を定義されるかどうかと、その範囲が仮想的にコピーされるか既存タスクと共用されるかどうかが決定される。メモリに関する仮想コピー動作のほとんどは、コピー・オン・ライト最適化を介して達成される。コピー・オン・ライト最適化は、保護された共用によって達成される。２つのタスクは、コピーされるメモリを共用するが、読取り専用のアクセス権を有する。どちらかのタスクがその範囲の一部を修正しようと試みる時には、その部分がその時点でコピーされる。このメモリ・コピーの遅延評価は、マイクロカーネル・システム１１５によって実行される重要な性能最適化であり、システムの通信／メモリ原理にとって重要である。
【００５０】
メモリの所与の領域は、メモリ・オブジェクトによって二重書き（バッキング）される。メモリ・マネージャ（ｍａｎａｇｅｒ）のタスクは、メモリにキャッシュされている間のページの組のイメージ（メモリ領域の物理メモリ内容）とキャッシュされていない時のページのその組のイメージ（アブストラクト・メモリ・オブジェクト（ａｂｓｔｒａｃｔ  ｍｅｍｏｒｙ  ｏｂｊｅｃｔ））の間の関係を支配するポリシーを提供する。パーソナリティ・ニュートラル・サービスは、当初は０で満たされ、システム・ページング空間に対してページングされる基本的な非持続性メモリ・オブジェクトを提供するデフォルト・メモリ・マネジャまたはデフォルト・ページャ１４４を有する。
【００５１】
タスク対タスク通信
マイクロカーネル・システム１１５は、通信チャネルを介して送られるメッセージを介して他のタスク（サーバ）に要求を行うことによってタスク（クライアント）がサービスをアクセスする、クライアント／サーバ・システム構造を使用する。マイクロカーネル１２０は、それ自体ではごく限られた数のサービスしか提供しない（たとえば、ファイル・サービスは提供しない）ので、マイクロカーネル１２０のタスクは、要求されたサービスを提供する他の多くのタスクと通信しなければならない。プロセス間通信（ＩＰＣ）機構の通信チャネルを、ポートと呼ぶ（ポートの詳細な説明については、第２節「アーキテクチャ・モデル」を参照されたい）。メッセージは、データ、メモリ領域およびポート権の集合である。ポート権とは、その権利を保持するタスクがポートに命名するのに用いる名前である。タスクは、適切なポート権を保持する場合に限ってポートを操作できる。１つのタスクだけが、あるポートの受取り権を保持することができる。このタスクは、そのポート待ち行列からメッセージを受け取る（読み取る）ことを許可される。複数のタスクが、そのポートへの送出権を保持することができ、これによって、その待ち行列にメッセージを送る（書き込む）ことが可能になる。タスクは、データ要素の組を含むデータ構造を作り、その後、送出権を保持するポートに対してメッセージ送出動作を実行することによって、別のタスクと通信する。後程、そのポートの受取り権を保持するタスクが、メッセージ受取り動作を実行する。
注意：このメッセージ転送は、非同期動作である。メッセージは、受取り側タスクに論理的にコピーされる（おそらくはコピー・オン・ライト最適化を用いて）。受取り側タスク内の複数のスレッドが、所与のポートからメッセージを受け取ろうと試みている可能性があるが、どのメッセージであれ、所与のメッセージを受け取るのは１つのスレッドだけである。
【００５２】
第２節  アーキテクチャ・モデル
マイクロカーネル・システム１１５は、その主な責任として、フレームワーク内で命令を実行する制御点の提供を有する。これらの制御点を、スレッドと呼ぶ。スレッドは、仮想環境で実行される。カーネルが提供する仮想環境には、ユーザ空間パーソナリティ・ニュートラル・サービスと、カーネルによって提供されるエミュレートされる命令（システム・トラップ）とによって増補される、ユーザ空間をアクセスできるハードウェア命令のすべてを実行する仮想プロセッサが含まれる。この仮想プロセッサは、仮想化されたレジスタの組と、その計算機の物理メモリと同様に応答する仮想メモリの一部をアクセスする。他のハードウェア資源のすべては、メモリ・アクセスとエミュレートされる命令の特殊な組合せを介さなければアクセスできない。カーネルによって提供される資源は、すべてが仮想化されることに留意されたい。この節では、スレッドから見える仮想環境の最高水準の要素を説明する。
【００５３】
パーソナリティ・ニュートラル・サービスの要素
マイクロカーネル・システム１１５のパーソナリティ・ニュートラル・サービス１４０部分は、その下層のマイクロカーネル１２０上に作られたサービスからなる。これによって、カーネル自体が依存するいくつかの機能ならびに、プログラムを構成するためのユーザ・レベル・サービスの基本セットがもたらされる。これらのプログラムは、複数のオペレーティング・システム・パーソナリティ・クライアントからの要求をサービスすることができ、オペレーティング・システム・パーソナリティ自体を構成するのに使用される。さらに、標準Ｃでパーソナリティ・ニュートラル・サービス・プログラムを構成するためのＡＮＳＩ（Ａｍｅｒｉｃａｎ  Ｎａｔｉｏｎａｌ  Ｓｔａｎｄａｒｄｓ  Ｉｎｓｔｉｔｕｔｅ、米国規格協会）のＣ実行時環境と、ＰＯＳＩＸ標準規格から採用された定義を有するいくつかの補足機能がある。パーソナリティ・ニュートラル・サービス自体を定義するライブラリのほかに、マイクロカーネル固有の部分であるパーソナリティ・ニュートラル・サービス内に存在する多数のライブラリがある。これらのライブラリは、マイクロカーネルがエクスポートするインターフェースと、マイクロカーネル・システム１１５のプロセス間通信機能と共に使用されるメッセージ・インターフェース・ジェネレータ（ＭＩＧ）のためのサポート・ロジックを表す。
【００５４】
パーソナリティ・ニュートラル・サービス環境ライブラリの構造は、各サービスの実装の詳細を呼出し側から隠蔽するようになっている。Ｃ実行時ライブラリのうちの１つなど、ライブラリの一部では、呼出し側のアドレス空間にロードされる局所ルーチンとしてその関数（機能）のすべてが実装され、それ以外のライブラリは、マイクロカーネルのＩＰＣ（プロセス間通信）システムを呼び出してメッセージをサーバに送るスタブからなる。このアーキテクチャによって、関数の柔軟な実装が可能になる。すなわち、サービスを使用するプログラムのソースに影響せずに、サーバを他のサーバによって置換することができ、サービスを組み合わせて単一のタスクにすることができる。パーソナリティ・ニュートラル・サービス環境の鍵となる要素は、それが完全なオペレーティング・システムを構成しないことである。そうではなくて、パーソナリティ・ニュートラル・サービスはパーソナリティの存在に依存する。システム始動中に最初にロードされる主要パーソナリティ１５２は、そのシステム上のユーザ・インターフェースを提供し、そのクライアントとパーソナリティ・ニュートラル・サービスの要素にサービスを提供するオペレーティング・システム・パーソナリティである。したがって、主要パーソナリティは、「最後の手段」のサーバである。主要パーソナリティは、パーソナリティ・ニュートラル・サービス・ライブラリによって定義されるが別のサーバによって実施されないサービスのすべてを実施する。
【００５５】
マイクロカーネル１２０も、パーソナリティ・ニュートラル・サービスのいくつかの要素に依存する。マイクロカーネルがパーソナリティ・ニュートラル・サーバ（Ｐｅｒｓｏｎａｌｉｔｙ  Ｎｅｕｔｒａｌ  Ｓｅｒｖｅｒ）にメッセージを送って内部カーネル動作を完了する場合がある。たとえば、ページ不在を解決する際に、マイクロカーネル１２０は、デフォルト・ページャ１４４にメッセージを送ってよい。その場合、デフォルト・ページャ１４４は、カーネルが必要とするページをハード・ディスクから読み込む。ページ不在は、通常はユーザ・タスクの代わりに解決されるが、この場合のカーネルは、メッセージの送出側である。
【００５６】
実行時
パーソナリティ・ニュートラル・サービス実行時は、この環境内で実行中のプログラムのための標準Ｃプログラミング環境をサポートするのに使用されるＡＮＳＩ  ＣおよびＰＯＳＩＸライブラリの組を提供する。この機能には、通常のＣ言語構造体が含まれる。どのシステムとも同じく、マイクロカーネル・システム１１５は、その主な責任として、フレームワーク内で命令を実行する制御点の提供を有する。マイクロカーネル１２０では、制御点をスレッドと呼ぶ。スレッドは、仮想環境で実行される。マイクロカーネル１２０が提供する仮想環境は、カーネルによって提供されるエミュレートされた（システム・トラップ）命令によって増補される、ユーザ空間をアクセスできるハードウェア命令のすべてを実行する仮想プロセッサからなる。この仮想プロセッサは、仮想化されたレジスタの組と、その計算機の物理メモリと同様に応答する一部の仮想メモリをアクセスする。他のハードウェア資源のすべては、メモリ・アクセスとエミュレートされる命令の特殊な組合せを介さなければアクセスできない。マイクロカーネルが提供する資源は、すべてが仮想化されることに留意されたい。この節では、マイクロカーネル・スレッドから見える仮想環境の最高水準要素を説明する。
【００５７】
カーネルの要素
マイクロカーネル１２０は、下のカーネル要素のリストに記載された要素からなる環境を提供する。
【００５８】
スレッド
実行制御点。スレッドは軽量の実体である。あるスレッドに関係する状態のほとんどは、それを含むタスクに関連する。
【００５９】
タスク
ポート名前空間、仮想アドレス空間およびスレッドの組の形式で資源への参照を保持するコンテナ。
【００６０】
セキュリティ・トークン
アクセス妥当性検査を実行するサーバにタスクから渡されるセキュリティ特徴。
【００６１】
ポート
タスク間の単一方向通信チャネル。
【００６２】
ポート・セット
メッセージ受取り時に単一の単位として扱うことができるポートの組。
【００６３】
ポート権
ポートをアクセスするための具体的な権利を許可する。
【００６４】
ポート名前空間
特定のポート権に命名するポート名の指標付きの集合。
【００６５】
メッセージ
２つのタスクの間で渡される、データ、メモリ領域およびポート権の集合。
【００６６】
メッセージ待ち行列
単一のポートに関連するメッセージの待ち行列。
【００６７】
仮想アドレス空間
１タスク内のスレッドによって参照できる、まばらなメモリ・ページの指標付きの組。ページの範囲に、カーネルおよび外部メモリ・マネージャによって実施される機構を介して、任意の属性とセマンティックスを関連付けることができる。
【００６８】
アブストラクト・メモリ・オブジェクト（Ａｂｓｔｒａｃｔ  Ｍｅｍｏｒｙ  Ｏｂｊｅｃｔ）
このオブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・オブジェクト。このオブジェクトを実装するタスクを、メモリ・マネージャと呼ぶ。アブストラクト・メモリ・オブジェクト・ポートは、カーネルがメモリ・マネージャの処置を要求するのに使用するポートである。
【００６９】
メモリ・オブジェクト・レプリゼンタティブ（ｍｅｍｏｒｙ  ｏｂｊｅｃｔ  ｒｅｐｒｅｓｅｎｔａｔｉｖｅ）メモリ・マネージャによってメモリ・オブジェクトのクライアントに供給されるメモリ・オブジェクトのアブストラクト表現。代理は、関連するアブストラクト・メモリ・オブジェクトを命名し、クライアントに許可される潜在的なアクセス・モードを制限する。
【００７０】
メモリ・キャッシュ・オブジェクト
アブストラクト・メモリ・オブジェクトによって二重書きされる常駐状態のメモリ範囲を含むカーネル・オブジェクト。メモリ・マネージャがクライアントの可視メモリ・イメージを操作するのは、このオブジェクトを介してである。
【００７１】
プロセッサ
スレッドを実行する能力を有する物理プロセッサ。
【００７２】
プロセッサ・セット
それぞれがプロセッサ・セットに割り当てられたスレッドを実行するのに使用可能なプロセッサの組。
【００７３】
ホスト
全体としての多重プロセッサ。
【００７４】
クロック
時間の経過の表現。一定の周波数で増分される時刻値。
【００７５】
これらの要素の多くが、スレッドによって直接操作できる、カーネルによって実装される資源である。これらの要素のそれぞれを、以下の段落で詳細に説明する。しかし、これらの一部の定義は、他の定義に依存するので、完全な説明を理解できるようにするために、鍵となる概念の一部を単純化した形で述べる。
【００７６】
スレッド
スレッドは、軽量の実体である。これは、作成のコストが低く、動作に必要なオーバーヘッドが少ない。スレッドは、ほんの少しの状態しか持たない（ほとんどはそのレジスタの状態である）。スレッドを所有するタスクが、資源管理の責任を負う。多重プロセッサ上では、１タスク内の複数のスレッドを並列に実行することができる。並列性が目標でない時であっても、複数のスレッドには長所がある。というのは、各スレッドが、単一のスレッドで複数のサービスを提供しようとする非同期プログラミングではなく、同期式プログラミング・スタイルを使用できるからである。スレッドには、下記の特徴が含まれる。
１．タスクの制御フローまたは命令実行のストリームの１点
２．それを含むタスクの要素のすべてに対するアクセス権
３．同一のタスク内のスレッドも含む他のスレッドとの並列実行
４．低オーバーヘッドのための最小限の状態
【００７７】
スレッドは、基本的な計算実体である。スレッドは、その仮想アドレス空間を定義する１つのタスクだけに属する。アドレス空間の構造に影響を及ぼしたり、アドレス空間以外の資源を参照するためには、スレッドが、特殊なトラップ命令を実行しなければならない。この命令が、カーネルに、スレッドの代わりに動作を実行させたり、スレッドの代わりにエージェントにメッセージを送らせる。これらのトラップは、そのスレッドを含むタスクに関連する資源を操作する。カーネルに対して要求を行って、これらの実体を操作する、すなわち、実体の作成、削除、状態の変更を行うことができる。カーネルは、資源（上にリストしたものなど）とサービスを提供するマネージャである。タスクは、サービスを提供することもでき、アブストラクト資源を実装する。カーネルは、サーバ・タスク（実際にはその中で実行中の１スレッド）がサービスを提供することをクライアント・タスクが要求できるようにする通信方法を提供する。この場合、タスクは二重のＩＤを有する。１つは、その資源マネージャがカーネル内で実行される、カーネルによって管理される資源のＩＤである。もう１つは、資源マネージャがタスク自体である資源の供給側のＩＤである。
【００７８】
スレッドは、下記の状態を有する。
１．その機械状態（レジスタなど）。これは、スレッドの実行に伴って変化し、カーネル・スレッド・ポートを保持するものによって変更される可能性もある。
２．スレッド固有のポート権の小さな組。これによって、そのスレッドのカーネル・ポートと、そのスレッドの代わりに例外メッセージを送るのに使用されるポートが識別される。
３．中断カウント。スレッドが命令を実行しようとしていない場合には０ではない。
４．資源スケジューリング・パラメータ。
【００７９】
スレッドは、通常の形で命令を実行することによって動作する。さまざまな特殊命令をカーネルがトラップして、スレッドの代わりに動作を実行する。これらのカーネル・トラップのうちで最も重要なのが、ｍａｃｈ＿ｍｓｇ＿ｔｒａｐである。このトラップを用いると、スレッドがカーネルや他のサーバにメッセージを送って、資源に対する動作を行えるようになる。このトラップは、直接に呼び出されることはない。これは、ライブラリ・ルーチンｍａｃｈ＿ｍｓｇを介して呼び出される。スレッドの実行中に発生する、「浮動小数点オーバーフロー」や「ページ不在」などの例外状態は、ポートにメッセージを送ることによって処理される。使用されるポートは、その状態の性質に依存する。例外状態の結果は、スレッドの状態をセットするか、例外メッセージに応答するか、この両方を行うことによって決定される。下記の動作をスレッド上で実行できる。
・作成と破壊
・中断と再開始（中断カウントの操作）
・機械状態の操作
・特殊ポート（例外ポートなど）の操作
・資源（スケジューリング）の制御
【００８０】
タスク
タスクは、システム資源の集合である。これらの資源は、アドレス空間を除いて、ポートによって参照される。これらの資源は、ポートに対する権利が分配されるならば、他のタスクと共用できる。
【００８１】
タスクは、機械アドレスによって参照される、大きく潜在的に疎なアドレス空間を提供する。この空間の各部は、継承または外部メモリ管理を介して共用できる。注意：タスク自体は動作しない。タスクには、命令を実行するスレッドが含まれる。「タスクＹがＸを行う」と言う時があるが、これは、「タスクＹに含まれるスレッドがＸを行う」という意味である。タスクは、コストの高い実体である。１タスク内のスレッドのすべてが、あらゆるものを共用する。２つのタスクは、明示的な処置がない限り何も共用しない。ただし、この処置はほとんどの場合に単純である。ポート受取り権などの一部の資源は、２つのタスクの間で共用することができない。タスクは、スレッドの組を保持するコンテナとみなすことができる。タスクには、それに含まれるスレッドに適用されるデフォルト値が含まれる。最も重要なことに、タスクには、それに含まれるスレッドが実行を必要とする要素、すなわち、ポート名前空間と仮想アドレス空間が含まれる。
【００８２】
タスクに関連する状態は次の通りである。
・含まれるスレッドの組
・関連する仮想アドレス空間
・ポート権の組に命名する関連するポート名前空間と、関連するポート通知要求の組
・タスクからメッセージと共に送出されるセキュリティ・トークン
・タスクのカーネル・ポートを識別するタスク固有ポートの小さな組、含まれるスレッドの例外処理に使用するためのデフォルト・ポート、および他のサービスに命名するためのブートストラップ・ポート
・スレッドが命令を実行しようとしていない場合には非０の中断カウント
・スレッド用のデフォルト・スケジューリング・パラメータ
・統計的ＰＣサンプルを含むさまざまな統計
【００８３】
タスクは、新タスクが作成されるホストを指定し、アドレス空間のさまざまな部分を継承によって供給できるプロトタイプ・タスクを指定することによって作成される。
【００８４】
１タスク上で、次の動作を実行できる。
・作成と破壊
・セキュリティ・トークンのセット
・中断と再開始
・特殊ポートの操作
・含まれるスレッドの操作
・スケジューリング・パラメータの操作
【００８５】
セキュリティ・ポート
どのタスクにも、セキュリティ・トークンすなわち、カーネルの視点からは不透明な識別子によってタグが付けられる。これによって、そのタスクのＩＤと他のセキュリティ属性が符号化される。このセキュリティ・トークンは、そのタスクが送るすべてのメッセージに暗黙値として含められる。信頼されるサーバは、この送られたトークンを送出側のＩＤの表示として使用して、アクセス調停決定を行う際に使用することができる。
【００８６】
タスクは、その親からセキュリティ・トークンを継承する。このトークンは、ＩＤの模造不能な表示として使用されるので、このトークンを変更するためには特権が必要である。この特権は、ホスト・セキュリティ・ポートを提示することによって示される。
【００８７】
ある予約された値が、カーネルのＩＤを示す。カーネルからのメッセージは、例外メッセージを除いてすべてがカーネルＩＤを含む。例外メッセージには、例外を発生しているタスクのＩＤが含まれる。
【００８８】
ポート
ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。ポートは、単一の受取り側と潜在的に複数の送出側を有する。ポートに関連する状態は、次の通りである。
・それに関連するメッセージ待ち行列
・そのポートに対する参照（権利）のカウント
・仮想コピー・メモリとポートの量に対するセット可能な限界
・ポートを介してメッセージ内で送ることのできる権利
【００８９】
カーネル・サービスは、ポートを割り振るために存在する。仮想メモリ範囲以外のシステム実体は、すべてがポートによって命名される。ポートは、これらの実体が作成される時に暗黙のうちに作成される。
【００９０】
カーネルは、要求時に、ポートの消滅の際に通知メッセージを供給する。タスクの仮想アドレス空間を除く他のシステム資源のすべては、ポートとして既知の、あるレベルの間接指定を介してアクセスされる。ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。そのようなサービス要求に対して応答を提供しなければならない場合、第２のポートを使用しなければならない。供給されるサービスは、ポートを介して送られたメッセージを受け取るマネージャによって決定される。すなわち、カーネル提供実体に関連するポートの受取り側は、カーネルであるということになる。タスク供給実体に関連するポートの受取り側は、その実体を提供したタスクである。タスク供給実体に命名するポートの場合、そのポートに対するメッセージの受取り側を別のタスクに変更することができる。単一のタスクが、それがサポートする資源を参照する複数のポートを有することもできる。所与の実体は、それを表す複数のポートを有することができ、このポートのそれぞれが、許容される動作の異なる組を暗示する。たとえば、多くの実体は、名前ポートと、特権ポートと呼ばれる場合もある制御ポートとを有する。制御ポートをアクセスすることによって、その実体を操作することができる。名前ポートのアクセスは、その実体に命名するだけであり、これはたとえば、情報を返すために行われる。
【００９１】
ポートに関するシステム全域の名前空間は存在しない。スレッドは、それを含むタスクに既知のポートだけをアクセスできる。タスクは、ポート権の組を保持し、このポート権のそれぞれが、ポート（別個である必要はない）に命名し、そのポートに関して許可される権利を指定する。ポート権は、メッセージに含めて伝送できる。これが、タスクがポート権を得る方法である。ポート権は、ポート名を用いて命名され、このポート名は、その権利を保持するタスクのコンテキスト（ポート名前空間）の内部でのみ意味を持つ、カーネルによって選択される整数である。システム内の動作のほとんどは、操作されるオブジェクトのマネージャを命名するポートにメッセージを送ることからなる。本明細書では、これを
オブジェクト−＞関数
の形式で示す。これは、そのオブジェクトを命名するポートに対して（適当なメッセージを送ることによって）この関数が呼び出されることを意味する。メッセージは、ポート（権）に送らなければならないので、この動作はオブジェクト基礎を有する。プロセッサ・セットへスレッドをバインドするなど、一部の動作は、２つのオブジェクトを必要とする。これらの動作では、コンマで区切られたオブジェクトが示される。すべての実体がポートによって命名されるわけではなく、これは純粋なオブジェクト・モデルではない。ポート権によって命名されない２つの主な実体が、ポート名／ポート権自体と、メモリの範囲である。事象オブジェクトも、タスク局所ＩＤによって命名される。メモリ範囲を操作するためには、そのメモリ範囲を所有するタスクによって命名された、そのメモリ範囲を含む仮想アドレス空間にメッセージを送る。ポート名／ポート権を操作するには、また、しばしば、関連ポートを操作するためには、それを所有するタスクによって命名された、それを含むポート名前空間にメッセージを送る。本明細書では、添え字表記
オブジェクト［ＩＤ］−＞関数
を使用して、操作される範囲またはオブジェクトの要素を示すためにメッセージ内のパラメータとしてＩＤが必要であることを示す。本明細書では、括弧表記
オブジェクト（ポート）−＞関数
を使用して、特定の方法でオブジェクトを操作するのに十分な特権を示すためにメッセージ内のパラメータとしてホスト制御ポートなどの特権ポートが必要であることを示す。
【００９２】
ポート・セット
ポート・セットは、メッセージ受取り時に単一の単位として扱うことのできるポートの組である。ｍａｃｈ＿ｍｓｇ受取り動作は、受取り権またはポート・セットのいずれかを命名するポート名に対して許可される。ポート・セットには、受取り権の集合が含まれる。あるポート・セットに対して受取り動作が実行される時には、そのセットのポートのうちの１つからメッセージが受け取られる。受け取られたメッセージは、それがどのメンバ・ポートから受け取られたかを示す。ポート・セットのメンバであるポートからメッセージを直接受け取ることは許可されない。ポート・セット内のポートには、優先順位という概念がない。所与のメッセージをポート・セット内のどのポートから受け取るかはカーネルが選択するが、この選択を制御する方法はない。ポート・セットに関してサポートされる動作は次の通りである。
・作成と削除
・メンバシップ（所属関係）の変更とメンバシップの問い合わせ
【００９３】
ポート権
ポートは、ポート権を使用することによってのみアクセス可能である。ポート権を用いると、特定のポートを特定の方法でアクセスできるようになる。ポート権には、下記の３種類がある。
・受取り権  この権利を保持していると、関連ポートからメッセージを受け取ることができる。
・送出権  この権利を保持していると、関連ポートにメッセージを送ることができる。
・１回送出権  この権利を保持していると、関連ポートに１つだけメッセージを送ることができる。このポート権は、メッセージが送られた後に自動的に破壊される。
【００９４】
ポート権は、ｍａｃｈ＿ｍｓｇ呼出しのさまざまなオプションを使用することによって、また、明示的なコマンドによって、タスクの間でコピーすることができ、移動することができる。メッセージ動作以外では、ポート権は、ポート名前空間のメンバとしてのみ操作可能である。ポート権は、他のシステム実体が作成される時に暗黙のうちに作成され、また、明示的なポート作成を使用することによって明示的に作成される。
【００９５】
カーネルは、要求時に、ポートに対する送出権がこれ以上ない時に、選択されたポートに通知を供給する。また、１回送出権の破壊（メッセージを送るのに使用することによらない場合）によって、対応ポートに送られる１回送出通知が生成される。要求時に、カーネルは、受取り権の破壊の通知を供給する。
【００９６】
ポート名前空間
ポートとポート権は、任意のポートまたはポート権の直接操作を可能にするシステム全域にわたる名前を有しない。ポートは、ポート権を介してのみ操作可能であり、ポート権は、ポート名前空間に含まれる時に限って操作可能である。ポート権は、ポート名前空間への指標であるポート名によって指定される。各タスクには、１つのポート名前空間だけが関連付けられている。
【００９７】
ポート名前空間内の１項目は、次の４つの可能な値を有することができる。
・ＭＡＣＨ＿ＰＯＲＴ＿ＮＵＬＬ  関連するポート権なし。
・ＭＡＣＨ＿ＰＯＲＴ＿ＤＥＡＤ  この名前に権利が関連していたが、その権利が参照していたポートが破壊されている。
・ポート権  ポートに関する、１回送出権、送出権または受取り権
・ポート・セット名  受取り権と同様に振る舞うが、複数のポートからの受取りが可能な名前。
【００９８】
タスク内で新しい権利を取得すると、新しいポート名が生成される。ポート権は、そのポート名を参照することによって操作されるので、時にはポート名自体が操作される。所与のポート名前空間内の所与のポートに対する送出権と受取り権のすべてが、同一のポート名を有する。所与のポートに対する１回送出権のそれぞれは、互いに異なるポート名を有し、このポート名は、保持されている送出権や受取り権に使用されているポート名のいずれとも異なる。ポート名に関してサポートされる動作には、下記が含まれる。
・作成（権利の作成時の暗黙の）と削除
・関連する型の問い合わせ
・名前の変更
・要求時に、カーネルが使用不能になる名前の通知を提供する。
【００９９】
ポート名前空間は、タスクにバインドされるので、それを所有するタスクと共に作成され、破壊される。
【０１００】
メッセージ
メッセージは、２つの実体の間で渡される、データ、メモリ領域およびポート権の集合である。メッセージ自体は、システム・オブジェクトではない。しかし、メッセージは、待ち行列化されるので重要である。というのは、メッセージが送られた時と受け取られる時の間で状態を保持することができるからである。この状態は、下記からなる。
・純データ
・メモリ範囲のコピー
・ポート権
・送出側のセキュリティ・トークン
【０１０１】
メッセージ待ち行列
ポートは、メッセージの待ち行列からなる。この待ち行列は、メッセージを伝送するメッセージ動作（ｍａｃｈ＿ｍｓｇ）を介してのみ操作される。待ち行列に関連する状態は、待ち行列化されたメッセージの順序付きセットと、メッセージの数に対する設定可能な限界である。
【０１０２】
仮想アドレス空間
仮想アドレス空間によって、その仮想アドレス空間を所有するタスク内で実行中のスレッドが参照を許可される仮想アドレスの組が定義される。仮想アドレス空間は、それを所有するタスクによって命名される。
【０１０３】
仮想アドレス空間は、疎なページの指標付きの組からなる。個々のページの属性は、望みどおりに設定できる。効率のため、カーネルは、同一の属性を有する仮想的に連続したページの組を、内部メモリ領域にグループ化する。カーネルは、望みどおりにメモリ領域を分割、併合することができる。システム機構は、メモリ領域のＩＤに敏感であるが、ほとんどのユーザ・アクセスは、それほど影響を受けず、自由にメモリ領域をまたぐことができる。
【０１０４】
所与のメモリ範囲に、メモリ・マネージャの処置を介して別個のセマンティックスを関連付けることができる。仮想アドレス空間内で新しいメモリ範囲を確立する時に、そのメモリ範囲のセマンティックスを表すアブストラクト・メモリ・オブジェクトが、おそらくはデフォルトで、そのセマンティックスを提供するタスク（メモリ・マネージャ）と関連付けることによって指定される。
【０１０５】
仮想アドレス空間は、タスクの作成時に作成され、タスクの破壊時に破壊される。アドレス空間の初期内容は、ｔａｓｋ＿ｃｒｅａｔｅ呼出しのさまざまなオプションならびに、その呼出しに使用されたプロトタイプ・タスクのメモリ範囲の継承特性から決定される。
【０１０６】
仮想アドレス空間に対する動作のほとんどは、そのアドレス空間内のメモリ範囲に命名する。これらの動作には、下記が含まれる。
・範囲の作成または割振りと割振り解除
・範囲のコピー
・追出しを避けるための物理メモリへのページの「ワイヤリング（ｗｉｒｉｎｇ）」を含む、特殊な属性の設定
・メモリ保護属性の設定
・継承特性の設定
・範囲の直接読み書き
・補助記憶への範囲の強制フラッシュ
・範囲の予約（範囲内のランダム割振りの防止）
【０１０７】
アブストラクト・メモリ・オブジェクト
マイクロカーネルは、ユーザ・モード・タスクに、仮想アドレス空間の参照部分に関連するセマンティックスの供給を許可する。これは、アブストラクト・メモリ・オブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・メモリ・オブジェクトの指定を可能にすることによって行われる。このメモリ・オブジェクトを実装し、メモリ・オブジェクトに命名するポートへ送られたメッセージに応答するタスクを、メモリ・マネージャと呼ぶ。
【０１０８】
カーネルは、さまざまなメモリ・オブジェクトの内容のための直接アクセス可能キャッシュとして、メイン・メモリを使用するものとみなされなければならない。カーネルは、アブストラクト・メモリ・オブジェクト・ポートにメッセージを送ることによって、カーネルの望みどおりにこのキャッシュを満たし、フラッシュして、このキャッシュを維持するためにさまざまなメモリ・マネージャと共に非同期ダイアログにかかわる。アブストラクト・メモリ・オブジェクトに対する動作には、下記が含まれる。
・初期設定
・ページ読取り
・ページ書込み
・強制動作およびフラッシュ動作との同期化
・ページをアクセスする許可の要求
・ページ・コピー
・終了
【０１０９】
メモリ・オブジェクト・レプリゼンタティブ（Ｍｅｍｏｒｙ  Ｏｂｊｅｃｔ  Ｒｅｐｒｅｓｅｎｔａｔｉｖｅ）
アブストラクト・メモリ・オブジェクト・ポートは、カーネルが、メモリ・オブジェクト用の補助記憶へのアクセスを要求するのに使用するポートである。このダイアログは保護されているので、メモリ・マネージャは、通常はアブストラクト・メモリ・オブジェクト・ポートへのアクセス権をクライアントに与えない。その代わりに、クライアントには、メモリ・オブジェクト・レプリゼンタティブへのアクセス権が与えられる。メモリ・オブジェクト・レプリゼンタティブは、メモリ・オブジェクトのクライアントの表現である。このようなポートに対して許可される動作は１つだけであり、それは、関連するメモリ・オブジェクトをタスクのアドレス空間にマッピングすることである。このような要求を行うと、マッピング・カーネルとメモリ・マネージャの間で、下層のアブストラクト・メモリ・オブジェクトを初期設定するためのプロトコルが開始される。カーネルが代理によって表されたアブストラクト・メモリ・オブジェクトならびに代理によって許可されるアクセス・モードの組について知らされるのは、この特殊なプロトコルを介してである。
【０１１０】
メモリ・キャッシュ・オブジェクト
カーネルのメイン・メモリ・キャッシュのうち、所与のアブストラクト・メモリ・オブジェクトに関連する常駐ページを含む部分を、メモリ・キャッシュ・オブジェクトと呼ぶ。メモリ・オブジェクトのメモリ・マネージャは、カーネルのメモリ・キャッシュ・オブジェクトに対する送出権を保持する。メモリ・マネージャは、カーネルと共に非同期ダイアログにかかわり、関連するメモリ・キャッシュ・オブジェクトにメッセージを送ることによってそのアブストラクト・メモリ・オブジェクトのアブストラクションを提供する。メモリ・キャッシュ・オブジェクトに対する動作には、下記が含まれる。
・動作属性を設定する
・属性を返す
・カーネルにページを供給する
・カーネルによって要求されたページが使用不能であることを示す
・カーネルによって要求されたページが、カーネルのデフォルト・ルールによって満たされなければならないことを示す
・オブジェクトの遅延コピーの完了を強制する
・メモリ・マネージャに送られたページが破棄されたことを示す
・メモリ・ページへのアクセスを制限する。
・性能ヒントを提供する
・終了
【０１１１】
プロセッサ
スレッドを実行する能力を有する物理プロセッサのそれぞれは、プロセッサ制御ポートによって命名される。実際の作業を実行するという点では重要であるが、プロセッサは、プロセッサ・セットのメンバとしての重要さを除いて、マイクロカーネルではあまり重要でない。スレッドの組をスケジューリングするのに使用されるプロセッサのプールの基礎を形成し、スケジューリング属性を関連付けられているのは、プロセッサ・セットである。プロセッサに関してサポートされる動作には、下記が含まれる。
・プロセッサ・セットへの割当て
・開始と停止などの機械制御
【０１１２】
プロセッサ・セット
プロセッサは、プロセッサ・セットにグループ化される。プロセッサ・セットは、そのプロセッサ・セットに割り当てられたスレッドのスケジューリングに使用されるプロセッサのプールを形成する。プロセッサ・セットは、スレッドの組のスケジュール可能性を均一に制御するための基礎として存在する。この概念によって、システム内の所与の活動に対するプロセッサのおおまかな割振りを実行する方法ももたらされる。プロセッサ・セットに対してサポートされる動作には、下記が含まれる。
・作成と削除
・プロセッサの割当て
・スレッドおよびタスクの割当て
・スケジューリング制御
【０１１３】
ホスト
ネットワーク化されたマイクロカーネル・システム内の各計算機（単一プロセッサまたは多重プロセッサ）は、それ自体のマイクロカーネルのインスタンスを走行させる。ホスト多重プロセッサ１００は、一般に、クライアント・タスクによって操作されない。しかし、各ホストはそれ自体のマイクロカーネル１２０を携帯し、そのそれぞれがそれ自体のポート空間、物理メモリおよび他の資源を有するので、実行中のホストは、可視であり、時には直接操作される。また、各ホストは、それ自体の統計を生成する。ホストは、自由に分配され、そのホストに関する情報の取得に使用できる名前ポートと、閉鎖的に保持され、ホストを操作するのに使用できる制御ポートとによって命名される。ホストによってサポートされる動作には、下記が含まれる。
・クロック操作
・統計収集
・リブート
・デフォルト・メモリ・マネージャの設定
・プロセッサとプロセッサ・セットのリスト取得
【０１１４】
クロック
クロックは、一定の周波数で時刻値カウンタを増分することによって、時間の経過の表現を提供する。各ホストまたは多重コンピュータ内の各ノードは、ハードウェアによってサポートされるさまざまなクロックおよびタイマならびにこれらのタイマ上に作成されるアブストラクト・クロック（ａｂｓｔｒａｃｔ  ｃｌｏｃｋ）に基づいて、それ自体のクロックの組を実装する。所与のシステムによって実装されるクロックの組は、構成時にセットされる。各クロックは、名前ポートと、制御ポートまたは特権ポートとの両方によって命名される。制御ポートを用いると、クロックの時刻と分解能を設定できる。名前ポートを与えられたタスクは、下記を実行することができる。
・時刻とクロックの分解能を判定する。
・時刻値をマッピングするメモリ・オブジェクトを生成する。
・所与の時刻まで休眠（遅延）する。
・所与の時刻に通知または警報を要求する。
【０１１５】
第３節  タスクとスレッド
この節では、ユーザから見えるスレッドとタスクの外見を述べる。スレッドは、マイクロカーネル・システム１１５内の能動的な実体である。これらは、タスク内の制御点として働き、タスクは、仮想アドレス空間と、他の資源をアクセスするのに用いられるポート名前空間とをスレッドに供給する。
【０１１６】
スレッド
スレッドは、基本的な計算実体である。スレッドは、その仮想アドレス空間を定義する１つのタスクだけに属する。スレッドは、最小限の状態を有する軽量の実体である。スレッドは、ハードウェアによって指示される形で、そのスレッドのレジスタ値に基づいてそのタスクのアドレス空間から命令を取り出しながら実行する。スレッドが直接行うことのできる唯一の処置は、そのレジスタを操作する命令と、そのメモリ空間を読み書きする命令の実行である。特権付きの機械命令を実行しようとすると、例外が発生する。例外については後で説明する。アドレス空間の構造に影響を与えるか、アドレス空間以外の資源を参照するためには、スレッドは、スレッドに代わってカーネルに動作を実行させるか、スレッドの代わりに何らかのエージェントにメッセージを送らせる特殊なトラップ命令を実行しなければならない。また、障害や他の不正な命令の挙動があると、カーネルが例外処理を呼び出すことになる。
【０１１７】
図２は、スレッドに関連する、クライアントから可視の構造を示す図である。スレッド・オブジェクトは、カーネル・スレッド・ポートに送られたメッセージを受け取る。このスレッド・ポートに関する送出権を保持するランダムなタスクからのほかに、スレッド・ポートは、スレッドを含むプロセッサ・セットまたはスレッドを含むタスクを介して、スレッドのスレッド自己ポートとしてアクセス可能である。
【０１１８】
スレッドによる処置
この節では、スレッドが直接行うことのできる処置の詳細を説明する。スレッドは、正しいポートへの権利を得ることができ、そのポートにメッセージを送ることができるならば、何でも行うことができる。スレッドが行うことのできるささまざまなことを、操作されるオブジェクトを説明する節で説明する。
【０１１９】
スケジューリング・サポート・トラップ
マイクロカーネルは、プリエンプティブにスレッドをスケジューリングする。これを行う方法には、さまざまな要因が関連する。ここでは、スレッドにスケジューリング優先順位が関連付けられ、この優先順位が、所与のプロセッサ・セット内で実行すべきスレッドの選択に使用されると述べておけば十分である。
【０１２０】
ｔｈｒｅａｄ＿ｓｗｉｔｃｈは、さまざまなオプションを有するコンテキスト切り換えを引き起こす。これは、ソフトウェア・ロック・ルーチンなど、プロセッサを放棄し、その結果、他のスレッドが進行できるようにしたい場合のために提供される。オプションは、新たに走行する適切なスレッドの情報が使用可能である時に、その選択に関係する。ｔｈｒｅａｄ＿ｓｗｉｔｃｈのオプションのうちの１つを指定すると、そのスレッドのスケジューリング優先順位が可能な最低の値に下げられ、その結果、他のスレッドが走行し、この順位を下げられたスレッドをブロックした作業を完了できるようになる。この優先順位低下は、所与の時刻が満了した時に取り消され、順位低下にもかかわらずこのスレッドが走行し、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ａｂｏｒｔまたはｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｄｅｐｒｅｓｓ＿ａｂｏｒｔが呼び出される。
【０１２１】
最後に、ｃｌｏｃｋ＿ｓｌｅｅｐトラップは、指定された時刻までスレッドを遅延させる。この遅延は、ｔｈｒｅａｄ＿ａｂｏｒｔによってｃｌｏｃｋ＿ｓｌｅｅｐにエラー・リターンを生成させることによって打ち切ることができる。
【０１２２】
ＩＤトラップ
この節で述べるいくつかのトラップのほかに、サービスを求める他の要求のすべてが、ポート権を必要とする。現スレッドまたは現タスクを操作するカーネルに対する要求であっても、ポート権（現スレッドまたは現タスクに命名する）が必要である。この処理をブートストラップするためには、あるスレッドが、ポート権なしに、それ自体とそのタスクに関するポート権を得る方法が必要である。これらの権利は、それぞれｍａｃｈ＿ｔｈｒｅａｄ＿ｓｅｌｆトラップおよびｍａｃｈ＿ｔａｓｋ＿ｓｅｌｆトラップを介して取得される。
【０１２３】
返されるポート権は、実際には、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔメッセージ呼出しおよびｔａｓｋ−＞ｔａｓｋ＿ｓｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔメッセージ呼出しを介して最後にセットされた特殊ポート、ＴＨＲＥＡＤ＿ＫＥＲＮＥＬ＿ＰＯＲＴおよびＴＡＳＫ＿ＫＥＲＮＥＬ＿ＰＯＲＴである。これらの特殊ポートのデフォルト値は、それぞれ実際のカーネル・スレッド・ポートおよびカーネル・タスク・ポートである。タスクまたはスレッドを生成する側は、そのスレッドまたはタスクを開始する前にこれらの特殊ポート値をセットし、その結果、スレッドまたはタスクが、それ自体のカーネル・ポートへのアクセス権を持たず、それ自体に対して行われるサービスを要求する時に何らかの中間ポートを呼び出すようにすることができる。カーネルは、タスクのホストの名前ポートに対する送出権を返すトラップ、ｍａｃｈ＿ｈｏｓｔ＿ｓｅｌｆも提供する。
【０１２４】
ブートストラップ応答ポート・トラップ
ｍａｃｈ＿ｒｅｐｌｙ＿ｐｏｒｔも、ブートストラップの目的に使用される。前に述べたように、サービス要求で応答を返す必要がある場合、第２のポートが必要である。このトラップは、他のポート関連呼出しのすべてのために使用できる初期応答ポート（受取り権）の作成に使用される。タスクの自己ポートがｎｕｌｌである場合、そのタスクに対するマイクロカーネル・サービスの使用が不能になるが、この呼出しでもｎｕｌｌが返される。
【０１２５】
メッセージ送受トラップ
最後の最も重要なトラップが、ｍａｃｈ＿ｍｓｇ＿ｔｒａｐである。このトラップは、ｍａｃｈ＿ｍｓｇライブラリ・ルーチンによって呼び出される。このトラップは、他のすべてのシステム・サービスへのアクセス権を提供する。これによって、所与の権利によって命名されたポートとの間でデータが送受される。この呼出しのセマンティックスは、Ｋｅｒｎｅｌ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｒｅｆｅｒｅｎｃｅ文書に含まれ、詳細に記載されており、この文書のさまざまな節にも記載されている。
【０１２６】
例外処理
スレッド内で例外が発生する時、スレッドは、カーネル・コンテキストで実行され、例外ポートに例外を説明する内容を含むメッセージを送る。例外は、Ｋｅｒｎｅｌ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｒｅｆｅｒｅｎｃｅ文書のｃａｔｃｈ＿ｅｘｃｅｐｔｉｏｎ＿ｒａｉｓｅにリストされている。このメッセージに成功裡の応答が返されると、そのスレッドは、おそらくはｔｈｒｅａｄ＿ｓｅｔ＿ｓｔａｔｅによって変更された状態で継続する。所与の例外に対して、適用される例外ポートは次の２つである。
・特定のタイプの例外のためのスレッド固有ポート。
・特定のタイプの例外のためのタスク・ポート。
【０１２７】
スレッド固有ポートは、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓを用いてセットされ、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｇｅｔ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓを用いて読み取られる。タスク・ポートは、ｔａｓｋ−＞ｔａｓｋ＿ｓｅｔ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓを用いてセットされ、ｔａｓｋ−＞ｔａｓｋ＿ｇｅｔ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓを用いて読み取られる。ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｗａｐ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓ呼出しとｔａｓｋ−＞ｔａｓｋ＿ｓｗａｐ＿ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔｓ呼出しによって、原子的なスワップが実行され、例外ポートがセットされ、前の例外ポートが返される。
【０１２８】
カーネルは、順序付きリスト内でポートが定義されているならば、これらのポートのうちで最初のポートを、例外メッセージの宛先として選択する。成功裡の応答は、スレッドの継続を引き起こすが、不成功の応答は、カーネルに第２ポートへ例外メッセージを送出させる。どちらの例外メッセージも成功裡の応答を受け取らない場合、そのスレッドが打ち切られる。
【０１２９】
カーネルは、例外ポートがセットされた時に選択されるものとして、下記のさまざまな例外メッセージ・フォーマットを送ることができる。
・ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔ−＞ｃａｔｃｈ＿ｅｘｃｅｐｔｉｏｎ＿ｒａｉｓｅ  障害を発生したスレッドのＩＤと、タスク自己ポートと、スレッド自己ポートと、実行コードおよび状況コードのタイプを示すメッセージ。
・ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔ−＞ｃａｔｃｈ＿ｅｘｃｅｐｔｉｏｎ＿ｒａｉｓｅ＿ｓｔａｔｅ  例外のタイプ、状況コードおよび、例外ポートがセットされた時に選択されたレジスタ値を含むスレッド状態の特色を示すメッセージ。スレッド状態は、入力と出力の両方であり、この応答がスレッド状態を変更できるようになっている。
・ｅｘｃｅｐｔｉｏｎ＿ｐｏｒｔ−＞ｃａｔｃｈ＿ｅｘｃｅｐｔｉｏｎ＿ｒａｉｓｅ＿ｓｔａｔｅ＿ｉｄｅｎｔｉｔｙ  タスク・ポートとスレッド・ポートを含むｃａｔｃｈ＿ｅｘｃｅｐｔｉｏｎ＿ｒａｉｓｅ＿ｓｔａｔｅメッセージ。
【０１３０】
スレッドが遭遇するすべての例外状態が、この方法で処理されるわけではない。ページ不在障害では、例外ポートにメッセージが送られない。その代わりに、障害を発生したアドレスがあるメモリ・ページに関連する外部メモリ・マネージャにメッセージが送られる。これは、仮想メモリの一部として説明する。一般的な例外の規則は、システム呼出し命令には必ずしも適用されない。まず、可能なシステム呼出し番号のうちのいくつかは、マイクロカーネル呼出しのために含まれる。残りのシステム呼出し番号は、当初は未定義である。これらを実行しようと試みると、ＥＸＣ＿ＳＷ＿ＥＭＵＬＡＴＩＯＮの例外が生じる。
【０１３１】
スレッドの処置
次の節では、カーネルのスレッド・ポートに対する送出権があるものとして、スレッドに対して行うことのできるさまざまな機能をリストする。
【０１３２】
作成と破壊
スレッドは、ｔａｓｋ−＞ｔｈｒｅａｄ＿ｃｒｅａｔｅを介して生成され、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｔｅｒｍｉｎａｔｅを介して破壊される。スレッドは、所与のタスクに属するので、スレッド作成は、実際にはタスクに対して実行される動作である。その結果は、新スレッド用のカーネルのスレッド・ポートへの送出権である。所与のタスク内のスレッドのすべてに関するカーネル・スレッド・ポートのリストは、ｔａｓｋ−＞ｔａｓｋ＿ｔｈｒｅａｄｓを用いて得ることができる。新たに作成されたスレッドは、中断状態である。これは、そのスレッドの最初の命令を実行する前にｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｕｓｐｅｎｄを呼び出した場合と同一である。中断されたスレッドは、実行されない。スレッドは、中断状態で作成されるので、スレッドを開始する前に、スレッドの機械状態を正しくセットすることができる。スレッドを中断状態から取り除く（中断カウントを減分する）には、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｒｅｓｕｍｅを使用する。
【０１３３】
最適化として、走行中のスレッドを作成するのに必要なステップのシーケンス、すなわち、ｔｈｒｅａｄ＿ｃｒｅａｔｅ、ｔｈｒｅａｄ＿ｓｅｔ＿ｓｔａｔｅおよびｔｈｒｅａｄ＿ｒｅｓｕｍｅを組み合わせて、ｔａｓｋ−＞ｔｈｒｅａｄ＿ｃｒｅａｔｅ＿ｒｕｎｎｉｎｇ呼出しにしてある。
【０１３４】
スレッドの状態
スレッドには、状態の２つの主な組すなわち、機械状態と１組の特殊ポートがある。あるスレッドの機械状態は、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｇｅｔ＿ｓｔａｔｅを使用して取得され、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｓｔａｔｅを使用してセットされる。ランダムな点でスレッドの状態をセットした結果は、未定義である。決定的な結果を得るためには、下記のさまざまなステップが必要である。
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｕｓｐｅｎｄを使用して、スレッドを停止させる。スレッドが作成されたばかりで、まだ走行していない場合には、このステップと次のステップは不要である。しかし、シグナル配布などの非同期割込みや例外処理のためには、これらのステップが必要である。
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ａｂｏｒｔを呼び出す。これによって、すべてのシステム呼出し（実際には、ｍａｃｈ＿ｍｓｇと、例外メッセージやページ不在メッセージなどの関連メッセージ呼出し）が打ち切られる。メッセージ呼出しの打切りによって、システム呼出しの後の点にスレッドの状態がセットされ、呼出しの割込みを示す戻り値が返される。ページ障害または例外を打ち切ると、スレッドは、ページ障害または例外の点に残される。このスレッドを再開始すると、そのページ障害または例外が再び発生する。ｔｈｒｅａｄ＿ａｂｏｒｔによって、多重ページ・メモリ管理動作などの回復不能システム呼出しが打ち切られる。
・その後、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｓｔａｔｅを安全に使用することができる。
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｒｅｓｕｍｅによって、スレッドを再開始する。
【０１３５】
スレッドは現在、１つの「特殊」ポートだけを関連付けられている。これは、そのスレッドがそれ自体に対する動作を要求するのに使用するための値である。これは、通常はカーネル・スレッド・ポートと同一であるが、異なる値にセットすることもできる（それを行うのは、ほとんどの場合にそのスレッドを作成した側である）。このポートは、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｇｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔによって返され、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔによってセットされる。
【０１３６】
中断カウントやスケジューリング情報など、カーネル・スレッド状態のさまざまな部分を、ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｉｎｆｏを使用して得ることができる。
【０１３７】
スケジューリング制御
下記の関数は、スレッドのスケジューリングに影響する。これらは、物理資源管理の節で説明する。
・ｔｈｒｅａｄ、ｐｒｏｃｅｓｓｏｒ＿ｓｅｔ＿ｃｏｎｔｒｏｌ−＞ｔｈｒｅａｄ＿ａｓｓｉｇｎ
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ａｓｓｉｇｎ＿ｄｅｆａｕｌｔ
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｇｅｔ＿ａｓｓｉｇｎｍｅｎｔ
・ｔｈｒｅａｄ（ｐｒｏｃｅｓｓｏｒ＿ｓｅｔ＿ｃｏｎｔｒｏｌ）−＞ｔｈｒｅａｄ＿ｓｅｔ＿ｐｏｌｉｃｙ
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｐｏｌｉｃｙ
・ｔｈｒｅａｄ（ｈｏｓｔ＿ｃｏｎｔｒｏｌ）−＞ｔｈｒｅａｄ＿ｗｉｒｅ
・ｔｈｒｅａｄ−＞ｔｈｒｅａｄ＿ｐｒｉｏｒｉｔｙ
・ｔｈｒｅａｄ（ｐｒｏｃｅｓｓｏｒ＿ｓｅｔ＿ｃｏｎｔｒｏｌ）−＞ｔｈｒｅａｄ＿ｍａｘ＿ｐｒｉｏｒｉｔｙ
【０１３８】
ｔｈｒｅａｄ＿ｗｉｒｅ呼出しによって、スレッドが「ワイヤリング済み（ｗｉｒｅｄ）」としてマークされる。これは、カーネル資源管理に関する特権を意味する。「ワイヤリング済み」のスレッドは、常にスケジューリングされる資格を有し、空きメモリが不十分な時であってもメモリを消費することができる。この特性は、デフォルト・ページアウト・パス内のスレッドに割り当てられる。カーネルの空きページ・リストを使い果たさないようにするために、デフォルト・ページアウト・パス内にないスレッドにこの特性を与えてはならない。
【０１３９】
タスク
タスクは、スレッドの組を保持するコンテナとみなすことができる。タスクには、それに含まれるスレッドに適用されるデフォルト値が含まれる。最も重要なことに、タスクには、それに含まれるスレッドが実行を必要とする要素、すなわち、ポート名前空間と仮想アドレス空間が含まれる。
【０１４０】
図３は、クライアントから可視のタスク構造を示す図である。タスク・オブジェクトは、カーネル・タスク・ポートに送られたメッセージを受け取る。タスク・ポートに対する送出権を保持する可能性があるランダムなタスクからのほかに、タスク・ポートは、タスクのタスク自己ポート、タスクに含まれるスレッドまたはタスクを含むプロセッサ・セットから導出することができる。
【０１４１】
作成と破壊
新タスクは、ｔａｓｋ−＞ｔａｓｋ＿ｃｒｅａｔｅを用いて作成される。タスク作成は、既存のプロトタイプ・タスクについて要求される動作であることに留意されたい。新タスクは、空の仮想アドレス空間を用いて作成されたものであるか、親タスクから継承したもののいずれかとすることができる。新タスクのポート名前空間は、空である。新タスクは、親タスクのＰＣサンプリング状態、特殊ポートおよび例外ポートを継承する。タスクは、ｔａｓｋ−＞ｔａｓｋ＿ｔｅｒｍｉｎａｔｅを用いて破壊される。この動作は、破壊されるタスクに関して要求されるものであって、その作成の際に指定された親に対するものではない。タスクの仮想アドレス空間とポート名前空間が破壊される。
【０１４２】
タスクに関するさまざまな統計は、ｔａｓｋ−＞ｔａｓｋ＿ｉｎｆｏを用いて取得できる。
【０１４３】
特殊ポート
タスクに関連するポート名前空間のほかに、タスクは、小さな組の特殊ポートも有する。
【０１４４】
タスクには、下記の特殊ポートが関連付けられている。
・タスクがそれ自体に対する動作を要求するのに使用するポート。これは、通常はカーネル・タスク・ポートと同一であるが、別の値にセットすることができる。
・どのような目的にも使用できるが、他のサービスを突き止めるのに使用するため、タスクがそれ自体以外の何かに対して保持する初期ポートとして用意された、ブートストラップ・ポート。
・通常はホスト名前ポートと同一の、タスクを含むホストに情報を要求するのに使用されるポート。
【０１４５】
これらのポートは、ｔａｓｋ−＞ｔａｓｋ＿ｇｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔによって返され、ｔａｓｋ−＞ｔａｓｋ＿ｓｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔによってセットされる。新タスク内のこれらのポートの値は、タスク自己ポートを除いて、ｔａｓｋ＿ｃｒｅａｔｅ呼出しの目標であったタスクから継承される。タスクは、例外処理の節で説明したように、親タスクから継承した例外ポートも有する。
【０１４６】
スレッド管理
スレッドは、１つのタスクだけに属する。スレッドは、ｔａｓｋ−＞ｔｈｒｅａｄ＿ｃｒｅａｔｅを用いて作成される。１タスク内に存在するスレッドの組は、ｔａｓｋ−＞ｔａｓｋ＿ｔｈｒｅａｄｓを用いて見つけることができる。
【０１４７】
タスク自体は実行されないが、あるタスクに関していくつかの実行特性をセットすることができ、これらの特性は、そのタスクに含まれるスレッドに適用される。あるタスク内のスレッドのすべてを一緒に、ｔａｓｋ−＞ｔａｓｋ＿ｓｕｓｐｅｎｄによって中断し、ｔａｓｋ−＞ｔａｓｋ＿ｒｅｓｕｍｅによって再開始することができる。これらの動作は、スレッドの中断カウントには影響せず、タスクの中断カウントに影響する。スレッドは、スレッドとそのタスクの両方の中断カウントが０である場合に限って実行可能になる。スレッドに関するデフォルトのスケジューリング特性は、下記を用いてセットできる。
・ｔａｓｋ、ｐｒｏｃｅｓｓｏｒ＿ｓｅｔ＿ｃｏｎｔｒｏｌ−＞ｔａｓｋ＿ａｓｓｉｇｎ
・ｔａｓｋ−＞ｔａｓｋ＿ａｓｓｉｇｎ＿ｄｅｆａｕｌｔ
・ｔａｓｋ−＞ｔａｓｋ＿ｇｅｔ＿ａｓｓｉｇｎｍｅｎｔ
・ｔａｓｋ−＞ｔａｓｋ＿ｐｒｉｏｒｉｔｙ
【０１４８】
ＩＤ
タスクのそれぞれには、カーネルによって解釈されないセキュリティ・トークンを用いてラベルが付けられる。これは、信頼されるサーバがサービス要求元に関するアクセス調停決定に使用するために、そのタスクによって送られるメッセージの中で送られる。このセキュリティ・トークンは、ｔａｓｋ＿ｃｒｅａｔｅによって親タスクから継承される。これは、特権付きのｔａｓｋ（ｓｅｃｕｒｉｔｙ）−＞ｔａｓｋ＿ｓｅｔ＿ｓｅｃｕｒｉｔｙ＿ｔｏｋｅｎ呼出しを用いなければ変更できない。セキュリティ・ポートは、ブートストラップ・タスクに供給される特権ポートであり、このブートストラップ・タスクの唯一の目的は、タスクＩＤのセットまたは変更をサポートすることである。
【０１４９】
第４節  ＩＰＣ
共用メモリを除いて、マイクロカーネル・タスクは、メッセージ送出と応答受取りだけによってその環境と対話する。これらのメッセージは、ポートを使用して送られる。ポートは、受取り側を１つだけ有し、複数の送出側を有することができる通信チャネルである。タスクは、これらのポートに対する権利を保持し、この権利によって、メッセージを送受する能力が指定される。
【０１５０】
ポート
ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。ポートは、受取り側を１つだけ有し、複数の送出側を有することができる。カーネルがサポートする資源を代表するポートは、受取り側としてカーネルを有する。あるタスクが提供するサービスに命名するポートは、そのポートの受取り側としてそのタスクを有する。この受取り側は、ポート権の節で述べるように、望むならば変更することができる。
【０１５１】
ポートに関連する状態は次の通りである。
・関連するメッセージ待ち行列
・ポートに対する参照または権利のカウント
・ポート権とアウトオブライン・メモリ受取り限界
・メッセージ順序番号
・受取り権から作成された送出権の数
・このポートを含むポート・セット
・ノーモアセンダー・ポートが指定されている場合にはその名前
【０１５２】
図４は、一連の送出権と単一の受取り権とを示す、通常のポートを示す図である。関連するメッセージ待ち行列は、一連の順序付きメッセージを有する。メッセージのうちの１つを詳細に示す。これには、そのメッセージの宛先ポート、応答ポート参照、そのメッセージで渡された送受権ならびにいくつかのアウトオブライン・メモリまたは仮想コピー・メモリが示されている。
【０１５３】
ポート自体に影響する動作はごくわずかである。ほとんどの動作は、ポート権またはポート権を含むポート名前空間に影響するか、メッセージ待ち行列に影響する。ポートは、他のシステム実体が作成される時に暗黙のうちに作成される。また、ｍａｃｈ＿ｒｅｐｌｙ＿ｐｏｒｔによってポートが１つ作成される。ポート群は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅおよびｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅ＿ｎａｍｅによって明示的に作成される。あるポートを明示的に破壊することはできない。ポートが破壊されるのは、受取り権が破壊される時だけである。
【０１５４】
ポートの属性は、作成時に割り当てられる。これらの属性の一部、たとえば１メッセージで受け取ることのできるポート権の数やアウトオブライン・メモリの量に対する限界などは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｓｅｔ＿ａｔｔｒｉｂｕｔｅｓを用いて変更できる。これらの属性は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓを用いて取得できる。
【０１５５】
ポートの存在は、関連するすべてのものにとって明らかに重要である。したがって、ポートを使用する多くのタスクが、ポートが破壊された時にメッセージを介して通知を受けることを希望する可能性がある。このような通知は、ｍａｃｈ＿ｍｓｇに対するオプション（ＭＡＣＨ＿ＲＣＶ＿ＮＯＴＩＦＹ）ならびにｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｒｅｑｕｅｓｔ＿ｎｏｔｉｆｉｃａｔｉｏｎによって要求される。その結果の破壊された名前の通知で、名前付きポートの破壊のためにあるタスクのポート名が破壊さ
れたことが示される。このメッセージでは、現在破壊されているポートに関するタスクの名前が示される（これについては、ポート名前空間の節で説明する）。
【０１５６】
メッセージ
メッセージは、２つの実体の間で渡されるデータ、アウトオブライン・メモリ領域およびポート権の集合である。メッセージ自体は、操作可能なシステム・オブジェクトではない。しかし、メッセージは待ち行列化され、メッセージが送出された時刻とそれが受け取られた時刻の間で状態を保持することができるので、メッセージは重要である。純データのほかに、メッセージにポート権を含めることもできる。これは重要である。この形で、メッセージの中でポート権を受け取ることによって、タスクが新しい権利を取得するのである。
【０１５７】
メッセージは、プロセス間通信（ＩＰＣ）サブシステムによって解析される制御部分と、データ部分からなる。さらに、メッセージは、メッセージそのものの外部にある、転送すべきデータの領域を指すことができる。これらの領域には、ポート権を含めることができる（アウトオブライン・ポート配列）。メッセージには、送出側のセキュリティ・トークンも含まれる。メッセージの制御部分は、ヘッダと、任意選択としてメッセージ本体と１つまたは複数のメッセージ記述子から構成される。ヘッダによって、このメッセージが送られるポートのポート名が指定され、応答が必要な場合には、応答が送られるポートの補助ポート名も指定される。
【０１５８】
メッセージ本体が存在する時には、メッセージ本体はヘッダの後に続き、ここでそれに続く記述子の数が宣言される。記述子がない場合、そのメッセージは「複合」メッセージではない、すなわち、データの表立った変換またはコピーをＩＰＣサブシステムが行う必要がない、とみなされる。非「複合」メッセージには、メッセージ本体が含まれない。各記述子は、アウトオブライン・メモリ領域、ポート権、ポート権配列など、カーネルによって操作されるデータのセクションを記述する。メッセージのデータ部分に含まれるデータは、ＩＰＣサブシステムによってバイトの無名配列として扱われる。メッセージの送出側と受取り側の両方が、データ・フォーマットに関する共通の理解を共用しなければならない。メッセージ・インターフェース・ジェネレータ（ＭＩＧ）が生成したルーチンから発するメッセージの場合、データの最初の８バイトに、そのメッセージに含まれるデータの可能な計算機間変換に関する計算機符号化情報が含まれる。
【０１５９】
単一のポート権に関する記述子は、その権利に命名し、コピーを作成したり異なる型の権利から権利を生成するのではなく権利を移動するなどのｍａｃｈ＿ｍｓｇによって実行される特殊な変換に命名する。「アウトオブライン」・ポート配列の記述子も、権利（すべてが同一の型でなければならない）のセットに関するＩＰＣ処理を指定するが、ポート名の配列のアドレスとサイズを指定する。
【０１６０】
アウトオブライン・データ記述子は、アウトオブライン領域のサイズとアドレスを記述する。この領域は、あるページの先頭から始まる必要はなく、整数個のページを含む必要もない。指定されたデータだけが、論理的に伝送される。この記述子は、メッセージを待ち行列化する処置によって、ｖｍ＿ｄｅａｌｌｏｃａｔｅによるものであるかのように、送出側タスクからメモリ範囲を割振り解除することを指定することができる。送出側は、データの物理コピーと仮想コピーのどちらを送るかを選択することができる。仮想コピーを要求することによって、カーネルがその仮想コピーを使用する、すなわち、大量のデータを効率的にコピーする機構であるコピー・オン・ライトを使用することが可能になる。その結果、受取り側には、送出側のメモリ・マネージャによって二重書きされる仮想コピーが見える可能性がある。仮想コピー機構が使用される可能性があるので、送出側と受取り側の両方が、メモリのアクセス時間に不確定性を経験する可能性がある。物理コピーを選択すると、送出側と受取り側によるデータへの決定的なアクセスが保証される。アウトオブライン・データ領域内の値も、メッセージ・データ内の値も、型を持たない。メッセージの受取り側だけが、そのメッセージが来たポートとメッセージ・データの知識を用いて、これらのデータ区域を解釈でき、おそらくは変換することができる。
【０１６１】
メッセージ・トレーラ
メッセージを受け取る時には、デフォルトでその末尾にトレーラが付加される。トレーラは、通常はＩＰＣサブシステムによって追加され、物理的にメッセージと連続している。トレーラには、メッセージ順序番号や送出側セキュリティ・トークンなどのさまざまな伝送関連フィールドが含まれる。
【０１６２】
トレーラのフォーマットとサイズは、受取り側のｍａｃｈ＿ｍｓｇへのオプションを介して制御可能である。これは、送出側のトレーラ供給のオプションとしても可能である。
【０１６３】
メッセージ待ち行列
ポートは、メッセージの待ち行列からなる。この待ち行列は、メッセージを伝送するメッセージ動作（ｍａｃｈ＿ｍｓｇ）を介してのみ操作される。メッセージ待ち行列に関して操作可能な唯一の状態が、そのサイズである。これは、関連ポートの受取り権がｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｓｅｔ＿ａｔｔｒｉｂｕｔｅｓに与えられる時にセットできる。メッセージ待ち行列が満杯の場合、それ以上のメッセージを待ち行列化することはできない。この場合、呼出し側がブロックされる。
【０１６４】
ポートに送られたメッセージは、信頼性のある形で配布される。メッセージの受取りによって、前のすべてのメッセージが受け取られたことと、それらのメッセージが、受取りポートに待ち行列化された順序で受け取られたことが保証される。
【０１６５】
ポート権
ポート権は、特定のポートを特定の方法でアクセスする権利を示す実体である。ポートは、ポート権を介してのみアクセス可能である。これと関連して、ポート権には次の３種類がある。
・受取り権  この権利を保持していると、関連ポートからメッセージを受け取ることができる。
・送出権  この権利を保持していると、関連ポートにメッセージを送ることができる。
・１回送出権  この権利を保持していると、関連ポートに１つだけメッセージを送ることができる。このポート権は、メッセージが送られた後に自動的に破壊される。
ポート権は、ポートを識別するための安全で位置独立な方法である。これらの権利は、カーネルによって保護される実体である。クライアントは、権利を有するポート名を介してのみポート権を操作する。
【０１６６】
基本操作
ｍａｃｈ＿ｍｓｇは、権利を操作する基本的な方法の１つである。ポート権は、メッセージ内で、タスクの間で移動すなわち、送出側から削除し、受取り側に追加することができる。メッセージ内の任意選択フラグによって、ｍａｃｈ＿ｍｓｇに既存の送出権のコピーを作成させたり、受取り権から送出権または１回送出権を生成させることができる。権利は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｅｘｔｒａｃｔ＿ｒｉｇｈｔ（メッセージで権利を送る目標と同等）およびｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｉｎｓｅｒｔ＿ｒｉｇｈｔ（メッセージで権利を受け取る目標と同等）によって強制的にコピーまたは移動することもできる。メッセージ動作以外では、ポート権は、ポート名前空間のメンバとしてのみ操作可能である。
【０１６７】
図５は、ポート名前空間または１メッセージの通過に含まれる、一連のポート権を示す図である。このポート名前空間には、ポート・セットも示されている。
【０１６８】
ポート権は、他のシステム実体が作成される時に暗黙のうちに作成される。Ｍａｃｈ＿ｒｅｐｌｙ＿ｐｏｒｔによって、１つのポート権が作成される。複数のポート権は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅおよびｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅ＿ｎａｍｅによって明示的に作成される。ポート権は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅａｌｌｏｃａｔｅおよびｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅｓｔｒｏｙによって破壊される。破壊は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｍｏｄ＿ｒｅｆｓによるなど、ポート名前空間操作の副産物となる可能性もある。
【０１６９】
受取り権があれば、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓを用いていくつかの状況情報を得ることができる。
【０１７０】
ノーモアセンダー通知
システムは、ポートごとに、送出権と１回送出権の数のシステム全域にわたるカウントを維持する。これには、宛先のポート権や応答ポート権を含む、メッセージの通過に含まれる権利が含まれる。ポートの受取り側は、そのポートに関する送出権がこれ以上存在せず、そのポートがこれ以上値を有することができないことが示される場合を知りたいと希望する可能性がある。この形式の通知は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｒｅｑｕｅｓｔ＿ｎｏｔｉｆｉｃａｔｉｏｎを使用して要求できる。この通知は、ポート名前空間の一部として説明する送出作成回数という概念に依存する。受取り権が別のタスクに移動すると、未処理のノーモアセンダー通知要求が取り消され、この取消しを示すために１回送出通知が送られる。ノーモアセンダー通知が発生するのは、未処理の１回送出権の数に無関係に、既存の送出権の数が０になる時である。
【０１７１】
１回送出権
１回送出権を用いると、１つのメッセージだけを送ることができる。この権利は、受取り権からのみ生成される。１回送出権は、それからメッセージがもたらされることを保証する特性を有する。通常の場合、１回送出権は、メッセージ内の宛先ポートとして使用することによって消費される。この権利は、メッセージが受け取られた時に静かに破壊される。１回送出権は、それが消費される時までは、宛先権として使用されるのでない時に、タスクからタスクへ移動することができる。メッセージを送るのに使用すること以外の方法でこの権利が破壊される場合、１回送出通知がポートに送られる。１回送出権を使用しない時にこれを破壊できる方法のほとんどは、かなり明白である。不明瞭な場合が２つある。
・１回送出権が、ノーセンダー通知の目標として指定され、ノーセンダー通知が要求されたポートが削除されたか、受取り権が移動された場合。来るべきノーセンダー通知が存在しないので、その代わりに１回送出通知が生成される。
・メッセージ受取りを実行する処理の中で、メッセージがポートから待ち行列解除された後、タスクに返される前に、タスクがその受取り権を放棄した場合（下のメッセージ伝送の詳細を参照されたい）。１回送出権を介して送られたメッセージとポートの間の関連が失われことを示す１回送出通知が、宛先ポートに送られる。
【０１７２】
ポート名前空間
ポートは命名されないが、ポート権は命名される。ポート権は、ポート名前空間内に含まれることによってのみ命名可能である。ポートは、ポート名前空間内の指標であるポート名によって指定される。各タスクには、１つのポート名前空間が関連する。
【０１７３】
ポート名前空間内の１項目は、４つの可能な値を有することができる。
・ＭＡＣＨ＿ＰＯＲＴ＿ＮＵＬＬ  関連するポート権なし。
・ＭＡＣＨ＿ＰＯＲＴ＿ＤＥＡＤ  この名前に権利が関連していたが、権利が参照していたポートが破壊されている。このポート名は、クライアント・タスクが何がおきたかを理解する前にこの名前を再利用しないようにするために明示的な処置がなされない限り、この状態に保たれる。
・ポート権  ポートに関する、１回送出権、送出権または受取り権
・ポート・セット名  受取り権と同様に振る舞うが、複数のポートからの受取りが可能な名前。これについては次の節で説明する。
【０１７４】
ポート名前空間に含まれる別個の権利のそれぞれは、必ずしもポート名前空間内で別個の名前を有するわけではない。１回送出権は、別個の権利のそれぞれについて別々の名前を必ず消費する。同一のポートに対する受取り権と送出権は、結合される。すなわち、ポート名前空間が、あるポートに関する３つの送出権を保持する場合、このポート名前空間は、これら３つの権利のすべてについて１つの名前を有する。ポート名は、１回送出、送出、受取り、ポート・セットおよび破壊された名前などの権利のタイプごとに、名前に関連する関連参照カウントを有する。ポート名前空間が受取り権も保持する場合、その受取り権は、送出権と同一の名前を有する。
【０１７５】
名前が破壊されるのは、それに関連するポートが破壊される時である。すなわち、破壊された名前を保持しているタスクは、その名前の下での受取り権を保持していることができない。破壊された名前は、その名前によって以前に保持されていた送出参照の数の非０参照カウントだけを有する。タスクは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｒｅｑｕｅｓｔ＿ｎｏｔｉｆｉｃａｔｉｏｎを使用することによって、その名前のうちのどれかが破壊される時に、送られるメッセージによって通知を受けることができる。この通知メッセージを受け取ることによって、破壊された名前の参照カウントが増分されて、その名前を操作するスレッドとの競争が回避される。
【０１７６】
タスクが権利を取得する時には必ず、そのタスクに、上の規則に従うポート名が割り当てられる。権利を取得すると、その権利のタイプのその名前の参照カウントが増分される。この参照カウントは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｇｅｔ＿ｒｅｆｓによって取得できる。
【０１７７】
ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅｓｔｒｏｙを使用することによって、ポート名を明示的に破壊することができ、すべての参照を除去することができるが、ポート名は、通常はユーザ参照カウントを修正することによって操作される。ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｍｏｄ＿ｒｅｆｓによって、ある名前に関連する指定された権利タイプの参照カウントが修正される。ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅａｌｌｏｃａｔｅは、ｍａｃｈ＿ｐｏｒｔ＿ｍｏｄ＿ｒｅｆｓに類似しているが、この場合、カウントが必ず１つだけ減分され、送出参照カウントまたは１回送出参照カウントだけが減分される。このルーチンは、名前を修正するための決定が行われた後に破壊された可能性があるポート名の参照カウントを操作するのに有用である。実際に権利を移動するｍａｃｈ＿ｍｓｇのオプションによって、また、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｅｘｔｒａｃｔ＿ｒｉｇｈｔによっても、名前の参照カウントを減分することができる。ポート名が解放されるのは、すべての参照カウントが０になった時である。
【０１７８】
ポート名が解放され、その名前に関する名前破壊通知が有効である場合に、ポート削除済み通知が生成される。名前破壊通知が有効である名前は、次の３つの状態のうちのどれか１つでしかあり得ない。
・有効な権利に命名している
・ＭＡＣＨ＿ＰＯＲＴ＿ＤＥＡＤ、名前が破壊された時に名前破壊通知が送られている。
・ＭＡＣＨ＿ＰＯＲＴ＿ＮＵＬＬ、名前がｎｕｌｌになった時にポート削除済み通知が送られている。
【０１７９】
名前の型などの名前に関する情報は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｔｙｐｅによって得ることができる。割当て済みの名前のリストは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｎａｍｅｓを用いて取得する。それによって権利がわかる名前は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｒｅｎａｍｅを用いて変更できる。受取り権名を与えられれば、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓを用いて、一部の状況情報を得ることができる。
【０１８０】
受取り権に命名するポート名は、ノーモアセンダー通知処理に使用される、関連する送出作成カウントを有する。送出作成カウントは、受取り権から送出権が（ｍａｃｈ＿ｍｓｇに対してＭＡＣＨ＿ＭＳＧ＿ＴＹＰＥ＿ＭＡＫＥ＿ＳＥＮＤ型の記述子を指定したポート権であるメッセージ要素を用いて）作られた回数のカーネルのカウントである。この送出作成カウントは、ポートが作成される時に０にセットされ、メッセージ内で受取り権が伝送される時には必ず０にリセットされる。これは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｓｅｔ＿ｍｓｃｏｕｎｔを用いて変更することもできる。送出作成カウントは、ノーモアセンダー通知メッセージに含まれる。ノーセンダー通知によって、通知が生成された時点で送出権が存在しないことが示されることに留意されたい。それでも未解決の１回送出権が存在する可能性がある。すべての１回送出権によって、メッセージまたは１回送出通知が保証されるので、タスクは、簡単に１回送出権の跡を追うことができる。受け取られたメッセージには、そのメッセージを受け取ったポートから取られた順序番号のスタンプを付ける。ポート・セットから受け取ったメッセージには、適当なメンバ・ポートからの順序番号を用いてスタンプを付ける。送られたメッセージに置かれる順序番号は、上書きされる。新たに作成されるポートは、０の順序番号から始まり、この順序番号は、そのポートの受取り権が移動される時に必ず０にリセットされる。順序番号は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｓｅｔ＿ｓｅｑｎｏを用いて明示的にセットすることもできる。メッセージをポートから待ち行列解除する時に、そのメッセージに、そのポートの順序番号を用いてスタンプを付け、その後、そのポートの順序番号を増分する。この待ち行列解除と増分の動作は、原子的であり、その結果、あるポートからメッセージを受け取る複数のスレッドが、ｍｓｇｈ＿ｓｅｑｎｏフィールドを使用してメッセージの元の順序を再構成できるようになっている。
【０１８１】
ポート名前空間は、タスクにバインドされるので、それを所有するタスクと共に作成され、破壊される。
【０１８２】
ポート・セット
ポート・セットは、メッセージを受け取る時に単一の単位として扱うことのできるポートの組である。ｍａｃｈ＿ｍｓｇの受取り動作は、受取り権またはポート・セットのいずれかに命名するポート名に対して許可される。ポート・セットには、受取り権の集合が含まれる。受取り動作がポート・セットに対して行われる時、メッセージは、そのセット内のポートのうちの１つから無作為に受け取られる。ポート・セットに対するメッセージの配布の順序は、不確定であり、次の２つの警告を伴う実施の対象となる。
１）ポート・セットのメンバは、資源枯渇の影響を受けてはならない。
２）同一のポートに対する他のメッセージに関するメッセージの到着の順序は、保存される。
【０１８３】
セット内の受取り権のそれぞれが、それ自体の名前を有し、セットも、それ自体の名前を有する。ポート・セットに対する受取りによって、そのメッセージを提供したポートの受取り権の名前が報告される。受取り権は、１つのポートセットだけに属することができる。タスクは、ポート・セットに含まれる受取り権から直接受け取ることができない。ポート・セットは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅまたはｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ａｌｌｏｃａｔｅ＿ｎａｍｅを用いて作成される。ポート・セットは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅｓｔｒｏｙまたはｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｄｅａｌｌｏｃａｔｅによって破壊される。
【０１８４】
ポート・セットの操作は、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｍｏｖｅ＿ｍｅｍｂｅｒを用いて行われる。この呼出しでは、セットにメンバを追加するか、セットからメンバを取り除くか、あるセットから別のセットへメンバを移動することができる。ポート・セットのメンバシップは、ｐｏｒｔ＿ｎａｍｅ＿ｓｐａｃｅ［ｐｏｒｔ＿ｎａｍｅ］−＞ｍａｃｈ＿ｐｏｒｔ＿ｇｅｔ＿ｓｅｔ＿ｓｔａｔｕｓを用いて見つけることができる。
【０１８５】
メッセージ伝送
システム呼出しｍａｃｈ＿ｍｓｇによって、マイクロカーネル・メッセージの送受が行われる。２つのタスクの間で実際にメッセージを転送するためには、送出側が、送出オプションと正しい目的ポートを用いてｍａｃｈ＿ｍｓｇ呼出しを行わなければならない。受取り側は、受取りオプションを用いてｍａｃｈ＿ｍｓｇ呼出しを行い、目的ポートでの読取りに着手しなければならない。この２つの呼出しの順序は、重要ではない。
【０１８６】
送出動作によって、メッセージがポートに待ち行列化される。このメッセージには、呼出し側のデータのコピーが含まれる。呼出し側は、送出動作からリターンした後に、送られたデータに影響を及ぼすことなくメッセージ・バッファやアウトオブライン領域を自由に修正できる。メッセージ内でアウトオブラインとして指定されたデータは、送出側のオプションとカーネルによる機構の選択とに応じて、仮想コピーまたは物理コピーとして渡される。カーネルは、領域を定義するページの組の仮想メモリイメージを構築する。「アウトオブライン」ポート配列は、物理的にコピーされ、宛先空間に適したポート名に変換される。カーネルが仮想コピーを構築する場合、カーネルは、仮想コピー内の最初のページのデータに先行する部分と、仮想コピー内の最後のページのデータに続く部分を０クリアする。
【０１８７】
呼出し側は、下記のいずれかが発生しない限り、メッセージを待ち行列化できるまでブロックされる。
・メッセージが１回送出権に送られる。これらのメッセージは、必ず強制的に待ち行列化される。
・ｍａｃｈ＿ｍｓｇ動作が打ち切られた（ｔｈｒｅａｄ＿ａｂｏｒｔ）。デフォルトでは、ｍａｃｈ＿ｍｓｇライブラリ・ルーチンが、中断された動作を再試行する。
・送出動作が、そのタイムアウト値を超過した。
・ポートが破壊された。
【０１８８】
メッセージの送出は、２ステップの処理である。第１のステップには、メッセージのカーネル・コピーの構築が含まれる。第２のステップには、メッセージの待ち行列化が含まれる。無効なポート権やデータ・アドレスなど、第１ステップ中に障害が発生すると、送られるメッセージがエラー・リターンを伴う障害を発生するが、悪影響はない。第２ステップ中の障害も、送出タイムアウト値を超過した時や、割込み（ｔｈｒｅａｄ＿ａｂｏｒｔ）が発生した時に発生する可能性がある。これらの障害も、送出に障害を発生させるが、これらの状況では、カーネルが、擬似受取り動作を用いて呼出し側にメッセージ内容を返そうと試みる。この擬似読取り動作によって、メッセージ内だけに存在するポート権またはメモリ（たとえば、メッセージに移動された受取り権や、割振り解除フラグと共に送られたアウトオブライン・メモリ）の消失が防止される。
【０１８９】
擬似受取り動作は、通常の受取り動作に非常に類似している。擬似受取りによって、メッセージ・ヘッダ内のポート権が、メッセージ本体に含まれるかのように処理される。擬似受取りの後、そのメッセージは、再送出の準備ができている。メッセージを再送出しない場合、アウトオブライン・メモリ範囲が移動されている可能性があり、一部のポート権が名前を変更されている可能性があることに留意されたい。
【０１９０】
受取り動作によって、メッセージがポートから待ち行列解除される。受取り側のタスクは、そのメッセージに含まれるポート権とアウトオブライン・メモリ範囲を取得する。受取り動作の呼出し側は、ヘッダと本体がコピーされるバッファを供給しなければならない。受け取られるメッセージのフォーマットは、送出された時と同一である。メッセージがバッファに収まらない場合、そのメッセージは破壊される。オプション（ＭＡＣＨ＿ＲＣＶ＿ＬＡＲＧＥ）を使用すると、呼出し側が、必要なバッファ・サイズと共にエラーを受け取ることができ、その結果、適切なサイズのバッファを用いてもう一度受取り動作を試みることができるようになる。
【０１９１】
受け取ったメッセージには、ポート権とアウトオブライン・メモリが含まれる可能性がある。受け取ったポート権とメモリは、何らかの形で消費するか割振り解除する必要がある。資源不足のためにポート権またはアウトオブライン・メモリを受け取れない場合、その実体が破壊される。ポート権の受取りは、ポート名前空間の節で説明した他の名前によるポート権の挿入と同一の規則に従う。ポート権記述子によって、受け取った権利のタイプが示される。
【０１９２】
伝送されるアウトオブライン領域のそれぞれについて、カーネルは、受け取られるメッセージ内の記述子を返し、この記述子によって、そのメモリが突き止められ、物理コピーと仮想コピーのどちらの送出をカーネルが選択した（または送出側によって指示された）かが示される。物理コピーを送出することによって、決定的な挙動が保証される。デフォルトのメモリ・マネージャによって二重書きされるにもかかわらず、カーネルの仮想コピー最適化で、既にメモリ内にあるページ・イメージが使用されるか、送出側のメモリを二重書きしたメモリ・マネージャからページ・イメージが取り出される可能性がある。これは、受取り側タスクを任意のメモリ・マネージャに従属させる可能性があるが、これによって、大量のメモリの直接コピーに対する大幅な性能改善をもたらすことができる。仮想コピーにとって最適の事例は、送出側が割振り解除オプションを使用した時である。追加情報については、仮想メモリ管理の節を参照されたい。
【０１９３】
アウトオブライン・メモリ領域またはポート配列メモリ領域の受取りには、２つのオプションがある。デフォルトのオプション１では、受け取られる領域が、ｖｍ＿ａｌｌｏｃａｔｅによるものであるかのように、受取り側のアドレス空間内で一時メモリとして動的に割り振られる。カーネルが仮想コピーを伝送した場合、受け取られるデータは、送出側のページ内境界合せと同一の境界合せで、割り振られた空間内に現れる。これ以外のどの場合でも、割り振られたデータは、ページ境界の先頭から始まる。どのような状況でも、このオプションを用いたメッセージの受取りは、仮想コピー自体の不注意な参照によって受取り側を機能停止させることはない。
【０１９４】
オプション２では、代替アウトオブライン受取りモードによって、アウトオブライン領域が、ｖｍ＿ｗｒｉｔｅによるものであるかのように、指定された区域内のバイトに上書きされる。このアウトオブライン領域が、指定された区域に収まらない場合、受取り側はエラーに遭遇する。さまざまな状況の下で、データ伝送とデータ境界合わせの方法に応じて、このオプションでは、ページ操作が実行されるか実際にデータがコピーされる可能性がある。この動作は、おそらくは、仮想コピーを二重書きするメモリ・マネージャと相互作用し、独断的に受取り側を機能停止させる可能性がある。
【０１９５】
この２つの受取りモードの選択は、ＭＡＣＨ＿ＲＣＶ＿ＯＶＥＲＷＲＩＴＥオプションに依存する。これがセットされていない時には、受け取られる領域のすべてが動的に割り振られる。セットされている場合には、受取りバッファが、送られたメッセージ内の記述子リストと同一形式の「散乱」記述子リストを記述するものとみなされる。カーネルは、このリストを走査して、受け取った領域のそれぞれに対して何を行うかを決定する。送られた領域の数を扱うのに十分な記述子が供給されていない場合、追加領域を動的に割り振る。カーネルは、アウトオブライン記述子のそれぞれを調べて、対応する領域の後処理を決定する。仮想コピーの「送出」オプションは、動的割振りを暗示し、物理コピーのオプションは、上書きされる領域を突き止めるのに使用される記述子のアドレス・フィールドとサイズ・フィールドを用いる上書きを暗示する。サイズが不十分であると、エラー・リターンが発生する。
【０１９６】
受取り動作も、２ステップの処理すなわち、メッセージの待ち行列解除と、その後の受取り側でのコピーの作成である。第１のステップは、指定された受取りタイムアウト値を超過したか、受取りが打ち切られた（ｔｈｒｅａｄ＿ａｂｏｒｔ）ためにエラーになる可能性がある。これらの状況は、受け取られたはずのメッセージには影響しない。ほとんどの障害は、第２ステップ中に発生し、これによってメッセージが破壊される。
【０１９７】
ｍａｃｈ＿ｍｓｇ呼出しの結果として要求することができる通知がある。この通知は、ｍａｃｈ＿ｍｓｇによって生成されるのではないが、ＭＡＣＨ＿ＲＣＶ＿ＮＯＴＩＦＹオプションによって要求される。このオプションを指定すると、受け取った応答ポート権が、ｍａｃｈ＿ｐｏｒｔ＿ｒｅｑｕｅｓｔ＿ｎｏｔｉｆｉｃａｔｉｏｎによるものであるかのように、それに関する名前破壊通知を自動的に要求されるようになる。このオプションは、特定の種類のリモート・プロシージャ・コール（ＲＰＣ）相互作用のための最適化である。応答ポート名に対する名前破壊通知を用いると、そのメッセージの受取り側が、要求元クライアントの破壊について時宜を得た形で通知を受けられるようになる。しかし、応答権は、通常は１回送出権であるから、応答を送ることによって、権利が破壊され、その代わりにポート削除通知が生成される。この通知を取り消すための最適化は、ｍａｃｈ＿ｍｓｇに対するＭＡＣＨ＿ＳＥＮＤ＿ＣＡＮＣＥＬオプションによって提供される。
【０１９８】
メッセージ動作は、メッセージ・ヘッダ内のポート権の操作に関しては原子的である。
【０１９９】
第５節  仮想メモリ管理
マイクロカーネルの仮想メモリ設計では、仮想メモリ・システムが、機械依存部分と機械独立部分の層に分けられる。機械依存部分は、仮想メモリのページに対するアクセス権の有効化、無効化およびセットのための単純なインターフェースを提供し、これによって、ハードウェア・アドレス・マップを維持する。機械独立部分は、論理アドレス・マップ（仮想アドレス空間のマッピング）、このマップ内のメモリ範囲、および、外部メモリ管理インターフェースを介するこれらの範囲に関する補助記憶（メモリ・オブジェクト）へのインターフェースのサポートを提供する。
【０２００】
仮想メモリ・システムは、適度なプロセッサ数の均一メモリ・アクセス多重プロセッサ用に設計されている。不均一メモリ・アクセスを提供するアーキテクチャまたは遠隔メモリ・アクセスを提供しないアーキテクチャのサポートは、現在研究中である。
【０２０１】
高性能が、マイクロカーネル仮想メモリ設計の特徴である。このかなりの部分が、大きく疎なアドレス空間、共用メモリおよび仮想コピー・メモリ最適化の効率的なサポートからもたらされる。
【０２０２】
最後に、この仮想メモリ・システムを用いると、クライアントが、メモリ範囲のために補助記憶を提供でき、これによって、そのような範囲に適用されるセマンティックスを定義できるようになる。
【０２０３】
仮想アドレス空間
仮想アドレス空間によって、その仮想アドレス空間を所有するタスク内で実行中のスレッドが参照を許可される有効な仮想アドレスの組が定義される。仮想アドレス空間は、それを所有するタスクによって命名される。
【０２０４】
仮想アドレス空間は、疎なメモリ・ページの指標付きの組からなる。１ページのサイズは、ｈｏｓｔ＿ｎａｍｅ−＞ｈｏｓｔ＿ｐａｇｅ＿ｓｉｚｅを用いて見つけることができる。カーネルは、その内部で、すべてが同一の属性（二重書きされるアブストラクト・メモリ・オブジェクト、継承、保護その他の特性など）を有するページの仮想的に連続した組を、メモリ領域と呼ばれる内部実体にグループ化する。メモリ領域は、それを含むアドレス空間内の仮想アドレス範囲のみによって命名される。さまざまな動作およびシステム機構が、メモリ領域のＩＤに敏感であるが、ほとんどのユーザ・アクセスは、それ程影響を受けず、メモリ領域を自由にまたぐことができる。カーネルは、適切と思われるならばメモリ領域を自由に分割、併合する。クライアントから見たアドレス空間は、ページの組として見える。メモリ領域に対して敏感な唯一の呼出しが、ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ａｄｄｒｅｓｓ］−＞ｖｍ＿ｒｅｇｉｏｎである。この呼出しは、所与のアドレス付近の領域を突き止め、そのメモリ領域に関する情報を返す。メモリ領域は、純粋にカーネル内部の概念であるが、ｖｍ＿ｍａｐ呼出しによって影響を受け、また、保護属性と継承属性の変更によって影響を受ける。したがって、この呼出しの結果は、呼出しごとに変化する可能性がある。
【０２０５】
仮想アドレス空間は、タスクが作成される時に作成され、タスクが破壊される時に破壊される。新タスクが作成される時には、継承を無視すると、そのアドレス空間は空であり、タスクがスレッドを実行にセットできるようになる前に、仮想アドレス空間の操作を介してアドレス空間を作成しなければならない。しかし、ｔａｓｋ＿ｃｒｅａｔｅ呼出しのオプションを用いると、新タスクが、この作成呼出しに使用されるプロトタイプ・タスクからメモリの範囲を継承できるようになる。カーネル関数ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｉｎｈｅｒｉｔによって、メモリ範囲の継承特性を変更し、継承を許可または禁止することができる。可能な継承は次の通りである。
・ＶＭ＿ＩＮＨＥＲＩＴ＿ＮＯＮＥ  新タスク内の範囲は未定義のまま残される。
・ＶＭ＿ＩＮＨＥＲＩＴ＿ＣＯＰＹ  タスク作成時に、コピー最適化を用いて新タスクに範囲がコピーされる。
・ＶＭ＿ＩＮＨＥＲＩＴ＿ＳＨＡＲＥ  新タスクと旧タスクがメモリ範囲へのアクセス権を共用する。
【０２０６】
メモリの範囲に、メモリ・マネージャの処置を介して別個のセマンティックスを関連付けることができる。新しいメモリ範囲を仮想アドレス空間内で確立する時には、おそらくはデフォルトで、そのメモリ範囲のセマンティックスを表すアブストラクト・メモリ・オブジェクトが指定される。このアブストラクト・メモリ・オブジェクトは、そのセマンティックスを提供するタスク（メモリ・マネージャ）と関連する。タスクがメモリ範囲に関連するセマンティックスに直接影響を及ぼすためのカーネル呼出しは存在しない。タスクは、所望の機能性を提供するメモリ・マネージャを選択することによるか、処置を指示するメッセージをメモリ・マネージャに直接送ることによってのみ、このような制御を得る。
【０２０７】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｍａｐ  仮想メモリの新しい範囲を確立する。この呼出しによって、配置、サイズ、保護、継承、オブジェクト・オフセットなどのメモリ範囲の詳細を指定する。この呼出しに対する最も重要なパラメータは、その範囲のための記憶域を二重書きするアブストラクト・メモリ・モデルを暗示するメモリ・オブジェクト・レプリゼンタティブ・ポートと、メモリ・オブジェクトに対して許可されるアクセス・モードである。ｎｕｌｌのポートは、システムのデフォルト・メモリ・マネージャを使用することを指定する。デフォルト・メモリ・マネージャは、システムのページング空間に対してページングされ、システム・ブート・ロードの間に持続しない、当初は０で満たされる記憶域を提供する。
【０２０８】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ａｌｌｏｃａｔｅ  デフォルト・システム・マネージャを所望する時の、単純化された形のｖｍ＿ｍａｐ呼出しである。
【０２０９】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｄｅａｌｌｏｃａｔｅ  メモリ範囲を無効化する。
【０２１０】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｒｅｍａｐ  目標タスクのアドレス空間に、ｔａｓｋ−＞ｔａｓｔｅ＿ｃｒｅａｔｅを介して作成されたかのようにメモリ範囲を作成するが、そのプロトタイプ・タスクは、ソース・タスクであり、ソース・メモリ範囲は、ＶＭ＿ＩＮＨＥＲＩＴ＿ＳＨＡＲＥ特性を有する。
【０２１１】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｐｒｏｔｅｃｔ  あるメモリ範囲に対して許可されるアクセス権をセットする。各メモリ範囲は、現保護マスクと最大保護マスクを有する。ある範囲のメモリ・マネージャは、メモリ・オブジェクト・レプリゼンタティブを介してページの範囲の全ユーザに関して最大保護を指定することができる。その後、各タスクは、許される許可をさらに制限するためのそれ自体の私用最大保護値ならびに、現保護マスクを有する。
【０２１２】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｃｏｐｙ  仮想アドレス空間内のある場所から別の場所へメモリ範囲をコピーする。
【０２１３】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｒｅａｄ  メモリ範囲をコピー・アウトする。
【０２１４】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｗｒｉｔｅ  メモリ範囲をコピー・インする。
【０２１５】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｍｓｙｎｃ  仮想メモリの範囲の補助記憶（そのメモリ・マネージャ）へのフラッシュまたはクリーンを強制する。
【０２１６】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｍａｃｈｉｎｅ＿ａｔｔｒｉｂｕｔｅ  メモリ範囲に対して、計算機固有のハードウェア特性をセットする。
【０２１７】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｒｅｓｅｒｖｅ  メモリの範囲を予約し、これによって、ｖｍ＿ａｌｌｏｃａｔｅ、ｖｍ＿ｍａｐまたはアウトオブライン・メモリ受取りから生じる範囲内のランダム割振りを防止する。ｖｍ＿ｄｅａｌｌｏｃａｔｅは、範囲を予約解除しない。
【０２１８】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｕｎｒｅｓｅｒｖｅ  メモリの範囲を予約解除する。
【０２１９】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｗｉｒｅ  メモリの範囲のページ可能性を指定する。ワイヤリングによって、メモリの範囲が存在し、常駐することが強制される。ワイヤリングされたメモリは、そのタスクのワイヤリング済みカーネル・メモリ限界に対してカウントされる。カーネルは、領域がワイヤリングされる回数のカウントを維持し、そのカウントが０に戻らない限りワイヤリングを解除しない。
【０２２０】
ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｂｅｈａｖｉｏｒ＿ｓｅｔ  カーネルのページ交換アルゴリズムを案内するヒントとして、通常、ランダム、順次、逆順次など、範囲の期待される使用パターンを指定する。
【０２２１】
ｖｍ＿ａｌｌｏｃａｔｅ（）、ｖｍ＿ｍａｐ（）またはｖｍ＿ｒｅｍａｐ（）を、ＶＭ＿ＡＬＬＯＣＡＴＥ＿ＡＮＹＷＨＥＲＥフラグ付きで、０の入力目標アドレスを用いて使用する時に、有効メモリ範囲がアドレス０に割り振られる可能性がある。一部のプログラム、特にＣ言語に基づくプログラムは、値が０のメモリ・ポインタをＮＵＬＬポインタとみなし、有効なメモリ・バイトを指すポインタでないとみなすので、これらのプログラムは、メモリがアドレス０に割り振られた場合に障害を発生する。パーソナリティ・サーバおよび他のタスクは、各タスクの第１ページが予約されていることを確認することによって、この問題を回避できる。
【０２２２】
メモリ・オブジェクト
マイクロカーネルを用いると、ユーザ・モード・タスクが、仮想アドレス空間の部分を参照するという動作に関連するセマンティックスを提供できるようになる。これは、アブストラクト・メモリ・オブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・メモリ・オブジェクトの指定を可能にすることによって行われる。メモリ・オブジェクトを実装するタスクは、そのメモリ・オブジェクトに命名するポートに送られたメッセージに応答する。このタスクを、メモリ・マネージャと呼ぶ。
【０２２３】
基本操作
ユーザ・モード・タスクによる仮想アドレス空間の操作は、下記の基本形式をとる。
・タスクが、範囲を二重書きするメモリ・オブジェクトに命名するためのメモリ・オブジェクト・レプリゼンタティブ・ポートを指定して、新しいメモリ範囲を確立する（ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｍａｐ）。
・タスクが、通常はこのメモリ範囲の一部を変更することによって、その部分を参照しようと試みる。その部分は、まだメモリ内に存在していないので、参照を行うタスクは、ページ不在障害を受け取る。カーネルが、その範囲のアブストラクト・メモリ・オブジェクトに、存在していないデータを要求するメッセージを送る。アブストラクト・メモリ・オブジェクトからの応答によって、要求元タスクのページ障害が解決される。
・最終的に、おそらくはクライアント・タスクによって修正された値を有するメモリ範囲の常駐ページが、メモリから追い出される。ページは、後処理のため、その範囲のアブストラクト・メモリ・オブジェクトへのメッセージで送られる。ページャは、カーネルに、ダーティ・ページだけを返すように命じるか、クリーン・ページも返すように命じることができる。
・クライアント・タスクが、ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ｒａｎｇｅ］−＞ｖｍ＿ｄｅａｌｌｏｃａｔｅを使用して、メモリ範囲を確立解除する。このメモリ・オブジェクトのすべてのマッピングが消滅した時に、このアブストラクト・メモリ・オブジェクトが終了する。
【０２２４】
カーネルは、さまざまなメモリ・オブジェクトの内容のための直接アクセス可能キャッシュとして、メイン・メモリを使用するものとみなされなければならない。あるメモリ・オブジェクトの常駐ページを含むキャッシュの部分を、メモリ・キャッシュ・オブジェクトと呼ぶ。カーネルは、ふさわしいと思われる形でこのキャッシュを満たし、フラッシュして、このキャッシュを維持するためにさまざまなメモリ・マネージャと共にダイアログにかかわる。このダイアログは、一般に、非同期メッセージからなる。というのは、メモリ・マネージャによってカーネルを機能停止させることができず、メモリ・マネージャは、その動作の並行性を最大にすることを望むからである。カーネルのメッセージは、アブストラクト・メモリ・オブジェクト・ポートを介してメモリ・マネージャに送られる。カーネルへのメッセージは、カーネルのメモリ・キャッシュ制御ポートを介して送られる。カーネルによって送られるメッセージは、サーバ・インターフェースというラベルを付けられたルーチンを使用して送られる。メモリ・マネージャによって送られるメッセージは、通常メッセージ関数というラベルを付けられたルーチンを使用して送られる。
【０２２５】
クライアントのｖｍ＿ｍａｐ呼出しで指定されたメモリ・オブジェクト・レプリゼンタティブ・ポートによって、アブストラクト・メモリ・オブジェクト・ポートが暗示される。このポートは、そのアブストラクト・メモリ・オブジェクトを実装するメモリ・マネージャ・タスクに命名する。各アブストラクト・メモリ・オブジェクトは、そのメモリ・オブジェクトの常駐ページのキャッシュを表す関連常駐カーネル・メモリ・キャッシュ・オブジェクトを有する。メモリ・キャッシュ・オブジェクトは、メモリ・マネージャがこのメモリ・キャッシュ・オブジェクトを制御し、オブジェクトに代わってカーネル要求に応答できるようにメモリ・マネージャに供給される関連制御ポートを有する。カーネルは、メモリ・キャッシュ・オブジェクトを参照するためにクライアント・タスクが使用するための、メモリ・キャッシュ・オブジェクトの名前ポートも生成する。名前ポートは、ｖｉｒｔｕａｌ＿ａｄｄｒｅｓｓ＿ｓｐａｃｅ［ｍｅｍｏｒｙ＿ａｄｄｒｅｓｓ］−＞ｖｍ＿ｒｅｇｉｏｎによって返される。アブストラクト・メモリ・オブジェクトが、複数のホスト上のタスクによってマッピングされる場合、各ホスト上に、メモリ・キャッシュ・オブジェクト用の１つの制御ポートと１つの名前ポートが存在する。
【０２２６】
メモリ・キャッシュ・オブジェクト内の各ページは、アブストラクト・メモリ・オブジェクト内のオフセットを表す。メモリ・オブジェクトのオフセットは、ｖｍ＿ｍａｐ呼出しでクライアントによって指定されたオブジェクト・オフセットに、ページ長の整数倍を加えた値である。クライアントは、ｖｍ＿ｍａｐに任意のオフセットを指定できることに留意されたい。したがって、１つのメモリ・オブジェクトが、クライアントによって指定された異なるオフセット値のために、メモリ内にそのデータの複数のコピーを有する可能性がある。しかし、カーネルは、これらのコピーの間のデータ一貫性を維持しない。
【０２２７】
図６は、クライアントから可視の仮想メモリ構造を示す図である。３つのメモリ範囲があり、そのうちの２つは、同一の二重書きアブストラクト・メモリ・オブジェクトを有するが、おそらくは継承属性または保護属性が異なる。メモリ・キャッシュ／アブストラクト・メモリ・オブジェクト対のうちの１つを、読取りアクセスと読み書きアクセスを表す２つのメモリ・オブジェクト・レプリゼンタティブと、メモリ・マネージャ・タスクと共に詳細に示す。予約されているが未割り振りの領域は、図示しない。その領域は、予約フラグと継承属性だけを用いてマークされるはずである。他の属性は適用されない。
【０２２８】
メモリ管理の初期設定
メモリ・オブジェクト初期設定の結果、メモリ・マネージャのアブストラクト・メモリ・オブジェクト（補助記憶）が、カーネルのメモリ・キャッシュ・オブジェクト（メモリ・イメージ）にバインドされる。メモリ・マネージャは、カーネルが後続の操作メッセージを送るのに使用するアブストラクト・メモリ・オブジェクト・ポートをカーネルに通信する。カーネルは、メモリ・マネージャに、マネージャが後続の操作メッセージを送るのに使用するメモリ・キャッシュ制御ポートを通信する。
【０２２９】
アブストラクト・メモリ・オブジェクト・ポートは、特別に設計されたプロトコルに従ってカーネルがメッセージを送るポートである。クライアントがこのポートへのアクセス権を有することは有害である可能性がある。というのは、メモリ・マネージャを混乱させる可能性があるからである。たとえば、クライアントは、アブストラクト・メモリ・オブジェクト・ポートを介してメッセージの無効なシーケンスを送る可能性があるが、このアブストラクト・メモリ・オブジェクト・ポートに対して、メモリ・マネージャは十分な保護を有しない。この理由と、メモリ・オブジェクトへのアクセス権を制御するために、メモリ・マネージャは、通常は、カーネル以外にはアブストラクト・メモリ・オブジェクト・ポートを配布しない。その代わりに、クライアントには、メモリ・オブジェクト・レプリゼンタティブ・ポートへの送出権が与えられ、これによって、関連するアブストラクト・メモリ・オブジェクト・ポートと、関連するメモリ・オブジェクトへの許可されるアクセス・モードの関連する組が暗示される。
【０２３０】
アブストラクト・メモリ・オブジェクト・ポートとメモリ・オブジェクト・レプリゼンタティブ・ポートのどちらもが、通常のマイクロカーネル・ポートである。すなわち、これらのポートの受取り側は、カーネルではなくマイクロカーネル・タスクである。
【０２３１】
クライアントが、メモリ・オブジェクト・レプリゼンタティブ・ポートによって表されるオブジェクトのＩＤをまだ知らないカーネルに、ｖｍ＿ｍａｐを介してメモリ・オブジェクト・レプリゼンタティブ・ポートを指定する時には、カーネルが、その代理ポートを使用して、特殊なダイアログにかかわる。カーネルが、関連するオブジェクトのＩＤを知らない場合、このｖｍ＿ｍａｐ呼出しを、メモリ・マネージャとの対話なしで直接に実行することができる。ｖｍ＿ｍａｐ呼出しは、カーネルに、メモリ・キャッシュ制御ポートへの送出権を含むｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｒｅｐｒｅｓｅｎｔａｔｉｖｅ（ｈｏｓｔ＿ｎａｍｅ）−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージを送らせる。その後、このメモリ・キャッシュ制御ポートに、デフォルトの属性が割り当てられる。ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈメッセージが送られるまでは、このポートが完全に確立されたとみなしてはならず、その属性が正しくセットされているとみなしてはならない。
【０２３２】
ｖｍ＿ｍａｐの結果としてカーネルによるのではなく、代理ポートを保持するクライアントによって、誤ったｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージが生成されている可能性があるので、メモリ・マネージャは、このメッセージに直接には応答せず、その代わりに、通知メッセージで供給されたホスト名前ポートに応答メッセージを送る。メモリ・マネージャは、ｍａｃｈ＿ｈｏｓｔ＿ｓｅｌｆを検査するか、名前サーバに問い合わせるかのいずれかによって、これがホスト名前ポートであるかどうかを検証できる。ホスト名前ポートが有効であることを検証した後に、メモリ・マネージャは、アブストラクト・メモリ・オブジェクト・ポートおよびオブジェクト属性ならびに、この代理を使用してマッピングを試みるタスクが有する必要のある、メモリ・オブジェクト・レプリゼンタティブによって許可されるアクセス権と制限付きのＩＤが存在するならばそれらを指定する、ｈｏｓｔ＿ｎａｍｅ（ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ）−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈを用いて応答する。メモリ・オブジェクト・レプリゼンタティブ・ポートをアブストラクト・メモリ・オブジェクト・ポートとして指定することは許容可能であるが、これによって、マネージャに関する潜在的な脆弱さが導入される。オブジェクト属性を用いると、オブジェクト・キャッシュ属性および下で説明するコピー戦略ならびに他の性能属性および特殊属性の指定が可能になる。これらの属性は、後程、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｈａｎｇｅ＿ａｔｔｒｉｂｕｔｅｓを用いて変更でき、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓを用いて調べることができる。
【０２３３】
マネージャには、このメッセージ内のメモリ・キャッシュ制御ポートが含まれることに留意されたい。制御ポートは、代理ポートのこの使用のために特別に作成されたので、他のタスクに与えられてはおらず、したがって、マネージャによって、マネージャ自体をカーネルに認証させる、すなわち、マネージャがｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージの受取り側であることを検証するのに使用することができる。クライアントが元のｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージを偽造したので、カーネルがｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈメッセージを期待していなかった場合には、カーネルは、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｒｅｊｅｃｔｅｄを用いて応答する。これによって、マネージャに、マネージャがメモリ・キャッシュ制御ポートとして識別したポートが実際にはそうでないことが知らされる。メモリ・マネージャは、どの情報もクライアントに漏らさない。マネージャは、単に、それを予期していなかったか受け入れなかったカーネルに余分なメッセージを送るだけである。
【０２３４】
ホスト名前ポートとメモリ・キャッシュ制御ポートを含むシーケンスによって、カーネルにメモリ・マネージャが認証され、メモリ・マネージャにカーネルが認証される。これは、メモリ・マネージャの、メモリ・マネージャに与えられた名前ポートを認証する能力に依存する。カーネルからマネージャへのダイアログに干渉するために、仲介物が、マネジャに、ホスト名前ポートではなく、他の名前ポートを提示するはずである。これが機能するためには、マネージャが、与えられた名前ポートを認証しないか、マネージャの使用する認証サービスが、マネージャに与えられた名前ポートの信憑性を保証しないかのいずれかでなければならない。前のシーケンスは、まだカーネルに知られていないメモリ・オブジェクトの初期設定に関する。これは、カーネルに、ｖｍ＿ｍａｐを介して、カーネルが知らないメモリ・オブジェクト・レプリゼンタティブ・ポートが提示された時に必ず呼び出される。この代理の下にあるメモリ・オブジェクトは、カーネルに知られている可能性がある。すなわち、カーネルは、その関連を知らないだけであり、したがって、カーネルは、この代理が新メモリ・オブジェクトの初期設定を暗示すると仮定しなければならない。メモリ・オブジェクトを初期設定する場合、同一のカーネルからの後続のｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージのために、メモリ・マネージャは、ｈｏｓｔ＿ｎａｍｅ（ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ）−＞ｍｅｍｏｒｙ  ｏｂｊｅｃｔ  ｒｅｐｒｅｓｅｎｔａｔｉｖｅを用いて応答する。この呼出しは、アブストラクト・メモリ・オブジェクト・ポートおよびこの代理に関して許可されるアクセス・モードならびに、この代理を使用してマッピングを試みるタスクが有する必要のある制限されたＩＤがあるならばその制限されたＩＤを供給するだけである。カーネルは、このメッセージを受け取る時に、供給された冗長なメモリ・キャッシュ制御ポートを破壊する。メモリ・オブジェクト・レプリゼンタティブ用のメッセージ・インターフェース・ジェネレータ（ＭＩＧ）スタブが、最適化として送出権を移動し、その結果、マネージャは、明示的にその権利を破棄する必要がなくなる。
【０２３５】
ｍｅｍｏｒｙ−ｏｂｊｅｃｔ−ｒｅｐｒｅｓｅｎｔａｔｉｖｅメッセージが、メモリ・オブジェクトの終了と競合する可能性がある。これが発生するのは、マネージャがそのメモリ・オブジェクトを初期設定しなければならないと信じているが、もうその必要がない時である。このような場合には、カーネルが、メモリ・オブジェクト・レプリゼンタティブ・メッセージを破棄する。というのは、そのオブジェクトが、カーネルの視点からは初期設定されていないからである。マネージャは、アブストラクト・メモリ・オブジェクト・ポート上のｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｔｅｒｍｉｎａｔｅメッセージの存在によって、この状況を検出する。カーネルは、メモリ・オブジェクト・レプリゼンタティブ・メッセージを破棄する時に、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージを再送出する。マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈを用いてもう一度応答しなければならない。
【０２３６】
一般的な規則として、メモリ・オブジェクトが未初期設定であることをマネージャが知っている（すなわち、オブジェクトが一度も初期設定されていないか、マネージャがｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｔｅｒｍｉｎａｔｅを見た）のでない限り、マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙに対してメモリ・オブジェクト・レプリゼンタティブを用いて応答しなければならない。クライアントがｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージを偽造したのでカーネルがメモリ・オブジェクト・レプリゼンタティブ・メッセージを期待していない場合、カーネルは、単にこれを無視する。マネージャがこのメッセージを送ったという事実は、そのメモリ・オブジェクトが初期設定されたとマネージャが信じていることを意味する。マネージャが応答したｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージは、マネージャに情報を提供しなかった。カーネルは、代理とアブストラクト・オブジェクトの関連をいつでも忘れることができる。カーネルがメモリ・オブジェクト・レプリゼンタティブ・メッセージを無視する時には、カーネルがそれを受け入れ、その後即座にその関連を忘れた場合と同一である。このシーケンスが完了した後に、メモリ・マネージャは、このメモリ・オブジェクトの代わりに要求に応答する準備を整えなければならない。
【０２３７】
メモリ・キャッシュ・オブジェクトも、ｖｍ＿ｒｅｇｉｏｎを介してクライアントに供給される名前ポートを有する。マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｇｅｔ＿ｎａｍｅを用いてこのポートを取得できる。
【０２３８】
基本的なページ操作
カーネルは、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｒｅｑｕｅｓｔを用いて、メモリに関するデータを要求する。通常、カーネルは、１時に１ページだけを要求し、供給する。カーネルは、メモリ領域のセット挙動によって変化する量の複数のページに１時に作用する権利を保留する。メモリ・マネージャは、各転送（データ返し）に好ましいページ数を指定する、メモリ・オブジェクトのクラスタ・サイズをセットできる。１時に何ページが実際に転送されるかは、さまざまな要因に影響される。
【０２３９】
メモリ・マネージャは、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｓｕｐｐｌｙを用いて、要求されたデータを供給する。この呼出しでは、データに関する最小限のアクセス保護も指定される。メモリ・マネージャは、エラーのためにデータを供給できない場合に、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｅｒｒｏｒを用いて応答する。この場合、カーネルは、このデータを待っているすべてのスレッドに、メモリ障害例外をとらせる。メモリ・マネージャは、この代わりに、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｕｎａｖａｉｌａｂｌｅを用いて応答することができる。この場合、カーネルは、存在していないデータについて０で満たされたページを供給する。メモリ・マネージャは、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｓｕｐｐｌｙを使用して、要求されたか否かにかかわらず、カーネルによってキャッシュされないページを提供することができる。
【０２４０】
カーネルが、メモリ・オブジェクトに属するメモリ・ページのいくつかをフラッシュすると決定した時には、修正されたページが、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｒｅｔｕｒｎを介して、メモリ・マネージャへのメッセージ内でアウトオブライン・データとして送られる。この処理では、カーネルがページの仮想コピーを送り、効果的に、物理メモリ・ページを、メモリ・オブジェクトに関連する常駐ページから、デフォルト・メモリ管理される一時オブジェクトに関連するページに変換する。この方法では、メモリ・マネージャがこれらのページを適度な時間内に宛先に移動できない場合に、カーネルが、デフォルト・メモリ・マネージャを使用してこれらの一時ページを追い出すことができる。デフォルト・メモリ・マネージャは、これらをページング記憶域にページングするが、まだメモリ・マネージャがこれらをアクセスすることを許可する。通常、メモリ・マネージャは、受け取ったアウトオブライン・メモリを扱うのと同様に、これらのページを装置またはファイル・システムにコピーした後に、ｖｍ＿ｄｅａｌｌｏｃａｔｅを使用してこれらをそのアドレス空間から解放する。
【０２４１】
ページが追い出されたならば、カーネルは、いつでも、おそらく即座に、もう一度それらのページを要求することができる。メモリ・マネージャ、特にマルチスレッド式のメモリ・マネージャは、バック・ツー・バック・データ返しと、同一ページに関するデータ要求メッセージに対してそのメモリ・マネージャ自体を保護しなければならない。この状況の説明については、Ｓｅｒｖｅｒ  Ｗｒｉｔｅｒ’ｓ  Ｇｕｉｄｅを参照されたい。
【０２４２】
クリーンインプレース（Ｃｌｅａｎ−ｉｎ−Ｐｌａｃｅ）
カーネルは、メモリ・マネージャにページを返す（すなわち、追出し、クリーニングまたはフラッシュ）時に、複数の問題に直面する。
・マネージャが適度な時間内にページを除去しない場合に、カーネルが、それらのページを一時補助記憶に追い出す用意をしておかなければならない。
・カーネルは、単一のページに関する追出し決定を行う。効率のため、カーネルは、マネージャに複数のページを返そうと試み（追出しはしない）、その結果、マネージャがその補助記憶内の複数のページを１回で更新できるようにする。追加のページは、それらをマッピングするタスクからアクセス可能なままでなければならない。原則的に、マネージャは、返されたページを変更できる。これらは、通常のアウトオブライン・メモリとして見える。カーネルは、ページの書込み可能なコピーを作成する用意をしておかなければならない。
【０２４３】
カーネルは、ページ返し機構を最適化するために最善をつくす。最大の性能が達成されるのは、マネージャがページを修正せず、ページの後処理を行うと信頼できる時である。下記の条件が成り立つ場合に、内部的にクリーンインプレースと呼ばれる特殊な高性能機構が、カーネルによって使用される。
・メモリ・マネージャが、メモリ資源消費に関して特権を与えられ、ホスト名前ポートではなくホスト制御ポートにｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈ＿ｐｒｉｖメッセージを送ることによってこの特権を主張する。
・メモリ・マネージャが、メモリ・キャッシュ・オブジェクトと同一のホスト（ノード）にある。
・メモリ・マネージャが、ページを修正しない。
【０２４４】
これらの特殊機構の使用は、データ返しのセマンティックスに影響する。というのは、メモリ・マネージャが、返されたページに関してａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｒｅｑｕｅｓｔが受け入れられる時を、カーネルに明示的に示さなければならないからである。さらに、カーネルは、メモリ・マネージャが、返されたページを時宜を得た形で割振り解除することを期待する。
【０２４５】
メモリ・オブジェクトの終了
すべてのタスクがメモリ・オブジェクト・レプリゼンタティブに関するマッピングを除去した時に、カーネルが、下層にあるアブストラクト・メモリ・オブジェクトに対するその代理の関連を破棄する。メモリ・マネージャは、通知をうけない。メモリ・マネージャは、いつでも代理に関するｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージを受け取る用意を整えていなければならない。後続のｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージのそれぞれに、独自のメモリ・キャッシュ制御ポートが含まれる。すべてのタスクが下層にあるアブストラクト・メモリ・オブジェクトに関するマッピングを除去した時に、カーネルが、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｔｅｒｍｉｎａｔｅを用いてメモリ・マネージャに情報を伝える。そのオブジェクトが一時属性を有するのでない限り、カーネルは、メモリ・キャッシュ・オブジェクトを実際に終了させ、終了メッセージを送る前に、そのオブジェクトのすべてのページを追い出す。終了メッセージによって、メモリ・キャッシュ制御ポートに関する受取り権が、マネージャに送られ、その結果、マネージャは、カーネルがオブジェクトを終了させた後、マネージャが終了メッセージを受け取る前に、そのマネージャがそのポートに送ったすべてのメッセージを取得できるようになる。
【０２４６】
メモリ・マネージャは、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄｅｓｔｒｏｙを用いて明示的に、または、アブストラクト・メモリ・オブジェクト・ポートを破壊することによって暗黙のうちに、カーネルがメモリ・キャッシュ・オブジェクトを破壊することを要求することができる。前者の場合、カーネルは、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｔｅｒｍｉｎａｔｅを用いて応答する。そのメモリ・オブジェクトの現在および将来の要求は、すべてエラーになる。破壊の後に、カーネルは、随意にメモリ・キャッシュ・オブジェクトの常駐ページを破棄することができる。
【０２４７】
メモリ・オブジェクトがｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈによって初期設定される時または、その後ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｈａｎｇｅ＿ａｔｔｒｉｂｕｔｅｓによって変更される時にセットされるオブジェクト属性のうちの１つが、オブジェクト・キャッシュ属性である。この属性がセットされていると、代理−アブストラクト・オブジェクトの関連を解消したり、すべてのマッピングが除去された時にメモリ・オブジェクトを終了させ、これによってすべてのキャッシュ・ページを追い出すのではなく、メモリ・オブジェクトが、小さなカーネル・オブジェクト・キャッシュに入れられる。あるタスクがこの時間の間にそのオブジェクトをマッピングする場合、そのオブジェクトは、追加のｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｎｏｔｉｆｙメッセージなしで生きたままになる。オブジェクトがオブジェクト・キャッシュから出る前にタスクがそのオブジェクトをマッピングしない場合、そのオブジェクトは終了する。メモリ・オブジェクトがこのマッピングされない状態である間にオブジェクト・キャッシュ属性がクリアされた場合、そのメモリ・オブジェクトは、直ちに終了する。この属性の変化には、この影響があるので、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｈａｎｇｅ＿ａｔｔｒｉｂｕｔｅｓは、任意選択として、同期化に使用することができる応答（ｒｅｐｌｙ＿ｐｏｒｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｈａｎｇｅ＿ｃｏｍｐｌｅｔｅｄ）を返すことができる。
【０２４８】
補助記憶との同期化
メモリ・オブジェクトのクライアントは、そのメモリ・オブジェクトに対して行われた変更が、補助記憶上で反映されることを知る必要があることがしばしばである。このクライアントは、メモリ範囲に対してｖｍ＿ｍｓｙｎｃを実行することによってそのような要求を行う。カーネルの応答は、マネージャに対してページの組をクリーンまたはフラッシュすることと、マネージャと共に同期化ダイアログにかかわることである。カーネルの応答は、クライアントがｖｍ＿ｍｓｙｎｃに与えたフラグと、メモリ・オブジェクトの無効化属性の値に依存する。範囲をクリーンまたはフラッシュした後に、カーネルは、メモリ・オブジェクト範囲ならびにクライアントのフラグを指定するａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｓｙｎｃｈｒｏｎｉｚｅを送る。これらのフラグのうちの１つが、非同期フラグである。これがセットされている時には、クライアントは、ページを補助記憶に待ち行列化させることだけに関心を持つ。そうでない場合、クライアントは、実際に補助記憶にあるページに関心を持つ。マネージャは、所望の効果を達成した時に、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｓｙｎｃｈｒｏｎｉｚｅ＿ｃｏｍｐｌｅｔｅｄを用いて応答する。クライアントは、その時点でｖｍ＿ｍｓｙｎｃ呼出しからリターンする。ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｓｙｎｃｈｒｏｎｉｚｅ＿ｃｏｍｐｌｅｔｅｄに指定された範囲は、対応するｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｓｙｎｃｈｒｏｎｉｚｅメッセージの範囲と一致しなければならない。カーネルは、未処理の同期要求を１度に複数有することができるが、オーバーラップする要求を未処理状態にすることは絶対にない。
【０２４９】
プレシャス・ページ（Ｐｒｅｃｉｏｕｓ  Ｐａｇｅｓ）
基本データ管理プロトコルでは、カーネルは、物理メモリ・キャッシュ内にある間に修正されたページだけをメモリ・マネージャに返す。追い出される時、純粋な無修正のページは、メモリ・マネージャがコピーを有するという前提に基づいて破棄される。ディスク・ファイルを補助記憶として使用し、その空間がページごとに補助記憶上に常に割り振られるマップド・ファイル・メモリ・マネージャの場合、これは最も合理的な手法である。しかし、ネットワーク共用メモリ・サーバや他の専用サーバなど、仮想メモリを補助記憶として使用するマネージャの場合、これは非効率的である。マネージャとカーネルの両方が、使用中のページを保持する。ページをカーネルに供給する時にそのページをプレシャス（貴重）として指定することによって、メモリ・マネージャがコピーを保持する必要がなくなる。カーネルは、追出し時にページ返しをコミットする。ページをプレシャスとして指定する能力は、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｓｕｐｐｌｙ呼出しに対するオプションとして使用可能である。メモリ・マネージャは、データ供給呼出しからの応答を要求することによって、これらのページの受諾について情報を得ることができる。この応答ｒｅｐｌｙ＿ｐｏｒｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｓｕｐｐｌｙ＿ｃｏｍｐｌｅｔｅｄによって、どのページが受け入れられたかが示される。この応答は、供給されたページの拒絶から生じるデータ返しメッセージのすべての後に続く。ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｒｅｔｕｒｎメッセージでは、修正されたページならびにプレシャス・ページの両方が、その状態を示すフラグと共に返される。
【０２５０】
直接キャッシュ操作
時には、メモリ・マネージャが、ページを強制的にフラッシュしたり、保護を変更することを必要とする場合がある。これは、ｍｅｍｏｒｙ＿ｃａｃｈｅ＿ｃｏｎｔｒｏｌ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔ呼出しを用いて行われる。この呼出しは、カーネルに、実行すべき動作について知らせる。完了した時に、カーネルは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔ呼出しで命名された応答ポートを使用して、ｒｅｐｌｙ＿ｐｏｒｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｃｏｍｐｌｅｔｅｄを用いて応答する。
【０２５１】
ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔの主目的は、分散メモリ・サーバやトランザクション保護メモリなど、ページに対するアクセス権の設定と取消しを含むメモリ管理プロトコルをサポートすることである。あるスレッドが、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｓｕｐｐｌｙまたはｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｕｎａｖａｉｌａｂｌｅを用いてセットされた許可によって現在許可されるものでない方法でページをアクセスしようと試みる場合、カーネルは、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｕｎｌｏｃｋを用いてメモリ・マネージャにメッセージを送る。メモリ・マネージャは、この要求を受ける場合に、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔを用いて応答して、新たに許される許可を指定する。単一クライアントの場合、メモリ・マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔによってカーネルに範囲をフラッシュさせることによって要求を拒絶することができ、カーネルがそのデータを再取出しする時に、メモリ・マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｅｒｒｏｒを用いて応答することができる。
【０２５２】
ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔのシーケンスも、メモリ・マネージャが主導して開始することができる。この呼出しは、カーネルが修正されたページまたはプレシャス・ページのすべてをマネージャに返すことを必要とし、ｆｓｙｎｃ動作中など、マネージャがページの最新コピーを必要とする時には、カーネルに書込み許可を取り消すように要求することもできる。メモリ・マネージャは、ページのすべてをメモリ・キャッシュからフラッシュするようにカーネルに要求することもできる。
【０２５３】
仮想コピーの最適化
下記は、メモリの範囲が論理的にコピーされる、マイクロカーネル・システム１１５内の３つの状況である。
・メモリ範囲がＶＭ＿ＩＮＨＥＲＩＴ＿ＣＯＰＹ継承属性を有し、このタスクから新タスクが作成される時。
・ｖｍ＿ｃｏｐｙによって、アドレス空間の１部分がその空間の別の部分にコピーされる時。
・メモリ範囲が、マイクロカーネル・メッセージ内で仮想アウトオブライン領域として渡される時。これには、ｖｍ＿ｒｅａｄ動作とｖｍ＿ｗｒｉｔｅ動作が含まれる。
【０２５４】
これらの状況は、頻繁に発生する。コピー継承メモリは、新プロセス作成に関するＰＯＳＩＸ（Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ  Ｆｏｒ  Ｃｏｍｐｕｔｅｒ  Ｅｎｖｉｒｏｎｍｅｎｔｓの略）のｆｏｒｋセマンティックスをサポートするのに使用される。アウトオブライン・メモリは、通常のメッセージの場合には一般的でないが、外部メモリ・マネージャ、デバイス・インターフェースおよび、特にファイル・システムのサポートに重要である。
【０２５５】
これらの動作は、直接共用の代わりに論理コピーとして定義することができる。というのは、マイクロカーネル仮想メモリが、仮想コピー最適化を提供するからである。これらの最適化が行われると、メモリ全体がコピーされるのではなく、データをコピーする必要が生じた時に限って、遅延評価方式でメモリがコピーされる。データのコピー動作は、下記のさまざま理由から延期することができる。
・データの一部が実際には参照されない。
・データの一部をどのタスクも修正せず、したがって、すべてのタスクが、未修正データの同一のメモリ・イメージを効率的に共用できる。
・データ・コピーを要求するタスクが、そのマッピングを削除し、このため、カーネルが、そのコピーを移動とみなすことができ、これは、ページ・コピーではなくページ再マッピング（ページ・スチール）に最適化することができる。これに関連する可能性として、データの受取り側がもう一度そのデータをコピーし、データを見ることもせずにそのマッピングを削除する場合がある。
【０２５６】
その一方で、これらの最適化は、純粋に内部的であり、したがって、本明細書で説明するマイクロカーネル・セマンティックスの一部ではない。しかし、これらの最適化は周知である。これらは、多くのインターフェース、特に外部メモリ・マネージャ・インターフェースの、ユーティリティに一体化された部分である。
【０２５７】
カーネルが、アウトオブライン・データのために仮想メモリ・システムを使用するという事実のおかげで、リストを返すさまざまなカーネル・プリミティブが、アウトオブライン・データを返すことによってリストを返せるようになる。これは、内部的なｖｍ＿ａｌｌｏｃａｔｅ動作によって達成される。これらの最適化は、インターフェースの仕様の重要な部分すなわち性能特性を形成する。仮想コピーの参照によって、元のメモリ・オブジェクトからページが取得され、これによって、そのオブジェクトのメモリ・マネージャとの相互作用が生じる可能性がある。参照を行うタスクの挙動は、特にメモリ・マネージャがカーネルのページ要求に応答しない場合に、影響を受ける可能性がある。
【０２５８】
メモリの範囲をコピーする時には、カーネルが、仮想的にコピーされるページを表現するために、新しいアブストラクト・メモリ・オブジェクトとメモリ・キャッシュ・オブジェクトを作成する。新メモリ・キャッシュ・オブジェクト（コピーの宛先）は、物理メモリ・ページが修正されないと仮定すると、旧メモリ・キャッシュ・オブジェクト（コピーの源）と、実際の物理メモリ・ページを共用することができる。旧オブジェクトは、この仮想コピーによって影響を受けない。旧オブジェクトは、同一のアブストラクト・メモリ・オブジェクトおよび同一の関連メモリ・マネージャと関連したままになる。そのページはそれ自体のものであり、ふさわしいと思われる場合に使用される。
【０２５９】
新メモリ・オブジェクトは、旧メモリ・オブジェクトのコピーされた範囲内のページのすべての仮想コピーを受け取るが、この動作の可視の仕組みは、それほど単純ではない。これらは、下で述べるように、旧オブジェクトに関する、オブジェクト作成時にｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｅｓｔａｂｌｉｓｈによってセットされるか、その後にｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｈａｎｇｅ＿ａｔｔｒｉｂｕｔｅｓによってセットされるコピー戦略の値によって制御される。
【０２６０】
通常のメモリ・オブジェクトのページは、タスクのアドレス空間にマッピングされた時に修正することと、そのタスクによる直接メモリ参照によって操作することだけが可能である。これが１つのホスト上だけで発生し得る場合、メモリ・オブジェクトのページに対する修正のすべてが、そのホスト上で発生し、カーネルに完全に可視である（カーネルはそのメモリ・キャッシュ・オブジェクトを維持するので）。この場合、メモリ・マネージャは、そのメモリ・オブジェクトのコピー戦略を、ＭＥＭＯＲＹ＿ＯＢＪＥＣＴ＿ＣＯＰＹ＿ＤＥＬＡＹすなわち標準的なコピー・オン・ライト最適化にセットする。新メモリ・オブジェクトは、デフォルト・メモリ・マネージャによって管理される一時オブジェクトとして作成される。旧オブジェクトと新オブジェクトの挙動は、次の通りである。
・新メモリ・オブジェクトと旧メモリ・オブジェクトの両方が、現在メモリ内にあるページを共用する。
・新オブジェクトの、メモリ常駐でなく、また下で述べるようにプッシュされていないページが参照される場合、データを求めて、旧アブストラクト・メモリ・オブジェクトにメッセージが送られる。メモリ・マネージャは、この要求を、旧メモリ・オブジェクトに対する参照と区別できない。取り出されるページは、旧メモリ・オブジェクトと新メモリ・オブジェクトによって共用される。
・旧オブジェクトのページが、旧オブジェクトまたは新オブジェクトのいずれかに対する修正参照の試みによって修正される（これらが現在物理メモリ・ページを共用しているので）場合、カーネルは、まず、そのページの未修正の値を新オブジェクトにプッシュし、その結果、新オブジェクトに、そのページの元のデータのコピーが見えるようにする。
・プッシュされたページは、デフォルト・メモリ・マネージャによって管理される。
【０２６１】
ネットワーク共用メモリやメモリ・マネージャによる直接アクセスなど、単一のホスト上のカーネルに可視でない形で旧メモリ・オブジェクトを修正できる場合、代替コピー戦略が必要である。これを理解するために、下記のシナリオを検討されたい。
・仮想コピーが要求される。しかし、その範囲のあるページが、コピーを行うホスト上のメモリ内にない。
・他のホスト上に常駐する範囲のページが修正される。
・コピーを行うホスト上の新（コピー）メモリ・オブジェクトが、ページに関する要求を行う。このオブジェクトは、仮想コピーの時点でそのページが有していたはずの値ではない、新しい値を受け取る。
【０２６２】
最適化を使用不能にするために、ＭＥＭＯＲＹ＿ＯＢＪＥＣＴ＿ＣＯＰＹ＿ＮＯＮＥ戦略を提供する。ＭＥＭＯＲＹ＿ＯＢＪＥＣＴ＿ＣＯＰＹ＿ＮＯＮＥは、メモリ・マネージャが知的な形で正しいセマンティックスを実施できない時に使用される。仮想コピーの時点で、カーネルは、デフォルト・メモリ・マネージャによって管理される一時オブジェクトとして、新メモリ・オブジェクトを構成する。新メモリ・オブジェクトの内容は、その時点で旧メモリ・オブジェクトから明示的にコピーされ、したがって、その時点で、メモリ・マネージャからすべてのページが要求される。
【０２６３】
ＭＥＭＯＲＹ＿ＯＢＪＥＣＴ＿ＣＯＰＹ＿ＮＯＮＥ戦略を使用すると、積極的なコピーが実行されるので、メモリ管理の性能に悪影響を及ぼす可能性がある。メモリ・オブジェクトが、メモリ・キャッシュを無効化する形で操作されるが、メモリ・マネージャが、これらの操作が発生する時を完全に把握し、制御する場合、そのメモリ・マネージャは、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｌｏｃｋ＿ｒｅｑｕｅｓｔ呼出しに対する強制コピー・オプションの助けを借りて、ＭＥＭＯＲＹ＿ＯＢＪＥＣＴ＿ＣＯＰＹ＿ＤＥＬＡＹ戦略を使用することができる。このオプションは、メモリ・マネージャが、カーネルのキャッシュを無効化しようとしていることを認識した時に、そのメモリ・マネージャが使用することができる。このオプションを指定すると、カーネルは、メモリ・オブジェクトの指定された範囲の遅延コピーのすべてを積極的に評価するようになる。
【０２６４】
デフォルト・メモリ・マネージャ
デフォルト・メモリ・マネージャは、無名メモリ（ｖｍ＿ａｌｌｏｃａｔｅ、メモリ・コピーなど）のための補助記憶を提供する。これは、最後の手段のメモリ・マネージャであり、障害を発生してはならないメモリ・マネージャである。このためにページングを提供できるメモリ・マネージャは存在しないので、デフォルト・メモリ・マネージャはメモリにワイヤリングされ、これに渡されるメモリのすべてがワイヤリングされる。このメモリ・マネージャは、そのメモリをすばやく処理しなければならず、メモリが補助記憶にページ・アウトされる時には、そのメモリが効果的にワイヤリングされているので、これをすばやく破棄しなければならない。あるホストのデフォルト・メモリ・マネージャのセットと問い合わせは、ｈｏｓｔ＿ｃｏｎｔｒｏｌ−＞ｖｍ＿ｓｅｔ＿ｄｅｆａｕｌｔ＿ｍｅｍｏｒｙ＿ｍａｎａｇｅｒによって行われる。
【０２６５】
デフォルト・メモリ・マネージャによって二重書きされるメモリは、さまざまな方法で作成できる。これらの作成には、デフォルト・メモリ・マネージャが直接に関係するわけではない。カーネルが、新デフォルト・メモリ・オブジェクトに関して明示的にデフォルト・メモリ・マネージャに情報を与えなければならない。これは、ｄｅｆａｕｌｔ＿ｐａｇｅｒ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｃｒｅａｔｅによって行われる。特権タスクは、ｄｅｆａｕｌｔ＿ｐａｇｅｒ−＞ｄｅｆａｕｌｔ＿ｐａｇｅｒ＿ｏｂｊｅｃｔ＿ｃｒｅａｔｅを用いて、デフォルト・ページャによって管理されるメモリ・オブジェクトを作成することもできる。
【０２６６】
デフォルト・メモリ・マネージャは、仮想コピー範囲を表すためにカーネルによって作成された一時メモリ・オブジェクト用の補助記憶を提供する。これらの一時オブジェクトは、追加動作を適用される。元のオブジェクトからのあるページが、一時オブジェクトにプッシュされる時に、プッシュされるデータが、ａｂｓｔｒａｃｔ＿ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ−＞ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｉｎｉｔｉａｌｉｚｅを用いてデフォルト・マネージャに供給される。この追加プリミティブの理由は、カーネルが、コピーにプッシュするページの範囲を完全には追跡しないからである。コピー・ページがページ・アウトされる場合、元のオブジェクトの後続の修正によって、修正された元のページがもう一度プッシュされる。デフォルト・メモリ・マネージャが、１ページに関する複数のプッシュ・メッセージ（ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｉｎｉｔｉａｌｉｚｅ）を受け取ることも有り得る。このマネージャは、それらのうちの最初のメッセージ以外をすべて無視しなければならない。ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｉｎｉｔｉａｌｉｚｅが呼び出されるのは、ページがコピーにプッシュされる時だけであり、コピーのページ自体が変更される場合には、修正されたページが、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｒｅｔｕｒｎを用いてマネージャに送られることに留意されたい。
【０２６７】
デフォルト・メモリ・マネージャは、一度もプッシュされていないコピーのページを要求される可能性がある。まだ存在しないページに関するマネージャの応答は、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｄａｔａ＿ｕｎａｖａｉｌａｂｌｅを呼び出すことである。０のページを作成するのではなく、この呼出しでは、元のオブジェクトから適切なページをコピーする。すなわち、初期化メッセージがないので、元のページは修正されていないことになる。
【０２６８】
パートＢ  発明の詳細な説明
本発明は、マイクロカーネル・アーキテクチャおよびマイクロカーネル構造のためのメモリ管理方法である。本発明は、特殊オブジェクトとしてメモリ内でカーネルによって定義されるテンプレート領域を特徴とする。マイクロカーネルには、スレッド、タスク、ＩＰＣポート空間、例外空間および仮想アドレス空間マッピングを表す、カーネルのタスク仮想アドレス空間内のデータ構造が含まれる。スレッドを表すデータ構造には、スレッドが例外状態を取り込み、スケジューリングおよび優先順位情報を提供できるようにする情報が記憶される。タスクを表すデータ構造によって、実行中のスレッドから使用可能な資源が記述される。ＩＰＣポート空間を表すデータ構造によって、そのタスク用のポート変換に対するポート名が記述される。例外空間を表すデータ構造によって、タスク内で例外を処理する方法が記述される。仮想アドレス空間マッピングを表すデータ構造によって、マイクロカーネル・システム１１５のメモリ管理ユニットをプログラミングするためのデータが記述され、維持される。マイクロカーネル１２０には、計算機依存のＰＭＡＰ層を管理するためのデータ構造も含まれ、これによって、あるタスクに関する物理アドレスへの仮想アドレスの変換を計算機依存の形で表現するデータが維持される。マイクロカーネルによって管理されるＰＭＡＰ層によって、ページアウト条件の場合にページ・フレームを現在記述しているＰＭＡＰのすべてを使用不能にするための、物理メモリ・フレームに関するデータが維持される。
【０２６９】
このメモリ管理方法では、マイクロカーネル１２０は、ホスト多重プロセッサ１００のメモリ１０２にロードされた後に、図３に示されたものなどの、メモリ内のタスク・コンテナの作成を開始することができる。タスクをタスク・コンテナと呼ぶのは、タスクのスレッドがその中で動作することのできる仮想メモリ空間の定義、これらのスレッドから使用可能なデータの定義または表現、および、タスクのスレッドがそれを介してシステム内の他のスレッドと通信することのできる通信ポートの表現など、タスクに関連するスレッドによる使用のために使用可能になるはずの資源を表すからである。
【０２７０】
メモリ管理方法は、マイクロカーネル１２０内のテンプレート領域２００、２００’および２００”の形成から始まる。図７からわかるように、テンプレート領域Ｒ０  ２００は、ネスト可能テンプレート領域である。ネスト可能とは、第２のテンプレート領域Ｒ１  ２００’を指すことを意味する。テンプレート領域Ｒ１  ２００’は、一連のポインタを介して図７のキャッシュ・オブジェクト２０２などのオブジェクトを指す、リーフ（ｌｅａｆ）・テンプレート領域である。テンプレート領域Ｒ１  ２００’は、もう１つのリーフ・テンプレート領域であるテンプレート領域Ｒ２  ２００”も指し、このテンプレート領域Ｒ２  ２００”は、一連のポインタを介してキャッシュ・オブジェクト２０２内のもう１つのデータ・ページを指す。下の説明から明らかになるように、テンプレート領域Ｒ１  ２００’は、その中に含まれる別のテンプレート領域を指していないので、リーフ・テンプレート領域とみなされる。しかし、テンプレート領域Ｒ０  ２００は、領域Ｒ１とＲ２の両方がその中に含まれるので、ネスト可能テンプレート領域とみなされる。「その中に含まれる」とは、領域Ｒ１の仮想アドレス空間が、テンプレート領域Ｒ０の仮想アドレス空間内にあることを意味する。同様に、テンプレート領域Ｒ２の仮想アドレス空間は、テンプレート領域Ｒ０の仮想アドレス空間内に含まれる。しかし、テンプレート領域Ｒ１とテンプレート領域Ｒ２の仮想アドレス空間は、別個であり、したがって、テンプレート領域Ｒ１はリーフ・テンプレート領域である。
【０２７１】
マイクロカーネル１２０は、マイクロカーネル・アドレス空間内でＰＭＡＰ２０４を構成して、タスクのための仮想アドレスの物理アドレスへの変換を計算機依存の形で表現するためのデータを維持する。テンプレート領域Ｒ０は、アドレス空間ＡＤ（Ｒ０）の記述を含む、マイクロカーネル１２０内のデータ構造である。このアドレス空間は、テンプレート領域Ｒ０によって定義されるタスクのためにスレッドが動作することのできるアドレス空間である。アドレス空間は、６４Ｋバイト仮想メモリ・アドレス・セグメントとすることができ、これは１６ビット・アドレスに適するはずであるが、３２ビット・アドレス用の４Ｇバイト仮想メモリ空間セグメントとすることもできる。テンプレート領域Ｒ０によって定義される仮想アドレス空間のセグメントは、テンプレート領域Ｒ０によって定義されるタスクのためにスレッドが動作することのできる区域である。図７でやはりテンプレート領域Ｒ０に含まれているのが、ＰＭＡＰ２０４を指すポインタである。このポインタは、たとえばマイクロカーネル１２０用のマイクロカーネル・アドレス空間内のＰＭＡＰ２０４の、開始アドレスを識別する。テンプレート領域Ｒ０を定義する追加のデータ構造には、テンプレート領域Ｒ０に関連するタスクを記述するのに使用される、テンプレート領域の連鎖内の次のテンプレート領域Ｒ１の指定が含まれる。この連鎖の末尾は、Ｒ２として指定され、これによって、テンプレート領域Ｒ０、Ｒ１およびＲ２の連鎖の最後のテンプレート領域をすばやく識別できるようになっている。同様に、図７のテンプレート領域Ｒ１には、アドレス空間ＡＤ（Ｒ０）の一部であるアドレス空間ＡＤ（Ｒ１）の記述が含まれる。さらに、テンプレート領域Ｒ１には、変換値「仮想アドレス（Ｖ０）」を指す、ＰＭＡＰを指すポインタＰＴ（Ｒ１）が含まれる。ＰＭＡＰ２０４のこの仮想アドレス変換値は、ポインタの仮想アドレス値を、線２０６を介して物理アドレスに変換し、この物理アドレスは、メモリ１０２内のオブジェクトへの線２０８上の出力である。図７からわかるように、仮想アドレス（Ｖ０）変換値は、キャッシュ・オブジェクト２０２内のデータ・ページＤ０を指す。テンプレート領域Ｒ１には、連鎖内の次のテンプレート領域Ｒ２と、連鎖内の前のテンプレート領域Ｒ０の指定も含まれる。テンプレート領域Ｒ１には、キャッシュ・オブジェクト２０２用の仮想アドレスでキャッシュ・オブジェクト２０２を指す別のポインタが含まれ、さらに、キャッシュ・オブジェクト２０２内のデータ・ページＤ０のオフセット値が含まれる。
【０２７２】
図７のテンプレート領域Ｒ２には、アドレス空間ＡＤ（Ｒ０）の一部であるアドレス空間ＡＤ（Ｒ２）の記述が含まれる。テンプレート領域Ｒ２には、ＰＭＡＰを指すポインタＰＴ（Ｒ２）も含まれ、その仮想アドレス値は、線２０６を介してＰＭＡＰ２０４の仮想アドレス変換「仮想アドレスＶ（１）」に適用される。この仮想アドレス変換は、キャッシュ・オブジェクト２０２の命令Ｄ１に対する線２０８上の出力である物理アドレスをもたらす。テンプレート領域Ｒ２には、さらに、連鎖内の前のテンプレート領域Ｒ１の指定が含まれる。テンプレート領域Ｒ２は、キャッシュ・オブジェクト２０２の仮想アドレスを指すポインタと、キャッシュ・オブジェクト２０２内での命令ページＤ１へのオフセットも有する。
【０２７３】
マイクロカーネル１２０のアドレス空間内の各テンプレート領域は、対応するタスク・コンテナを定義するための属性の組を有する。これらの属性によって、仮想メモリ・アドレス空間、データ・オブジェクト資源および通信ポートなど、タスクのスレッドによる使用のためにそのタスクから使用可能な資源を指定することができる。マイクロカーネルは、図８に示されるように、メモリ１０２内にタスクを形成することができる。マイクロカーネル１２０は、テンプレート領域２００、２００’および２００”によって指定された属性をタスク２１０にマッピングすることによって、メモリ１０２内にタスク２１０を形成できる。マイクロカーネル１２０は、テンプレート領域Ｒ０内の仮想アドレス空間ＡＤ（Ｒ０）に基づいて、このタスクの仮想アドレス空間を定義する。後程、マイクロカーネル１２０は、仮想記憶動作を行う時に、テンプレート領域Ｒ０内のポインタ２０５、テンプレート領域Ｒ１内のポインタ２０５’およびテンプレート領域Ｒ２内のポインタ２０５”の値を操作することによって、その動作を行う。マイクロカーネル１２０は、タスク２１０ではなく、テンプレート領域Ｒ０、Ｒ１およびＲ２に対して仮想記憶動作を行うので、この仮想記憶動作の効果は、タスク内ではポインタ２１２によって示される。
【０２７４】
マイクロカーネル１２０は、テンプレート領域Ｒ０からのサイズ属性とタスク２１０用の開始仮想アドレスとを使用して、仮想アドレスでタスク２１０を表すデータ構造を定義する。マイクロカーネル１２０は、テンプレート領域Ｒ０からの属性を使用して、タスクのスレッドがその動作を行うことのできる、タスク２１０用の仮想アドレス空間を定義する。マイクロカーネルは、タスクＴ（Ａ）など、タスク２１０のタスク名も定義する。マイクロカーネル１２０は、タスク２１０がそのスレッドとシステム内の他のスレッドの間の通信チャネルとして使用するために、メモリ１０２内でポート名前空間も形成する。マイクロカーネル１２０は、テンプレート領域Ｒ０からの属性の組を使用して、タスク２１０用のポート名前空間のアクセス権を定義する。その後、マイクロカーネルは、タスク２１０のためにメモリ１０２内でスレッド・オブジェクトを形成することができ、これらのスレッドは、このタスクの仮想アドレス空間から命令を取り出すことができる。
【０２７５】
本発明によれば、マイクロカーネル１２０は、テンプレート領域Ｒ０を指す第１のポインタ２１２を、タスク２１０のために定義する。テンプレート領域Ｒ０内には、少なくとも１つ、おそらくは多数の第２のポインタ２０５があり、このポインタ２０５は、直接または間接にマッピング・テーブルであるＰＭＡＰ２０４を指す。図８からわかるように、ポインタ２０５はＰＭＡＰ２０４を指す。テンプレート領域Ｒ１は、テンプレート領域Ｒ０のアドレス空間に含まれるが、これは、テンプレート領域Ｒ１のポインタ２０５’がＰＭＡＰ２０４内の仮想アドレス変換値Ｖ（０）を指しているからである。仮想アドレス変換値Ｖ０によって、ポインタ２０５’の仮想アドレス値が、キャッシュ・オブジェクト２０２内のデータ・ページＤ０の物理アドレスに変換される。同様に、テンプレート領域Ｒ０のアドレス空間内に含まれるテンプレート領域Ｒ２内のポインタ２０５”は、ＰＭＡＰ２０４内の仮想アドレス変換値Ｖ（１）を指す。仮想アドレス変換値Ｖ１によって、ポインタ２０５”の仮想アドレス値が、キャッシュ・オブジェクト２０２内の命令ページＤ１の物理アドレスに変換される。
【０２７６】
時折、あるタスクのデータ資源に変更を加えることが望ましい場合がある。これは、テンプレート領域Ｒ０、Ｒ１およびＲ２内のポインタ２０５、２０５’および２０５”によって表される仮想アドレスを変更することによって達成される。変更されたポインタは、望みどおりにＰＭＡＰ２０４内の異なる変換値を指すことができる。しかし、本発明によれば、タスク２１０自体の内容に変更を加える必要はない。キャッシュ・オブジェクト内のデータなどのタスク資源は、タスクによって、テンプレート領域内のポインタ２０５、２０５’および２０５”を介してアドレッシングされる。
【０２７７】
図９に示されるように、マイクロカーネルが、テンプレート領域から複数のタスクを定義した場合、テンプレート領域Ｒ０、Ｒ１およびＲ２内のポインタ２０５、２０５’および２０５”を変更すると、図９の複数のタスク２１０および２１０’から使用可能な資源の大域的な変更がもたらされる。これは、タスク２１０および２１０’が、それぞれ同一のテンプレート領域Ｒ０  ２００を指すポインタ２１２および２１２’を有するからである。タスク２１０および２１０’によってアドレッシングされるデータ・ページＤ０およびＤ１は、タスク２１０および２１０’のそれぞれの内容を変更するのではなく、テンプレート領域Ｒ０、Ｒ１およびＲ２内のポインタ２０５、２０５’および２０５”に対する単一の変更だけで変更できる。
【０２７８】
こうして、単一のテンプレート領域Ｒ０とそれに含まれるテンプレート領域Ｒ１およびＲ２を、複数のタスク２１０および２１０’に同時にマッピングすることができる。各タスク２１０または２１０’には、テンプレート領域Ｒ０、Ｒ１およびＲ２に対して行われる変更のすべてが見える。このため、同一のテンプレート領域Ｒ０  ２００によって生成されたタスク２１０および２１０’の特性の共用が可能になる。
【０２７９】
テンプレート領域Ｒ０、Ｒ１およびＲ２は、すべての仮想記憶動作が向けられるオブジェクトである。かつてのＭＡＣＨマイクロカーネルでは、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作を、その動作が実施されるテンプレート領域に向けることによって、複数のタスクでの仮想記憶動作の共用がはるかに簡単に達成される。
【０２８０】
テンプレート領域は特殊オブジェクトであるから、単一のテンプレート領域を、複数のタスクに同時にマッピングすることができる。あるテンプレート領域が複数のタスクにマッピングされる時には、各タスクに、そのテンプレート領域に対して行われる変更のすべてが見える。メモリ内容の変更もしくは、内部テンプレート領域の追加または削除のすべてが、元のテンプレート領域にマッピングされるタスクに見える。これによって、以前には不可能または近似的にしか実現できなかったセマンティックスの共用が可能になる。すなわち、テンプレート領域を用いると、メモリ内容を共用できるだけではなく、メモリ・マッピング自体を共用できるようになる。したがって、テンプレート領域に対する変更（メモリ内容の変更またはテンプレート領域によってマッピングされるものに対する変更の結果として）は、そのテンプレート領域がマッピングされるすべてのタスクによって認識される。テンプレート領域を用いない代替案は、タスクとメモリの関係のそれぞれの監視を必要とするものであり、さらに、タスクに対応するメモリ領域に対する変更によって影響を受けるタスクのそれぞれに対する変更を必要とするものである。テンプレート領域のない実施態様の暗黙の短所は、特定のメモリ領域にマッピングされるタスクの数が増加するにつれて、１つの変更によって影響を受ける領域を更新する時間がそれ相応に増加することである。
【０２８１】
たとえば、テンプレート領域を使用すると、すべてのライブラリが同一のテンプレート領域内に置かれ、そのテンプレート領域が関心を持つタスクによってマッピングされる場合に、テンプレート領域への新ライブラリのマッピングに要する時間は、関心を持つタスクの数と無関係に予測可能である。さらに、潜在的に複雑なロック方式を導入しなくても、マッピング情報の変更が、その領域をマッピングされるタスクに原子的に見えるようにすることができる。
【０２８２】
テンプレート領域は、ＶＭ動作すなわち仮想記憶動作が向けられるオブジェクトである。かつては、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作をその動作が実施されるテンプレート領域に向けることによって、変更が領域のマッピングではなく、テンプレート領域に対して行われるようになるので、共用がはるかに簡単に達成される。これは、本発明の重要な相違である。テンプレート領域は、オブジェクトである。テンプレート領域は、属性すなわちある量の状態を有し、タスクのアドレス空間内に存在しない。タスクのアドレス空間に存在するのは、テンプレート領域のマッピングである。テンプレート領域のマッピングがタスクのアドレス空間に存在するので、このマッピングは、そのタスクのアドレス空間内のどこにでも現れることができ、図１０に示されるように、異なるタスクが、それぞれのアドレス空間内の異なるアドレスにマッピングされた同一のテンプレート領域を共用することができる。すなわち、タスクＡが、アドレス４０００（１６進）にマッピングされたテンプレート領域を有し、タスクＢが、アドレス８００Ｆ０００（１６進）にマッピングされた同一のテンプレート領域を有することができる。図１１に示されるように、同一のテンプレート領域を、単一のタスクのアドレス空間内に複数回マッピングすることも可能である。
【０２８３】
タスクのアドレス自体は、そのタスクが作成される時に供給されるテンプレート領域によって定義される。したがって、あるタスクのアドレス空間にマッピングされるすべてのテンプレート領域は、実際にはもう１つのテンプレート領域にマッピングされる。したがって、マイクロカーネルに対する”ＶＭ−ｍａｐ”呼出しは、タスク・ポートをとらず、新テンプレート領域を他のテンプレート領域にマッピングしなければならない位置に関するテンプレート領域ポートだけをとる。これは、テンプレート領域が、すべての仮想記憶動作がそれによって実行される実体であるという概念にうまくあてはまる。タスクとテンプレート領域の間の連係は、タスクが作成される時に確立される。この形でタスクのアドレス空間を管理することによって、タスクを作成する時にマッピング設定を事前に定義するのが非常に簡単になる。また、異なるサイズのアドレス空間を有するタスクを有することも比較的簡単になる。異なるサイズのアドレス空間は、後に図１８と共に説明する「基本テンプレート領域」の機能である。簡単に言うと、基本テンプレート領域は、タスクのアドレス可能メモリ領域を定義する実体である。タスクに関連する基本テンプレート領域を確立（または変更）することができ、その結果、基本テンプレート領域が任意のサイズになるようにすることができる。異なるサイズの基本テンプレート領域のより有用な実施態様の中には、たとえば、３２ビットと６４ビットの混合システムの同時サポートが含まれる。さらに、異なるサイズの基本テンプレート領域は、何らかの理由のためにタスクのアドレス範囲を制限しなければならない環境で使用することができる。
【０２８４】
本発明の例示の実施例によれば、テンプレート領域をネストすることができる。しかし、テンプレート領域のネスティングは、非常に限られた形でしか行えない。２つのテンプレート領域がオーバーラップする場合、テンプレート領域のうちの一方が、他方のテンプレート領域を完全に包含しなければならない。図１２では、テンプレート領域Ｒ１がテンプレート領域Ｒ２とオーバーラップする場合に、図１２の左側の絵は正しいが、図１２の右側は正しくない。テンプレート領域Ｒ１とテンプレート領域Ｒ２を入れ替えた場合でも同様である（どの領域がどの領域にオーバーラップするかという順序は、２つの異なるマッピング動作によって判定される）。図１２の右側の絵は、図１３に示されるように、オーバーラップされるテンプレート領域がＲ０である場合にも正しくない。テンプレート領域を別のテンプレート領域の上に置くことができる位置について、追加の制約が存在する可能性がある。たとえば、あるテンプレート領域が、それを囲むテンプレート領域内の同一の範囲に他のテンプレートが現れないようにすることを示す属性を有することができる。通常、テンプレート領域は、それを囲むテンプレート領域に無関係に互いにオーバーラップすることができる。図１２では、Ｒ１を囲むテンプレート領域は、Ｒ２またはＲ０のいずれかである。しかし、Ｒ１とＲ２の両方に「メモリ」が含まれる場合に、これが問題を引き起こす可能性がある。これは、テンプレート領域を他のテンプレート領域の「穴」にのみマッピングできるようにすることによって防止される。すなわち、あるテンプレート領域を、別のテンプレート領域によって既にマッピングされている区域にマッピングすることはできない。したがって、図１２では、Ｒ１は、Ｒ２によってのみ囲まれることができ、Ｒ１がＲ０によって囲まれる可能性はない。というのは、Ｒ１とＲ２の両方がＲ０内で同一の範囲を占めるからである。
【０２８５】
テンプレート領域を使用する時には、無名メモリを割り振る方法がない。これは、図１３に示されるように、メモリ・オブジェクトを領域にマッピングすることによって行われる。すべてのメモリがメモリ・オブジェクトによって表現されるので、メモリがテンプレート領域内で見えるようにするためには、メモリ・オブジェクトをテンプレート領域にマッピングしなければならない。過去において、メモリ割振りは、実際には無名メモリ・オブジェクトの一部のマッピングの特殊な場合にすぎなかった。テンプレート領域を用いる場合、無名メモリ・オブジェクトという概念が実在しない。メモリ・オブジェクトをマッピングするために、各メモリ・オブジェクトを識別しなければならない。
【０２８６】
テンプレート領域は非常に再帰的であることが理解されるであろう。これは、物理ページに向かって進む再帰であると考えると便利である。物理ページは、固定サイズのテンプレート領域であると考えることができる。これは、実施態様がこの形でなければならないということを暗示するものではない。物理ページがテンプレート領域の最下位の組であると考えることは、概念的な観点から便利である。単一のテンプレート領域を、複数の他のテンプレート領域にマッピングすることができるので、物理ページを複数の「通常」の領域にマッピングすることができる。これによって、異なるテンプレート領域から、異なる属性が関連付けられた同一の物理メモリをアクセスできるようになる。明らかに、異なるテンプレート領域が衝突する属性を有する場合に、物理ページの属性をセットする方法に関して規則が必要である。たとえば、あるテンプレートではそのページがキャッシュ不能と示され、別のテンプレートではそのページをキャッシュしなければならないと示される場合がある。この逆の場合もある。ページ・テーブルを用いると、物理的に不連続なページを仮想的に連続しているように見せることができる。同一のことを、オーバーラップするテンプレート領域に対しても行える。図１４では、Ｒ０に２つの他の領域Ｒ１およびＲ２が含まれ、Ｒ１とＲ２は、Ｒ０内で連続していない。一部のアプリケーションでは、この不連続性を知り、対処しなければならないので、情報の操作が困難になる可能性がある。Ｒ１とＲ２を含むのに十分な大きさの新テンプレート領域Ｒ３を作成することができる。Ｒ１とＲ２は、Ｒ３内で互いに連続する形でマッピングされる。こうすると、先程のアプリケーションが、Ｒ３を利用して、Ｒ０に見られる不連続性に対処する必要をなくすことができる。
【０２８７】
本発明の例示の実施例によれば、テンプレート領域には別個の２つの種類がある。テンプレート領域の第１のタイプは、他のテンプレート領域を含む能力を有するネスト可能テンプレート領域である。これを用いると、上で述べた再帰が可能になる。しかし、この再帰では、実際にメモリを含むことができない。これは、すべてのメモリ（仮想メモリ）がメモリ・オブジェクトによって表現されるからである。メモリ・オブジェクトは、テンプレート領域と異なる実体である。したがって、メモリ・オブジェクトの一部をマッピングする第２のタイプのテンプレート領域がある。これらは、「リーフ（ｌｅａｆ）」領域と考えることができる。図１５に、異なるタイプのテンプレート領域の例と、メモリ領域がそれらとどのように関連するかを示す。メモリ・オブジェクトであるリーフ領域は、メモリ・オブジェクトのマッピングされる部分のサイズと正確に同じサイズでなければならないことに留意されたい。すなわち、このテンプレート領域には、メモリ・オブジェクトをマッピングされていない部分があってはならない。図１６に、領域へのメモリ・オブジェクトのマッピングの正しくない例を２つ示す。テンプレート領域Ｒ３へのＭＯ１のマッピングは、Ｒ３が他のテンプレート領域を含むので正しくない。Ｒ２へのＭＯ２のマッピングは、Ｒ２がＭＯ２のマッピングされる部分より大きいので、正しくない。
【０２８８】
テンプレート領域には、そのテンプレート領域によって含まれるメモリを扱う方法を示す属性が関連付けられている。下記は、属性の識別と、そのそれぞれの意味および各属性を取り巻くセマンティックスの一部の説明である。
１．テンプレート領域内でメモリが割り振られる時に、補助記憶の割振りを切望する。これがセットされていない時には、補助記憶が遅延割り振りされる。
２．スーパーバイザ（Ｓｕｐｅｒｖｉｓｏｒ）。プロセッサがスーパーバイザ状態で実行中である時に限ってアクセス可能なテンプレート領域を示す。
３．特権（Ｐｒｉｖｉｌｅｇｅｄ）。物理メモリが足りない時に予約済みプールからページを割り振ることができる。
４．メモリが割り振られ、テンプレート領域に置かれる時に、そのメモリを表すページが、物理的に連続していなければならない。
５．メモリが割り振られ、テンプレート領域に置かれる時に、そのメモリを表すページが、指示された物理アドレス範囲内になければならない。
６．テンプレート領域内のページが、メモリにワイヤリングされる。このテンプレート領域への新しい割振りは、どれもがワイヤリングされる。この属性がセットされていない場合、テンプレート領域内のページを、名前メモリから追い出すことができる。
７．プロセッサ・キャッシュ属性。
８．アクセス挙動。
９．アクセス権。
１０．コヒーレンシ（Ｃｏｈｅｒｅｎｃｙ）とＮＯＲＭＡ。
【０２８９】
テンプレート領域は、図１７に示されるように他の複数の構成要素と相互作用する。構成要素のそれぞれの説明は、下の節で行う。
【０２９０】
さまざまな仮想メモリ構成要素が、ページ、メモリ・オブジェクト、テンプレート領域、キャッシュ、ＰＭＡＰおよびメモリ管理ユニットである。
【０２９１】
本発明による方法で編成された仮想メモリ・システムに関して、下記を観察することができる。
１．物理ページは、多くとも１つのメモリ・オブジェクトに含まれる。これが発生するのは、メモリ・オブジェクトが、「メモリ」を表すのに使用される実体だからである。共用は、ページを含むメモリ・オブジェクトの共用か、メモリ・オブジェクトを含むテンプレート領域の共用のいずれかによって達成される。
２．メモリ・オブジェクトは、それをマッピングしているテンプレート領域のすべてについて知っていなければならない。
３．テンプレート領域は、そのテンプレート領域を含むすべてのＰＭＡＰ範囲について知っていなければならない。
【０２９２】
上記によって、物理ページの共用を識別するのに必要なメモリの量をかなり削減することができる。過去の実施態様では、ページを含むＰＭＡＰのすべての、ページごとのリストが維持された。これによって、ＰＭＡＰコードへの望ましくない再帰も導入された。というのは、ページを含むＰＭＡＰのリストを構成し、維持するために、ＰＭＡＰコードが、動的にメモリを割り振る能力を有する必要があったからである。
【０２９３】
しかし、本発明によれば、ＰＭＡＰは、そのデータ構造を維持するためにメモリを動的に割り振る必要がない。共用は、テンプレート領域レベルで行われるので、ＰＭＡＰのリストをかなり小さくすることができる。タスク間で大量の共用を行うシステムでは、これによってかなりの節約をもたらすことができる。たとえば、１０ページのテンプレート領域を共用する１０個のタスクがあれば、９０個のリスト要素が節約される。すなわち、テンプレート要素を用いない場合の１００個のリスト（１０ページのそれぞれに１０要素のリスト）に対して、テンプレート要素を用いる場合には１０個のリスト（１０要素のリストを有する１つの領域）である。
【０２９４】
テンプレート領域はマッピングを表すので、テンプレート領域からハードウェア・データ構造を参照することができる。多くのハードウェア実施態様では、２レベル以上のデータ構造が使用される。したがって、実施態様を第２レベル・データ構造全体に敏感にすることによって、テンプレート領域をマッピングしたタスクが、データ構造によって表されるハードウェア・データ構造を再使用できるはずである。たとえば、インテル社の３８６／４８６およびペンティアム・プロセッサの場合、ページ・テーブル構造は、２レベルの深さである。第２レベルは、４メガバイト境界上の４メガバイト長のメモリ領域を表す。これらのプロセッサのうちの１つのテンプレート領域の実装では、４メガバイト（または４メガバイトの整数倍）のメモリ領域が作成される時を検出することができ、複数のタスクがそれをマッピングする時に、ハードウェア・データ構造を作成する必要がないことが保証される。共用されないハードウェア・データ構造の場合であっても、この実施態様は、テンプレート領域が他のハードウェア・データ構造のマッピングの案内として役立つので、効率的になり得る。そうする際に、他のハードウェア・データ構造マッピングは、元のマッピングされたハードウェア・データ構造からごくわずかしか変化しない（おそらくは、全く変化しない）可能性があり、このため、将来のデータ構造の作成が単純になり、性能の向上がもたらされる。
【０２９５】
さらに、本発明を用いると、ページをページ・インする時の熱心なＰＭＡＰ項目の効率的な実施が可能になる。これによって、ページ障害を大幅に減らすことができる。ページがメモリ内にある場合、そのページに対して障害は発生しない。
【０２９６】
テンプレート領域とタスクは、どちらもが特殊なマイクロカーネル・オブジェクトである。すなわち、これらは、互いに独立であると考えることができる。しかし、テンプレート領域は、タスクのアドレス空間を定義する。タスクのアドレス空間すなわち、その基本テンプレート領域は、そのタスクが作成される時に定義される。
【０２９７】
１つのタスクは、基本的に２つのテンプレート領域を知っている。一方の領域は他方の領域に含まれるが、このタスクは内側のテンプレート領域について知る必要があるので、それについて知らされる。この２つのテンプレート領域は、基本テンプレート領域とユーザ・テンプレート領域である。基本テンプレート領域によって、そのタスクのアドレス空間全体が記述される。ユーザ・テンプレート領域は、通常は基本テンプレート領域の内側に置かれ、これによって、そのタスクのユーザ部分によって特殊な特権なしに（すなわち、タスク・ポートだけが必要）操作可能なアドレス空間の部分が記述される。これらはテンプレート領域であるから、そのタスクとシステムの正しい動作のために必要であれば、他のテンプレート領域を含めることができる。図１８では、Ｒ０が基本テンプレート領域である。Ｒ０には、基本テンプレート領域に特有のもう１つのテンプレート領域Ｒ３が含まれ、Ｒ０には、ユーザ・テンプレート領域Ｒ１が含まれる。Ｒ１には、もう１つのテンプレート領域Ｒ２が含まれる。このタスク内のスレッドは、これらのテンプレート領域のどの内容にもアクセスできるが、このタスクは、テンプレート領域Ｒ１およびＲ２しか操作できないことに留意されたい。
【０２９８】
タスクがユーザ・テンプレート領域を有する必要はない。この場合、タスクは、そのアドレス空間を操作することができず、そのタスクに代わって操作を実行する他のタスクに頼ることになる。これは、オペレーティング・システム・パーソナリティが、タスクにそのアドレス・マップを随意変更させないようにするのに役立つ（すなわち、アドレス・マップは、オペレーティング・システム・パーソナリティに依存しなければならない）。
【０２９９】
もう一度図１８を参照すると、タスクは、２つのポインタを有するものとして図示されている。第１のポインタは、基本領域を指し、そのタスクの全アドレス空間（そのタスクがアクセスできるもののすべて）を記述している。第２のポインタは、ユーザ領域（領域に関して、ユーザ・プログラムが通常操作できるもの）を指す。タスクの内部または基本領域の内部に、ユーザ・プログラムからアクセス可能であるが、操作可能ではなく、非特権コードによって操作できないテンプレート領域が存在し得ることに留意されたい。さらに留意すべき点として、図１８には、４つの領域Ｒ０ないしＲ３がある。タスクの全アドレス空間を記述する基本領域は、Ｒ０である。通常、この領域は、計算機アーキテクチャによってその特定のタイプのタスクに許される限りの大きさになる。したがって、たとえば、ほとんどの３２ビット・アーキテクチャでは、基本領域が４ギガバイトの領域を記述することになる。これは、基本領域に４ギガバイトの情報が含まれるという意味ではない。そうではなくて、タスクが４ギガバイトの情報にアクセスできるのである。ユーザ領域は、Ｒ１によって記述される。Ｒ１を用いると、タスク内の非特権コードが、Ｒ１の内部の領域を操作し、領域を作成し、Ｒ１に新領域をマッピングし、Ｒ１から領域のマッピングを解除することができるようになる。しかし、Ｒ１は、Ｒ３に対する機能を全く実行できない。Ｒ１は、たとえば、Ｒ３の内容をアクセスする可能性がある（Ｒ３の特権による）が、Ｒ１は、領域自体としてのＲ３について具体的に知ることはできない。さらに、Ｒ１とＲ３は、Ｒ０が存在することを知らず、その内容も全く知らない。したがって、タスクがそのアドレス空間内で知ることのできる唯一の領域は、ユーザ領域によって指され、Ｒ１やＲ２などのユーザ領域に含まれる領域である。
【０３００】
あるシナリオでは、あるタスクのユーザ領域が存在せず、そのタスクがそのマッピング情報を全く変更できない環境が作成される場合がある。このタスクは、それに代わって操作を実行するために、他のサーバなど、他の何らかのエージェントに依存するはずである。これが望ましいオペレーティング・システム環境の１つに、それ自体のアドレス空間を操作できるアプリケーション・プログラムを避けなければならない環境がある。
【０３０１】
もう１つのシナリオでは、たとえばカーネル自体について、ユーザ領域と基本領域の両方が、同一の領域を指す。そうすることによって、カーネル・タスクは、そのアドレス空間の一部だけではなく、アドレス空間全体を操作できる。
【０３０２】
領域をスーパーバイザ状態にエクスポートする時には、テンプレート領域の概念を用いていくつかのことを単純化できる。第１に、スーパーバイザ・テンプレート領域に、新コードをロードすることができる。第２に、スーパーバイザ・モードで走行するコードの一部を、簡単にページ可能にすることができる。これらの特徴のどちらもが、一般的なテンプレート領域サポートに必要なインターフェース以外の追加インターフェースを必要としない。
【０３０３】
ユーザ・アクセス状態とスーパーバイザ・アクセス状態の間でアクセス保護を維持することが重要である。これは、プロセッサがスーパーバイザ状態である時に限ってテンプレート領域をアクセスできることを示す属性を維持することによって達成される。ユーザ・タスクは、スーパーバイザ領域が存在することを「知る」ことはできるが、その内容をアクセスすることはできない。通常、スーパーバイザ・テンプレート領域は、テンプレート領域自体が操作されないようにするために、基本テンプレート領域内に置かれる。
【０３０４】
走行中のシステムは、通常、比較的少ない数のスーパーバイザ・テンプレート領域を有する。これらは、２つの可能な範疇に含まれる傾向を有する。テンプレート領域の１つの組は、カーネル・インターフェース・ライブラリを提供するための使用可能性を有するために個々のタスクに固有になる傾向を有する。これは、複数のカーネル呼出しを行うというペナルティを課すことなく、個々のタスクにカーネルへの専用インターフェースを与える可能性を有する。これを図１９に示す。
【０３０５】
図１９は、ほとんどの環境に、保護されるがタスクのアドレス空間にマッピングしなければならないカーネルの部分またはスーパーバイザ実体があることを示す図である。これは、テンプレート領域に、タスクのアドレス空間に現れるカーネルの部分をマッピングすることによって、テンプレート領域を用いて達成される。この部分は、ユーザがそれを操作できなくするために、基本領域にマッピングすることができる。通常、ユーザ／スーパーバイザ遷移が発生する方法のために、スーパーバイザの一部が、そのタスクのアドレス空間内にあることが必要である。しかし、この部分は、ユーザまたはアプリケーション・プログラムによってアクセス可能にならないように保護される。さらに、この手法を用いると、共用カーネル領域を有するだけでなく、異なるライブラリをインターフェース・ライブラリとしてマッピングすることによって、タスクごとの基準でアプリケーション・カーネル・インターフェースをカスタマイズすることも可能になる。インターフェース・ライブラリも、基本領域内にあるように見え、アプリケーション・コードによって操作できない形で保護される。これを、図１９のＲ５およびＲ６に示す。共用カーネルは、この図の左右でＲ３として示されている。
【０３０６】
マイクロカーネル自体も、カーネル・タスクと称する１タスクであり、他のタスクと同様に、基本テンプレート領域を有する。マイクロカーネルのタスク基本テンプレート領域に含まれるテンプレート領域の、すべてではないにせよほとんどは、スーパーバイザ・テンプレート領域である。この基本テンプレート領域は、別のタスクがカーネル機能にアクセスできるようにするために、そのタスクの基本テンプレート領域に含まれる可能性がある。しかし、他のタスクのユーザ・テンプレートとは異なり、領域は基本テンプレート領域と同一である。カーネルのテンプレート領域を、まず図１９に示す。その詳細な構造の例を、図２０に示す。図２０は、特定のテンプレート領域が、ワイヤリング不能であることを示す属性を有することができることを示すことによって、カーネルの一部を、ページ可能にすることができることを示す図である。カーネルの機能は、カーネルのテンプレート領域のうちの１つに新テンプレート領域をマッピングすることによって拡張できる。
【０３０７】
図２０では、マイクロカーネル自体がタスクであるから、テンプレート領域を使用してカーネル・タスク自体を編成している。カーネル・タスクは、図２０では同一の領域Ｒ０を指す基本ポインタおよびユーザ・ポインタを有し、その結果、カーネル・タスクは、その全アドレス空間を操作する特権を有する。カーネル・タスクのマップ内の２つの主な副領域、Ｒ１およびＲ３が図示されている。Ｒ３は、それ自体を「ワイヤリング」させる属性を有し、その結果、絶対にメモリから追い出されない。しかし、カーネルには、不在であることが許容される部分があり、これは、その領域のページングを可能にする属性を有する領域Ｒ１に含まれる。したがって、カーネル内でページ可能なコードは、ページ可能属性をセットされたテンプレート領域に置くことができる。ページ可能でないコードは、ページ可能属性をセットされていないテンプレート領域に置くことができる。そうする際に、適当なワイヤリングされた領域またはページ可能な領域のいずれかに新領域を単純にマッピングすることによって、カーネルに新コードをロードすることが非常に簡単になる。
【０３０８】
以下で、テンプレート領域内のマッピングの例を述べる。プログラムは、オープン中にファイル・サーバを呼び出すことができる。ファイル・サーバは、ファイルのサイズを判定し、そのファイルを含めるのに十分な大きさの仮想メモリ空間を表すテンプレート領域を作成する。たとえば、ファイルが７０００００バイトの場合、ファイル・サーバは、７０００００バイトの仮想メモリ空間を表すテンプレート領域を作成する。ファイル・サーバは、そのファイルを表すのに使用するメモリ・オブジェクトも作成する。このメモリ・オブジェクトは、潜在的に許可のないファイルを表し、したがって、クライアントが読取り専用のファイル・オープンと読み書き両用のファイル・オープンのどちらを望んだかに無関係に、同一のメモリ・オブジェクトになるはずである。この例には、２つのクライアントがある。一方のクライアントは、ファイルを読取り専用としてオープンすると決定し、もう一方のクライアントは、ファイルを読み書き両用としてオープンする。メモリ・オブジェクトはファイルの実際の内容を表すので、メモリ・オブジェクトは１つ存在する。しかし、テンプレート領域は２つ存在するはずである。一方のテンプレート領域には、そのファイルの読取り専用マッピングが含まれ、もう一方のテンプレート領域を用いると、そのオブジェクトに書き込むことができる。
【０３０９】
テンプレート領域のそれぞれが、データのマッピングを表す。たとえば、第２のテンプレート領域は、両方の領域のデータが同一であり、同一になることが保証されるにもかかわらず、オブジェクトを読取り可能であると同時に書込み可能にすることができる属性を有する可能性がある。データに対して行うことができる機能は、どちらのテンプレート領域をアクセスするかに応じて変化する。テンプレート領域のない実施態様の場合、メモリは、少なくとも１つのタスクにマッピングしなければ操作できない。テンプレート領域を用いると、タスクとメモリの直接的な関係の必要が破壊されるので、操作のためにメモリをタスクにマッピングする必要がなくなることに留意されたい。さらに、タスクとメモリの直接的な関係の必要が破壊されているので、テンプレート領域によってマッピングされるメモリ領域は、テンプレート領域がマッピングされるアドレス空間より大きくてもかまわない。その際に、対応するタスクの制約に従ってテンプレート領域をマッピングできるように、テンプレート領域のサイズに制約を加えたり、テンプレート領域を随意分割する理由はない。
【０３１０】
第１のテンプレート領域は、オブジェクト内のデータに対する読取り専用許可を有する。第２のテンプレート領域は、メモリ・オブジェクト内のデータに対する読み書き許可を有する。それぞれの許可に対応するファイルを含むデータは、メモリ・オブジェクト内にある。ファイル・サーバの役割には、２つの部分がある。第１の役割は、ファイルのマッピングを表すテンプレート領域とファイルを表すメモリ・オブジェクトの間の連係を確立することである。第１テンプレート領域にポインタ情報が置かれ、これによって、メモリ・オブジェクト・ページの位置が識別される。これに対応して、同一のポインタ情報が第２テンプレート領域に置かれ、メモリ・オブジェクト・ページの仮想アドレス空間内の位置が識別される。２つのテンプレート領域の間の相違は、第１のテンプレート領域がオブジェクト内のデータを読み取る許可だけを有するが、第２のテンプレート領域がデータの読取りと書込みの両方の許可を有することである。
【０３１１】
テンプレート領域の長所の１つが、同一のオブジェクトに対して異なる属性を有する能力である。さらに、領域をネストできるので、テンプレート領域は、他のメモリ・オブジェクトだけでなく、他のテンプレート領域を指すこともできる。したがって、メモリのテンプレート・マップを構成することができる。そうする際に、テンプレート領域によって記述される情報をアクセスするために、そのデータをアクセスするのに必要なハードウェア・マッピングを確立するための明瞭に構成された適度な組のポインタ情報が存在する。たとえば、インテル・アーキテクチャ計算機上には、前に満たされたページ・テーブルまたはページ・テーブルの部分が存在する可能性がある。あるアドレス空間を実際にテンプレート領域にマッピングしたい場合、その作業は、ページ・テーブル・データ構造を完全に作るのではなく、ページ・テーブル・データ構造の一部を指すだけの簡単なことになるはずである。
【０３１２】
下の表１ないし表１４で、タスクおよびテンプレート領域の作成と操作に関連するカーネル呼出しを説明する。
【０３１３】
テンプレートの作成と操作に関連して使用されるカーネル呼出しは、オブジェクト指向ユーザ・プログラム内で指定できる。オブジェクト指向プログラムは、２つの主要部分すなわち、オブジェクト定義部分と命令ストリーム部分に分割される。ユーザ・プログラムのオブジェクト定義部分には、命令ストリーム内の命令に関連するプログラム・オブジェクトを定義するためのオブジェクト定義テーブルが含まれる可能性がある。ユーザは、カーネル呼出しを使用して、マイクロカーネル・アドレス空間内でテンプレート領域を作成し、メモリ１０２内でタスクを生成して、ユーザの意図したプログラムの目的を実行する。ユーザは、自分のプログラムに、表１ないし表１４に記載されたカーネル呼出しを含めて、テンプレート領域とそれによって定義されるタスクを作成し、操作する。表１ないし表５に示されたカーネル呼出しを用いると、タスクがテンプレート領域の概念を利用できるようになる。表６ないし表１４のカーネル呼出しは、テンプレート領域の操作に必要なプリミティブ・テンプレート領域動作である。これらのカーネル呼出しは、マイクロカーネル１２０、パーソナリティ・ニュートラル・サービス１４０、パーソナリティ・サーバ１５０またはアプリケーション・プログラム１８０によって発行可能である。テンプレート領域の操作のための高水準関数は、表１ないし表１４に記載のプリミティブ動作の組合せから作成できる。表１ないし表１４に記載されたタスク動作およびテンプレート領域動作は、次の通りである。
・表１  ｔａｓｋ＿ｃｒｅａｔｅ  タスクの作成と命名
・表２  ｔａｓｋ＿ｓｅｔ＿ｂａｓｅ＿ｒｅｇｉｏｎ  タスクの基本領域のセット
・表３  ｔａｓｋ＿ｇｅｔ＿ｂａｓｅ＿ｒｅｇｉｏｎ  タスクの基本領域のゲット
・表４  ｔａｓｋ＿ｓｅｔ＿ｕｓｅｒ＿ｒｅｇｉｏｎ  タスクのユーザ領域のセット
・表５  ｔａｓｋ＿ｇｅｔ＿ｕｓｅｒ＿ｒｅｇｉｏｎ  タスクのユーザ領域のゲット
・表６  ｒｅｇｉｏｎ＿ｃｒｅａｔｅ＿ｎｅｓｔａｂｌｅ  他のテンプレート領域を含むことのできるテンプレート領域の作成
・表７  ｒｅｇｉｏｎ＿ｃｒｅａｔｅ＿ｌｅａｆ  メモリ・オブジェクトを参照するテンプレート領域の作成
・表８  ｒｅｇｉｏｎ＿ｍａｐ＿ｉｎｔｏ  小さいテンプレート領域のより大きいテンプレート領域へのマッピング
・表９  ｒｅｇｉｏｎ＿ｓｅｔ＿ａｔｔｒｉｂｕｔｅｓ  テンプレート領域の属性のセット
・表１０  ｒｅｇｉｏｎ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓ  テンプレート領域の属性のゲット
・表１１  ｒｅｇｉｏｎ＿ｏｂｊｅｃｔ＿ａｔｔａｃｈ  リーフ（ｌｅａｆ）・テンプレート領域へのメモリ・オブジェクトの付加
・表１２  ｒｅｇｉｏｎ＿ｃｏｐｙ  あるテンプレートの内容の別のテンプレートへのコピー
・表１３  ｒｅｇｉｏｎ＿ｇｅｔ＿ｐｈｙｓ＿ａｄｄｒｓ  テンプレート領域を構成する物理ページのリストのゲット
・表１４  ｒｅｇｉｏｎ＿ａｔｔｒ＿ｔ  異なる領域属性の定義
表１ないし表１４を参照すれば、本発明によるタスク動作およびテンプレート領域動作の実行に必要な例のカーネル呼出しの詳細な説明が得られる。
【０３１４】
【表１】
0003570525.tif 000002
解説
これは、領域の概念が導入された時に現行の関数ｔａｓｋ＿ｃｒｅａｔｅをどのように変更できるかの例である。
関数ｔａｓｋ＿ｃｒｅａｔｅは、ｐａｒｅｎｔ＿ｔａｓｋから新タスクを作成し、新タスクの名前をｃｈｉｌｄ＿ｔａｓｋに返す。子タスクのアドレス空間は、ｐａｒｅｎｔ＿ｔａｓｋの基本領域と供給されたｕｓｅｒ＿ｒｅｇｉｏｎに基づいて確立される。子タスクのｕｓｅｒ＿ｒｅｇｉｏｎは、その基本領域のオフセットｕｓｅｒ＿ｓｔａｒｔｉｎｇ＿ｏｆｆｓｅｔにマッピングされる。子タスクには、当初はスレッドが含まれない。子タスクは、親タスクのセキュリティ・トークンを継承する。
子タスクは、タスク作成時に作成またはコピーされる下記の特殊ポートを受け取る。
・［タスク自己ポート］  カーネルが新子タスクを知り、それの操作を可能にするのに使用するポート。子タスクは、このポートへの送出権を保持する。このポート名は、呼出し側のタスクにも返される。
・［ブートストラップ・ポート］  子タスクが、必要なシステム・サービス・ポートからの返しを要求するメッセージを送ることができるポート。子タスクは、親タスクからこのポートの送出権を継承する。タスクは、ｔａｓｋ＿ｓｅｔ＿ｓｐｅｃｉａｌ＿ｐｏｒｔを使用してこのポートを変更できる。
・［ホスト自己ポート］  子タスクがそのホストに関する情報を要求するのに使用するポート。子タスクは、親ポートからこのポートの送出権を継承する。
・［基本領域ポート］  子タスクの基本領域を記述するポート。このポートによって命名される領域は、親タスクの基本領域のコピーか、親タスクの基本領域への参照のいずれかである。親の領域のコピーは、この基本領域に対する変更のすべてが、個々のタスクの私用であることを意味する。すなわち、これは、親の基本領域とは別個の領域であるが、親タスクと同一のサイズ、属性およびマッピングされた領域（ユーザ領域を除く）を有する。子の基本領域が親の基本領域への参照である場合、基本領域に対する変更のすべてが、両方のタスクから可視である。これは、そのタスクのユーザ領域が、基本領域にマッピングされることを意味する。したがって、ユーザ領域は、異なる開始オフセットにある必要がある。両方のタスクのユーザ領域が同一の領域である場合は、ユーザ領域が同一の開始オフセットにあってかまわない特殊な例である。このポートは、ｔａｓｋ＿ｇｅｔ＿ｂａｓｅ＿ｒｅｇｉｏｎを介してアクセス可能である。
・［ユーザ領域ポート］  子タスクのユーザ領域を記述するポート。このポートによって命名される領域は、ｕｓｅｒ＿ｒｅｇｉｏｎによって記述される領域である。子タスクと親タスクのユーザ領域の間に存在し得る唯一の関係は、呼出し側によって決定される。このポートは、ｔａｓｋ＿ｇｅｔ＿ｕｓｅｒ＿ｒｅｇｉｏｎを介してアクセス可能である。
パラメータ
・ｐａｒｅｎｔ＿ｔａｓｋ
［入力、タスク・ポート］子タスクのポート権と基本領域を引き出すためのタスク用のポート。
・ｕｓｅｒ＿ｒｅｇｉｏｎ
［入力、領域ポート］タスクのユーザ・アドレスを記述するのに使用される、領域用のポート。
・ｕｓｅｒ＿ｓｔａｒｔｉｎｇ＿ｏｆｆｓｅｔ
［入力、ｖｍオフセット］タスクの基本領域内でユーザ領域を置くオフセット。
・ｃｏｐｙ＿ｂａｓｅ
［入力、論理値］この子タスクの基本領域が親の基本領域のコピーであるか、親の基本領域への追加参照であるかを示す。
・ｃｈｉｌｄ＿ｔａｓｋ
［出力、タスク・ポートを指すポインタ］新タスクのためにカーネルが割り当てたポート名。
戻り値
【０３１５】
【表２】
0003570525.tif 000003
解説
関数ｔａｓｋ＿ｓｅｔ＿ｂａｓｅ＿ｒｅｇｉｏｎは、タスクがそのアドレス空間の記述であるとみなす領域をセットする。この領域へのアクセスが必要になるのは、タスクが非ユーザ領域を何らかの形で操作しようとする場合である。これは、タスクがその基本領域内で見るものの内容をタスクごとの基準で管理するのに使用できる。
タスクの基本領域には、通常は、スーパーバイザ属性を有する領域が含まれ、カーネルがタスクの基本領域にマッピングされた領域に含まれ、タスクの基本領域の操作が、システム動作とセキュリティに関係がある可能性があるので、この関数は、ホスト特権ポートへのアクセスを必要とする特権関数である。
パラメータ
・ｔａｓｋ
［入力、タスク・ポート］基本領域を所望されるタスクのポート。
・ｈｏｓｔ＿ｐｒｉｖ＿ｐｏｒｔ
［入力、ホスト特権ポート］ホスト特権ポートのポート。
・ｒｅｇｉｏｎ
［入力、領域ポート］タスクの全アドレス空間を表す領域のポート。
戻り値
【０３１６】
【表３】
0003570525.tif 000004
解説
関数ｔａｓｋ＿ｇｅｔ＿ｂａｓｅ＿ｒｅｇｉｏｎは、タスクの全アドレス空間を記述する領域を記述するポートを返す。この領域へのアクセスが必要になるのは、タスクが非ユーザ領域を何らかの形で操作しようとする場合である。この関数は、タスクがその基本領域で見るものの内容をタスクごとの基礎で管理するのに使用できる。
タスクの基本領域には、通常は、スーパーバイザ属性を有する領域が含まれ、カーネルがタスクの基本領域にマッピングされた領域に含まれ、タスクの基本領域の操作が、システム動作とセキュリティに関係がある可能性があるので、この関数は、ホスト特権ポートへのアクセスを必要とする特権関数である。
パラメータ
・ｔａｓｋ
［入力、タスク・ポート］基本領域を所望されるタスクのポート。
・ｈｏｓｔ＿ｐｒｉｖ＿ｐｏｒｔ
［入力、ホスト特権ポート］ホスト特権ポートのポート。
・ｒｅｇｉｏｎ
［出力、領域ポートを指すポインタ］タスクの全アドレス空間を表す領域のポート。
戻り値
【０３１７】
【表４】
0003570525.tif 000005
解説
関数ｔａｓｋ＿ｓｅｔ＿ｕｓｅｒ＿ｒｅｇｉｏｎは、タスクが操作を許可される領域でタスクを「指す」。この領域は、この呼出しを発行する前にタスクの基本領域にマッピングされていなければならない。
パラメータ
・ｔａｓｋ
［入力、タスク・ポート］ユーザ領域を変更されるタスクのポート。
・ｒｅｇｉｏｎ
［入力、領域ポート］タスクのユーザ操作可能アドレス空間を表す領域のポート。
戻り値
【０３１８】
【表５】
0003570525.tif 000006
解説
関数ｔａｓｋ＿ｇｅｔ＿ｕｓｅｒ＿ｒｅｇｉｏｎは、タスクのタスク・アドレス空間のユーザ操作可能領域を記述するポートを返す。この領域へのアクセスが必要になるのは、タスクがそのアドレス空間を何らかの形で操作しようとする場合である。
パラメータ
・ｔａｓｋ
［入力、タスク・ポート］ユーザ領域を所望されるタスクのポート。
・ｒｅｇｉｏｎ
［出力、領域ポートを指すポインタ］タスクのユーザ操作可能アドレス空間を表す領域のポート。
戻り値
【０３１９】
【表６】
0003570525.tif 000007
解説
「親」領域から新しい領域を作成する。親領域は、新たに作成される領域に制限を課すのに使用される。親より大きい子領域を作成することはできない。子領域は、親領域の属性も継承する。作成の後、子領域を他のネスト可能領域にマッピングすることができる。子領域は、当初は他の領域にマッピングされていない。
新たに作成される領域は、他の領域を含むことができる領域である。メモリ・オブジェクトは、ネスト可能領域に直接にマッピングすることができない。
パラメータ
・ｐａｒｅｎｔ＿ｒｅｇｉｏｎ
［入力、領域ポート］新領域を作成する元の「親」領域に対する参照。新領域は、許可またはサイズに関して、親によって記述されるものを超えることはできない。
・ｒｅｇｉｏｎ＿ｓｉｚｅ
［入力、ｖｍサイズ］新領域が有することになるサイズ。
・ｃｈｉｌｄ＿ｒｅｇｉｏｎ
［出力、領域ポートを指すポインタ］新たに作成された領域の名前。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｐａｒｅｎｔ＿ｒｅｇｉｏｎが、システムに既知の領域でない。
・ＢＡＤ＿ＳＩＺＥ
新領域のために指定されたｒｅｇｉｏｎ＿ｓｉｚｅが、ｐａｒｅｎｔ＿ｒｅｇｉｏｎのサイズより大きい。
【０３２０】
【表７】
0003570525.tif 000008
解説
「親」領域から新しい領域を作成する。親領域は、新たに作成される領域に制限を課すのに使用される。親より大きい子領域を作成することはできない。子領域は、親領域の属性も継承する。作成の後、子領域を他のネスト可能領域にマッピングすることができる。子領域は、当初は他の領域にマッピングされていない。
新たに作成される領域は、メモリ・オブジェクトまたはメモリ・オブジェクトの一部をネスト可能領域にマッピングするのに使用することができる。リーフ（ｌｅａｆ）領域は、メモリ・オブジェクトの一部を記述するのに使用される。これは、１つのメモリ・オブジェクトだけを記述することができる。他の領域を含めることはできない。
パラメータ
・ｐａｒｅｎｔ＿ｒｅｇｉｏｎ
［入力、領域ポート］新領域を作成する元の「親」領域に対する参照。新領域は、許可またはサイズに関して、親によって記述されるものを超えることはできない。
・ｒｅｇｉｏｎ＿ｓｉｚｅ
［入力、ｖｍサイズ］新領域が有することになるサイズ。
・ｎｅｗ＿ｒｅｇｉｏｎ
［出力、領域ポートを指すポインタ］新たに作成された領域の名前。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｐａｒｅｎｔ＿ｒｅｇｉｏｎが、システムに既知の領域でない。
・ＢＡＤ＿ＳＩＺＥ
新領域のために指定されたｒｅｇｉｏｎ＿ｓｉｚｅが、ｐａｒｅｎｔ＿ｒｅｇｉｏｎのサイズより大きい。
【０３２１】
【表８】
0003570525.tif 000009
解説
関数ｒｅｇｉｏｎ＿ｍａｐ＿ｉｎｔｏは、小さな領域をとり、これをより大きな領域の一部にマッピングする。ｆｒｏｍ＿ｒｅｇｉｏｎをｉｎｔｏ＿ｒｅｇｉｏｎ内のどこに置くかに関してｉｎｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔを解釈する方法を指定する複数のオプションが、ｐｌａｃｅｍｅｎｔによって指定
される。
パラメータ
・ｉｎｔｏ＿ｒｅｇｉｏｎ
［入力、領域ポート］小さな領域がマッピングされる、より大きな領域を指定する。
・ｉｎｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔ
［入出力、ｖｍオフセットを指すポインタ］入力としては、ｆｒｏｍ＿ｒｅｇｉｏｎをｉｎｔｏ＿ｒｅｇｉｏｎに置くための位置を探し始める開始オフセットを指定する。出力としては、ｆｒｏｍ＿ｒｅｇｉｏｎがマッピングされたｉｎｔｏ＿ｒｅｇｉｏｎ内のオフセットが格納される。
・ｆｒｏｍ＿ｒｅｇｉｏｎ
［入力、領域ポート］より大きな領域にマッピングされる小さな領域を指定する。
・ｐｌａｃｅｍｅｎｔ
［入力、領域配置］ｉｎｔｏ＿ｒｅｇｉｏｎ内でｆｒｏｍ＿ｒｅｇｉｏｎ用の位置を選択する方法を指定する。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｆｒｏｍ＿ｒｅｇｉｏｎまたはｉｎｔｏ＿ｒｅｇｉｏｎが、システムに既知の領域でない。このエラーは、ｉｎｔｏ＿ｒｅｇｉｏｎがリーフ（ｌｅａｆ）領域の場合にも発生する。
・ＢＡＤ＿ＯＦＦＳＥＴ
ｉｎｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔが、ｉｎｔｏ＿ｒｅｇｉｏｎのサイズより大きい。このエラーは、ｆｒｏｍ＿ｒｅｇｉｏｎ  ＋  ｉｎｆｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔのサイズがｉｎｔｏ＿ｒｅｇｉｏｎのサイズより大きい場合にも発生する。
【０３２２】
【表９】
0003570525.tif 000010
解説
関数ｒｅｇｉｏｎ＿ｓｅｔ＿ａｔｔｒｉｂｕｔｅｓは、ある領域の絶対属性をセットする。領域の有効属性は、その領域がマッピングされる領域によって決定される。１つの領域を複数の領域にマッピングすることができるので、１つの領域が、複数の有効属性の組を有する可能性がある。この関数は、「特権」属性は全くセットできない。パラメータ
・ｒｅｇｉｏｎ
［入力、領域ポート］属性をセットする領域。
・ａｔｔｒｉｂｕｔｅｓ
［入力、領域属性］領域に割り当てられる属性。
・ａｔｔｒｉｂｕｔｅ＿ｍａｓｋ
［入力、領域属性マスク］どの属性を変更するかを示す。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｒｅｇｉｏｎが、システムに既知の領域ではない。
・ＢＡＤ＿ＡＴＴＲＩＢＵＴＥ
指定された属性のうちの１つまたは複数をセットできなかった。通常、これが発生するのは、この関数を用いて特権属性をセットしようとした時である。
【０３２３】
【表１０】
0003570525.tif 000011
解説
関数ｒｅｇｉｏｎ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓは、指定された領域の属性を返す。この関数は、領域に関してセットされた属性を返す。領域は、その領域に関してセットされた属性と、それを含む領域の属性とに基づく有効属性の組を有する。１つの領域を複数の領域に含めることができるので、１つの領域が複数の有効属性の組を有する可能性がある。
パラメータ
・ｒｅｇｉｏｎ
［入力、領域ポート］属性を返すべき領域。
・ａｔｔｒｉｂｕｔｅｓ
［出力、領域属性を指すポインタ］指定された領域の属性。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｒｅｇｉｏｎが、システムに既知の領域ではない。
【０３２４】
【表１１】
0003570525.tif 000012
解説
関数ｒｅｇｉｏｎ＿ｏｂｊｅｃｔ＿ａｔｔａｃｈは、指定されたオフセットから始まるメモリ・オブジェクトを領域に関連付ける。領域と実際の記憶域の間の連係を最終的に確立するのは、この関数である。記憶域は、メモリ・オブジェクトの内容によって表現される。
一旦領域が付加されたならば、もう一度付加することは絶対にできない（ｒｅｇｉｏｎ＿ｏｂｊｅｃｔ＿ｄｅｔａｃｈを実行した場合であっても）という議論がある。その理由は、これによってメモリ・オブジェクトへのアクセスが制限され、「ランダム」なタスクがメモリ・オブジェクトのどの部分もマッピングできなくなるはずであるということである。これに対する反論は、現在は領域からメモリ・オブジェクトを得る方法がないので、付加（最初の１回を含む）は、いずれにせよ全メモリ・オブジェクトへのアクセス権を有するタスクでなければ行えないというものである。ある領域の付加と切離しを複数回行えるようにすることによって、１つの領域が、メモリ・オブジェクトへの「制御された」窓として働くことが可能になるはずである。その窓は、そのメモリ・オブジェクトについて知っている、何らかの「信頼される」エージェントによってのみ移動可能である。信頼されない実体は、リーフ領域へのアクセス権だけを有するはずである。
パラメータ
・ｒｅｇｉｏｎ
［入力、領域ポート］メモリ・オブジェクトを付加するリーフ領域。
・ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ
［入力、メモリ・オブジェクト・ポート］供給されたリーフ領域に付加されるメモリ・オブジェクト。
・ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｏｆｆｓｅｔ
［入力、ｖｍオフセット］供給されたリーフ領域によってマッピングされる、メモリ・オブジェクト内の開始オフセット。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｒｅｇｉｏｎが、システムに既知の領域ではない。このエラーは、ｒｅｇｉｏｎがリーフ領域でない場合にも発生する。
・ＢＡＤ＿ＯＦＦＳＥＴ
ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｏｆｆｓｅｔが、ｍｅｍｏｒｙ＿ｏｂｊｅｃｔのサイズより大きい。このエラーは、ｒｅｇｉｏｎ  ＋  ｍｅｍｏｒｙ＿ｏｂｊｅｃｔ＿ｏｆｆｓｅｔのサイズがｍｅｍｏｒｙ−ｏｂｊｅｃｔのサイズより大きい場合にも発生する。
【０３２５】
【表１２】
0003570525.tif 000013
解説
関数ｒｅｇｉｏｎ＿ｃｏｐｙは、ｆｒｏｍ＿ｒｅｇｉｏｎからｔｏ＿ｒｅｇｉｏｎへ情報をコピーする。コピーの規則は、ｆｒｏｍ＿ｒｅｇｉｏｎとｔｏ＿ｒｅｇｉｏｎの両方が、コピーの範囲に関してそれらを二重書きするメモリ・オブジェクトを有する必要がある、というものである。コピー範囲を二重書きするメモリ・オブジェクトが、単一のメモリ・オブジェクトである必要はない。二重書きされない「穴」が存在しないことだけが必要である。コピーは、ｒｅｇｉｏｎ＿ｃｏｐｙがリターンした時に、データのすべてがｔｏ＿ｒｅｇｉｏｎにコピー済になっているような形で実行される。ｆｒｏｍ＿ｒｅｇｉｏｎおよびｔｏ＿ｒｅｇｉｏｎを、コピーの実行を所望するタスクにマッピングする必要はない。
パラメータ
・ｆｒｏｍ＿ｒｅｇｉｏｎ
［入力、領域ポート］データのコピー元の領域。
・ｆｒｏｍ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔ
［入力、ｖｍオフセット］ｆｒｏｍ＿ｒｅｇｉｏｎ内の、コピーを開始する位置の開始オフセット。
・ｔｏ＿ｒｅｇｉｏｎ
［入力、領域ポート］データのコピー先の領域。
・ｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔ
［入力、ｖｍオフセット］ｔｏ＿ｒｅｇｉｏｎ内の、最初のデータを置く位置の開始オフセット。
・ｃｏｐｙ＿ａｍｏｕｎｔ
［入力、ｖｍサイズ］ｆｒｏｍ＿ｒｅｇｉｏｎからコピーしてｔｏ＿ｒｅｇｉｏｎに置くバイト数。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｆｒｏｍ＿ｒｅｇｉｏｎまたはｔｏ＿ｒｅｇｉｏｎが、システムに既知の領域ではない。
・ＢＡＤ＿ＯＦＦＳＥＴ
ｆｒｏｍ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔが、ｆｒｏｍ＿ｒｅｇｉｏｎのサイズより大きい。ｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔが、ｔｏ＿ｒｅｇｉｏｎのサイズより大きい。ｆｒｏｍ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔ  ＋  ｃｏｐｙ＿ａｍｏｕｎｔが、ｆｒｏｍ＿ｒｅｇｉｏｎのサイズより大きい。ｔｏ＿ｒｅｇｉｏｎ＿ｏｆｆｓｅｔ  ＋  ｃｏｐｙ＿ａｍｏｕｎｔが、ｔｏ＿ｒｅｇｉｏｎのサイズより大きい。
・ＮＯ＿ＤＡＴＡ
このコピーに含まれるｆｒｏｍ＿ｒｅｇｉｏｎまたはｔｏ＿ｒｅｇｉｏｎの一部が、データを有しない（すなわち、下層のメモリ・オブジェクトがない）場合に、このエラーが返される。
【０３２６】
【表１３】
0003570525.tif 000014
解説
関数ｒｅｇｉｏｎ＿ｇｅｔ＿ｐｈｙｓ＿ａｄｄｒｓは、ｒｅｇｉｏｎに含まれるページのすべての物理ページ・アドレスの配列を返す。関数ｒｅｇｉｏｎ＿ｇｅｔ＿ｐｈｙｓ＿ａｄｄｒｓが意味のある情報を返すためには、ｒｅｇｉｏｎの有効属性が、ＲＥＧＩＯＮ＿ＷＩＲＥ＿ＴＲＡＮＳＬＡＴＩＯＮが真である（すなわち、ｒｅｇｉｏｎがワイヤリングされ、その物理アドレスが固定されている）ような形にセットされていなければならない。そうでない場合には、エラーが返される。ｒｅｇｉｏｎ＿ｇｅｔ＿ｐｈｙｓ＿ａｄｄｒｓは、物理アドレスを得るために必要な場合には、ｒｅｇｉｏｎに含まれる領域のすべてを再帰的に検査することに留意されたい。
パラメータ
・ｒｅｇｉｏｎ
［入力、領域ポート］物理ページ・アドレスのリストが返される領域。
・ｐｈｙｓ＿ａｄｄｒ＿ｌｉｓｔ
［出力、物理アドレスの動的配列を指すポインタ］示された領域を表す物理ページのリスト。
・ｐｈｙｓ＿ａｄｄｒ＿ｌｉｓｔ＿ｃｏｕｎｔ
［入出力、スカラを指すポインタ］指定された領域に含まれる物理ページ数。
戻り値
・ＮＯＴ＿Ａ＿ＲＥＧＩＯＮ
ｒｅｇｉｏｎが、システムに既知の領域ではない。
・ＮＯＴ＿ＦＩＸＥＤ
ｒｅｇｉｏｎがワイヤリングされていないので、ページが固定された物理アドレスになく、したがって、物理アドレスのリストを返す意味がない。
【０３２７】
【表１４】
0003570525.tif 000015
解説
構造体ｒｅｇｉｏｎ＿ａｔｔｒ＿ｔには、関数ｒｅｇｉｏｎ＿ｇｅｔ＿ａｔｔｒｉｂｕｔｅｓ、ｒｅｇｉｏｎ＿ｓｅｔ＿ａｔｔｒｉｂｕｔｅｓおよびｒｅｇｉｏｎ＿ｓｅｔ＿ｐｒｉｖ＿ａｔｔｒｉｂｕｔｅｓによって１領域に対してセットでき、検索できる属性のすべてが含まれる。ｒｅｇｉｏｎ＿ａｔｔｒ＿ｔの各フィールドは、個別の属性を表す。各属性を、下で説明し、特権属性である場合の属性の意味と、その継承規則を解説する。
フィールド
・ａｃｃｅｓｓ
この属性は、その領域に対して許されるアクセス許可を示す。これは、非特権属性である。この属性の有効値は、外側領域に向かって伝播する。この属性の有効値は、外側領域からこの属性の有効値をとり、含まれる領域の属性との論理和関数を実行することによって決定される。
・ｃａｃｈｅ＿ａｔｔｒ
この属性は、その領域のキャッシュ属性を示す。キャッシュ属性は、どのハードウェア・キャッシュ特性であるべきかを示す。これは特権属性である。これは入出力ワイヤリング特権を必要とする。この属性の有効値は、内側領域に向かって伝播する。この属性の有効値は、特定のページの組に関する最小のキャッシュ可能性によって決定される。すなわち、有効値は、あるメモリ・オブジェクトの同一の区域をマッピングする領域のすべてによって決定される。
・ｄｉｓｃａｒｄａｂｌｅ
この属性は、その領域が破棄可能であることを示す。破棄可能とは、この領域に対して関数ｒｅｇｉｏｎ＿ｄｉｓｃａｒｄを発行できることを意味する。これは非特権属性である。この属性の有効値は、外側領域に向かって伝播する。この属性の有効値は、外側領域からこの属性の有効値をとり、含まれる領域の属性との論理和関数を実行することによって決定される。たとえば、外側領域が破棄可能であり、囲まれる領域がそうでない場合、外側領域に対してｒｅｇｉｏｎ＿ｄｉｓｃａｒｄを発行することはできない。
・ｅａｇｅｒ＿ｂａｃｋｉｎｇ
この属性は、メモリ・オブジェクトをリーフ領域に付加する時に補助記憶を割り振らなければならないことを示す。これは非特権属性である。この属性の有効値は、内側領域に向かって伝播する。すなわち、外側領域のｅａｇｅｒ＿ｂａｃｋｉｎｇがセットされている場合、それに含まれる領域のすべてが、ｅａｇｅｒ＿ｂａｃｋｉｎｇがセットされているかのように扱われる。
・ｐａｇｉｎｇ＿ｈｉｎｔ
この属性は、指示された領域に関するカーネル・ページングのアドバイスを与える。これは非特権属性である。この属性の有効値は、属性がセットされた時点で内側領域に伝播する。
・ｐｒｉｖｉｌｅｇｅｄ
この属性は、この領域に関する要求を満足するために、予約済みページ・プールからメモリを割り振ることができることを示す。これは、ホスト制御ポートを必要とする特権属性である。この属性の有効値は、この属性がセットされている外側領域によって含まれる内側領域に伝播する。
・ｐｈｙｓｉｃａｌｌｙ＿ｃｏｎｔｉｇｕｏｕｓ
この属性は、この領域に含まれるメモリが物理的に連続していなければならないことを示す。これは、入出力ワイヤリング制御ポートを必要とする特権属性である。この属性の有効値は、この属性がセットされている外側領域によって囲まれる内側領域に伝播する。
・ｓｕｐｅｒｖｉｓｏｒ
この属性は、セットされている時には領域がスーパーバイザ領域であり、そうでない時にはユーザ領域であることを示す。これは、ホスト特権ポートを必要とする特権属性である。この属性は、外側領域から内側領域へ伝播する。
・ｖｍ＿ｂｅｈａｖｉｏｒ
この属性は、指示された領域に関して期待されるアクセス・パターンのヒントをカーネルに与える。これは非特権属性である。この属性の有効値は、属性がセットされる時点で内側領域に伝播する。
・ｗｉｒｅ＿ａｔｔｒ
この属性は、この領域に関するページ可能性を示す。これは、入出力ワイヤリング制御ポートを必要とする特権属性である。この属性の有効値は、外側領域に含まれる内側領域に伝播する。
・ｉｎｈｅｒｉｔａｎｃｅ
この属性は、この領域に関する継承を示す。この属性は、プリミティブ領域動作によって使用されないが、領域関数の上に作成される高水準関数にとって役に立つ可能性のある情報を提供できる。
【０３３１】
【発明の効果】
単一のテンプレート領域を同時に複数のタスクにマッピングすることができ、各タスク内のテンプレート領域のマッピングではなく、１つのテンプレート領域に対して変更が行われるので、仮想記憶動作の共用がはるかに簡単に達成される。
【図面の簡単な説明】
【図１】ホスト多重プロセッサ１００のメモリ１０２内のマイクロカーネル・システム１１５の機能ブロック図である。
【図２】スレッドに関連する、クライアントから可視の構造を示す図である。
【図３】クライアントから可視のタスク構造を示す図である。
【図４】一連の送出権と単一の受取り権とを示す、通常のポートを示す図である。
【図５】ポート名前空間またはメッセージの通過に含まれる、一連のポート権を示す図である。
【図６】クライアントから可視の仮想メモリ構造を示す図である。
【図７】マイクロカーネル・アドレス空間内で形成された３つのテンプレート領域を示す図である。
【図８】テンプレート領域Ｒ０の属性を使用してマイクロカーネルによって形成された第１のタスクＴ（Ａ）を示す図である。
【図９】テンプレート領域Ｒ０の属性を使用してマイクロカーネルによって形成された第２のタスクＴ（Ｂ）を示す図である。
【図１０】２つのタスクへの１つのテンプレート領域のマッピングを示す図である。
【図１１】１つのタスクへの１つのテンプレート領域の２回のマッピングを示す図である。
【図１２】オーバーラップするテンプレート領域を示す図である。
【図１３】メモリ割振りとオーバーラップするテンプレート領域とを示す図である。
【図１４】テンプレート領域の縮合を示す図である。
【図１５】メモリ・オブジェクトのマッピングを示す図である。
【図１６】メモリ・オブジェクトの不正なマッピングを示す図である。
【図１７】仮想メモリ構成要素を示す図である。
【図１８】あるタスクのテンプレート領域を示す図である。
【図１９】異なるカーネル・インターフェース・ライブラリを有するタスクを示す図である。
【図２０】カーネル・タスクのテンプレート領域を示す図である。
【符号の説明】
１００  ホスト多重プロセッサ
１０２  メモリ
１０４  バス
１０６  補助記憶装置
１０８  入出力アダプタ
１１０  プロセッサＡ
１１２  プロセッサＢ
１１５  マイクロカーネル・システム
１２０  マイクロカーネル
１２２  プロセス間通信モジュール（ＩＰＣ）
１２４  仮想メモリ・モジュール
１２５  マシン依存コード
１２６  タスクおよびスレッド・モジュール
１２８  ホストおよびプロセッサ・セット
１３０  入出力サポートおよび割込み
１４０  パーソナリティ・ニュートラル・サービス（ＰＮＳ）
１４２  多重パーソナリティ・サポート
１４４  デフォルト・ページャ
１４６  デバイス・サポート
１５０  パーソナリティ・サーバ
１５２  主要パーソナリティ
【図１】
0003570525.tif 000016
【図２】
0003570525.tif 000017
【図３】
0003570525.tif 000018
【図４】
0003570525.tif 000019
【図５】
0003570525.tif 000020
【図６】
0003570525.tif 000021
【図７】
0003570525.tif 000022
【図８】
0003570525.tif 000023
【図９】
0003570525.tif 000024
【図１０】
0003570525.tif 000025
【図１１】
0003570525.tif 000026
【図１２】
0003570525.tif 000027
【図１３】
0003570525.tif 000028
【図１４】
0003570525.tif 000029
【図１５】
0003570525.tif 000030
【図１６】
0003570525.tif 000031
【図１７】
0003570525.tif 000032
【図１８】
0003570525.tif 000033
【図１９】
0003570525.tif 000034
【図２０】
0003570525.tif 000035