JP3570525B2 - マイクロカーネル・アーキテクチャ・データ処理システム及びそのメモリ管理方法、オペレーティング・システム・パーソナリティ・プログラムを走行させる方法、アプリケーション・プログラムを走行させる方法 - Google Patents

マイクロカーネル・アーキテクチャ・データ処理システム及びそのメモリ管理方法、オペレーティング・システム・パーソナリティ・プログラムを走行させる方法、アプリケーション・プログラムを走行させる方法 Download PDF

Info

Publication number
JP3570525B2
JP3570525B2 JP15423095A JP15423095A JP3570525B2 JP 3570525 B2 JP3570525 B2 JP 3570525B2 JP 15423095 A JP15423095 A JP 15423095A JP 15423095 A JP15423095 A JP 15423095A JP 3570525 B2 JP3570525 B2 JP 3570525B2
Authority
JP
Japan
Prior art keywords
memory
task
template
port
pointer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP15423095A
Other languages
English (en)
Other versions
JPH0816412A (ja
Inventor
ジェームス・マイケル・マジー
フリーマン・リー・ローソン・ザ=サード
ガイ・ジル・ソトマイヤー・ジュニア
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Publication of JPH0816412A publication Critical patent/JPH0816412A/ja
Application granted granted Critical
Publication of JP3570525B2 publication Critical patent/JP3570525B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • G06F12/1027Address translation using associative or pseudo-associative address translation means, e.g. translation look-aside buffer [TLB]
    • G06F12/1036Address translation using associative or pseudo-associative address translation means, e.g. translation look-aside buffer [TLB] for multiple virtual address spaces, e.g. segmentation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/10Address translation
    • G06F12/109Address translation for multiple virtual address spaces, e.g. segmentation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/14Protection against unauthorised use of memory or access to memory
    • G06F12/1416Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights
    • G06F12/145Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights the protection being virtual, e.g. for virtual blocks or segments before a translation mechanism
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/12Replacement control
    • G06F12/121Replacement control using replacement algorithms
    • G06F12/126Replacement control using replacement algorithms with special data handling, e.g. priority of data or instructions, handling errors or pinning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2211/00Indexing scheme relating to details of data-processing equipment not covered by groups G06F3/00 - G06F13/00
    • G06F2211/009Trust
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/65Details of virtual memory and virtual address translation
    • G06F2212/656Address space sharing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/65Details of virtual memory and virtual address translation
    • G06F2212/657Virtual address space management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Security & Cryptography (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Description

【0001】
【産業上の利用分野】
ここに開示される発明は、広義にはデータ処理システムに関し、具体的にはデータ処理システム用のオペレーティング・システムの改善に関する。
【0002】
【従来の技術】
オペレーティング・システムは、コンピュータ上で稼動する最も重要なソフトウェアである。汎用コンピュータのすべてが、他のプログラムを実行させるためのオペレーティング・システムを有する必要がある。通常、オペレーティング・システムは、キーボードからの入力の認識、表示画面への出力の送出、ディスク上のファイルやディレクトリの記録、ディスク駆動装置やプリンタなどの周辺装置の制御などの基本的なタスクを実行する。より複雑なシステムの場合、オペレーティング・システムは、より大きな責任と能力とを有する。これによって、同時に実行される異なるプログラムやユーザが、互いに干渉しないことが保証される。また、オペレーティング・システムは、通常はセキュリティの責任も有し、これによって、許可されていないユーザがそのシステムをアクセスできないことを保証する。
【0003】
オペレーティング・システムは、マルチユーザ・オペレーティング・システム、マルチプロセッサ・オペレーティング・システム、マルチタスク・オペレーティング・システムおよびリアルタイム・オペレーティング・システムとして分類することができる。マルチユーザ・オペレーティング・システムでは、複数のユーザが同時にプログラムを実行させることができる。一部のオペレーティング・システムは、同時に数百人から数千人のユーザを受け入れる。マルチプロセッシング・プログラムを用いると、単一のユーザが同時に複数のプログラムを実行させることができるようになる。実行されるプログラムのそれぞれを、プロセスと呼ぶ。ほとんどのマルチプロセッシング・システムは、複数のユーザをサポートする。マルチタスク・システムでは、単一のプロセスで複数のタスクを実行させることができる。「マルチタスク」と「マルチプロセッシング」にはわずかに異なる意味があるが、一般的な用語では、この2つが交換可能に使用されることがしばしばである。マルチタスクとは、同時に複数のタスクを実行する能力であり、1つのタスクが1つのプログラムである。マルチタスキングでは、1つの中央処理装置だけが使用されるが、この中央処理装置が、あるプログラムから別のプログラムへ非常にすばやく切り替えられるので、すべてのプログラムが同時に実行されているようにみえる。マルチタスキングには、プリエンプティブ(preemptive、先取り式)とコオペラティブ(cooperative、協調式)という2つの基本タイプがある。プリエンプティブ・マルチタスキングでは、オペレーティング・システムが、CPUタイム・スライスを各プログラムに分配する。コオペラティブ・マルチタスキングでは、各プログラムが、必要なだけいつまでもCPUを制御することができる。しかし、あるプログラムがCPUを使用していない場合、そのプログラムは、他のプログラムに一時的にCPUの使用を許可することができる。たとえば、OS/2(登録商標)とUNIX(登録商標)オペレーティング・システムは、プリエンプティブ・マルチタスキングを使用し、マッキントッシュ(Macintosh、登録商標)コンピュータ用のマルチファインダ(MultiFinder、登録商標)オペレーティング・システムは、コオペラティブ・マルチタスキングを使用する。マルチプロセッシングとは、コンピュータ・システムの、同時に複数のプロセスまたはプログラムをサポートする能力を指す。マルチプロセッシング・オペレーティング・システムでは、複数のプログラムを同時に走行させることができる。マルチプロセッシング・システムは、オペレーティング・システムが競合するプロセスに正当な形で資源を割り振らなければならないので、シングルプロセス・システムよりはるかに複雑である。リアルタイム・オペレーティング・システムは、入力に即座に応答する。DOSやUNIXなどの汎用オペレーティング・システムは、リアルタイムではない。
【0004】
オペレーティング・システムは、アプリケーション・プログラムが走行する基礎となるソフトウェア・プラットホームを提供する。アプリケーション・プログラムは、特定のオペレーティング・システムの上で走行するように特別に記述される必要がある。したがって、オペレーティング・システムの選択によって、実行可能なアプリケーションの大部分が決定される。IBM互換パーソナル・コンピュータの場合、オペレーティング・システムの例として、DOS、OS/2(登録商標)、AIX(登録商標)およびXENIX(登録商標)がある。
【0005】
ユーザは通常、1組のコマンドを介してオペレーティング・システムと対話する。たとえば、DOSオペレーティング・システムには、ファイルをコピーするためのCOPYコマンドやファイル名を変更するためのRENAMEコマンドなどのコマンドが含まれる。コマンドは、コマンド・プロセッサまたはコマンド・ライン・インタープリタと呼ばれるオペレーティング・システムの一部によって受け取られ、実行される。
【0006】
パーソナル・コンピュータ用には、CP/M(登録商標)、DOS、OS/2(登録商標)、UNIX(登録商標)、XENIX(登録商標)、AIX(登録商標)など、多数の異なるオペレーティング・システムが存在する。CP/Mは、小型コンピュータ用の最初のオペレーティング・システムの1つである。CP/Mは、当初は広い範囲のパーソナル・コンピュータで使用されたが、最終的にDOSにとってかわられた。DOSは、IBM互換パーソナル・コンピュータのすべてで走行する、シングル・ユーザ、シングル・タスクのオペレーティング・システムである。DOSの後継オペレーティング・システムであるOS/2は、インテル(Intel)社の80286以降のマイクロプロセッサを使用するIBM互換パーソナル・コンピュータ上で走行する、かなり強力なオペレーティング・システムである。OS/2は、全般的にDOSと互換であるが、たとえばマルチタスキングや仮想メモリのサポートなど、多くの追加機能を含む。UNIXとUNIXベースのAIXは、広範囲のパーソナル・コンピュータおよびワーク・ステーション上で走行する。UNIXとAIXは、ワーク・ステーション用の標準オペレーティング・システムとなっており、強力なマルチユーザ、マルチプロセッシング・オペレーティング・システムである。
【0007】
1981年にIBMパーソナル・コンピュータが米国で初めて公表された時、DOSオペレーティング・システムは、約10KBの記憶域を専有していた。それ以来、パーソナル・コンピュータは、はるかに複雑になり、はるかに大きなオペレーティング・システムが必要になった。たとえば現在、IBMパーソナル・コンピュータ用のOS/2オペレーティング・システムは、22MBもの記憶域を占める可能性がある。パーソナル・コンピュータは、時の流れに伴ってますます複雑かつ強力になるが、これらのシステムに関連する記憶装置にかなりの記憶ペナルティを課すことなしに継続的にオペレーティング・システムのサイズと複雑さを増大させることは、明らかに不可能である。
【0008】
オペレーティング・システムのサイズのこの増加速度は擁護できないので、1980年代にカーネギー・メロン(Carnegie Mellon)大学でMACHプロジェクトが行われた。この研究の目標は、新たに生まれる現代のコンピュータ・アーキテクチャをコンピュータ・プログラマが利用できるようにし、なおかつカーネル・オペレーティング・システムのサイズと機能の数を減らした、新しいオペレーティング・システムを開発することであった。カーネルとは、オペレーティング・システムのうちで、ハードウェア資源の割振りなどの基本機能を実行する部分である。MACHカーネルの場合、5つのプログラミング・アブストラクション(Programming abstraction)が、システムの基本構成要素として確立された。これらは、通常の複雑な動作をカーネルの外部で構築できるようにするための有用なシステムを作るために最小限必要なものとして選択された。カーネギー・メロンMACHカーネルは、リリース3.0でサイズを減らされ、MACHマイクロカーネルと呼ばれる完全に機能するオペレーティング・システムになった。MACHマイクロカーネルには、タスク、スレッド、ポート、メッセージおよびメモリ・オブジェクトというプリミティブがある。
【0009】
タスクとは、MACHマイクロカーネル内で2つの別々の構成要素に分割される従来のUNIXプロセスである。その第1の構成要素がタスクであり、これには、協働する実体のグループ用の資源のすべてが含まれる。あるタスクに含まれる資源の例が、仮想メモリと通信ポートである。タスクは、資源の受動的な集合であり、プロセッサ上では走行しない。
【0010】
UNIXプロセスの第2の構成要素がスレッドであり、これは、能動的な実行環境である。各タスクは、スレッドと呼ばれる1つまたは複数の同時に実行される計算をサポートできる。たとえば、マルチスレッド・プログラムでは、1つのスレッドを科学計算の計算に使用し、もう1つのスレッドをユーザ・インターフェースの監視に使用することができる。MACHタスクは、すべてが同時に走行する多数の実行スレッドを有することができる。MACHプログラミング・モデルの威力の多くが、1タスク内のすべてのスレッドがそのタスクの資源を共用するという事実に由来する。たとえば、これらのスレッドのすべてが、同一の仮想メモリ(VM)アドレス空間を有する。しかし、1タスク内の各スレッドは、それ自体の私有実行状態を有する。この状態は、汎用レジスタ、スタック・ポインタ、プログラム・カウンタ、フレーム・ポインタなどのレジスタの組からなる。
【0011】
ポートとは、スレッドがそれを介して互いに通信する通信チャネルである。ポートは資源であり、タスクによって所有される。スレッドは、タスクに属することによってポートへのアクセス権を得る。協働するプログラムは、あるタスクのスレッドに別のタスクのポートへのアクセス権を与えることができる。ポートの重要な特徴は、ポートの位置が透過的であるということである。この能力のおかげで、プログラムを修正せずにネットワークを介してサービスを分散することが簡単になる。
【0012】
メッセージは、異なるタスクのスレッドが互いに通信できるようにするのに使用される。メッセージには、所与のクラスまたは型のデータの集合が含まれる。このデータには、数や文字列などのプログラム固有データから、タスクから別のタスクへのポートの転送機能などのMACH関連データまでが含まれる。
【0013】
メモリ・オブジェクトとは、MACHマイクロカーネルの鍵となる特徴である、従来のオペレーティング・システム機能をユーザ・レベル・プログラムで実行する能力をサポートするアブストラクション(abstraction)である。たとえば、MACHマイクロカーネルは、ユーザ・レベル・プログラムで仮想メモリページング・ポリシーをサポートする。メモリ・オブジェクトは、この能力をサポートするためのアブストラクションである。
【0014】
これらの概念のすべてが、MACHマイクロカーネル・プログラミング・モデルの基礎であり、カーネル自体で使用される。カーネギー・メロン大学のMACHマイクロカーネルのこれらの概念および他の特徴は、ボイキン(Joseph Boykin)他著、”Programming Under MACH”, Addison Wessely Publishing Company, Incorporated、1993年に記載されている。
【0015】
UNIXパーソナリティをサポートするためのマイクロカーネルの使用に関する追加の議論は、アセッタ(Mike Accetta)他著の論文、”MACH: A New Kernel Foundation for UNIX Development”, Proceedings of the Summer 1986 USENIX Conference, Atlanta, Georgiaに記載されている。この話題に関するもう1つの技術論文が、ゴラブ(David Golub)他著、”UNIX as an Application Program”, Proceedings of the Summer 1990 USENIX Conference, Anaheim, Californiaである。
【0016】
現在のマイクロカーネル実施態様に関する問題の1つが、仮想記憶動作(memory operation)のすべてがタスクに基づくということである。仮想メモリ呼出しの多くが、必ずしも単一のタスクに制限されるものではないので、これは不適切な要件である。また、これによって、重大な機密漏れが導入される。あるタスクの代わりに別のタスクが仮想メモリサブシステムの一部を操作できるようにするためには、あるタスクの制御ポートを別のタスクに与えなければならない。あるタスクの制御ポートを与えられたならば、そのタスクは、第1のタスクのセキュリティを破ることができる。さらに、仮想メモリ機能のすべてをタスク上で動作させることによって、必ずしもタスク操作の一部である必要がない仮想メモリ呼出しのすべてに関して、タスク・インターフェースが過度に複雑になる。現在のマイクロカーネル用仮想メモリインターフェースのもう1つの問題は、それらの多くが、メモリの範囲に対して動作することである。タスクは、多くのメモリ範囲からなる場合があるので、このインターフェース定義には、複数のメモリ範囲に対する動作を自然に制限するものが存在しない。たとえば、予約されているメモリの範囲がある場合、予約済みの範囲とそれに隣接する未予約の範囲にまたがるメモリ割振りなどの動作を防止するための明白な制限はない。このため、メモリ内のオブジェクトの内容が破壊されるという望ましくない結果が生じる。
【0017】
【発明が解決しようとする課題】
したがって、本発明の目的は、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【0018】
本発明のもう1つの目的は、従来技術で可能であったものよりも仮想記憶動作が単純化されている、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【0019】
本発明のもう1つの目的は、タスクに関するセキュリティを強化された、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【0020】
本発明のもう1つの目的は、メモリ内で定義されたオブジェクトの破壊に対してより強く抵抗する、データ処理システム用の改良されたマイクロカーネル・アーキテクチャを提供することである。
【0021】
【課題を解決するための手段】
上記その他の目的、特徴および長所は、本明細書に記載の発明に従うマップ済み領域および未マップ領域を管理するための方法および装置によって達成される。
【0022】
本発明は、マイクロカーネル・アーキテクチャ用のメモリ管理方法およびマイクロカーネル構造自体である。本発明は、特殊オブジェクトとしてメモリ内でマイクロカーネルによって定義されるテンプレート領域を特徴とする。このメモリ管理方法では、マイクロカーネルが、データ処理システムのメモリにロードされた後に、メモリ内でタスク・コンテナの作成を開始できる。これは、まず、メモリ内の特殊オブジェクトとしてテンプレート領域を形成し、各テンプレート領域が、対応するタスク・コンテナを定義する属性の組を有するようにすることによって行われる。この属性によって、仮想メモリ、データ、通信ポートなど、あるタスクがそのスレッドによる使用のために使用可能な資源を指定することができる。その後、マイクロカーネルは、テンプレート領域によって指定された属性をタスクにマッピングすることによって、メモリ内でタスクを形成することができる。マイクロカーネルは、テンプレート領域に基づいてタスク用の仮想アドレス空間を定義する。その後、マイクロカーネルがテンプレート領域に対する仮想記憶動作を実行する時には、その仮想記憶動作の効果が、マッピング関係によってタスクに明示される。
【0023】
マイクロカーネルは、テンプレート領域からのサイズ属性と、タスクの開始仮想アドレスとを使用して、仮想アドレスでのタスクを表すデータ構造を定義する。マイクロカーネルは、テンプレート領域からの属性を使用して、タスクのスレッドが動作を行うことのできる、タスク用の仮想アドレス空間を定義する。また、マイクロカーネルは、タスクのタスク名を定義し、そのタスクが通信チャネルとして使用するためのメモリ内のポート名前空間を形成する。マイクロカーネルは、テンプレート領域からの属性の組を使用して、そのタスク用のポート名前空間に関するアクセス権を定義する。その後、マイクロカーネルは、タスクの仮想アドレス空間から命令を取り出すために、そのタスク用のメモリ内にスレッド・オブジェクトを形成することができる。
【0024】
本発明によれば、マイクロカーネルは、テンプレート領域を指す、タスク用の第1ポインタを定義する。テンプレート領域内には、PMAPと呼ばれるマッピング・テーブルを直接または間接に指す第2ポインタがある。PMAPによって、第2ポインタの仮想アドレス値が、そのタスクが使用するデータのページを含むメモリ内のキャッシュ・オブジェクトの物理アドレスに変換される。時々、あるタスクのデータ資源に変更を加えることが所望される。これは、テンプレート領域内の第2ポインタによって表される仮想アドレス値を変更することによって達成される。変更された第2ポインタは、PMAP内の異なる変換値を指すことができ、これによって、望みどおりの異なるページやキャッシュ・オブジェクトのアドレッシングがもたらされる。しかし、タスクの内容自体に変更を加える必要はない。キャッシュ・オブジェクト内のデータなどのタスク資源は、テンプレート領域内の第2ポインタを介してタスクによってアドレッシングされる。マイクロカーネルが、テンプレート領域から複数のタスクを定義している場合、テンプレート領域内の第2ポインタを変更することによって、そのテンプレート領域を指す複数のタスクから使用可能な資源の大域的な変更がもたらされる。タスクによってアドレッシングされるデータ・ページは、タスクのそれぞれの内容を変更するのではなく、テンプレート領域内の第2ポインタを1回だけ変更することによって変更できる。この形で、単一のテンプレート領域を複数のタスクに同時にマッピングすることができる。各タスクから、このテンプレート領域に対して行われた変更のすべてが見える。これによって、同一のテンプレート領域から生成されたタスクによる、特性の共用が可能になる。
【0025】
テンプレート領域は、すべての仮想記憶動作が向けられるオブジェクトである。かつてのMACHマイクロカーネルでは、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作を、その動作が実施されるテンプレート領域に向けることによって、仮想記憶動作の共用がはるかに簡単に達成される。というのは、各タスク内の領域のマッピングではなく、1つの領域に対して変更が行われるからである。
【0026】
【実施例】
パートA マイクロカーネル・システム
第1節 マイクロカーネルの原理
図1は、マイクロカーネル120とパーソナリティ・ニュートラル・サービス(PNS)140が、さまざまなハードウェア・プラットホーム上で複数のオペレーティング・システムのパーソナリティ・サーバ150を走行させる方法を示す、マイクロカーネル・システム115の機能ブロック図である。
【0027】
図1に示されたホスト多重プロセッサ100には、たとえばディスク駆動装置、読取り専用光学記憶装置、読み書き可能光学記憶装置または他の大量記憶装置とすることができる補助記憶装置106にバス104によって接続されたメモリ102が含まれる。やはりバス104に接続されているのが、キーボード、モニタ表示装置、遠隔通信アダプタ、ローカル・エリア・ネットワーク・アダプタ、モデム、マルチメディア・インターフェース装置または他の入出力装置に接続することができる入出力アダプタ108である。やはりバス104に接続されているのが、第1のプロセッサA 110と第2のプロセッサB 112である。図1に示された例は、2つの単一プロセッサであるプロセッサA 110とプロセッサB 112が共通のメモリ102アドレス空間を共用する対称多重プロセッサ構成である。単一プロセッサまたは多重プロセッサの他の構成を、同等に適した例として示すことができる。プロセッサは、たとえばインテル社の386CPU(登録商標)、インテル社の486CPU(登録商標)、ペンティアム(Pentium、登録商標)プロセッサ、パワーPC(PowerPC、登録商標)プロセッサまたは他の単一プロセッサ装置とすることができる。
【0028】
メモリ102には、マイクロカーネル・システム115が記憶され、このマイクロカーネル・システム115には、マイクロカーネル120、パーソナリティ・ニュートラル・サービス140およびパーソナリティ・サーバ150が含まれる。マイクロカーネル・システム115は、メモリ102に記憶されたアプリケーション・プログラム180のためのオペレーティング・システムとして働く。
【0029】
本発明の1目的は、UNIXやOS/2などの従来のオペレーティング・システムと同様に振る舞うオペレーティング・システムを提供することである。言い換えると、このオペレーティング・システムは、OS/2やUNIXまたは他の従来のオペレーティング・システムのパーソナリティを有する。
【0030】
マイクロカーネル120には、ホスト多重プロセッサ100の最高優先状態で走行する、この計算機の基本動作を制御するシステム・ソフトウェアの小さなメッセージ受渡し核が含まれる。マイクロカーネル・システム115には、マイクロカーネル120と、パーソナリティ・ニュートラル・サービス140を提供するサービスおよびデバイス・ドライバの組とが含まれる。その名が示すように、パーソナリティ・ニュートラル・サービスとデバイス・ドライバは、UNIXやOS/2などのパーソナリティに依存しない。これらは、マイクロカーネル120に依存し、また、互いに依存する。パーソナリティ・サーバ150は、マイクロカーネル120のメッセージ渡しサービスを使用して、パーソナリティ・ニュートラル・サービス140と通信する。たとえば、UNIX、OS/2または他のパーソナリティ・サーバは、パーソナリティ・ニュートラル・ディスク・ドライバにメッセージを送り、そのディスクから1ブロックのデータを読み取るよう要求することができる。このディスク・ドライバは、そのブロックを読み取り、それをメッセージに入れて返す。メッセージ・システムは、ポインタ操作によって大量のデータをすばやく転送できるように最適化されており、データ自体はコピーされない。
【0031】
そのサイズと、標準的なプログラミング・サービスおよび特徴をアプリケーション・プログラムとしてサポートする能力のおかげで、マイクロカーネル120は、標準的なオペレーティング・システムより単純である。マイクロカーネル・システム115は、さまざまな形で構成されるモジュラー片に分解され、小さな片にモジュラー片を追加することによってより大きなシステムを作成できるようになっている。たとえば、各パーソナリティ・ニュートラル・サービス140は、論理的に分離されており、さまざまな形で構成することができる。各サーバは、アプリケーション・プログラムとして走行し、アプリケーション・デバッガを使用してデバッグすることができる。各サーバは、別々のタスク内で走行し、サーバのエラーは、そのタスクの中に閉じこめられる。
【0032】
図1には、プロセス間通信モジュール(IPC)122と、仮想メモリモジュール124と、タスクおよびスレッド・モジュール126と、ホストおよびプロセッサ・セット128と、入出力サポートおよび割込み130と、マシン依存コード125とを含むマイクロカーネル120が示されている。
【0033】
図1に示されたパーソナリティ・ニュートラル・サービス140には、マスタ・サーバ、初期設定および命名を含む多重パーソナリティ・サポート142が含まれる。パーソナリティ・ニュートラル・サービスには、デフォルト・ページャ144も含まれる。パーソナリティ・ニュートラル・サービスには、多重パーソナリティ・サポートとデバイス・ドライバを含むデバイス・サポート146も含まれる。パーソナリティ・ニュートラル・サービスには、ファイル・サーバ、ネットワーク・サービス、データベース・エンジンおよびセキュリティを含む他のパーソナリティ・ニュートラル・プロダクト148も含まれる。
【0034】
パーソナリティ・サーバ150は、たとえば主要パーソナリティ152であり、これは、たとえばUNIXパーソナリティとすることができる。主要パーソナリティには、UNIXサーバになるはずの主要パーソナリティ・サーバ154と、UNIX主要パーソナリティをサポートするはずの他の主要パーソナリティ・サービス155が含まれる。代替パーソナリティ156は、たとえばOS/2とすることができる。代替パーソナリティ156には、OS/2パーソナリティの特徴を表すはずの代替パーソナリティ・サーバ158と、OS/2用の他の代替パーソナリティ・サービス159が含まれる。
【0035】
図1に示された、UNIX主要パーソナリティの例に関連する主要パーソナリティ・アプリケーション182は、UNIXオペレーティング・システム・パーソナリティである主要パーソナリティ152の上で走行するはずのUNIXタイプのアプリケーションである。図1に示された代替パーソナリティ・アプリケーション186は、OS/2代替パーソナリティ・オペレーティング・システムである代替パーソナリティ156の上で走行するOS/2アプリケーションである。
【0036】
図1には、マイクロカーネル・システム115の実装が、プロセッサ・タイプからプロセッサ・タイプへ完全に可搬であるコードと、実行中の特定の計算機のプロセッサのタイプに依存するコードに注意深く分離されていることが示されている。また、装置に依存するコードはデバイス・ドライバに分離されている。しかし、デバイス・ドライバのコードは、装置依存ではあるが、必ずしもプロセッサ・アーキテクチャに依存するとは限らない。1タスクあたり複数のスレッドを使用することによって、特定の計算機が多重プロセッサであることを必要とせずに多重プロセッサの使用を可能にするアプリケーション環境がもたらされる。単一プロセッサ上では、異なるスレッドは異なる時刻に走行する。多重プロセッサのために必要なサポートのすべてが、小さく単純なマイクロカーネル120に集中している。
【0037】
この節では、マイクロカーネル・システム115の構造の概観を提供する。後の節で、この構造の構成要素のそれぞれを詳細に説明し、マイクロカーネル・システム115のサービスを使用する新しいプログラムを作るのに必要な技術を説明する。
【0038】
マイクロカーネル・システム115は、オペレーティング・システムのための新しい基礎である。これは、次の特徴を有するオペレーティング・システム開発用の理解しやすい環境を提供する。
・多重パーソナリティのサポート
・拡張可能なメモリ管理
・プロセス間通信
・マルチスレッド
・マルチプロセッシング
【0039】
マイクロカーネル・システム115は、純粋カーネルとして実装されたカーネル・サービスの簡潔な組と、ユーザ・レベル・サーバの組として実装されるオペレーティング・システム・パーソナリティを作るための拡張サービスの組とを提供する。
【0040】
マイクロカーネル・システム115の目標には、下記が含まれる。
・複数のオペレーティング・システム・パーソナリティが互いに協調して働けるようにすること
・デバイス・ドライバやファイル・システムなどの低水準システム要素のための共通プログラミングを提供すること
・オペレーティング・システムとユーザ・アプリケーションの両方で並列性を利用すること
・柔軟なメモリ共用を有する、大きく、潜在的に疎なアドレス空間をサポートすること
・透過的なネットワーク資源アクセスを可能にすること
・OS/2やUNIXなどの既存のソフトウェア環境と互換であること
・可搬であること(32ビット・プラットホームと64ビット・プラットホームに対して)
【0041】
マイクロカーネル・システム115は、下記の概念に基づく。
・多くの従来のオペレーティング・システム機能(たとえば、ファイル・システムやネットワークのアクセス)を実行するユーザ・モード・タスク
・オペレーティング・システムを作成するためのユーザ・レベル実行時サービスの基本セット
・単純で拡張可能な通信カーネル
・オブジェクト参照としての通信チャネルを有するオブジェクト基礎
・同期式および非同期式のプロセス間通信を使用する、クライアント/サーバ・プログラミング・モデル
【0042】
マイクロカーネル・システム115の基礎は、単純で拡張可能な通信カーネルを提供することである。マイクロカーネル・システム115の目的は、ユーザ空間またはカーネル空間のいずれかでの、最小量のカーネル固有機能を用いる、柔軟なサービスの構成を可能にすることである。このカーネルは、タスク対タスク通信の他に、下記を含む他のサポートを提供しなければならない。
・制御点の管理(スレッド)
・資源割当て(タスク)
・タスク用アドレス空間のサポート
・物理メモリ、プロセッサ、割込み、DMAチャネル、クロックなどの物理資源の管理
【0043】
ユーザ・モード・タスクは、資源の使用に関するポリシーを実施する。カーネルは、このポリシーを実行するための機構を提供するにすぎない。論理的にカーネルの上にあるのが、パーソナリティ・ニュートラル・サービス140層である。パーソナリティ・ニュートラル・サービスは、C実行時環境を提供する。これには、文字列関数などの基本構造と、下記を含むサーバの組が含まれる。
・名前サーバ クライアントがサーバを見つけられるようにする
・マスタ・サーバ プログラムのロードと開始を可能にする
【0044】
カーネル・アブストラクション(Kernel Abstractions)
マイクロカーネル・システム115の目標の1つは、カーネル自体によって提供されるアブストラクションを最小にすることであるが、これは、これらのアブストラクションに関連するセマンティックスにおける最小化ではない。提供されるアブストラクションのそれぞれが、それに関連するセマンティックスの組と、他のアブストラクションとの相互作用の複雑な組を有する。このため、鍵となる発想の識別が困難になる可能性がある。主なカーネル・アブストラクションは、次の通りである。
・タスク 資源割振りの単位であり、大きなアクセス空間とポート権を有する
・スレッド CPU利用の単位であり、軽量(低オーバーヘッド)である
・ポート 通信チャネルであり、送出/受取りの能力または権利を介してのみアクセス可能である
・メッセージ データ・オブジェクトの集合
・メモリ・オブジェクト メモリ管理の内部単位
(タスク、スレッド、ポート、メッセージおよびメモリ・オブジェクトの概念の詳細な説明については、第2節「アーキテクチャ・モデル」を参照されたい)
【0045】
タスクとスレッド
マイクロカーネル・システム115は、従来のプロセスという概念は提供しない。というのは、オペレーティング・システム環境のすべてが、プロセスに関するかなりのセマンティックス(ユーザID、シグナル状態など)を有するからであり、これらの拡張されたセマンティックスを理解もしくは提供することは、マイクロカーネルの目的ではないからである。
【0046】
多くのシステムでは、プロセスが制御の実行点と同等とみなされる。一部のシステムはそうではない。
【0047】
マイクロカーネル120は、オペレーティング・システム環境のプロセスとは別に、複数の制御点をサポートする。マイクロカーネルは、次の2つの概念を提供する。
・タスク
・スレッド
(タスクおよびスレッドという概念の詳細な説明については、第2節「アーキテクチャ・モデル」を参照されたい)
【0048】
メモリ管理
カーネルは、多少のメモリ管理を提供する。メモリは、タスクに関連付けられる。メモリ・オブジェクトは、タスクがメモリ管理に対する制御を得るのに利用する手段である。マイクロカーネル・システム115は、大きな、潜在的に疎な仮想アドレス空間をサポートする機構を提供する。各タスクは、関連アドレス・マップを有し、この関連アドレス・マップが、カーネルによって維持され、タスクのアドレス空間内の仮想アドレスから物理アドレスへの変換を制御する。仮想メモリ・システムの場合と同様に、所与のタスクの全アドレス空間の内容が、同一の時刻に物理メモリ内に完全に常駐していなくてもよく、タスクの仮想アドレス空間のためのキャッシュとして物理メモリを使用するための機構が存在しなければならない。従来の仮想メモリ設計と異なり、マイクロカーネル・システム115は、キャッシュ動作自体のすべてを実施するわけではない。マイクロカーネル・システムは、これらの機構に関与する能力をユーザ・モード・タスクに与える。パーソナリティ・ニュートラル・サービスには、ユーザ・タスクと、メモリに関するページング・サービスを提供するデフォルト・ページャ144が含まれる。
【0049】
マイクロカーネル・システム115内の他の資源と異なり、仮想メモリは、ポートを使用した参照はされない。メモリは、特定のタスクのアドレス空間内の指標として仮想アドレスを使用することだけによって参照できる。あるタスクのアドレス空間を定義するメモリと関連アドレス・マップは、他のタスクと部分的に共用することができる。タスクは、そのアドレス空間内で新しいメモリ範囲を割り振り、メモリ範囲の割振りを解除し、メモリ範囲に対する保護を変更することができる。タスクは、範囲に対する継承特性を指定することもできる。新タスクは、既存タスクを基礎として指定し、これから新タスク用のアドレス空間を構築することによって作成される。既存タスクのメモリの範囲のそれぞれの継承属性によって、新タスクがその範囲を定義されるかどうかと、その範囲が仮想的にコピーされるか既存タスクと共用されるかどうかが決定される。メモリに関する仮想コピー動作のほとんどは、コピー・オン・ライト最適化を介して達成される。コピー・オン・ライト最適化は、保護された共用によって達成される。2つのタスクは、コピーされるメモリを共用するが、読取り専用のアクセス権を有する。どちらかのタスクがその範囲の一部を修正しようと試みる時には、その部分がその時点でコピーされる。このメモリ・コピーの遅延評価は、マイクロカーネル・システム115によって実行される重要な性能最適化であり、システムの通信/メモリ原理にとって重要である。
【0050】
メモリの所与の領域は、メモリ・オブジェクトによって二重書き(バッキングされる。メモリ・マネージャ( manager )のタスクは、メモリにキャッシュされている間のページの組のイメージ(メモリ領域の物理メモリ内容)とキャッシュされていない時のページのその組のイメージ(アブストラクト・メモリ・オブジェクト(abstract memory object))の間の関係を支配するポリシーを提供する。パーソナリティ・ニュートラル・サービスは、当初は0で満たされ、システム・ページング空間に対してページングされる基本的な非持続性メモリ・オブジェクトを提供するデフォルト・メモリ・マネジャまたはデフォルト・ページャ144を有する。
【0051】
タスク対タスク通信
マイクロカーネル・システム115は、通信チャネルを介して送られるメッセージを介して他のタスク(サーバ)に要求を行うことによってタスク(クライアント)がサービスをアクセスする、クライアント/サーバ・システム構造を使用する。マイクロカーネル120は、それ自体ではごく限られた数のサービスしか提供しない(たとえば、ファイル・サービスは提供しない)ので、マイクロカーネル120のタスクは、要求されたサービスを提供する他の多くのタスクと通信しなければならない。プロセス間通信(IPC)機構の通信チャネルを、ポートと呼ぶ(ポートの詳細な説明については、第2節「アーキテクチャ・モデル」を参照されたい)。メッセージは、データ、メモリ領域およびポート権の集合である。ポート権とは、その権利を保持するタスクがポートに命名するのに用いる名前である。タスクは、適切なポート権を保持する場合に限ってポートを操作できる。1つのタスクだけが、あるポートの受取り権を保持することができる。このタスクは、そのポート待ち行列からメッセージを受け取る(読み取る)ことを許可される。複数のタスクが、そのポートへの送出権を保持することができ、これによって、その待ち行列にメッセージを送る(書き込む)ことが可能になる。タスクは、データ要素の組を含むデータ構造を作り、その後、送出権を保持するポートに対してメッセージ送出動作を実行することによって、別のタスクと通信する。後程、そのポートの受取り権を保持するタスクが、メッセージ受取り動作を実行する。
注意:このメッセージ転送は、非同期動作である。メッセージは、受取り側タスクに論理的にコピーされる(おそらくはコピー・オン・ライト最適化を用いて)。受取り側タスク内の複数のスレッドが、所与のポートからメッセージを受け取ろうと試みている可能性があるが、どのメッセージであれ、所与のメッセージを受け取るのは1つのスレッドだけである。
【0052】
第2節 アーキテクチャ・モデル
マイクロカーネル・システム115は、その主な責任として、フレームワーク内で命令を実行する制御点の提供を有する。これらの制御点を、スレッドと呼ぶ。スレッドは、仮想環境で実行される。カーネルが提供する仮想環境には、ユーザ空間パーソナリティ・ニュートラル・サービスと、カーネルによって提供されるエミュレートされる命令(システム・トラップ)とによって増補される、ユーザ空間をアクセスできるハードウェア命令のすべてを実行する仮想プロセッサが含まれる。この仮想プロセッサは、仮想化されたレジスタの組と、その計算機の物理メモリと同様に応答する仮想メモリの一部をアクセスする。他のハードウェア資源のすべては、メモリ・アクセスとエミュレートされる命令の特殊な組合せを介さなければアクセスできない。カーネルによって提供される資源は、すべてが仮想化されることに留意されたい。この節では、スレッドから見える仮想環境の最高水準の要素を説明する。
【0053】
パーソナリティ・ニュートラル・サービスの要素
マイクロカーネル・システム115のパーソナリティ・ニュートラル・サービス140部分は、その下層のマイクロカーネル120上に作られたサービスからなる。これによって、カーネル自体が依存するいくつかの機能ならびに、プログラムを構成するためのユーザ・レベル・サービスの基本セットがもたらされる。これらのプログラムは、複数のオペレーティング・システム・パーソナリティ・クライアントからの要求をサービスすることができ、オペレーティング・システム・パーソナリティ自体を構成するのに使用される。さらに、標準Cでパーソナリティ・ニュートラル・サービス・プログラムを構成するためのANSI(American National Standards Institute、米国規格協会)のC実行時環境と、POSIX標準規格から採用された定義を有するいくつかの補足機能がある。パーソナリティ・ニュートラル・サービス自体を定義するライブラリのほかに、マイクロカーネル固有の部分であるパーソナリティ・ニュートラル・サービス内に存在する多数のライブラリがある。これらのライブラリは、マイクロカーネルがエクスポートするインターフェースと、マイクロカーネル・システム115のプロセス間通信機能と共に使用されるメッセージ・インターフェース・ジェネレータ(MIG)のためのサポート・ロジックを表す。
【0054】
パーソナリティ・ニュートラル・サービス環境ライブラリの構造は、各サービスの実装の詳細を呼出し側から隠蔽するようになっている。C実行時ライブラリのうちの1つなど、ライブラリの一部では、呼出し側のアドレス空間にロードされる局所ルーチンとしてその関数(機能)のすべてが実装され、それ以外のライブラリは、マイクロカーネルのIPC(プロセス間通信)システムを呼び出してメッセージをサーバに送るスタブからなる。このアーキテクチャによって、関数の柔軟な実装が可能になる。すなわち、サービスを使用するプログラムのソースに影響せずに、サーバを他のサーバによって置換することができ、サービスを組み合わせて単一のタスクにすることができる。パーソナリティ・ニュートラル・サービス環境の鍵となる要素は、それが完全なオペレーティング・システムを構成しないことである。そうではなくて、パーソナリティ・ニュートラル・サービスはパーソナリティの存在に依存する。システム始動中に最初にロードされる主要パーソナリティ152は、そのシステム上のユーザ・インターフェースを提供し、そのクライアントとパーソナリティ・ニュートラル・サービスの要素にサービスを提供するオペレーティング・システム・パーソナリティである。したがって、主要パーソナリティは、「最後の手段」のサーバである。主要パーソナリティは、パーソナリティ・ニュートラル・サービス・ライブラリによって定義されるが別のサーバによって実施されないサービスのすべてを実施する。
【0055】
マイクロカーネル120も、パーソナリティ・ニュートラル・サービスのいくつかの要素に依存する。マイクロカーネルがパーソナリティ・ニュートラル・サーバ(Personality Neutral Server)にメッセージを送って内部カーネル動作を完了する場合がある。たとえば、ページ不在を解決する際に、マイクロカーネル120は、デフォルト・ページャ144にメッセージを送ってよい。その場合、デフォルト・ページャ144は、カーネルが必要とするページをハード・ディスクから読み込む。ページ不在は、通常はユーザ・タスクの代わりに解決されるが、この場合のカーネルは、メッセージの送出側である。
【0056】
実行時
パーソナリティ・ニュートラル・サービス実行時は、この環境内で実行中のプログラムのための標準Cプログラミング環境をサポートするのに使用されるANSI CおよびPOSIXライブラリの組を提供する。この機能には、通常のC言語構造体が含まれる。どのシステムとも同じく、マイクロカーネル・システム115は、その主な責任として、フレームワーク内で命令を実行する制御点の提供を有する。マイクロカーネル120では、制御点をスレッドと呼ぶ。スレッドは、仮想環境で実行される。マイクロカーネル120が提供する仮想環境は、カーネルによって提供されるエミュレートされた(システム・トラップ)命令によって増補される、ユーザ空間をアクセスできるハードウェア命令のすべてを実行する仮想プロセッサからなる。この仮想プロセッサは、仮想化されたレジスタの組と、その計算機の物理メモリと同様に応答する一部の仮想メモリをアクセスする。他のハードウェア資源のすべては、メモリ・アクセスとエミュレートされる命令の特殊な組合せを介さなければアクセスできない。マイクロカーネルが提供する資源は、すべてが仮想化されることに留意されたい。この節では、マイクロカーネル・スレッドから見える仮想環境の最高水準要素を説明する。
【0057】
カーネルの要素
マイクロカーネル120は、下のカーネル要素のリストに記載された要素からなる環境を提供する。
【0058】
スレッド
実行制御点。スレッドは軽量の実体である。あるスレッドに関係する状態のほとんどは、それを含むタスクに関連する。
【0059】
タスク
ポート名前空間、仮想アドレス空間およびスレッドの組の形式で資源への参照を保持するコンテナ。
【0060】
セキュリティ・トークン
アクセス妥当性検査を実行するサーバにタスクから渡されるセキュリティ特徴。
【0061】
ポート
タスク間の単一方向通信チャネル。
【0062】
ポート・セット
メッセージ受取り時に単一の単位として扱うことができるポートの組。
【0063】
ポート権
ポートをアクセスするための具体的な権利を許可する。
【0064】
ポート名前空間
特定のポート権に命名するポート名の指標付きの集合。
【0065】
メッセージ
2つのタスクの間で渡される、データ、メモリ領域およびポート権の集合。
【0066】
メッセージ待ち行列
単一のポートに関連するメッセージの待ち行列。
【0067】
仮想アドレス空間
1タスク内のスレッドによって参照できる、まばらなメモリ・ページの指標付きの組。ページの範囲に、カーネルおよび外部メモリ・マネージャによって実施される機構を介して、任意の属性とセマンティックスを関連付けることができる。
【0068】
アブストラクト・メモリ・オブジェクト(Abstract Memory Object)
このオブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・オブジェクト。このオブジェクトを実装するタスクを、メモリ・マネージャと呼ぶ。アブストラクト・メモリ・オブジェクト・ポートは、カーネルがメモリ・マネージャの処置を要求するのに使用するポートである。
【0069】
メモリ・オブジェクト・レプリゼンタティブ(memory object representative)メモリ・マネージャによってメモリ・オブジェクトのクライアントに供給されるメモリ・オブジェクトのアブストラクト表現。代理は、関連するアブストラクト・メモリ・オブジェクトを命名し、クライアントに許可される潜在的なアクセス・モードを制限する。
【0070】
メモリ・キャッシュ・オブジェクト
アブストラクト・メモリ・オブジェクトによって二重書きされる常駐状態のメモリ範囲を含むカーネル・オブジェクト。メモリ・マネージャがクライアントの可視メモリ・イメージを操作するのは、このオブジェクトを介してである。
【0071】
プロセッサ
スレッドを実行する能力を有する物理プロセッサ。
【0072】
プロセッサ・セット
それぞれがプロセッサ・セットに割り当てられたスレッドを実行するのに使用可能なプロセッサの組。
【0073】
ホスト
全体としての多重プロセッサ。
【0074】
クロック
時間の経過の表現。一定の周波数で増分される時刻値。
【0075】
これらの要素の多くが、スレッドによって直接操作できる、カーネルによって実装される資源である。これらの要素のそれぞれを、以下の段落で詳細に説明する。しかし、これらの一部の定義は、他の定義に依存するので、完全な説明を理解できるようにするために、鍵となる概念の一部を単純化した形で述べる。
【0076】
スレッド
スレッドは、軽量の実体である。これは、作成のコストが低く、動作に必要なオーバーヘッドが少ない。スレッドは、ほんの少しの状態しか持たない(ほとんどはそのレジスタの状態である)。スレッドを所有するタスクが、資源管理の責任を負う。多重プロセッサ上では、1タスク内の複数のスレッドを並列に実行することができる。並列性が目標でない時であっても、複数のスレッドには長所がある。というのは、各スレッドが、単一のスレッドで複数のサービスを提供しようとする非同期プログラミングではなく、同期式プログラミング・スタイルを使用できるからである。スレッドには、下記の特徴が含まれる。
1.タスクの制御フローまたは命令実行のストリームの1点
2.それを含むタスクの要素のすべてに対するアクセス権
3.同一のタスク内のスレッドも含む他のスレッドとの並列実行
4.低オーバーヘッドのための最小限の状態
【0077】
スレッドは、基本的な計算実体である。スレッドは、その仮想アドレス空間を定義する1つのタスクだけに属する。アドレス空間の構造に影響を及ぼしたり、アドレス空間以外の資源を参照するためには、スレッドが、特殊なトラップ命令を実行しなければならない。この命令が、カーネルに、スレッドの代わりに動作を実行させたり、スレッドの代わりにエージェントにメッセージを送らせる。これらのトラップは、そのスレッドを含むタスクに関連する資源を操作する。カーネルに対して要求を行って、これらの実体を操作する、すなわち、実体の作成、削除、状態の変更を行うことができる。カーネルは、資源(上にリストしたものなど)とサービスを提供するマネージャである。タスクは、サービスを提供することもでき、アブストラクト資源を実装する。カーネルは、サーバ・タスク(実際にはその中で実行中の1スレッド)がサービスを提供することをクライアント・タスクが要求できるようにする通信方法を提供する。この場合、タスクは二重のIDを有する。1つは、その資源マネージャがカーネル内で実行される、カーネルによって管理される資源のIDである。もう1つは、資源マネージャがタスク自体である資源の供給側のIDである。
【0078】
スレッドは、下記の状態を有する。
1.その機械状態(レジスタなど)。これは、スレッドの実行に伴って変化し、カーネル・スレッド・ポートを保持するものによって変更される可能性もある。
2.スレッド固有のポート権の小さな組。これによって、そのスレッドのカーネル・ポートと、そのスレッドの代わりに例外メッセージを送るのに使用されるポートが識別される。
3.中断カウント。スレッドが命令を実行しようとしていない場合には0ではない。
4.資源スケジューリング・パラメータ。
【0079】
スレッドは、通常の形で命令を実行することによって動作する。さまざまな特殊命令をカーネルがトラップして、スレッドの代わりに動作を実行する。これらのカーネル・トラップのうちで最も重要なのが、mach_msg_trapである。このトラップを用いると、スレッドがカーネルや他のサーバにメッセージを送って、資源に対する動作を行えるようになる。このトラップは、直接に呼び出されることはない。これは、ライブラリ・ルーチンmach_msgを介して呼び出される。スレッドの実行中に発生する、「浮動小数点オーバーフロー」や「ページ不在」などの例外状態は、ポートにメッセージを送ることによって処理される。使用されるポートは、その状態の性質に依存する。例外状態の結果は、スレッドの状態をセットするか、例外メッセージに応答するか、この両方を行うことによって決定される。下記の動作をスレッド上で実行できる。
・作成と破壊
・中断と再開始(中断カウントの操作)
・機械状態の操作
・特殊ポート(例外ポートなど)の操作
・資源(スケジューリング)の制御
【0080】
タスク
タスクは、システム資源の集合である。これらの資源は、アドレス空間を除いて、ポートによって参照される。これらの資源は、ポートに対する権利が分配されるならば、他のタスクと共用できる。
【0081】
タスクは、機械アドレスによって参照される、大きく潜在的に疎なアドレス空間を提供する。この空間の各部は、継承または外部メモリ管理を介して共用できる。注意:タスク自体は動作しない。タスクには、命令を実行するスレッドが含まれる。「タスクYがXを行う」と言う時があるが、これは、「タスクYに含まれるスレッドがXを行う」という意味である。タスクは、コストの高い実体である。1タスク内のスレッドのすべてが、あらゆるものを共用する。2つのタスクは、明示的な処置がない限り何も共用しない。ただし、この処置はほとんどの場合に単純である。ポート受取り権などの一部の資源は、2つのタスクの間で共用することができない。タスクは、スレッドの組を保持するコンテナとみなすことができる。タスクには、それに含まれるスレッドに適用されるデフォルト値が含まれる。最も重要なことに、タスクには、それに含まれるスレッドが実行を必要とする要素、すなわち、ポート名前空間と仮想アドレス空間が含まれる。
【0082】
タスクに関連する状態は次の通りである。
・含まれるスレッドの組
・関連する仮想アドレス空間
・ポート権の組に命名する関連するポート名前空間と、関連するポート通知要求の組
・タスクからメッセージと共に送出されるセキュリティ・トークン
・タスクのカーネル・ポートを識別するタスク固有ポートの小さな組、含まれるスレッドの例外処理に使用するためのデフォルト・ポート、および他のサービスに命名するためのブートストラップ・ポート
・スレッドが命令を実行しようとしていない場合には非0の中断カウント
・スレッド用のデフォルト・スケジューリング・パラメータ
・統計的PCサンプルを含むさまざまな統計
【0083】
タスクは、新タスクが作成されるホストを指定し、アドレス空間のさまざまな部分を継承によって供給できるプロトタイプ・タスクを指定することによって作成される。
【0084】
1タスク上で、次の動作を実行できる。
・作成と破壊
・セキュリティ・トークンのセット
・中断と再開始
・特殊ポートの操作
・含まれるスレッドの操作
・スケジューリング・パラメータの操作
【0085】
セキュリティ・ポート
どのタスクにも、セキュリティ・トークンすなわち、カーネルの視点からは不透明な識別子によってタグが付けられる。これによって、そのタスクのIDと他のセキュリティ属性が符号化される。このセキュリティ・トークンは、そのタスクが送るすべてのメッセージに暗黙値として含められる。信頼されるサーバは、この送られたトークンを送出側のIDの表示として使用して、アクセス調停決定を行う際に使用することができる。
【0086】
タスクは、その親からセキュリティ・トークンを継承する。このトークンは、IDの模造不能な表示として使用されるので、このトークンを変更するためには特権が必要である。この特権は、ホスト・セキュリティ・ポートを提示することによって示される。
【0087】
ある予約された値が、カーネルのIDを示す。カーネルからのメッセージは、例外メッセージを除いてすべてがカーネルIDを含む。例外メッセージには、例外を発生しているタスクのIDが含まれる。
【0088】
ポート
ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。ポートは、単一の受取り側と潜在的に複数の送出側を有する。ポートに関連する状態は、次の通りである。
・それに関連するメッセージ待ち行列
・そのポートに対する参照(権利)のカウント
・仮想コピー・メモリとポートの量に対するセット可能な限界
・ポートを介してメッセージ内で送ることのできる権利
【0089】
カーネル・サービスは、ポートを割り振るために存在する。仮想メモリ範囲以外のシステム実体は、すべてがポートによって命名される。ポートは、これらの実体が作成される時に暗黙のうちに作成される。
【0090】
カーネルは、要求時に、ポートの消滅の際に通知メッセージを供給する。タスクの仮想アドレス空間を除く他のシステム資源のすべては、ポートとして既知の、あるレベルの間接指定を介してアクセスされる。ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。そのようなサービス要求に対して応答を提供しなければならない場合、第2のポートを使用しなければならない。供給されるサービスは、ポートを介して送られたメッセージを受け取るマネージャによって決定される。すなわち、カーネル提供実体に関連するポートの受取り側は、カーネルであるということになる。タスク供給実体に関連するポートの受取り側は、その実体を提供したタスクである。タスク供給実体に命名するポートの場合、そのポートに対するメッセージの受取り側を別のタスクに変更することができる。単一のタスクが、それがサポートする資源を参照する複数のポートを有することもできる。所与の実体は、それを表す複数のポートを有することができ、このポートのそれぞれが、許容される動作の異なる組を暗示する。たとえば、多くの実体は、名前ポートと、特権ポートと呼ばれる場合もある制御ポートとを有する。制御ポートをアクセスすることによって、その実体を操作することができる。名前ポートのアクセスは、その実体に命名するだけであり、これはたとえば、情報を返すために行われる。
【0091】
ポートに関するシステム全域の名前空間は存在しない。スレッドは、それを含むタスクに既知のポートだけをアクセスできる。タスクは、ポート権の組を保持し、このポート権のそれぞれが、ポート(別個である必要はない)に命名し、そのポートに関して許可される権利を指定する。ポート権は、メッセージに含めて伝送できる。これが、タスクがポート権を得る方法である。ポート権は、ポート名を用いて命名され、このポート名は、その権利を保持するタスクのコンテキスト(ポート名前空間)の内部でのみ意味を持つ、カーネルによって選択される整数である。システム内の動作のほとんどは、操作されるオブジェクトのマネージャを命名するポートにメッセージを送ることからなる。本明細書では、これを
オブジェクト−>関数
の形式で示す。これは、そのオブジェクトを命名するポートに対して(適当なメッセージを送ることによって)この関数が呼び出されることを意味する。メッセージは、ポート(権)に送らなければならないので、この動作はオブジェクト基礎を有する。プロセッサ・セットへスレッドをバインドするなど、一部の動作は、2つのオブジェクトを必要とする。これらの動作では、コンマで区切られたオブジェクトが示される。すべての実体がポートによって命名されるわけではなく、これは純粋なオブジェクト・モデルではない。ポート権によって命名されない2つの主な実体が、ポート名/ポート権自体と、メモリの範囲である。事象オブジェクトも、タスク局所IDによって命名される。メモリ範囲を操作するためには、そのメモリ範囲を所有するタスクによって命名された、そのメモリ範囲を含む仮想アドレス空間にメッセージを送る。ポート名/ポート権を操作するには、また、しばしば、関連ポートを操作するためには、それを所有するタスクによって命名された、それを含むポート名前空間にメッセージを送る。本明細書では、添え字表記
オブジェクト[ID]−>関数
を使用して、操作される範囲またはオブジェクトの要素を示すためにメッセージ内のパラメータとしてIDが必要であることを示す。本明細書では、括弧表記
オブジェクト(ポート)−>関数
を使用して、特定の方法でオブジェクトを操作するのに十分な特権を示すためにメッセージ内のパラメータとしてホスト制御ポートなどの特権ポートが必要であることを示す。
【0092】
ポート・セット
ポート・セットは、メッセージ受取り時に単一の単位として扱うことのできるポートの組である。mach_msg受取り動作は、受取り権またはポート・セットのいずれかを命名するポート名に対して許可される。ポート・セットには、受取り権の集合が含まれる。あるポート・セットに対して受取り動作が実行される時には、そのセットのポートのうちの1つからメッセージが受け取られる。受け取られたメッセージは、それがどのメンバ・ポートから受け取られたかを示す。ポート・セットのメンバであるポートからメッセージを直接受け取ることは許可されない。ポート・セット内のポートには、優先順位という概念がない。所与のメッセージをポート・セット内のどのポートから受け取るかはカーネルが選択するが、この選択を制御する方法はない。ポート・セットに関してサポートされる動作は次の通りである。
・作成と削除
・メンバシップ(所属関係)の変更とメンバシップの問い合わせ
【0093】
ポート権
ポートは、ポート権を使用することによってのみアクセス可能である。ポート権を用いると、特定のポートを特定の方法でアクセスできるようになる。ポート権には、下記の3種類がある。
・受取り権 この権利を保持していると、関連ポートからメッセージを受け取ることができる。
・送出権 この権利を保持していると、関連ポートにメッセージを送ることができる。
・1回送出権 この権利を保持していると、関連ポートに1つだけメッセージを送ることができる。このポート権は、メッセージが送られた後に自動的に破壊される。
【0094】
ポート権は、mach_msg呼出しのさまざまなオプションを使用することによって、また、明示的なコマンドによって、タスクの間でコピーすることができ、移動することができる。メッセージ動作以外では、ポート権は、ポート名前空間のメンバとしてのみ操作可能である。ポート権は、他のシステム実体が作成される時に暗黙のうちに作成され、また、明示的なポート作成を使用することによって明示的に作成される。
【0095】
カーネルは、要求時に、ポートに対する送出権がこれ以上ない時に、選択されたポートに通知を供給する。また、1回送出権の破壊(メッセージを送るのに使用することによらない場合)によって、対応ポートに送られる1回送出通知が生成される。要求時に、カーネルは、受取り権の破壊の通知を供給する。
【0096】
ポート名前空間
ポートとポート権は、任意のポートまたはポート権の直接操作を可能にするシステム全域にわたる名前を有しない。ポートは、ポート権を介してのみ操作可能であり、ポート権は、ポート名前空間に含まれる時に限って操作可能である。ポート権は、ポート名前空間への指標であるポート名によって指定される。各タスクには、1つのポート名前空間だけが関連付けられている。
【0097】
ポート名前空間内の1項目は、次の4つの可能な値を有することができる。
・MACH_PORT_NULL 関連するポート権なし。
・MACH_PORT_DEAD この名前に権利が関連していたが、その権利が参照していたポートが破壊されている。
・ポート権 ポートに関する、1回送出権、送出権または受取り権
・ポート・セット名 受取り権と同様に振る舞うが、複数のポートからの受取りが可能な名前。
【0098】
タスク内で新しい権利を取得すると、新しいポート名が生成される。ポート権は、そのポート名を参照することによって操作されるので、時にはポート名自体が操作される。所与のポート名前空間内の所与のポートに対する送出権と受取り権のすべてが、同一のポート名を有する。所与のポートに対する1回送出権のそれぞれは、互いに異なるポート名を有し、このポート名は、保持されている送出権や受取り権に使用されているポート名のいずれとも異なる。ポート名に関してサポートされる動作には、下記が含まれる。
・作成(権利の作成時の暗黙の)と削除
・関連する型の問い合わせ
・名前の変更
・要求時に、カーネルが使用不能になる名前の通知を提供する。
【0099】
ポート名前空間は、タスクにバインドされるので、それを所有するタスクと共に作成され、破壊される。
【0100】
メッセージ
メッセージは、2つの実体の間で渡される、データ、メモリ領域およびポート権の集合である。メッセージ自体は、システム・オブジェクトではない。しかし、メッセージは、待ち行列化されるので重要である。というのは、メッセージが送られた時と受け取られる時の間で状態を保持することができるからである。この状態は、下記からなる。
・純データ
・メモリ範囲のコピー
・ポート権
・送出側のセキュリティ・トークン
【0101】
メッセージ待ち行列
ポートは、メッセージの待ち行列からなる。この待ち行列は、メッセージを伝送するメッセージ動作(mach_msg)を介してのみ操作される。待ち行列に関連する状態は、待ち行列化されたメッセージの順序付きセットと、メッセージの数に対する設定可能な限界である。
【0102】
仮想アドレス空間
仮想アドレス空間によって、その仮想アドレス空間を所有するタスク内で実行中のスレッドが参照を許可される仮想アドレスの組が定義される。仮想アドレス空間は、それを所有するタスクによって命名される。
【0103】
仮想アドレス空間は、疎なページの指標付きの組からなる。個々のページの属性は、望みどおりに設定できる。効率のため、カーネルは、同一の属性を有する仮想的に連続したページの組を、内部メモリ領域にグループ化する。カーネルは、望みどおりにメモリ領域を分割、併合することができる。システム機構は、メモリ領域のIDに敏感であるが、ほとんどのユーザ・アクセスは、それほど影響を受けず、自由にメモリ領域をまたぐことができる。
【0104】
所与のメモリ範囲に、メモリ・マネージャの処置を介して別個のセマンティックスを関連付けることができる。仮想アドレス空間内で新しいメモリ範囲を確立する時に、そのメモリ範囲のセマンティックスを表すアブストラクト・メモリ・オブジェクトが、おそらくはデフォルトで、そのセマンティックスを提供するタスク(メモリ・マネージャ)と関連付けることによって指定される。
【0105】
仮想アドレス空間は、タスクの作成時に作成され、タスクの破壊時に破壊される。アドレス空間の初期内容は、task_create呼出しのさまざまなオプションならびに、その呼出しに使用されたプロトタイプ・タスクのメモリ範囲の継承特性から決定される。
【0106】
仮想アドレス空間に対する動作のほとんどは、そのアドレス空間内のメモリ範囲に命名する。これらの動作には、下記が含まれる。
・範囲の作成または割振りと割振り解除
・範囲のコピー
・追出しを避けるための物理メモリへのページの「ワイヤリング(wiring)」を含む、特殊な属性の設定
・メモリ保護属性の設定
・継承特性の設定
・範囲の直接読み書き
・補助記憶への範囲の強制フラッシュ
・範囲の予約(範囲内のランダム割振りの防止)
【0107】
アブストラクト・メモリ・オブジェクト
マイクロカーネルは、ユーザ・モード・タスクに、仮想アドレス空間の参照部分に関連するセマンティックスの供給を許可する。これは、アブストラクト・メモリ・オブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・メモリ・オブジェクトの指定を可能にすることによって行われる。このメモリ・オブジェクトを実装し、メモリ・オブジェクトに命名するポートへ送られたメッセージに応答するタスクを、メモリ・マネージャと呼ぶ。
【0108】
カーネルは、さまざまなメモリ・オブジェクトの内容のための直接アクセス可能キャッシュとして、メイン・メモリを使用するものとみなされなければならない。カーネルは、アブストラクト・メモリ・オブジェクト・ポートにメッセージを送ることによって、カーネルの望みどおりにこのキャッシュを満たし、フラッシュして、このキャッシュを維持するためにさまざまなメモリ・マネージャと共に非同期ダイアログにかかわる。アブストラクト・メモリ・オブジェクトに対する動作には、下記が含まれる。
・初期設定
・ページ読取り
・ページ書込み
・強制動作およびフラッシュ動作との同期化
・ページをアクセスする許可の要求
・ページ・コピー
・終了
【0109】
メモリ・オブジェクト・レプリゼンタティブ(Memory Object Representative)
アブストラクト・メモリ・オブジェクト・ポートは、カーネルが、メモリ・オブジェクト用の補助記憶へのアクセスを要求するのに使用するポートである。このダイアログは保護されているので、メモリ・マネージャは、通常はアブストラクト・メモリ・オブジェクト・ポートへのアクセス権をクライアントに与えない。その代わりに、クライアントには、メモリ・オブジェクト・レプリゼンタティブへのアクセス権が与えられる。メモリ・オブジェクト・レプリゼンタティブは、メモリ・オブジェクトのクライアントの表現である。このようなポートに対して許可される動作は1つだけであり、それは、関連するメモリ・オブジェクトをタスクのアドレス空間にマッピングすることである。このような要求を行うと、マッピング・カーネルとメモリ・マネージャの間で、下層のアブストラクト・メモリ・オブジェクトを初期設定するためのプロトコルが開始される。カーネルが代理によって表されたアブストラクト・メモリ・オブジェクトならびに代理によって許可されるアクセス・モードの組について知らされるのは、この特殊なプロトコルを介してである。
【0110】
メモリ・キャッシュ・オブジェクト
カーネルのメイン・メモリ・キャッシュのうち、所与のアブストラクト・メモリ・オブジェクトに関連する常駐ページを含む部分を、メモリ・キャッシュ・オブジェクトと呼ぶ。メモリ・オブジェクトのメモリ・マネージャは、カーネルのメモリ・キャッシュ・オブジェクトに対する送出権を保持する。メモリ・マネージャは、カーネルと共に非同期ダイアログにかかわり、関連するメモリ・キャッシュ・オブジェクトにメッセージを送ることによってそのアブストラクト・メモリ・オブジェクトのアブストラクションを提供する。メモリ・キャッシュ・オブジェクトに対する動作には、下記が含まれる。
・動作属性を設定する
・属性を返す
・カーネルにページを供給する
・カーネルによって要求されたページが使用不能であることを示す
・カーネルによって要求されたページが、カーネルのデフォルト・ルールによって満たされなければならないことを示す
・オブジェクトの遅延コピーの完了を強制する
・メモリ・マネージャに送られたページが破棄されたことを示す
・メモリ・ページへのアクセスを制限する。
・性能ヒントを提供する
・終了
【0111】
プロセッサ
スレッドを実行する能力を有する物理プロセッサのそれぞれは、プロセッサ制御ポートによって命名される。実際の作業を実行するという点では重要であるが、プロセッサは、プロセッサ・セットのメンバとしての重要さを除いて、マイクロカーネルではあまり重要でない。スレッドの組をスケジューリングするのに使用されるプロセッサのプールの基礎を形成し、スケジューリング属性を関連付けられているのは、プロセッサ・セットである。プロセッサに関してサポートされる動作には、下記が含まれる。
・プロセッサ・セットへの割当て
・開始と停止などの機械制御
【0112】
プロセッサ・セット
プロセッサは、プロセッサ・セットにグループ化される。プロセッサ・セットは、そのプロセッサ・セットに割り当てられたスレッドのスケジューリングに使用されるプロセッサのプールを形成する。プロセッサ・セットは、スレッドの組のスケジュール可能性を均一に制御するための基礎として存在する。この概念によって、システム内の所与の活動に対するプロセッサのおおまかな割振りを実行する方法ももたらされる。プロセッサ・セットに対してサポートされる動作には、下記が含まれる。
・作成と削除
・プロセッサの割当て
・スレッドおよびタスクの割当て
・スケジューリング制御
【0113】
ホスト
ネットワーク化されたマイクロカーネル・システム内の各計算機(単一プロセッサまたは多重プロセッサ)は、それ自体のマイクロカーネルのインスタンスを走行させる。ホスト多重プロセッサ100は、一般に、クライアント・タスクによって操作されない。しかし、各ホストはそれ自体のマイクロカーネル120を携帯し、そのそれぞれがそれ自体のポート空間、物理メモリおよび他の資源を有するので、実行中のホストは、可視であり、時には直接操作される。また、各ホストは、それ自体の統計を生成する。ホストは、自由に分配され、そのホストに関する情報の取得に使用できる名前ポートと、閉鎖的に保持され、ホストを操作するのに使用できる制御ポートとによって命名される。ホストによってサポートされる動作には、下記が含まれる。
・クロック操作
・統計収集
・リブート
・デフォルト・メモリ・マネージャの設定
・プロセッサとプロセッサ・セットのリスト取得
【0114】
クロック
クロックは、一定の周波数で時刻値カウンタを増分することによって、時間の経過の表現を提供する。各ホストまたは多重コンピュータ内の各ノードは、ハードウェアによってサポートされるさまざまなクロックおよびタイマならびにこれらのタイマ上に作成されるアブストラクト・クロック(abstract clock)に基づいて、それ自体のクロックの組を実装する。所与のシステムによって実装されるクロックの組は、構成時にセットされる。各クロックは、名前ポートと、制御ポートまたは特権ポートとの両方によって命名される。制御ポートを用いると、クロックの時刻と分解能を設定できる。名前ポートを与えられたタスクは、下記を実行することができる。
・時刻とクロックの分解能を判定する。
・時刻値をマッピングするメモリ・オブジェクトを生成する。
・所与の時刻まで休眠(遅延)する。
・所与の時刻に通知または警報を要求する。
【0115】
第3節 タスクとスレッド
この節では、ユーザから見えるスレッドとタスクの外見を述べる。スレッドは、マイクロカーネル・システム115内の能動的な実体である。これらは、タスク内の制御点として働き、タスクは、仮想アドレス空間と、他の資源をアクセスするのに用いられるポート名前空間とをスレッドに供給する。
【0116】
スレッド
スレッドは、基本的な計算実体である。スレッドは、その仮想アドレス空間を定義する1つのタスクだけに属する。スレッドは、最小限の状態を有する軽量の実体である。スレッドは、ハードウェアによって指示される形で、そのスレッドのレジスタ値に基づいてそのタスクのアドレス空間から命令を取り出しながら実行する。スレッドが直接行うことのできる唯一の処置は、そのレジスタを操作する命令と、そのメモリ空間を読み書きする命令の実行である。特権付きの機械命令を実行しようとすると、例外が発生する。例外については後で説明する。アドレス空間の構造に影響を与えるか、アドレス空間以外の資源を参照するためには、スレッドは、スレッドに代わってカーネルに動作を実行させるか、スレッドの代わりに何らかのエージェントにメッセージを送らせる特殊なトラップ命令を実行しなければならない。また、障害や他の不正な命令の挙動があると、カーネルが例外処理を呼び出すことになる。
【0117】
図2は、スレッドに関連する、クライアントから可視の構造を示す図である。スレッド・オブジェクトは、カーネル・スレッド・ポートに送られたメッセージを受け取る。このスレッド・ポートに関する送出権を保持するランダムなタスクからのほかに、スレッド・ポートは、スレッドを含むプロセッサ・セットまたはスレッドを含むタスクを介して、スレッドのスレッド自己ポートとしてアクセス可能である。
【0118】
スレッドによる処置
この節では、スレッドが直接行うことのできる処置の詳細を説明する。スレッドは、正しいポートへの権利を得ることができ、そのポートにメッセージを送ることができるならば、何でも行うことができる。スレッドが行うことのできるささまざまなことを、操作されるオブジェクトを説明する節で説明する。
【0119】
スケジューリング・サポート・トラップ
マイクロカーネルは、プリエンプティブにスレッドをスケジューリングする。これを行う方法には、さまざまな要因が関連する。ここでは、スレッドにスケジューリング優先順位が関連付けられ、この優先順位が、所与のプロセッサ・セット内で実行すべきスレッドの選択に使用されると述べておけば十分である。
【0120】
thread_switchは、さまざまなオプションを有するコンテキスト切り換えを引き起こす。これは、ソフトウェア・ロック・ルーチンなど、プロセッサを放棄し、その結果、他のスレッドが進行できるようにしたい場合のために提供される。オプションは、新たに走行する適切なスレッドの情報が使用可能である時に、その選択に関係する。thread_switchのオプションのうちの1つを指定すると、そのスレッドのスケジューリング優先順位が可能な最低の値に下げられ、その結果、他のスレッドが走行し、この順位を下げられたスレッドをブロックした作業を完了できるようになる。この優先順位低下は、所与の時刻が満了した時に取り消され、順位低下にもかかわらずこのスレッドが走行し、thread−>thread_abortまたはthread−>thread_depress_abortが呼び出される。
【0121】
最後に、clock_sleepトラップは、指定された時刻までスレッドを遅延させる。この遅延は、thread_abortによってclock_sleepにエラー・リターンを生成させることによって打ち切ることができる。
【0122】
IDトラップ
この節で述べるいくつかのトラップのほかに、サービスを求める他の要求のすべてが、ポート権を必要とする。現スレッドまたは現タスクを操作するカーネルに対する要求であっても、ポート権(現スレッドまたは現タスクに命名する)が必要である。この処理をブートストラップするためには、あるスレッドが、ポート権なしに、それ自体とそのタスクに関するポート権を得る方法が必要である。これらの権利は、それぞれmach_thread_selfトラップおよびmach_task_selfトラップを介して取得される。
【0123】
返されるポート権は、実際には、thread−>thread_set_special_portメッセージ呼出しおよびtask−>task_set_special_portメッセージ呼出しを介して最後にセットされた特殊ポート、THREAD_KERNEL_PORTおよびTASK_KERNEL_PORTである。これらの特殊ポートのデフォルト値は、それぞれ実際のカーネル・スレッド・ポートおよびカーネル・タスク・ポートである。タスクまたはスレッドを生成する側は、そのスレッドまたはタスクを開始する前にこれらの特殊ポート値をセットし、その結果、スレッドまたはタスクが、それ自体のカーネル・ポートへのアクセス権を持たず、それ自体に対して行われるサービスを要求する時に何らかの中間ポートを呼び出すようにすることができる。カーネルは、タスクのホストの名前ポートに対する送出権を返すトラップ、mach_host_selfも提供する。
【0124】
ブートストラップ応答ポート・トラップ
mach_reply_portも、ブートストラップの目的に使用される。前に述べたように、サービス要求で応答を返す必要がある場合、第2のポートが必要である。このトラップは、他のポート関連呼出しのすべてのために使用できる初期応答ポート(受取り権)の作成に使用される。タスクの自己ポートがnullである場合、そのタスクに対するマイクロカーネル・サービスの使用が不能になるが、この呼出しでもnullが返される。
【0125】
メッセージ送受トラップ
最後の最も重要なトラップが、mach_msg_trapである。このトラップは、mach_msgライブラリ・ルーチンによって呼び出される。このトラップは、他のすべてのシステム・サービスへのアクセス権を提供する。これによって、所与の権利によって命名されたポートとの間でデータが送受される。この呼出しのセマンティックスは、Kernel Programming Reference文書に含まれ、詳細に記載されており、この文書のさまざまな節にも記載されている。
【0126】
例外処理
スレッド内で例外が発生する時、スレッドは、カーネル・コンテキストで実行され、例外ポートに例外を説明する内容を含むメッセージを送る。例外は、Kernel Programming Reference文書のcatch_exception_raiseにリストされている。このメッセージに成功裡の応答が返されると、そのスレッドは、おそらくはthread_set_stateによって変更された状態で継続する。所与の例外に対して、適用される例外ポートは次の2つである。
・特定のタイプの例外のためのスレッド固有ポート。
・特定のタイプの例外のためのタスク・ポート。
【0127】
スレッド固有ポートは、thread−>thread_set_exception_portsを用いてセットされ、thread−>thread_get_exception_portsを用いて読み取られる。タスク・ポートは、task−>task_set_exception_portsを用いてセットされ、task−>task_get_exception_portsを用いて読み取られる。thread−>thread_swap_exception_ports呼出しとtask−>task_swap_exception_ports呼出しによって、原子的なスワップが実行され、例外ポートがセットされ、前の例外ポートが返される。
【0128】
カーネルは、順序付きリスト内でポートが定義されているならば、これらのポートのうちで最初のポートを、例外メッセージの宛先として選択する。成功裡の応答は、スレッドの継続を引き起こすが、不成功の応答は、カーネルに第2ポートへ例外メッセージを送出させる。どちらの例外メッセージも成功裡の応答を受け取らない場合、そのスレッドが打ち切られる。
【0129】
カーネルは、例外ポートがセットされた時に選択されるものとして、下記のさまざまな例外メッセージ・フォーマットを送ることができる。
・exception_port−>catch_exception_raise 障害を発生したスレッドのIDと、タスク自己ポートと、スレッド自己ポートと、実行コードおよび状況コードのタイプを示すメッセージ。
・exception_port−>catch_exception_raise_state 例外のタイプ、状況コードおよび、例外ポートがセットされた時に選択されたレジスタ値を含むスレッド状態の特色を示すメッセージ。スレッド状態は、入力と出力の両方であり、この応答がスレッド状態を変更できるようになっている。
・exception_port−>catch_exception_raise_state_identity タスク・ポートとスレッド・ポートを含むcatch_exception_raise_stateメッセージ。
【0130】
スレッドが遭遇するすべての例外状態が、この方法で処理されるわけではない。ページ不在障害では、例外ポートにメッセージが送られない。その代わりに、障害を発生したアドレスがあるメモリ・ページに関連する外部メモリ・マネージャにメッセージが送られる。これは、仮想メモリの一部として説明する。一般的な例外の規則は、システム呼出し命令には必ずしも適用されない。まず、可能なシステム呼出し番号のうちのいくつかは、マイクロカーネル呼出しのために含まれる。残りのシステム呼出し番号は、当初は未定義である。これらを実行しようと試みると、EXC_SW_EMULATIONの例外が生じる。
【0131】
スレッドの処置
次の節では、カーネルのスレッド・ポートに対する送出権があるものとして、スレッドに対して行うことのできるさまざまな機能をリストする。
【0132】
作成と破壊
スレッドは、task−>thread_createを介して生成され、thread−>thread_terminateを介して破壊される。スレッドは、所与のタスクに属するので、スレッド作成は、実際にはタスクに対して実行される動作である。その結果は、新スレッド用のカーネルのスレッド・ポートへの送出権である。所与のタスク内のスレッドのすべてに関するカーネル・スレッド・ポートのリストは、task−>task_threadsを用いて得ることができる。新たに作成されたスレッドは、中断状態である。これは、そのスレッドの最初の命令を実行する前にthread−>thread_suspendを呼び出した場合と同一である。中断されたスレッドは、実行されない。スレッドは、中断状態で作成されるので、スレッドを開始する前に、スレッドの機械状態を正しくセットすることができる。スレッドを中断状態から取り除く(中断カウントを減分する)には、thread−>thread_resumeを使用する。
【0133】
最適化として、走行中のスレッドを作成するのに必要なステップのシーケンス、すなわち、thread_create、thread_set_stateおよびthread_resumeを組み合わせて、task−>thread_create_running呼出しにしてある。
【0134】
スレッドの状態
スレッドには、状態の2つの主な組すなわち、機械状態と1組の特殊ポートがある。あるスレッドの機械状態は、thread−>thread_get_stateを使用して取得され、thread−>thread_set_stateを使用してセットされる。ランダムな点でスレッドの状態をセットした結果は、未定義である。決定的な結果を得るためには、下記のさまざまなステップが必要である。
・thread−>thread_suspendを使用して、スレッドを停止させる。スレッドが作成されたばかりで、まだ走行していない場合には、このステップと次のステップは不要である。しかし、シグナル配布などの非同期割込みや例外処理のためには、これらのステップが必要である。
・thread−>thread_abortを呼び出す。これによって、すべてのシステム呼出し(実際には、mach_msgと、例外メッセージやページ不在メッセージなどの関連メッセージ呼出し)が打ち切られる。メッセージ呼出しの打切りによって、システム呼出しの後の点にスレッドの状態がセットされ、呼出しの割込みを示す戻り値が返される。ページ障害または例外を打ち切ると、スレッドは、ページ障害または例外の点に残される。このスレッドを再開始すると、そのページ障害または例外が再び発生する。thread_abortによって、多重ページ・メモリ管理動作などの回復不能システム呼出しが打ち切られる。
・その後、thread−>thread_set_stateを安全に使用することができる。
・thread−>thread_resumeによって、スレッドを再開始する。
【0135】
スレッドは現在、1つの「特殊」ポートだけを関連付けられている。これは、そのスレッドがそれ自体に対する動作を要求するのに使用するための値である。これは、通常はカーネル・スレッド・ポートと同一であるが、異なる値にセットすることもできる(それを行うのは、ほとんどの場合にそのスレッドを作成した側である)。このポートは、thread−>thread_get_special_portによって返され、thread−>thread_set_special_portによってセットされる。
【0136】
中断カウントやスケジューリング情報など、カーネル・スレッド状態のさまざまな部分を、thread−>thread_infoを使用して得ることができる。
【0137】
スケジューリング制御
下記の関数は、スレッドのスケジューリングに影響する。これらは、物理資源管理の節で説明する。
・thread、processor_set_control−>thread_assign
・thread−>thread_assign_default
・thread−>thread_get_assignment
・thread(processor_set_control)−>thread_set_policy
・thread−>thread_policy
・thread(host_control)−>thread_wire
・thread−>thread_priority
・thread(processor_set_control)−>thread_max_priority
【0138】
thread_wire呼出しによって、スレッドが「ワイヤリング済み(wired)」としてマークされる。これは、カーネル資源管理に関する特権を意味する。「ワイヤリング済み」のスレッドは、常にスケジューリングされる資格を有し、空きメモリが不十分な時であってもメモリを消費することができる。この特性は、デフォルト・ページアウト・パス内のスレッドに割り当てられる。カーネルの空きページ・リストを使い果たさないようにするために、デフォルト・ページアウト・パス内にないスレッドにこの特性を与えてはならない。
【0139】
タスク
タスクは、スレッドの組を保持するコンテナとみなすことができる。タスクには、それに含まれるスレッドに適用されるデフォルト値が含まれる。最も重要なことに、タスクには、それに含まれるスレッドが実行を必要とする要素、すなわち、ポート名前空間と仮想アドレス空間が含まれる。
【0140】
図3は、クライアントから可視のタスク構造を示す図である。タスク・オブジェクトは、カーネル・タスク・ポートに送られたメッセージを受け取る。タスク・ポートに対する送出権を保持する可能性があるランダムなタスクからのほかに、タスク・ポートは、タスクのタスク自己ポート、タスクに含まれるスレッドまたはタスクを含むプロセッサ・セットから導出することができる。
【0141】
作成と破壊
新タスクは、task−>task_createを用いて作成される。タスク作成は、既存のプロトタイプ・タスクについて要求される動作であることに留意されたい。新タスクは、空の仮想アドレス空間を用いて作成されたものであるか、親タスクから継承したもののいずれかとすることができる。新タスクのポート名前空間は、空である。新タスクは、親タスクのPCサンプリング状態、特殊ポートおよび例外ポートを継承する。タスクは、task−>task_terminateを用いて破壊される。この動作は、破壊されるタスクに関して要求されるものであって、その作成の際に指定された親に対するものではない。タスクの仮想アドレス空間とポート名前空間が破壊される。
【0142】
タスクに関するさまざまな統計は、task−>task_infoを用いて取得できる。
【0143】
特殊ポート
タスクに関連するポート名前空間のほかに、タスクは、小さな組の特殊ポートも有する。
【0144】
タスクには、下記の特殊ポートが関連付けられている。
・タスクがそれ自体に対する動作を要求するのに使用するポート。これは、通常はカーネル・タスク・ポートと同一であるが、別の値にセットすることができる。
・どのような目的にも使用できるが、他のサービスを突き止めるのに使用するため、タスクがそれ自体以外の何かに対して保持する初期ポートとして用意された、ブートストラップ・ポート。
・通常はホスト名前ポートと同一の、タスクを含むホストに情報を要求するのに使用されるポート。
【0145】
これらのポートは、task−>task_get_special_portによって返され、task−>task_set_special_portによってセットされる。新タスク内のこれらのポートの値は、タスク自己ポートを除いて、task_create呼出しの目標であったタスクから継承される。タスクは、例外処理の節で説明したように、親タスクから継承した例外ポートも有する。
【0146】
スレッド管理
スレッドは、1つのタスクだけに属する。スレッドは、task−>thread_createを用いて作成される。1タスク内に存在するスレッドの組は、task−>task_threadsを用いて見つけることができる。
【0147】
タスク自体は実行されないが、あるタスクに関していくつかの実行特性をセットすることができ、これらの特性は、そのタスクに含まれるスレッドに適用される。あるタスク内のスレッドのすべてを一緒に、task−>task_suspendによって中断し、task−>task_resumeによって再開始することができる。これらの動作は、スレッドの中断カウントには影響せず、タスクの中断カウントに影響する。スレッドは、スレッドとそのタスクの両方の中断カウントが0である場合に限って実行可能になる。スレッドに関するデフォルトのスケジューリング特性は、下記を用いてセットできる。
・task、processor_set_control−>task_assign
・task−>task_assign_default
・task−>task_get_assignment
・task−>task_priority
【0148】
ID
タスクのそれぞれには、カーネルによって解釈されないセキュリティ・トークンを用いてラベルが付けられる。これは、信頼されるサーバがサービス要求元に関するアクセス調停決定に使用するために、そのタスクによって送られるメッセージの中で送られる。このセキュリティ・トークンは、task_createによって親タスクから継承される。これは、特権付きのtask(security)−>task_set_security_token呼出しを用いなければ変更できない。セキュリティ・ポートは、ブートストラップ・タスクに供給される特権ポートであり、このブートストラップ・タスクの唯一の目的は、タスクIDのセットまたは変更をサポートすることである。
【0149】
第4節 IPC
共用メモリを除いて、マイクロカーネル・タスクは、メッセージ送出と応答受取りだけによってその環境と対話する。これらのメッセージは、ポートを使用して送られる。ポートは、受取り側を1つだけ有し、複数の送出側を有することができる通信チャネルである。タスクは、これらのポートに対する権利を保持し、この権利によって、メッセージを送受する能力が指定される。
【0150】
ポート
ポートは、サービスを要求するクライアントとそのサービスを提供するサーバの間の単一方向通信チャネルである。ポートは、受取り側を1つだけ有し、複数の送出側を有することができる。カーネルがサポートする資源を代表するポートは、受取り側としてカーネルを有する。あるタスクが提供するサービスに命名するポートは、そのポートの受取り側としてそのタスクを有する。この受取り側は、ポート権の節で述べるように、望むならば変更することができる。
【0151】
ポートに関連する状態は次の通りである。
・関連するメッセージ待ち行列
・ポートに対する参照または権利のカウント
・ポート権とアウトオブライン・メモリ受取り限界
・メッセージ順序番号
・受取り権から作成された送出権の数
・このポートを含むポート・セット
・ノーモアセンダー・ポートが指定されている場合にはその名前
【0152】
図4は、一連の送出権と単一の受取り権とを示す、通常のポートを示す図である。関連するメッセージ待ち行列は、一連の順序付きメッセージを有する。メッセージのうちの1つを詳細に示す。これには、そのメッセージの宛先ポート、応答ポート参照、そのメッセージで渡された送受権ならびにいくつかのアウトオブライン・メモリまたは仮想コピー・メモリが示されている。
【0153】
ポート自体に影響する動作はごくわずかである。ほとんどの動作は、ポート権またはポート権を含むポート名前空間に影響するか、メッセージ待ち行列に影響する。ポートは、他のシステム実体が作成される時に暗黙のうちに作成される。また、mach_reply_portによってポートが1つ作成される。ポート群は、port_name_space[port_name]−>mach_port_allocateおよびport_name_space[port_name]−>mach_port_allocate_nameによって明示的に作成される。あるポートを明示的に破壊することはできない。ポートが破壊されるのは、受取り権が破壊される時だけである。
【0154】
ポートの属性は、作成時に割り当てられる。これらの属性の一部、たとえば1メッセージで受け取ることのできるポート権の数やアウトオブライン・メモリの量に対する限界などは、port_name_space[port_name]−>mach_port_set_attributesを用いて変更できる。これらの属性は、port_name_space[port_name]−>mach_port_get_attributesを用いて取得できる。
【0155】
ポートの存在は、関連するすべてのものにとって明らかに重要である。したがって、ポートを使用する多くのタスクが、ポートが破壊された時にメッセージを介して通知を受けることを希望する可能性がある。このような通知は、mach_msgに対するオプション(MACH_RCV_NOTIFY)ならびにport_name_space[port_name]−>mach_port_request_notificationによって要求される。その結果の破壊された名前の通知で、名前付きポートの破壊のためにあるタスクのポート名が破壊さ
れたことが示される。このメッセージでは、現在破壊されているポートに関するタスクの名前が示される(これについては、ポート名前空間の節で説明する)。
【0156】
メッセージ
メッセージは、2つの実体の間で渡されるデータ、アウトオブライン・メモリ領域およびポート権の集合である。メッセージ自体は、操作可能なシステム・オブジェクトではない。しかし、メッセージは待ち行列化され、メッセージが送出された時刻とそれが受け取られた時刻の間で状態を保持することができるので、メッセージは重要である。純データのほかに、メッセージにポート権を含めることもできる。これは重要である。この形で、メッセージの中でポート権を受け取ることによって、タスクが新しい権利を取得するのである。
【0157】
メッセージは、プロセス間通信(IPC)サブシステムによって解析される制御部分と、データ部分からなる。さらに、メッセージは、メッセージそのものの外部にある、転送すべきデータの領域を指すことができる。これらの領域には、ポート権を含めることができる(アウトオブライン・ポート配列)。メッセージには、送出側のセキュリティ・トークンも含まれる。メッセージの制御部分は、ヘッダと、任意選択としてメッセージ本体と1つまたは複数のメッセージ記述子から構成される。ヘッダによって、このメッセージが送られるポートのポート名が指定され、応答が必要な場合には、応答が送られるポートの補助ポート名も指定される。
【0158】
メッセージ本体が存在する時には、メッセージ本体はヘッダの後に続き、ここでそれに続く記述子の数が宣言される。記述子がない場合、そのメッセージは「複合」メッセージではない、すなわち、データの表立った変換またはコピーをIPCサブシステムが行う必要がない、とみなされる。非「複合」メッセージには、メッセージ本体が含まれない。各記述子は、アウトオブライン・メモリ領域、ポート権、ポート権配列など、カーネルによって操作されるデータのセクションを記述する。メッセージのデータ部分に含まれるデータは、IPCサブシステムによってバイトの無名配列として扱われる。メッセージの送出側と受取り側の両方が、データ・フォーマットに関する共通の理解を共用しなければならない。メッセージ・インターフェース・ジェネレータ(MIG)が生成したルーチンから発するメッセージの場合、データの最初の8バイトに、そのメッセージに含まれるデータの可能な計算機間変換に関する計算機符号化情報が含まれる。
【0159】
単一のポート権に関する記述子は、その権利に命名し、コピーを作成したり異なる型の権利から権利を生成するのではなく権利を移動するなどのmach_msgによって実行される特殊な変換に命名する。「アウトオブライン」・ポート配列の記述子も、権利(すべてが同一の型でなければならない)のセットに関するIPC処理を指定するが、ポート名の配列のアドレスとサイズを指定する。
【0160】
アウトオブライン・データ記述子は、アウトオブライン領域のサイズとアドレスを記述する。この領域は、あるページの先頭から始まる必要はなく、整数個のページを含む必要もない。指定されたデータだけが、論理的に伝送される。この記述子は、メッセージを待ち行列化する処置によって、vm_deallocateによるものであるかのように、送出側タスクからメモリ範囲を割振り解除することを指定することができる。送出側は、データの物理コピーと仮想コピーのどちらを送るかを選択することができる。仮想コピーを要求することによって、カーネルがその仮想コピーを使用する、すなわち、大量のデータを効率的にコピーする機構であるコピー・オン・ライトを使用することが可能になる。その結果、受取り側には、送出側のメモリ・マネージャによって二重書きされる仮想コピーが見える可能性がある。仮想コピー機構が使用される可能性があるので、送出側と受取り側の両方が、メモリのアクセス時間に不確定性を経験する可能性がある。物理コピーを選択すると、送出側と受取り側によるデータへの決定的なアクセスが保証される。アウトオブライン・データ領域内の値も、メッセージ・データ内の値も、型を持たない。メッセージの受取り側だけが、そのメッセージが来たポートとメッセージ・データの知識を用いて、これらのデータ区域を解釈でき、おそらくは変換することができる。
【0161】
メッセージ・トレーラ
メッセージを受け取る時には、デフォルトでその末尾にトレーラが付加される。トレーラは、通常はIPCサブシステムによって追加され、物理的にメッセージと連続している。トレーラには、メッセージ順序番号や送出側セキュリティ・トークンなどのさまざまな伝送関連フィールドが含まれる。
【0162】
トレーラのフォーマットとサイズは、受取り側のmach_msgへのオプションを介して制御可能である。これは、送出側のトレーラ供給のオプションとしても可能である。
【0163】
メッセージ待ち行列
ポートは、メッセージの待ち行列からなる。この待ち行列は、メッセージを伝送するメッセージ動作(mach_msg)を介してのみ操作される。メッセージ待ち行列に関して操作可能な唯一の状態が、そのサイズである。これは、関連ポートの受取り権がport_name_space[port_name]−>mach_port_set_attributesに与えられる時にセットできる。メッセージ待ち行列が満杯の場合、それ以上のメッセージを待ち行列化することはできない。この場合、呼出し側がブロックされる。
【0164】
ポートに送られたメッセージは、信頼性のある形で配布される。メッセージの受取りによって、前のすべてのメッセージが受け取られたことと、それらのメッセージが、受取りポートに待ち行列化された順序で受け取られたことが保証される。
【0165】
ポート権
ポート権は、特定のポートを特定の方法でアクセスする権利を示す実体である。ポートは、ポート権を介してのみアクセス可能である。これと関連して、ポート権には次の3種類がある。
・受取り権 この権利を保持していると、関連ポートからメッセージを受け取ることができる。
・送出権 この権利を保持していると、関連ポートにメッセージを送ることができる。
・1回送出権 この権利を保持していると、関連ポートに1つだけメッセージを送ることができる。このポート権は、メッセージが送られた後に自動的に破壊される。
ポート権は、ポートを識別するための安全で位置独立な方法である。これらの権利は、カーネルによって保護される実体である。クライアントは、権利を有するポート名を介してのみポート権を操作する。
【0166】
基本操作
mach_msgは、権利を操作する基本的な方法の1つである。ポート権は、メッセージ内で、タスクの間で移動すなわち、送出側から削除し、受取り側に追加することができる。メッセージ内の任意選択フラグによって、mach_msgに既存の送出権のコピーを作成させたり、受取り権から送出権または1回送出権を生成させることができる。権利は、port_name_space[port_name]−>mach_port_extract_right(メッセージで権利を送る目標と同等)およびport_name_space[port_name]−>mach_port_insert_right(メッセージで権利を受け取る目標と同等)によって強制的にコピーまたは移動することもできる。メッセージ動作以外では、ポート権は、ポート名前空間のメンバとしてのみ操作可能である。
【0167】
図5は、ポート名前空間または1メッセージの通過に含まれる、一連のポート権を示す図である。このポート名前空間には、ポート・セットも示されている。
【0168】
ポート権は、他のシステム実体が作成される時に暗黙のうちに作成される。Mach_reply_portによって、1つのポート権が作成される。複数のポート権は、port_name_space[port_name]−>mach_port_allocateおよびport_name_space[port_name]−>mach_port_allocate_nameによって明示的に作成される。ポート権は、port_name_space[port_name]−>mach_port_deallocateおよびport_name_space[port_name]−>mach_port_destroyによって破壊される。破壊は、port_name_space[port_name]−>mach_port_mod_refsによるなど、ポート名前空間操作の副産物となる可能性もある。
【0169】
受取り権があれば、port_name_space[port_name]−>mach_port_get_attributesを用いていくつかの状況情報を得ることができる。
【0170】
ノーモアセンダー通知
システムは、ポートごとに、送出権と1回送出権の数のシステム全域にわたるカウントを維持する。これには、宛先のポート権や応答ポート権を含む、メッセージの通過に含まれる権利が含まれる。ポートの受取り側は、そのポートに関する送出権がこれ以上存在せず、そのポートがこれ以上値を有することができないことが示される場合を知りたいと希望する可能性がある。この形式の通知は、port_name_space[port_name]−>mach_port_request_notificationを使用して要求できる。この通知は、ポート名前空間の一部として説明する送出作成回数という概念に依存する。受取り権が別のタスクに移動すると、未処理のノーモアセンダー通知要求が取り消され、この取消しを示すために1回送出通知が送られる。ノーモアセンダー通知が発生するのは、未処理の1回送出権の数に無関係に、既存の送出権の数が0になる時である。
【0171】
1回送出権
1回送出権を用いると、1つのメッセージだけを送ることができる。この権利は、受取り権からのみ生成される。1回送出権は、それからメッセージがもたらされることを保証する特性を有する。通常の場合、1回送出権は、メッセージ内の宛先ポートとして使用することによって消費される。この権利は、メッセージが受け取られた時に静かに破壊される。1回送出権は、それが消費される時までは、宛先権として使用されるのでない時に、タスクからタスクへ移動することができる。メッセージを送るのに使用すること以外の方法でこの権利が破壊される場合、1回送出通知がポートに送られる。1回送出権を使用しない時にこれを破壊できる方法のほとんどは、かなり明白である。不明瞭な場合が2つある。
・1回送出権が、ノーセンダー通知の目標として指定され、ノーセンダー通知が要求されたポートが削除されたか、受取り権が移動された場合。来るべきノーセンダー通知が存在しないので、その代わりに1回送出通知が生成される。
・メッセージ受取りを実行する処理の中で、メッセージがポートから待ち行列解除された後、タスクに返される前に、タスクがその受取り権を放棄した場合(下のメッセージ伝送の詳細を参照されたい)。1回送出権を介して送られたメッセージとポートの間の関連が失われことを示す1回送出通知が、宛先ポートに送られる。
【0172】
ポート名前空間
ポートは命名されないが、ポート権は命名される。ポート権は、ポート名前空間内に含まれることによってのみ命名可能である。ポートは、ポート名前空間内の指標であるポート名によって指定される。各タスクには、1つのポート名前空間が関連する。
【0173】
ポート名前空間内の1項目は、4つの可能な値を有することができる。
・MACH_PORT_NULL 関連するポート権なし。
・MACH_PORT_DEAD この名前に権利が関連していたが、権利が参照していたポートが破壊されている。このポート名は、クライアント・タスクが何がおきたかを理解する前にこの名前を再利用しないようにするために明示的な処置がなされない限り、この状態に保たれる。
・ポート権 ポートに関する、1回送出権、送出権または受取り権
・ポート・セット名 受取り権と同様に振る舞うが、複数のポートからの受取りが可能な名前。これについては次の節で説明する。
【0174】
ポート名前空間に含まれる別個の権利のそれぞれは、必ずしもポート名前空間内で別個の名前を有するわけではない。1回送出権は、別個の権利のそれぞれについて別々の名前を必ず消費する。同一のポートに対する受取り権と送出権は、結合される。すなわち、ポート名前空間が、あるポートに関する3つの送出権を保持する場合、このポート名前空間は、これら3つの権利のすべてについて1つの名前を有する。ポート名は、1回送出、送出、受取り、ポート・セットおよび破壊された名前などの権利のタイプごとに、名前に関連する関連参照カウントを有する。ポート名前空間が受取り権も保持する場合、その受取り権は、送出権と同一の名前を有する。
【0175】
名前が破壊されるのは、それに関連するポートが破壊される時である。すなわち、破壊された名前を保持しているタスクは、その名前の下での受取り権を保持していることができない。破壊された名前は、その名前によって以前に保持されていた送出参照の数の非0参照カウントだけを有する。タスクは、port_name_space[port_name]−>mach_port_request_notificationを使用することによって、その名前のうちのどれかが破壊される時に、送られるメッセージによって通知を受けることができる。この通知メッセージを受け取ることによって、破壊された名前の参照カウントが増分されて、その名前を操作するスレッドとの競争が回避される。
【0176】
タスクが権利を取得する時には必ず、そのタスクに、上の規則に従うポート名が割り当てられる。権利を取得すると、その権利のタイプのその名前の参照カウントが増分される。この参照カウントは、port_name_space[port_name]−>mach_port_get_refsによって取得できる。
【0177】
port_name_space[port_name]−>mach_port_destroyを使用することによって、ポート名を明示的に破壊することができ、すべての参照を除去することができるが、ポート名は、通常はユーザ参照カウントを修正することによって操作される。port_name_space[port_name]−>mach_port_mod_refsによって、ある名前に関連する指定された権利タイプの参照カウントが修正される。port_name_space[port_name]−>mach_port_deallocateは、mach_port_mod_refsに類似しているが、この場合、カウントが必ず1つだけ減分され、送出参照カウントまたは1回送出参照カウントだけが減分される。このルーチンは、名前を修正するための決定が行われた後に破壊された可能性があるポート名の参照カウントを操作するのに有用である。実際に権利を移動するmach_msgのオプションによって、また、port_name_space[port_name]−>mach_port_extract_rightによっても、名前の参照カウントを減分することができる。ポート名が解放されるのは、すべての参照カウントが0になった時である。
【0178】
ポート名が解放され、その名前に関する名前破壊通知が有効である場合に、ポート削除済み通知が生成される。名前破壊通知が有効である名前は、次の3つの状態のうちのどれか1つでしかあり得ない。
・有効な権利に命名している
・MACH_PORT_DEAD、名前が破壊された時に名前破壊通知が送られている。
・MACH_PORT_NULL、名前がnullになった時にポート削除済み通知が送られている。
【0179】
名前の型などの名前に関する情報は、port_name_space[port_name]−>mach_port_typeによって得ることができる。割当て済みの名前のリストは、port_name_space[port_name]−>mach_port_namesを用いて取得する。それによって権利がわかる名前は、port_name_space[port_name]−>mach_port_renameを用いて変更できる。受取り権名を与えられれば、port_name_space[port_name]−>mach_port_get_attributesを用いて、一部の状況情報を得ることができる。
【0180】
受取り権に命名するポート名は、ノーモアセンダー通知処理に使用される、関連する送出作成カウントを有する。送出作成カウントは、受取り権から送出権が(mach_msgに対してMACH_MSG_TYPE_MAKE_SEND型の記述子を指定したポート権であるメッセージ要素を用いて)作られた回数のカーネルのカウントである。この送出作成カウントは、ポートが作成される時に0にセットされ、メッセージ内で受取り権が伝送される時には必ず0にリセットされる。これは、port_name_space[port_name]−>mach_port_set_mscountを用いて変更することもできる。送出作成カウントは、ノーモアセンダー通知メッセージに含まれる。ノーセンダー通知によって、通知が生成された時点で送出権が存在しないことが示されることに留意されたい。それでも未解決の1回送出権が存在する可能性がある。すべての1回送出権によって、メッセージまたは1回送出通知が保証されるので、タスクは、簡単に1回送出権の跡を追うことができる。受け取られたメッセージには、そのメッセージを受け取ったポートから取られた順序番号のスタンプを付ける。ポート・セットから受け取ったメッセージには、適当なメンバ・ポートからの順序番号を用いてスタンプを付ける。送られたメッセージに置かれる順序番号は、上書きされる。新たに作成されるポートは、0の順序番号から始まり、この順序番号は、そのポートの受取り権が移動される時に必ず0にリセットされる。順序番号は、port_name_space[port_name]−>mach_port_set_seqnoを用いて明示的にセットすることもできる。メッセージをポートから待ち行列解除する時に、そのメッセージに、そのポートの順序番号を用いてスタンプを付け、その後、そのポートの順序番号を増分する。この待ち行列解除と増分の動作は、原子的であり、その結果、あるポートからメッセージを受け取る複数のスレッドが、msgh_seqnoフィールドを使用してメッセージの元の順序を再構成できるようになっている。
【0181】
ポート名前空間は、タスクにバインドされるので、それを所有するタスクと共に作成され、破壊される。
【0182】
ポート・セット
ポート・セットは、メッセージを受け取る時に単一の単位として扱うことのできるポートの組である。mach_msgの受取り動作は、受取り権またはポート・セットのいずれかに命名するポート名に対して許可される。ポート・セットには、受取り権の集合が含まれる。受取り動作がポート・セットに対して行われる時、メッセージは、そのセット内のポートのうちの1つから無作為に受け取られる。ポート・セットに対するメッセージの配布の順序は、不確定であり、次の2つの警告を伴う実施の対象となる。
1)ポート・セットのメンバは、資源枯渇の影響を受けてはならない。
2)同一のポートに対する他のメッセージに関するメッセージの到着の順序は、保存される。
【0183】
セット内の受取り権のそれぞれが、それ自体の名前を有し、セットも、それ自体の名前を有する。ポート・セットに対する受取りによって、そのメッセージを提供したポートの受取り権の名前が報告される。受取り権は、1つのポートセットだけに属することができる。タスクは、ポート・セットに含まれる受取り権から直接受け取ることができない。ポート・セットは、port_name_space[port_name]−>mach_port_allocateまたはport_name_space[port_name]−>mach_port_allocate_nameを用いて作成される。ポート・セットは、port_name_space[port_name]−>mach_port_destroyまたはport_name_space[port_name]−>mach_port_deallocateによって破壊される。
【0184】
ポート・セットの操作は、port_name_space[port_name]−>mach_port_move_memberを用いて行われる。この呼出しでは、セットにメンバを追加するか、セットからメンバを取り除くか、あるセットから別のセットへメンバを移動することができる。ポート・セットのメンバシップは、port_name_space[port_name]−>mach_port_get_set_statusを用いて見つけることができる。
【0185】
メッセージ伝送
システム呼出しmach_msgによって、マイクロカーネル・メッセージの送受が行われる。2つのタスクの間で実際にメッセージを転送するためには、送出側が、送出オプションと正しい目的ポートを用いてmach_msg呼出しを行わなければならない。受取り側は、受取りオプションを用いてmach_msg呼出しを行い、目的ポートでの読取りに着手しなければならない。この2つの呼出しの順序は、重要ではない。
【0186】
送出動作によって、メッセージがポートに待ち行列化される。このメッセージには、呼出し側のデータのコピーが含まれる。呼出し側は、送出動作からリターンした後に、送られたデータに影響を及ぼすことなくメッセージ・バッファやアウトオブライン領域を自由に修正できる。メッセージ内でアウトオブラインとして指定されたデータは、送出側のオプションとカーネルによる機構の選択とに応じて、仮想コピーまたは物理コピーとして渡される。カーネルは、領域を定義するページの組の仮想メモリイメージを構築する。「アウトオブライン」ポート配列は、物理的にコピーされ、宛先空間に適したポート名に変換される。カーネルが仮想コピーを構築する場合、カーネルは、仮想コピー内の最初のページのデータに先行する部分と、仮想コピー内の最後のページのデータに続く部分を0クリアする。
【0187】
呼出し側は、下記のいずれかが発生しない限り、メッセージを待ち行列化できるまでブロックされる。
・メッセージが1回送出権に送られる。これらのメッセージは、必ず強制的に待ち行列化される。
・mach_msg動作が打ち切られた(thread_abort)。デフォルトでは、mach_msgライブラリ・ルーチンが、中断された動作を再試行する。
・送出動作が、そのタイムアウト値を超過した。
・ポートが破壊された。
【0188】
メッセージの送出は、2ステップの処理である。第1のステップには、メッセージのカーネル・コピーの構築が含まれる。第2のステップには、メッセージの待ち行列化が含まれる。無効なポート権やデータ・アドレスなど、第1ステップ中に障害が発生すると、送られるメッセージがエラー・リターンを伴う障害を発生するが、悪影響はない。第2ステップ中の障害も、送出タイムアウト値を超過した時や、割込み(thread_abort)が発生した時に発生する可能性がある。これらの障害も、送出に障害を発生させるが、これらの状況では、カーネルが、擬似受取り動作を用いて呼出し側にメッセージ内容を返そうと試みる。この擬似読取り動作によって、メッセージ内だけに存在するポート権またはメモリ(たとえば、メッセージに移動された受取り権や、割振り解除フラグと共に送られたアウトオブライン・メモリ)の消失が防止される。
【0189】
擬似受取り動作は、通常の受取り動作に非常に類似している。擬似受取りによって、メッセージ・ヘッダ内のポート権が、メッセージ本体に含まれるかのように処理される。擬似受取りの後、そのメッセージは、再送出の準備ができている。メッセージを再送出しない場合、アウトオブライン・メモリ範囲が移動されている可能性があり、一部のポート権が名前を変更されている可能性があることに留意されたい。
【0190】
受取り動作によって、メッセージがポートから待ち行列解除される。受取り側のタスクは、そのメッセージに含まれるポート権とアウトオブライン・メモリ範囲を取得する。受取り動作の呼出し側は、ヘッダと本体がコピーされるバッファを供給しなければならない。受け取られるメッセージのフォーマットは、送出された時と同一である。メッセージがバッファに収まらない場合、そのメッセージは破壊される。オプション(MACH_RCV_LARGE)を使用すると、呼出し側が、必要なバッファ・サイズと共にエラーを受け取ることができ、その結果、適切なサイズのバッファを用いてもう一度受取り動作を試みることができるようになる。
【0191】
受け取ったメッセージには、ポート権とアウトオブライン・メモリが含まれる可能性がある。受け取ったポート権とメモリは、何らかの形で消費するか割振り解除する必要がある。資源不足のためにポート権またはアウトオブライン・メモリを受け取れない場合、その実体が破壊される。ポート権の受取りは、ポート名前空間の節で説明した他の名前によるポート権の挿入と同一の規則に従う。ポート権記述子によって、受け取った権利のタイプが示される。
【0192】
伝送されるアウトオブライン領域のそれぞれについて、カーネルは、受け取られるメッセージ内の記述子を返し、この記述子によって、そのメモリが突き止められ、物理コピーと仮想コピーのどちらの送出をカーネルが選択した(または送出側によって指示された)かが示される。物理コピーを送出することによって、決定的な挙動が保証される。デフォルトのメモリ・マネージャによって二重書きされるにもかかわらず、カーネルの仮想コピー最適化で、既にメモリ内にあるページ・イメージが使用されるか、送出側のメモリを二重書きしたメモリ・マネージャからページ・イメージが取り出される可能性がある。これは、受取り側タスクを任意のメモリ・マネージャに従属させる可能性があるが、これによって、大量のメモリの直接コピーに対する大幅な性能改善をもたらすことができる。仮想コピーにとって最適の事例は、送出側が割振り解除オプションを使用した時である。追加情報については、仮想メモリ管理の節を参照されたい。
【0193】
アウトオブライン・メモリ領域またはポート配列メモリ領域の受取りには、2つのオプションがある。デフォルトのオプション1では、受け取られる領域が、vm_allocateによるものであるかのように、受取り側のアドレス空間内で一時メモリとして動的に割り振られる。カーネルが仮想コピーを伝送した場合、受け取られるデータは、送出側のページ内境界合せと同一の境界合せで、割り振られた空間内に現れる。これ以外のどの場合でも、割り振られたデータは、ページ境界の先頭から始まる。どのような状況でも、このオプションを用いたメッセージの受取りは、仮想コピー自体の不注意な参照によって受取り側を機能停止させることはない。
【0194】
オプション2では、代替アウトオブライン受取りモードによって、アウトオブライン領域が、vm_writeによるものであるかのように、指定された区域内のバイトに上書きされる。このアウトオブライン領域が、指定された区域に収まらない場合、受取り側はエラーに遭遇する。さまざまな状況の下で、データ伝送とデータ境界合わせの方法に応じて、このオプションでは、ページ操作が実行されるか実際にデータがコピーされる可能性がある。この動作は、おそらくは、仮想コピーを二重書きするメモリ・マネージャと相互作用し、独断的に受取り側を機能停止させる可能性がある。
【0195】
この2つの受取りモードの選択は、MACH_RCV_OVERWRITEオプションに依存する。これがセットされていない時には、受け取られる領域のすべてが動的に割り振られる。セットされている場合には、受取りバッファが、送られたメッセージ内の記述子リストと同一形式の「散乱」記述子リストを記述するものとみなされる。カーネルは、このリストを走査して、受け取った領域のそれぞれに対して何を行うかを決定する。送られた領域の数を扱うのに十分な記述子が供給されていない場合、追加領域を動的に割り振る。カーネルは、アウトオブライン記述子のそれぞれを調べて、対応する領域の後処理を決定する。仮想コピーの「送出」オプションは、動的割振りを暗示し、物理コピーのオプションは、上書きされる領域を突き止めるのに使用される記述子のアドレス・フィールドとサイズ・フィールドを用いる上書きを暗示する。サイズが不十分であると、エラー・リターンが発生する。
【0196】
受取り動作も、2ステップの処理すなわち、メッセージの待ち行列解除と、その後の受取り側でのコピーの作成である。第1のステップは、指定された受取りタイムアウト値を超過したか、受取りが打ち切られた(thread_abort)ためにエラーになる可能性がある。これらの状況は、受け取られたはずのメッセージには影響しない。ほとんどの障害は、第2ステップ中に発生し、これによってメッセージが破壊される。
【0197】
mach_msg呼出しの結果として要求することができる通知がある。この通知は、mach_msgによって生成されるのではないが、MACH_RCV_NOTIFYオプションによって要求される。このオプションを指定すると、受け取った応答ポート権が、mach_port_request_notificationによるものであるかのように、それに関する名前破壊通知を自動的に要求されるようになる。このオプションは、特定の種類のリモート・プロシージャ・コール(RPC)相互作用のための最適化である。応答ポート名に対する名前破壊通知を用いると、そのメッセージの受取り側が、要求元クライアントの破壊について時宜を得た形で通知を受けられるようになる。しかし、応答権は、通常は1回送出権であるから、応答を送ることによって、権利が破壊され、その代わりにポート削除通知が生成される。この通知を取り消すための最適化は、mach_msgに対するMACH_SEND_CANCELオプションによって提供される。
【0198】
メッセージ動作は、メッセージ・ヘッダ内のポート権の操作に関しては原子的である。
【0199】
第5節 仮想メモリ管理
マイクロカーネルの仮想メモリ設計では、仮想メモリ・システムが、機械依存部分と機械独立部分の層に分けられる。機械依存部分は、仮想メモリのページに対するアクセス権の有効化、無効化およびセットのための単純なインターフェースを提供し、これによって、ハードウェア・アドレス・マップを維持する。機械独立部分は、論理アドレス・マップ(仮想アドレス空間のマッピング)、このマップ内のメモリ範囲、および、外部メモリ管理インターフェースを介するこれらの範囲に関する補助記憶(メモリ・オブジェクト)へのインターフェースのサポートを提供する。
【0200】
仮想メモリ・システムは、適度なプロセッサ数の均一メモリ・アクセス多重プロセッサ用に設計されている。不均一メモリ・アクセスを提供するアーキテクチャまたは遠隔メモリ・アクセスを提供しないアーキテクチャのサポートは、現在研究中である。
【0201】
高性能が、マイクロカーネル仮想メモリ設計の特徴である。このかなりの部分が、大きく疎なアドレス空間、共用メモリおよび仮想コピー・メモリ最適化の効率的なサポートからもたらされる。
【0202】
最後に、この仮想メモリ・システムを用いると、クライアントが、メモリ範囲のために補助記憶を提供でき、これによって、そのような範囲に適用されるセマンティックスを定義できるようになる。
【0203】
仮想アドレス空間
仮想アドレス空間によって、その仮想アドレス空間を所有するタスク内で実行中のスレッドが参照を許可される有効な仮想アドレスの組が定義される。仮想アドレス空間は、それを所有するタスクによって命名される。
【0204】
仮想アドレス空間は、疎なメモリ・ページの指標付きの組からなる。1ページのサイズは、host_name−>host_page_sizeを用いて見つけることができる。カーネルは、その内部で、すべてが同一の属性(二重書きされるアブストラクト・メモリ・オブジェクト、継承、保護その他の特性など)を有するページの仮想的に連続した組を、メモリ領域と呼ばれる内部実体にグループ化する。メモリ領域は、それを含むアドレス空間内の仮想アドレス範囲のみによって命名される。さまざまな動作およびシステム機構が、メモリ領域のIDに敏感であるが、ほとんどのユーザ・アクセスは、それ程影響を受けず、メモリ領域を自由にまたぐことができる。カーネルは、適切と思われるならばメモリ領域を自由に分割、併合する。クライアントから見たアドレス空間は、ページの組として見える。メモリ領域に対して敏感な唯一の呼出しが、virtual_address_space[memory_address]−>vm_regionである。この呼出しは、所与のアドレス付近の領域を突き止め、そのメモリ領域に関する情報を返す。メモリ領域は、純粋にカーネル内部の概念であるが、vm_map呼出しによって影響を受け、また、保護属性と継承属性の変更によって影響を受ける。したがって、この呼出しの結果は、呼出しごとに変化する可能性がある。
【0205】
仮想アドレス空間は、タスクが作成される時に作成され、タスクが破壊される時に破壊される。新タスクが作成される時には、継承を無視すると、そのアドレス空間は空であり、タスクがスレッドを実行にセットできるようになる前に、仮想アドレス空間の操作を介してアドレス空間を作成しなければならない。しかし、task_create呼出しのオプションを用いると、新タスクが、この作成呼出しに使用されるプロトタイプ・タスクからメモリの範囲を継承できるようになる。カーネル関数virtual_address_space[memory_range]−>vm_inheritによって、メモリ範囲の継承特性を変更し、継承を許可または禁止することができる。可能な継承は次の通りである。
・VM_INHERIT_NONE 新タスク内の範囲は未定義のまま残される。
・VM_INHERIT_COPY タスク作成時に、コピー最適化を用いて新タスクに範囲がコピーされる。
・VM_INHERIT_SHARE 新タスクと旧タスクがメモリ範囲へのアクセス権を共用する。
【0206】
メモリの範囲に、メモリ・マネージャの処置を介して別個のセマンティックスを関連付けることができる。新しいメモリ範囲を仮想アドレス空間内で確立する時には、おそらくはデフォルトで、そのメモリ範囲のセマンティックスを表すアブストラクト・メモリ・オブジェクトが指定される。このアブストラクト・メモリ・オブジェクトは、そのセマンティックスを提供するタスク(メモリ・マネージャ)と関連する。タスクがメモリ範囲に関連するセマンティックスに直接影響を及ぼすためのカーネル呼出しは存在しない。タスクは、所望の機能性を提供するメモリ・マネージャを選択することによるか、処置を指示するメッセージをメモリ・マネージャに直接送ることによってのみ、このような制御を得る。
【0207】
virtual_address_space[memory_range]−>vm_map 仮想メモリの新しい範囲を確立する。この呼出しによって、配置、サイズ、保護、継承、オブジェクト・オフセットなどのメモリ範囲の詳細を指定する。この呼出しに対する最も重要なパラメータは、その範囲のための記憶域を二重書きするアブストラクト・メモリ・モデルを暗示するメモリ・オブジェクト・レプリゼンタティブ・ポートと、メモリ・オブジェクトに対して許可されるアクセス・モードである。nullのポートは、システムのデフォルト・メモリ・マネージャを使用することを指定する。デフォルト・メモリ・マネージャは、システムのページング空間に対してページングされ、システム・ブート・ロードの間に持続しない、当初は0で満たされる記憶域を提供する。
【0208】
virtual_address_space[memory_range]−>vm_allocate デフォルト・システム・マネージャを所望する時の、単純化された形のvm_map呼出しである。
【0209】
virtual_address_space[memory_range]−>vm_deallocate メモリ範囲を無効化する。
【0210】
virtual_address_space[memory_range]−>vm_remap 目標タスクのアドレス空間に、task−>taste_createを介して作成されたかのようにメモリ範囲を作成するが、そのプロトタイプ・タスクは、ソース・タスクであり、ソース・メモリ範囲は、VM_INHERIT_SHARE特性を有する。
【0211】
virtual_address_space[memory_range]−>vm_protect あるメモリ範囲に対して許可されるアクセス権をセットする。各メモリ範囲は、現保護マスクと最大保護マスクを有する。ある範囲のメモリ・マネージャは、メモリ・オブジェクト・レプリゼンタティブを介してページの範囲の全ユーザに関して最大保護を指定することができる。その後、各タスクは、許される許可をさらに制限するためのそれ自体の私用最大保護値ならびに、現保護マスクを有する。
【0212】
virtual_address_space[memory_range]−>vm_copy 仮想アドレス空間内のある場所から別の場所へメモリ範囲をコピーする。
【0213】
virtual_address_space[memory_range]−>vm_read メモリ範囲をコピー・アウトする。
【0214】
virtual_address_space[memory_range]−>vm_write メモリ範囲をコピー・インする。
【0215】
virtual_address_space[memory_range]−>vm_msync 仮想メモリの範囲の補助記憶(そのメモリ・マネージャ)へのフラッシュまたはクリーンを強制する。
【0216】
virtual_address_space[memory_range]−>vm_machine_attribute メモリ範囲に対して、計算機固有のハードウェア特性をセットする。
【0217】
virtual_address_space[memory_range]−>vm_reserve メモリの範囲を予約し、これによって、vm_allocate、vm_mapまたはアウトオブライン・メモリ受取りから生じる範囲内のランダム割振りを防止する。vm_deallocateは、範囲を予約解除しない。
【0218】
virtual_address_space[memory_range]−>vm_unreserve メモリの範囲を予約解除する。
【0219】
virtual_address_space[memory_range]−>vm_wire メモリの範囲のページ可能性を指定する。ワイヤリングによって、メモリの範囲が存在し、常駐することが強制される。ワイヤリングされたメモリは、そのタスクのワイヤリング済みカーネル・メモリ限界に対してカウントされる。カーネルは、領域がワイヤリングされる回数のカウントを維持し、そのカウントが0に戻らない限りワイヤリングを解除しない。
【0220】
virtual_address_space[memory_range]−>vm_behavior_set カーネルのページ交換アルゴリズムを案内するヒントとして、通常、ランダム、順次、逆順次など、範囲の期待される使用パターンを指定する。
【0221】
vm_allocate()、vm_map()またはvm_remap()を、VM_ALLOCATE_ANYWHEREフラグ付きで、0の入力目標アドレスを用いて使用する時に、有効メモリ範囲がアドレス0に割り振られる可能性がある。一部のプログラム、特にC言語に基づくプログラムは、値が0のメモリ・ポインタをNULLポインタとみなし、有効なメモリ・バイトを指すポインタでないとみなすので、これらのプログラムは、メモリがアドレス0に割り振られた場合に障害を発生する。パーソナリティ・サーバおよび他のタスクは、各タスクの第1ページが予約されていることを確認することによって、この問題を回避できる。
【0222】
メモリ・オブジェクト
マイクロカーネルを用いると、ユーザ・モード・タスクが、仮想アドレス空間の部分を参照するという動作に関連するセマンティックスを提供できるようになる。これは、アブストラクト・メモリ・オブジェクトによって二重書きされるメモリ範囲の非常駐状態を表すアブストラクト・メモリ・オブジェクトの指定を可能にすることによって行われる。メモリ・オブジェクトを実装するタスクは、そのメモリ・オブジェクトに命名するポートに送られたメッセージに応答する。このタスクを、メモリ・マネージャと呼ぶ。
【0223】
基本操作
ユーザ・モード・タスクによる仮想アドレス空間の操作は、下記の基本形式をとる。
・タスクが、範囲を二重書きするメモリ・オブジェクトに命名するためのメモリ・オブジェクト・レプリゼンタティブ・ポートを指定して、新しいメモリ範囲を確立する(virtual_address_space[memory_range]−>vm_map)。
・タスクが、通常はこのメモリ範囲の一部を変更することによって、その部分を参照しようと試みる。その部分は、まだメモリ内に存在していないので、参照を行うタスクは、ページ不在障害を受け取る。カーネルが、その範囲のアブストラクト・メモリ・オブジェクトに、存在していないデータを要求するメッセージを送る。アブストラクト・メモリ・オブジェクトからの応答によって、要求元タスクのページ障害が解決される。
・最終的に、おそらくはクライアント・タスクによって修正された値を有するメモリ範囲の常駐ページが、メモリから追い出される。ページは、後処理のため、その範囲のアブストラクト・メモリ・オブジェクトへのメッセージで送られる。ページャは、カーネルに、ダーティ・ページだけを返すように命じるか、クリーン・ページも返すように命じることができる。
・クライアント・タスクが、virtual_address_space[memory_range]−>vm_deallocateを使用して、メモリ範囲を確立解除する。このメモリ・オブジェクトのすべてのマッピングが消滅した時に、このアブストラクト・メモリ・オブジェクトが終了する。
【0224】
カーネルは、さまざまなメモリ・オブジェクトの内容のための直接アクセス可能キャッシュとして、メイン・メモリを使用するものとみなされなければならない。あるメモリ・オブジェクトの常駐ページを含むキャッシュの部分を、メモリ・キャッシュ・オブジェクトと呼ぶ。カーネルは、ふさわしいと思われる形でこのキャッシュを満たし、フラッシュして、このキャッシュを維持するためにさまざまなメモリ・マネージャと共にダイアログにかかわる。このダイアログは、一般に、非同期メッセージからなる。というのは、メモリ・マネージャによってカーネルを機能停止させることができず、メモリ・マネージャは、その動作の並行性を最大にすることを望むからである。カーネルのメッセージは、アブストラクト・メモリ・オブジェクト・ポートを介してメモリ・マネージャに送られる。カーネルへのメッセージは、カーネルのメモリ・キャッシュ制御ポートを介して送られる。カーネルによって送られるメッセージは、サーバ・インターフェースというラベルを付けられたルーチンを使用して送られる。メモリ・マネージャによって送られるメッセージは、通常メッセージ関数というラベルを付けられたルーチンを使用して送られる。
【0225】
クライアントのvm_map呼出しで指定されたメモリ・オブジェクト・レプリゼンタティブ・ポートによって、アブストラクト・メモリ・オブジェクト・ポートが暗示される。このポートは、そのアブストラクト・メモリ・オブジェクトを実装するメモリ・マネージャ・タスクに命名する。各アブストラクト・メモリ・オブジェクトは、そのメモリ・オブジェクトの常駐ページのキャッシュを表す関連常駐カーネル・メモリ・キャッシュ・オブジェクトを有する。メモリ・キャッシュ・オブジェクトは、メモリ・マネージャがこのメモリ・キャッシュ・オブジェクトを制御し、オブジェクトに代わってカーネル要求に応答できるようにメモリ・マネージャに供給される関連制御ポートを有する。カーネルは、メモリ・キャッシュ・オブジェクトを参照するためにクライアント・タスクが使用するための、メモリ・キャッシュ・オブジェクトの名前ポートも生成する。名前ポートは、virtual_address_space[memory_address]−>vm_regionによって返される。アブストラクト・メモリ・オブジェクトが、複数のホスト上のタスクによってマッピングされる場合、各ホスト上に、メモリ・キャッシュ・オブジェクト用の1つの制御ポートと1つの名前ポートが存在する。
【0226】
メモリ・キャッシュ・オブジェクト内の各ページは、アブストラクト・メモリ・オブジェクト内のオフセットを表す。メモリ・オブジェクトのオフセットは、vm_map呼出しでクライアントによって指定されたオブジェクト・オフセットに、ページ長の整数倍を加えた値である。クライアントは、vm_mapに任意のオフセットを指定できることに留意されたい。したがって、1つのメモリ・オブジェクトが、クライアントによって指定された異なるオフセット値のために、メモリ内にそのデータの複数のコピーを有する可能性がある。しかし、カーネルは、これらのコピーの間のデータ一貫性を維持しない。
【0227】
図6は、クライアントから可視の仮想メモリ構造を示す図である。3つのメモリ範囲があり、そのうちの2つは、同一の二重書きアブストラクト・メモリ・オブジェクトを有するが、おそらくは継承属性または保護属性が異なる。メモリ・キャッシュ/アブストラクト・メモリ・オブジェクト対のうちの1つを、読取りアクセスと読み書きアクセスを表す2つのメモリ・オブジェクト・レプリゼンタティブと、メモリ・マネージャ・タスクと共に詳細に示す。予約されているが未割り振りの領域は、図示しない。その領域は、予約フラグと継承属性だけを用いてマークされるはずである。他の属性は適用されない。
【0228】
メモリ管理の初期設定
メモリ・オブジェクト初期設定の結果、メモリ・マネージャのアブストラクト・メモリ・オブジェクト(補助記憶)が、カーネルのメモリ・キャッシュ・オブジェクト(メモリ・イメージ)にバインドされる。メモリ・マネージャは、カーネルが後続の操作メッセージを送るのに使用するアブストラクト・メモリ・オブジェクト・ポートをカーネルに通信する。カーネルは、メモリ・マネージャに、マネージャが後続の操作メッセージを送るのに使用するメモリ・キャッシュ制御ポートを通信する。
【0229】
アブストラクト・メモリ・オブジェクト・ポートは、特別に設計されたプロトコルに従ってカーネルがメッセージを送るポートである。クライアントがこのポートへのアクセス権を有することは有害である可能性がある。というのは、メモリ・マネージャを混乱させる可能性があるからである。たとえば、クライアントは、アブストラクト・メモリ・オブジェクト・ポートを介してメッセージの無効なシーケンスを送る可能性があるが、このアブストラクト・メモリ・オブジェクト・ポートに対して、メモリ・マネージャは十分な保護を有しない。この理由と、メモリ・オブジェクトへのアクセス権を制御するために、メモリ・マネージャは、通常は、カーネル以外にはアブストラクト・メモリ・オブジェクト・ポートを配布しない。その代わりに、クライアントには、メモリ・オブジェクト・レプリゼンタティブ・ポートへの送出権が与えられ、これによって、関連するアブストラクト・メモリ・オブジェクト・ポートと、関連するメモリ・オブジェクトへの許可されるアクセス・モードの関連する組が暗示される。
【0230】
アブストラクト・メモリ・オブジェクト・ポートとメモリ・オブジェクト・レプリゼンタティブ・ポートのどちらもが、通常のマイクロカーネル・ポートである。すなわち、これらのポートの受取り側は、カーネルではなくマイクロカーネル・タスクである。
【0231】
クライアントが、メモリ・オブジェクト・レプリゼンタティブ・ポートによって表されるオブジェクトのIDをまだ知らないカーネルに、vm_mapを介してメモリ・オブジェクト・レプリゼンタティブ・ポートを指定する時には、カーネルが、その代理ポートを使用して、特殊なダイアログにかかわる。カーネルが、関連するオブジェクトのIDを知らない場合、このvm_map呼出しを、メモリ・マネージャとの対話なしで直接に実行することができる。vm_map呼出しは、カーネルに、メモリ・キャッシュ制御ポートへの送出権を含むmemory_object_representative(host_name)−>memory_object_notifyメッセージを送らせる。その後、このメモリ・キャッシュ制御ポートに、デフォルトの属性が割り当てられる。memory_object_establishメッセージが送られるまでは、このポートが完全に確立されたとみなしてはならず、その属性が正しくセットされているとみなしてはならない。
【0232】
vm_mapの結果としてカーネルによるのではなく、代理ポートを保持するクライアントによって、誤ったmemory_object_notifyメッセージが生成されている可能性があるので、メモリ・マネージャは、このメッセージに直接には応答せず、その代わりに、通知メッセージで供給されたホスト名前ポートに応答メッセージを送る。メモリ・マネージャは、mach_host_selfを検査するか、名前サーバに問い合わせるかのいずれかによって、これがホスト名前ポートであるかどうかを検証できる。ホスト名前ポートが有効であることを検証した後に、メモリ・マネージャは、アブストラクト・メモリ・オブジェクト・ポートおよびオブジェクト属性ならびに、この代理を使用してマッピングを試みるタスクが有する必要のある、メモリ・オブジェクト・レプリゼンタティブによって許可されるアクセス権と制限付きのIDが存在するならばそれらを指定する、host_name(memory_cache_control)−>memory_object_establishを用いて応答する。メモリ・オブジェクト・レプリゼンタティブ・ポートをアブストラクト・メモリ・オブジェクト・ポートとして指定することは許容可能であるが、これによって、マネージャに関する潜在的な脆弱さが導入される。オブジェクト属性を用いると、オブジェクト・キャッシュ属性および下で説明するコピー戦略ならびに他の性能属性および特殊属性の指定が可能になる。これらの属性は、後程、memory_cache_control−>memory_object_change_attributesを用いて変更でき、memory_cache_control−>memory_object_get_attributesを用いて調べることができる。
【0233】
マネージャには、このメッセージ内のメモリ・キャッシュ制御ポートが含まれることに留意されたい。制御ポートは、代理ポートのこの使用のために特別に作成されたので、他のタスクに与えられてはおらず、したがって、マネージャによって、マネージャ自体をカーネルに認証させる、すなわち、マネージャがmemory_object_notifyメッセージの受取り側であることを検証するのに使用することができる。クライアントが元のmemory_object_notifyメッセージを偽造したので、カーネルがmemory_object_establishメッセージを期待していなかった場合には、カーネルは、abstract_memory_object−>memory_object_rejectedを用いて応答する。これによって、マネージャに、マネージャがメモリ・キャッシュ制御ポートとして識別したポートが実際にはそうでないことが知らされる。メモリ・マネージャは、どの情報もクライアントに漏らさない。マネージャは、単に、それを予期していなかったか受け入れなかったカーネルに余分なメッセージを送るだけである。
【0234】
ホスト名前ポートとメモリ・キャッシュ制御ポートを含むシーケンスによって、カーネルにメモリ・マネージャが認証され、メモリ・マネージャにカーネルが認証される。これは、メモリ・マネージャの、メモリ・マネージャに与えられた名前ポートを認証する能力に依存する。カーネルからマネージャへのダイアログに干渉するために、仲介物が、マネジャに、ホスト名前ポートではなく、他の名前ポートを提示するはずである。これが機能するためには、マネージャが、与えられた名前ポートを認証しないか、マネージャの使用する認証サービスが、マネージャに与えられた名前ポートの信憑性を保証しないかのいずれかでなければならない。前のシーケンスは、まだカーネルに知られていないメモリ・オブジェクトの初期設定に関する。これは、カーネルに、vm_mapを介して、カーネルが知らないメモリ・オブジェクト・レプリゼンタティブ・ポートが提示された時に必ず呼び出される。この代理の下にあるメモリ・オブジェクトは、カーネルに知られている可能性がある。すなわち、カーネルは、その関連を知らないだけであり、したがって、カーネルは、この代理が新メモリ・オブジェクトの初期設定を暗示すると仮定しなければならない。メモリ・オブジェクトを初期設定する場合、同一のカーネルからの後続のmemory_object_notifyメッセージのために、メモリ・マネージャは、host_name(memory_cache_control)−>memory object representativeを用いて応答する。この呼出しは、アブストラクト・メモリ・オブジェクト・ポートおよびこの代理に関して許可されるアクセス・モードならびに、この代理を使用してマッピングを試みるタスクが有する必要のある制限されたIDがあるならばその制限されたIDを供給するだけである。カーネルは、このメッセージを受け取る時に、供給された冗長なメモリ・キャッシュ制御ポートを破壊する。メモリ・オブジェクト・レプリゼンタティブ用のメッセージ・インターフェース・ジェネレータ(MIG)スタブが、最適化として送出権を移動し、その結果、マネージャは、明示的にその権利を破棄する必要がなくなる。
【0235】
memory−object−representativeメッセージが、メモリ・オブジェクトの終了と競合する可能性がある。これが発生するのは、マネージャがそのメモリ・オブジェクトを初期設定しなければならないと信じているが、もうその必要がない時である。このような場合には、カーネルが、メモリ・オブジェクト・レプリゼンタティブ・メッセージを破棄する。というのは、そのオブジェクトが、カーネルの視点からは初期設定されていないからである。マネージャは、アブストラクト・メモリ・オブジェクト・ポート上のmemory_object_terminateメッセージの存在によって、この状況を検出する。カーネルは、メモリ・オブジェクト・レプリゼンタティブ・メッセージを破棄する時に、memory_object_notifyメッセージを再送出する。マネージャは、memory_object_establishを用いてもう一度応答しなければならない。
【0236】
一般的な規則として、メモリ・オブジェクトが未初期設定であることをマネージャが知っている(すなわち、オブジェクトが一度も初期設定されていないか、マネージャがmemory_object_terminateを見た)のでない限り、マネージャは、memory_object_notifyに対してメモリ・オブジェクト・レプリゼンタティブを用いて応答しなければならない。クライアントがmemory_object_notifyメッセージを偽造したのでカーネルがメモリ・オブジェクト・レプリゼンタティブ・メッセージを期待していない場合、カーネルは、単にこれを無視する。マネージャがこのメッセージを送ったという事実は、そのメモリ・オブジェクトが初期設定されたとマネージャが信じていることを意味する。マネージャが応答したmemory_object_notifyメッセージは、マネージャに情報を提供しなかった。カーネルは、代理とアブストラクト・オブジェクトの関連をいつでも忘れることができる。カーネルがメモリ・オブジェクト・レプリゼンタティブ・メッセージを無視する時には、カーネルがそれを受け入れ、その後即座にその関連を忘れた場合と同一である。このシーケンスが完了した後に、メモリ・マネージャは、このメモリ・オブジェクトの代わりに要求に応答する準備を整えなければならない。
【0237】
メモリ・キャッシュ・オブジェクトも、vm_regionを介してクライアントに供給される名前ポートを有する。マネージャは、memory_object_get_nameを用いてこのポートを取得できる。
【0238】
基本的なページ操作
カーネルは、abstract_memory_object−>memory_object_data_requestを用いて、メモリに関するデータを要求する。通常、カーネルは、1時に1ページだけを要求し、供給する。カーネルは、メモリ領域のセット挙動によって変化する量の複数のページに1時に作用する権利を保留する。メモリ・マネージャは、各転送(データ返し)に好ましいページ数を指定する、メモリ・オブジェクトのクラスタ・サイズをセットできる。1時に何ページが実際に転送されるかは、さまざまな要因に影響される。
【0239】
メモリ・マネージャは、memory_cache_control−>memory_object_data_supplyを用いて、要求されたデータを供給する。この呼出しでは、データに関する最小限のアクセス保護も指定される。メモリ・マネージャは、エラーのためにデータを供給できない場合に、memory_cache_control−>memory_object_data_errorを用いて応答する。この場合、カーネルは、このデータを待っているすべてのスレッドに、メモリ障害例外をとらせる。メモリ・マネージャは、この代わりに、memory_cache_control−>memory_object_data_unavailableを用いて応答することができる。この場合、カーネルは、存在していないデータについて0で満たされたページを供給する。メモリ・マネージャは、memory_cache_control−>memory_object_data_supplyを使用して、要求されたか否かにかかわらず、カーネルによってキャッシュされないページを提供することができる。
【0240】
カーネルが、メモリ・オブジェクトに属するメモリ・ページのいくつかをフラッシュすると決定した時には、修正されたページが、abstract_memory_object−>memory_object_data_returnを介して、メモリ・マネージャへのメッセージ内でアウトオブライン・データとして送られる。この処理では、カーネルがページの仮想コピーを送り、効果的に、物理メモリ・ページを、メモリ・オブジェクトに関連する常駐ページから、デフォルト・メモリ管理される一時オブジェクトに関連するページに変換する。この方法では、メモリ・マネージャがこれらのページを適度な時間内に宛先に移動できない場合に、カーネルが、デフォルト・メモリ・マネージャを使用してこれらの一時ページを追い出すことができる。デフォルト・メモリ・マネージャは、これらをページング記憶域にページングするが、まだメモリ・マネージャがこれらをアクセスすることを許可する。通常、メモリ・マネージャは、受け取ったアウトオブライン・メモリを扱うのと同様に、これらのページを装置またはファイル・システムにコピーした後に、vm_deallocateを使用してこれらをそのアドレス空間から解放する。
【0241】
ページが追い出されたならば、カーネルは、いつでも、おそらく即座に、もう一度それらのページを要求することができる。メモリ・マネージャ、特にマルチスレッド式のメモリ・マネージャは、バック・ツー・バック・データ返しと、同一ページに関するデータ要求メッセージに対してそのメモリ・マネージャ自体を保護しなければならない。この状況の説明については、Server Writer’s Guideを参照されたい。
【0242】
クリーンインプレース(Clean−in−Place)
カーネルは、メモリ・マネージャにページを返す(すなわち、追出し、クリーニングまたはフラッシュ)時に、複数の問題に直面する。
・マネージャが適度な時間内にページを除去しない場合に、カーネルが、それらのページを一時補助記憶に追い出す用意をしておかなければならない。
・カーネルは、単一のページに関する追出し決定を行う。効率のため、カーネルは、マネージャに複数のページを返そうと試み(追出しはしない)、その結果、マネージャがその補助記憶内の複数のページを1回で更新できるようにする。追加のページは、それらをマッピングするタスクからアクセス可能なままでなければならない。原則的に、マネージャは、返されたページを変更できる。これらは、通常のアウトオブライン・メモリとして見える。カーネルは、ページの書込み可能なコピーを作成する用意をしておかなければならない。
【0243】
カーネルは、ページ返し機構を最適化するために最善をつくす。最大の性能が達成されるのは、マネージャがページを修正せず、ページの後処理を行うと信頼できる時である。下記の条件が成り立つ場合に、内部的にクリーンインプレースと呼ばれる特殊な高性能機構が、カーネルによって使用される。
・メモリ・マネージャが、メモリ資源消費に関して特権を与えられ、ホスト名前ポートではなくホスト制御ポートにmemory_object_establish_privメッセージを送ることによってこの特権を主張する。
・メモリ・マネージャが、メモリ・キャッシュ・オブジェクトと同一のホスト(ノード)にある。
・メモリ・マネージャが、ページを修正しない。
【0244】
これらの特殊機構の使用は、データ返しのセマンティックスに影響する。というのは、メモリ・マネージャが、返されたページに関してabstract_memory_object−>memory_object_data_requestが受け入れられる時を、カーネルに明示的に示さなければならないからである。さらに、カーネルは、メモリ・マネージャが、返されたページを時宜を得た形で割振り解除することを期待する。
【0245】
メモリ・オブジェクトの終了
すべてのタスクがメモリ・オブジェクト・レプリゼンタティブに関するマッピングを除去した時に、カーネルが、下層にあるアブストラクト・メモリ・オブジェクトに対するその代理の関連を破棄する。メモリ・マネージャは、通知をうけない。メモリ・マネージャは、いつでも代理に関するmemory_object_notifyメッセージを受け取る用意を整えていなければならない。後続のmemory_object_notifyメッセージのそれぞれに、独自のメモリ・キャッシュ制御ポートが含まれる。すべてのタスクが下層にあるアブストラクト・メモリ・オブジェクトに関するマッピングを除去した時に、カーネルが、abstract_memory_object−>memory_object_terminateを用いてメモリ・マネージャに情報を伝える。そのオブジェクトが一時属性を有するのでない限り、カーネルは、メモリ・キャッシュ・オブジェクトを実際に終了させ、終了メッセージを送る前に、そのオブジェクトのすべてのページを追い出す。終了メッセージによって、メモリ・キャッシュ制御ポートに関する受取り権が、マネージャに送られ、その結果、マネージャは、カーネルがオブジェクトを終了させた後、マネージャが終了メッセージを受け取る前に、そのマネージャがそのポートに送ったすべてのメッセージを取得できるようになる。
【0246】
メモリ・マネージャは、memory_cache_control−>memory_object_destroyを用いて明示的に、または、アブストラクト・メモリ・オブジェクト・ポートを破壊することによって暗黙のうちに、カーネルがメモリ・キャッシュ・オブジェクトを破壊することを要求することができる。前者の場合、カーネルは、abstract_memory_object−>memory_object_terminateを用いて応答する。そのメモリ・オブジェクトの現在および将来の要求は、すべてエラーになる。破壊の後に、カーネルは、随意にメモリ・キャッシュ・オブジェクトの常駐ページを破棄することができる。
【0247】
メモリ・オブジェクトがmemory_object_establishによって初期設定される時または、その後memory_object_change_attributesによって変更される時にセットされるオブジェクト属性のうちの1つが、オブジェクト・キャッシュ属性である。この属性がセットされていると、代理−アブストラクト・オブジェクトの関連を解消したり、すべてのマッピングが除去された時にメモリ・オブジェクトを終了させ、これによってすべてのキャッシュ・ページを追い出すのではなく、メモリ・オブジェクトが、小さなカーネル・オブジェクト・キャッシュに入れられる。あるタスクがこの時間の間にそのオブジェクトをマッピングする場合、そのオブジェクトは、追加のmemory_object_notifyメッセージなしで生きたままになる。オブジェクトがオブジェクト・キャッシュから出る前にタスクがそのオブジェクトをマッピングしない場合、そのオブジェクトは終了する。メモリ・オブジェクトがこのマッピングされない状態である間にオブジェクト・キャッシュ属性がクリアされた場合、そのメモリ・オブジェクトは、直ちに終了する。この属性の変化には、この影響があるので、memory_object_change_attributesは、任意選択として、同期化に使用することができる応答(reply_port−>memory_object_change_completed)を返すことができる。
【0248】
補助記憶との同期化
メモリ・オブジェクトのクライアントは、そのメモリ・オブジェクトに対して行われた変更が、補助記憶上で反映されることを知る必要があることがしばしばである。このクライアントは、メモリ範囲に対してvm_msyncを実行することによってそのような要求を行う。カーネルの応答は、マネージャに対してページの組をクリーンまたはフラッシュすることと、マネージャと共に同期化ダイアログにかかわることである。カーネルの応答は、クライアントがvm_msyncに与えたフラグと、メモリ・オブジェクトの無効化属性の値に依存する。範囲をクリーンまたはフラッシュした後に、カーネルは、メモリ・オブジェクト範囲ならびにクライアントのフラグを指定するabstract_memory_object−>memory_object_synchronizeを送る。これらのフラグのうちの1つが、非同期フラグである。これがセットされている時には、クライアントは、ページを補助記憶に待ち行列化させることだけに関心を持つ。そうでない場合、クライアントは、実際に補助記憶にあるページに関心を持つ。マネージャは、所望の効果を達成した時に、memory_cache_control−>memory_object_synchronize_completedを用いて応答する。クライアントは、その時点でvm_msync呼出しからリターンする。memory_object_synchronize_completedに指定された範囲は、対応するmemory_object_synchronizeメッセージの範囲と一致しなければならない。カーネルは、未処理の同期要求を1度に複数有することができるが、オーバーラップする要求を未処理状態にすることは絶対にない。
【0249】
プレシャス・ページ(Precious Pages)
基本データ管理プロトコルでは、カーネルは、物理メモリ・キャッシュ内にある間に修正されたページだけをメモリ・マネージャに返す。追い出される時、純粋な無修正のページは、メモリ・マネージャがコピーを有するという前提に基づいて破棄される。ディスク・ファイルを補助記憶として使用し、その空間がページごとに補助記憶上に常に割り振られるマップド・ファイル・メモリ・マネージャの場合、これは最も合理的な手法である。しかし、ネットワーク共用メモリ・サーバや他の専用サーバなど、仮想メモリを補助記憶として使用するマネージャの場合、これは非効率的である。マネージャとカーネルの両方が、使用中のページを保持する。ページをカーネルに供給する時にそのページをプレシャス(貴重)として指定することによって、メモリ・マネージャがコピーを保持する必要がなくなる。カーネルは、追出し時にページ返しをコミットする。ページをプレシャスとして指定する能力は、memory_object_data_supply呼出しに対するオプションとして使用可能である。メモリ・マネージャは、データ供給呼出しからの応答を要求することによって、これらのページの受諾について情報を得ることができる。この応答reply_port−>memory_object_supply_completedによって、どのページが受け入れられたかが示される。この応答は、供給されたページの拒絶から生じるデータ返しメッセージのすべての後に続く。memory_object_data_returnメッセージでは、修正されたページならびにプレシャス・ページの両方が、その状態を示すフラグと共に返される。
【0250】
直接キャッシュ操作
時には、メモリ・マネージャが、ページを強制的にフラッシュしたり、保護を変更することを必要とする場合がある。これは、memory_cache_control−>memory_object_lock_request呼出しを用いて行われる。この呼出しは、カーネルに、実行すべき動作について知らせる。完了した時に、カーネルは、memory_object_lock_request呼出しで命名された応答ポートを使用して、reply_port−>memory_object_lock_completedを用いて応答する。
【0251】
memory_object_lock_requestの主目的は、分散メモリ・サーバやトランザクション保護メモリなど、ページに対するアクセス権の設定と取消しを含むメモリ管理プロトコルをサポートすることである。あるスレッドが、memory_object_data_supplyまたはmemory_object_data_unavailableを用いてセットされた許可によって現在許可されるものでない方法でページをアクセスしようと試みる場合、カーネルは、abstract_memory_object−>memory_object_data_unlockを用いてメモリ・マネージャにメッセージを送る。メモリ・マネージャは、この要求を受ける場合に、memory_object_lock_requestを用いて応答して、新たに許される許可を指定する。単一クライアントの場合、メモリ・マネージャは、memory_object_lock_requestによってカーネルに範囲をフラッシュさせることによって要求を拒絶することができ、カーネルがそのデータを再取出しする時に、メモリ・マネージャは、memory_object_data_errorを用いて応答することができる。
【0252】
memory_object_lock_requestのシーケンスも、メモリ・マネージャが主導して開始することができる。この呼出しは、カーネルが修正されたページまたはプレシャス・ページのすべてをマネージャに返すことを必要とし、fsync動作中など、マネージャがページの最新コピーを必要とする時には、カーネルに書込み許可を取り消すように要求することもできる。メモリ・マネージャは、ページのすべてをメモリ・キャッシュからフラッシュするようにカーネルに要求することもできる。
【0253】
仮想コピーの最適化
下記は、メモリの範囲が論理的にコピーされる、マイクロカーネル・システム115内の3つの状況である。
・メモリ範囲がVM_INHERIT_COPY継承属性を有し、このタスクから新タスクが作成される時。
・vm_copyによって、アドレス空間の1部分がその空間の別の部分にコピーされる時。
・メモリ範囲が、マイクロカーネル・メッセージ内で仮想アウトオブライン領域として渡される時。これには、vm_read動作とvm_write動作が含まれる。
【0254】
これらの状況は、頻繁に発生する。コピー継承メモリは、新プロセス作成に関するPOSIX(Portable Operating System Interface For Computer Environmentsの略)のforkセマンティックスをサポートするのに使用される。アウトオブライン・メモリは、通常のメッセージの場合には一般的でないが、外部メモリ・マネージャ、デバイス・インターフェースおよび、特にファイル・システムのサポートに重要である。
【0255】
これらの動作は、直接共用の代わりに論理コピーとして定義することができる。というのは、マイクロカーネル仮想メモリが、仮想コピー最適化を提供するからである。これらの最適化が行われると、メモリ全体がコピーされるのではなく、データをコピーする必要が生じた時に限って、遅延評価方式でメモリがコピーされる。データのコピー動作は、下記のさまざま理由から延期することができる。
・データの一部が実際には参照されない。
・データの一部をどのタスクも修正せず、したがって、すべてのタスクが、未修正データの同一のメモリ・イメージを効率的に共用できる。
・データ・コピーを要求するタスクが、そのマッピングを削除し、このため、カーネルが、そのコピーを移動とみなすことができ、これは、ページ・コピーではなくページ再マッピング(ページ・スチール)に最適化することができる。これに関連する可能性として、データの受取り側がもう一度そのデータをコピーし、データを見ることもせずにそのマッピングを削除する場合がある。
【0256】
その一方で、これらの最適化は、純粋に内部的であり、したがって、本明細書で説明するマイクロカーネル・セマンティックスの一部ではない。しかし、これらの最適化は周知である。これらは、多くのインターフェース、特に外部メモリ・マネージャ・インターフェースの、ユーティリティに一体化された部分である。
【0257】
カーネルが、アウトオブライン・データのために仮想メモリ・システムを使用するという事実のおかげで、リストを返すさまざまなカーネル・プリミティブが、アウトオブライン・データを返すことによってリストを返せるようになる。これは、内部的なvm_allocate動作によって達成される。これらの最適化は、インターフェースの仕様の重要な部分すなわち性能特性を形成する。仮想コピーの参照によって、元のメモリ・オブジェクトからページが取得され、これによって、そのオブジェクトのメモリ・マネージャとの相互作用が生じる可能性がある。参照を行うタスクの挙動は、特にメモリ・マネージャがカーネルのページ要求に応答しない場合に、影響を受ける可能性がある。
【0258】
メモリの範囲をコピーする時には、カーネルが、仮想的にコピーされるページを表現するために、新しいアブストラクト・メモリ・オブジェクトとメモリ・キャッシュ・オブジェクトを作成する。新メモリ・キャッシュ・オブジェクト(コピーの宛先)は、物理メモリ・ページが修正されないと仮定すると、旧メモリ・キャッシュ・オブジェクト(コピーの源)と、実際の物理メモリ・ページを共用することができる。旧オブジェクトは、この仮想コピーによって影響を受けない。旧オブジェクトは、同一のアブストラクト・メモリ・オブジェクトおよび同一の関連メモリ・マネージャと関連したままになる。そのページはそれ自体のものであり、ふさわしいと思われる場合に使用される。
【0259】
新メモリ・オブジェクトは、旧メモリ・オブジェクトのコピーされた範囲内のページのすべての仮想コピーを受け取るが、この動作の可視の仕組みは、それほど単純ではない。これらは、下で述べるように、旧オブジェクトに関する、オブジェクト作成時にmemory_object_establishによってセットされるか、その後にmemory_object_change_attributesによってセットされるコピー戦略の値によって制御される。
【0260】
通常のメモリ・オブジェクトのページは、タスクのアドレス空間にマッピングされた時に修正することと、そのタスクによる直接メモリ参照によって操作することだけが可能である。これが1つのホスト上だけで発生し得る場合、メモリ・オブジェクトのページに対する修正のすべてが、そのホスト上で発生し、カーネルに完全に可視である(カーネルはそのメモリ・キャッシュ・オブジェクトを維持するので)。この場合、メモリ・マネージャは、そのメモリ・オブジェクトのコピー戦略を、MEMORY_OBJECT_COPY_DELAYすなわち標準的なコピー・オン・ライト最適化にセットする。新メモリ・オブジェクトは、デフォルト・メモリ・マネージャによって管理される一時オブジェクトとして作成される。旧オブジェクトと新オブジェクトの挙動は、次の通りである。
・新メモリ・オブジェクトと旧メモリ・オブジェクトの両方が、現在メモリ内にあるページを共用する。
・新オブジェクトの、メモリ常駐でなく、また下で述べるようにプッシュされていないページが参照される場合、データを求めて、旧アブストラクト・メモリ・オブジェクトにメッセージが送られる。メモリ・マネージャは、この要求を、旧メモリ・オブジェクトに対する参照と区別できない。取り出されるページは、旧メモリ・オブジェクトと新メモリ・オブジェクトによって共用される。
・旧オブジェクトのページが、旧オブジェクトまたは新オブジェクトのいずれかに対する修正参照の試みによって修正される(これらが現在物理メモリ・ページを共用しているので)場合、カーネルは、まず、そのページの未修正の値を新オブジェクトにプッシュし、その結果、新オブジェクトに、そのページの元のデータのコピーが見えるようにする。
・プッシュされたページは、デフォルト・メモリ・マネージャによって管理される。
【0261】
ネットワーク共用メモリやメモリ・マネージャによる直接アクセスなど、単一のホスト上のカーネルに可視でない形で旧メモリ・オブジェクトを修正できる場合、代替コピー戦略が必要である。これを理解するために、下記のシナリオを検討されたい。
・仮想コピーが要求される。しかし、その範囲のあるページが、コピーを行うホスト上のメモリ内にない。
・他のホスト上に常駐する範囲のページが修正される。
・コピーを行うホスト上の新(コピー)メモリ・オブジェクトが、ページに関する要求を行う。このオブジェクトは、仮想コピーの時点でそのページが有していたはずの値ではない、新しい値を受け取る。
【0262】
最適化を使用不能にするために、MEMORY_OBJECT_COPY_NONE戦略を提供する。MEMORY_OBJECT_COPY_NONEは、メモリ・マネージャが知的な形で正しいセマンティックスを実施できない時に使用される。仮想コピーの時点で、カーネルは、デフォルト・メモリ・マネージャによって管理される一時オブジェクトとして、新メモリ・オブジェクトを構成する。新メモリ・オブジェクトの内容は、その時点で旧メモリ・オブジェクトから明示的にコピーされ、したがって、その時点で、メモリ・マネージャからすべてのページが要求される。
【0263】
MEMORY_OBJECT_COPY_NONE戦略を使用すると、積極的なコピーが実行されるので、メモリ管理の性能に悪影響を及ぼす可能性がある。メモリ・オブジェクトが、メモリ・キャッシュを無効化する形で操作されるが、メモリ・マネージャが、これらの操作が発生する時を完全に把握し、制御する場合、そのメモリ・マネージャは、memory_object_lock_request呼出しに対する強制コピー・オプションの助けを借りて、MEMORY_OBJECT_COPY_DELAY戦略を使用することができる。このオプションは、メモリ・マネージャが、カーネルのキャッシュを無効化しようとしていることを認識した時に、そのメモリ・マネージャが使用することができる。このオプションを指定すると、カーネルは、メモリ・オブジェクトの指定された範囲の遅延コピーのすべてを積極的に評価するようになる。
【0264】
デフォルト・メモリ・マネージャ
デフォルト・メモリ・マネージャは、無名メモリ(vm_allocate、メモリ・コピーなど)のための補助記憶を提供する。これは、最後の手段のメモリ・マネージャであり、障害を発生してはならないメモリ・マネージャである。このためにページングを提供できるメモリ・マネージャは存在しないので、デフォルト・メモリ・マネージャはメモリにワイヤリングされ、これに渡されるメモリのすべてがワイヤリングされる。このメモリ・マネージャは、そのメモリをすばやく処理しなければならず、メモリが補助記憶にページ・アウトされる時には、そのメモリが効果的にワイヤリングされているので、これをすばやく破棄しなければならない。あるホストのデフォルト・メモリ・マネージャのセットと問い合わせは、host_control−>vm_set_default_memory_managerによって行われる。
【0265】
デフォルト・メモリ・マネージャによって二重書きされるメモリは、さまざまな方法で作成できる。これらの作成には、デフォルト・メモリ・マネージャが直接に関係するわけではない。カーネルが、新デフォルト・メモリ・オブジェクトに関して明示的にデフォルト・メモリ・マネージャに情報を与えなければならない。これは、default_pager−>memory_object_createによって行われる。特権タスクは、default_pager−>default_pager_object_createを用いて、デフォルト・ページャによって管理されるメモリ・オブジェクトを作成することもできる。
【0266】
デフォルト・メモリ・マネージャは、仮想コピー範囲を表すためにカーネルによって作成された一時メモリ・オブジェクト用の補助記憶を提供する。これらの一時オブジェクトは、追加動作を適用される。元のオブジェクトからのあるページが、一時オブジェクトにプッシュされる時に、プッシュされるデータが、abstract_memory_object−>memory_object_data_initializeを用いてデフォルト・マネージャに供給される。この追加プリミティブの理由は、カーネルが、コピーにプッシュするページの範囲を完全には追跡しないからである。コピー・ページがページ・アウトされる場合、元のオブジェクトの後続の修正によって、修正された元のページがもう一度プッシュされる。デフォルト・メモリ・マネージャが、1ページに関する複数のプッシュ・メッセージ(memory_object_data_initialize)を受け取ることも有り得る。このマネージャは、それらのうちの最初のメッセージ以外をすべて無視しなければならない。memory_object_data_initializeが呼び出されるのは、ページがコピーにプッシュされる時だけであり、コピーのページ自体が変更される場合には、修正されたページが、memory_object_data_returnを用いてマネージャに送られることに留意されたい。
【0267】
デフォルト・メモリ・マネージャは、一度もプッシュされていないコピーのページを要求される可能性がある。まだ存在しないページに関するマネージャの応答は、memory_object_data_unavailableを呼び出すことである。0のページを作成するのではなく、この呼出しでは、元のオブジェクトから適切なページをコピーする。すなわち、初期化メッセージがないので、元のページは修正されていないことになる。
【0268】
パートB 発明の詳細な説明
本発明は、マイクロカーネル・アーキテクチャおよびマイクロカーネル構造のためのメモリ管理方法である。本発明は、特殊オブジェクトとしてメモリ内でカーネルによって定義されるテンプレート領域を特徴とする。マイクロカーネルには、スレッド、タスク、IPCポート空間、例外空間および仮想アドレス空間マッピングを表す、カーネルのタスク仮想アドレス空間内のデータ構造が含まれる。スレッドを表すデータ構造には、スレッドが例外状態を取り込み、スケジューリングおよび優先順位情報を提供できるようにする情報が記憶される。タスクを表すデータ構造によって、実行中のスレッドから使用可能な資源が記述される。IPCポート空間を表すデータ構造によって、そのタスク用のポート変換に対するポート名が記述される。例外空間を表すデータ構造によって、タスク内で例外を処理する方法が記述される。仮想アドレス空間マッピングを表すデータ構造によって、マイクロカーネル・システム115のメモリ管理ユニットをプログラミングするためのデータが記述され、維持される。マイクロカーネル120には、計算機依存のPMAP層を管理するためのデータ構造も含まれ、これによって、あるタスクに関する物理アドレスへの仮想アドレスの変換を計算機依存の形で表現するデータが維持される。マイクロカーネルによって管理されるPMAP層によって、ページアウト条件の場合にページ・フレームを現在記述しているPMAPのすべてを使用不能にするための、物理メモリ・フレームに関するデータが維持される。
【0269】
このメモリ管理方法では、マイクロカーネル120は、ホスト多重プロセッサ100のメモリ102にロードされた後に、図3に示されたものなどの、メモリ内のタスク・コンテナの作成を開始することができる。タスクをタスク・コンテナと呼ぶのは、タスクのスレッドがその中で動作することのできる仮想メモリ空間の定義、これらのスレッドから使用可能なデータの定義または表現、および、タスクのスレッドがそれを介してシステム内の他のスレッドと通信することのできる通信ポートの表現など、タスクに関連するスレッドによる使用のために使用可能になるはずの資源を表すからである。
【0270】
メモリ管理方法は、マイクロカーネル120内のテンプレート領域200、200’および200”の形成から始まる。図7からわかるように、テンプレート領域R0 200は、ネスト可能テンプレート領域である。ネスト可能とは、第2のテンプレート領域R1 200’を指すことを意味する。テンプレート領域R1 200’は、一連のポインタを介して図7のキャッシュ・オブジェクト202などのオブジェクトを指す、リーフ(leaf)・テンプレート領域である。テンプレート領域R1 200’は、もう1つのリーフ・テンプレート領域であるテンプレート領域R2 200”も指し、このテンプレート領域R2 200”は、一連のポインタを介してキャッシュ・オブジェクト202内のもう1つのデータ・ページを指す。下の説明から明らかになるように、テンプレート領域R1 200’は、その中に含まれる別のテンプレート領域を指していないので、リーフ・テンプレート領域とみなされる。しかし、テンプレート領域R0 200は、領域R1とR2の両方がその中に含まれるので、ネスト可能テンプレート領域とみなされる。「その中に含まれる」とは、領域R1の仮想アドレス空間が、テンプレート領域R0の仮想アドレス空間内にあることを意味する。同様に、テンプレート領域R2の仮想アドレス空間は、テンプレート領域R0の仮想アドレス空間内に含まれる。しかし、テンプレート領域R1とテンプレート領域R2の仮想アドレス空間は、別個であり、したがって、テンプレート領域R1はリーフ・テンプレート領域である。
【0271】
マイクロカーネル120は、マイクロカーネル・アドレス空間内でPMAP204を構成して、タスクのための仮想アドレスの物理アドレスへの変換を計算機依存の形で表現するためのデータを維持する。テンプレート領域R0は、アドレス空間AD(R0)の記述を含む、マイクロカーネル120内のデータ構造である。このアドレス空間は、テンプレート領域R0によって定義されるタスクのためにスレッドが動作することのできるアドレス空間である。アドレス空間は、64Kバイト仮想メモリ・アドレス・セグメントとすることができ、これは16ビット・アドレスに適するはずであるが、32ビット・アドレス用の4Gバイト仮想メモリ空間セグメントとすることもできる。テンプレート領域R0によって定義される仮想アドレス空間のセグメントは、テンプレート領域R0によって定義されるタスクのためにスレッドが動作することのできる区域である。図7でやはりテンプレート領域R0に含まれているのが、PMAP204を指すポインタである。このポインタは、たとえばマイクロカーネル120用のマイクロカーネル・アドレス空間内のPMAP204の、開始アドレスを識別する。テンプレート領域R0を定義する追加のデータ構造には、テンプレート領域R0に関連するタスクを記述するのに使用される、テンプレート領域の連鎖内の次のテンプレート領域R1の指定が含まれる。この連鎖の末尾は、R2として指定され、これによって、テンプレート領域R0、R1およびR2の連鎖の最後のテンプレート領域をすばやく識別できるようになっている。同様に、図7のテンプレート領域R1には、アドレス空間AD(R0)の一部であるアドレス空間AD(R1)の記述が含まれる。さらに、テンプレート領域R1には、変換値「仮想アドレス(V0)」を指す、PMAPを指すポインタPT(R1)が含まれる。PMAP204のこの仮想アドレス変換値は、ポインタの仮想アドレス値を、線206を介して物理アドレスに変換し、この物理アドレスは、メモリ102内のオブジェクトへの線208上の出力である。図7からわかるように、仮想アドレス(V0)変換値は、キャッシュ・オブジェクト202内のデータ・ページD0を指す。テンプレート領域R1には、連鎖内の次のテンプレート領域R2と、連鎖内の前のテンプレート領域R0の指定も含まれる。テンプレート領域R1には、キャッシュ・オブジェクト202用の仮想アドレスでキャッシュ・オブジェクト202を指す別のポインタが含まれ、さらに、キャッシュ・オブジェクト202内のデータ・ページD0のオフセット値が含まれる。
【0272】
図7のテンプレート領域R2には、アドレス空間AD(R0)の一部であるアドレス空間AD(R2)の記述が含まれる。テンプレート領域R2には、PMAPを指すポインタPT(R2)も含まれ、その仮想アドレス値は、線206を介してPMAP204の仮想アドレス変換「仮想アドレスV(1)」に適用される。この仮想アドレス変換は、キャッシュ・オブジェクト202の命令D1に対する線208上の出力である物理アドレスをもたらす。テンプレート領域R2には、さらに、連鎖内の前のテンプレート領域R1の指定が含まれる。テンプレート領域R2は、キャッシュ・オブジェクト202の仮想アドレスを指すポインタと、キャッシュ・オブジェクト202内での命令ページD1へのオフセットも有する。
【0273】
マイクロカーネル120のアドレス空間内の各テンプレート領域は、対応するタスク・コンテナを定義するための属性の組を有する。これらの属性によって、仮想メモリ・アドレス空間、データ・オブジェクト資源および通信ポートなど、タスクのスレッドによる使用のためにそのタスクから使用可能な資源を指定することができる。マイクロカーネルは、図8に示されるように、メモリ102内にタスクを形成することができる。マイクロカーネル120は、テンプレート領域200、200’および200”によって指定された属性をタスク210にマッピングすることによって、メモリ102内にタスク210を形成できる。マイクロカーネル120は、テンプレート領域R0内の仮想アドレス空間AD(R0)に基づいて、このタスクの仮想アドレス空間を定義する。後程、マイクロカーネル120は、仮想記憶動作を行う時に、テンプレート領域R0内のポインタ205、テンプレート領域R1内のポインタ205’およびテンプレート領域R2内のポインタ205”の値を操作することによって、その動作を行う。マイクロカーネル120は、タスク210ではなく、テンプレート領域R0、R1およびR2に対して仮想記憶動作を行うので、この仮想記憶動作の効果は、タスク内ではポインタ212によって示される。
【0274】
マイクロカーネル120は、テンプレート領域R0からのサイズ属性とタスク210用の開始仮想アドレスとを使用して、仮想アドレスでタスク210を表すデータ構造を定義する。マイクロカーネル120は、テンプレート領域R0からの属性を使用して、タスクのスレッドがその動作を行うことのできる、タスク210用の仮想アドレス空間を定義する。マイクロカーネルは、タスクT(A)など、タスク210のタスク名も定義する。マイクロカーネル120は、タスク210がそのスレッドとシステム内の他のスレッドの間の通信チャネルとして使用するために、メモリ102内でポート名前空間も形成する。マイクロカーネル120は、テンプレート領域R0からの属性の組を使用して、タスク210用のポート名前空間のアクセス権を定義する。その後、マイクロカーネルは、タスク210のためにメモリ102内でスレッド・オブジェクトを形成することができ、これらのスレッドは、このタスクの仮想アドレス空間から命令を取り出すことができる。
【0275】
本発明によれば、マイクロカーネル120は、テンプレート領域R0を指す第1のポインタ212を、タスク210のために定義する。テンプレート領域R0内には、少なくとも1つ、おそらくは多数の第2のポインタ205があり、このポインタ205は、直接または間接にマッピング・テーブルであるPMAP204を指す。図8からわかるように、ポインタ205はPMAP204を指す。テンプレート領域R1は、テンプレート領域R0のアドレス空間に含まれるが、これは、テンプレート領域R1のポインタ205’がPMAP204内の仮想アドレス変換値V(0)を指しているからである。仮想アドレス変換値V0によって、ポインタ205’の仮想アドレス値が、キャッシュ・オブジェクト202内のデータ・ページD0の物理アドレスに変換される。同様に、テンプレート領域R0のアドレス空間内に含まれるテンプレート領域R2内のポインタ205”は、PMAP204内の仮想アドレス変換値V(1)を指す。仮想アドレス変換値V1によって、ポインタ205”の仮想アドレス値が、キャッシュ・オブジェクト202内の命令ページD1の物理アドレスに変換される。
【0276】
時折、あるタスクのデータ資源に変更を加えることが望ましい場合がある。これは、テンプレート領域R0、R1およびR2内のポインタ205、205’および205”によって表される仮想アドレスを変更することによって達成される。変更されたポインタは、望みどおりにPMAP204内の異なる変換値を指すことができる。しかし、本発明によれば、タスク210自体の内容に変更を加える必要はない。キャッシュ・オブジェクト内のデータなどのタスク資源は、タスクによって、テンプレート領域内のポインタ205、205’および205”を介してアドレッシングされる。
【0277】
図9に示されるように、マイクロカーネルが、テンプレート領域から複数のタスクを定義した場合、テンプレート領域R0、R1およびR2内のポインタ205、205’および205”を変更すると、図9の複数のタスク210および210’から使用可能な資源の大域的な変更がもたらされる。これは、タスク210および210’が、それぞれ同一のテンプレート領域R0 200を指すポインタ212および212’を有するからである。タスク210および210’によってアドレッシングされるデータ・ページD0およびD1は、タスク210および210’のそれぞれの内容を変更するのではなく、テンプレート領域R0、R1およびR2内のポインタ205、205’および205”に対する単一の変更だけで変更できる。
【0278】
こうして、単一のテンプレート領域R0とそれに含まれるテンプレート領域R1およびR2を、複数のタスク210および210’に同時にマッピングすることができる。各タスク210または210’には、テンプレート領域R0、R1およびR2に対して行われる変更のすべてが見える。このため、同一のテンプレート領域R0 200によって生成されたタスク210および210’の特性の共用が可能になる。
【0279】
テンプレート領域R0、R1およびR2は、すべての仮想記憶動作が向けられるオブジェクトである。かつてのMACHマイクロカーネルでは、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作を、その動作が実施されるテンプレート領域に向けることによって、複数のタスクでの仮想記憶動作の共用がはるかに簡単に達成される。
【0280】
テンプレート領域は特殊オブジェクトであるから、単一のテンプレート領域を、複数のタスクに同時にマッピングすることができる。あるテンプレート領域が複数のタスクにマッピングされる時には、各タスクに、そのテンプレート領域に対して行われる変更のすべてが見える。メモリ内容の変更もしくは、内部テンプレート領域の追加または削除のすべてが、元のテンプレート領域にマッピングされるタスクに見える。これによって、以前には不可能または近似的にしか実現できなかったセマンティックスの共用が可能になる。すなわち、テンプレート領域を用いると、メモリ内容を共用できるだけではなく、メモリ・マッピング自体を共用できるようになる。したがって、テンプレート領域に対する変更(メモリ内容の変更またはテンプレート領域によってマッピングされるものに対する変更の結果として)は、そのテンプレート領域がマッピングされるすべてのタスクによって認識される。テンプレート領域を用いない代替案は、タスクとメモリの関係のそれぞれの監視を必要とするものであり、さらに、タスクに対応するメモリ領域に対する変更によって影響を受けるタスクのそれぞれに対する変更を必要とするものである。テンプレート領域のない実施態様の暗黙の短所は、特定のメモリ領域にマッピングされるタスクの数が増加するにつれて、1つの変更によって影響を受ける領域を更新する時間がそれ相応に増加することである。
【0281】
たとえば、テンプレート領域を使用すると、すべてのライブラリが同一のテンプレート領域内に置かれ、そのテンプレート領域が関心を持つタスクによってマッピングされる場合に、テンプレート領域への新ライブラリのマッピングに要する時間は、関心を持つタスクの数と無関係に予測可能である。さらに、潜在的に複雑なロック方式を導入しなくても、マッピング情報の変更が、その領域をマッピングされるタスクに原子的に見えるようにすることができる。
【0282】
テンプレート領域は、VM動作すなわち仮想記憶動作が向けられるオブジェクトである。かつては、タスクが、仮想記憶動作が向けられるオブジェクトであった。本発明に従って、仮想記憶動作をその動作が実施されるテンプレート領域に向けることによって、変更が領域のマッピングではなく、テンプレート領域に対して行われるようになるので、共用がはるかに簡単に達成される。これは、本発明の重要な相違である。テンプレート領域は、オブジェクトである。テンプレート領域は、属性すなわちある量の状態を有し、タスクのアドレス空間内に存在しない。タスクのアドレス空間に存在するのは、テンプレート領域のマッピングである。テンプレート領域のマッピングがタスクのアドレス空間に存在するので、このマッピングは、そのタスクのアドレス空間内のどこにでも現れることができ、図10に示されるように、異なるタスクが、それぞれのアドレス空間内の異なるアドレスにマッピングされた同一のテンプレート領域を共用することができる。すなわち、タスクAが、アドレス4000(16進)にマッピングされたテンプレート領域を有し、タスクBが、アドレス800F000(16進)にマッピングされた同一のテンプレート領域を有することができる。図11に示されるように、同一のテンプレート領域を、単一のタスクのアドレス空間内に複数回マッピングすることも可能である。
【0283】
タスクのアドレス自体は、そのタスクが作成される時に供給されるテンプレート領域によって定義される。したがって、あるタスクのアドレス空間にマッピングされるすべてのテンプレート領域は、実際にはもう1つのテンプレート領域にマッピングされる。したがって、マイクロカーネルに対する”VM−map”呼出しは、タスク・ポートをとらず、新テンプレート領域を他のテンプレート領域にマッピングしなければならない位置に関するテンプレート領域ポートだけをとる。これは、テンプレート領域が、すべての仮想記憶動作がそれによって実行される実体であるという概念にうまくあてはまる。タスクとテンプレート領域の間の連係は、タスクが作成される時に確立される。この形でタスクのアドレス空間を管理することによって、タスクを作成する時にマッピング設定を事前に定義するのが非常に簡単になる。また、異なるサイズのアドレス空間を有するタスクを有することも比較的簡単になる。異なるサイズのアドレス空間は、後に図18と共に説明する「基本テンプレート領域」の機能である。簡単に言うと、基本テンプレート領域は、タスクのアドレス可能メモリ領域を定義する実体である。タスクに関連する基本テンプレート領域を確立(または変更)することができ、その結果、基本テンプレート領域が任意のサイズになるようにすることができる。異なるサイズの基本テンプレート領域のより有用な実施態様の中には、たとえば、32ビットと64ビットの混合システムの同時サポートが含まれる。さらに、異なるサイズの基本テンプレート領域は、何らかの理由のためにタスクのアドレス範囲を制限しなければならない環境で使用することができる。
【0284】
本発明の例示の実施例によれば、テンプレート領域をネストすることができる。しかし、テンプレート領域のネスティングは、非常に限られた形でしか行えない。2つのテンプレート領域がオーバーラップする場合、テンプレート領域のうちの一方が、他方のテンプレート領域を完全に包含しなければならない。図12では、テンプレート領域R1がテンプレート領域R2とオーバーラップする場合に、図12の左側の絵は正しいが、図12の右側は正しくない。テンプレート領域R1とテンプレート領域R2を入れ替えた場合でも同様である(どの領域がどの領域にオーバーラップするかという順序は、2つの異なるマッピング動作によって判定される)。図12の右側の絵は、図13に示されるように、オーバーラップされるテンプレート領域がR0である場合にも正しくない。テンプレート領域を別のテンプレート領域の上に置くことができる位置について、追加の制約が存在する可能性がある。たとえば、あるテンプレート領域が、それを囲むテンプレート領域内の同一の範囲に他のテンプレートが現れないようにすることを示す属性を有することができる。通常、テンプレート領域は、それを囲むテンプレート領域に無関係に互いにオーバーラップすることができる。図12では、R1を囲むテンプレート領域は、R2またはR0のいずれかである。しかし、R1とR2の両方に「メモリ」が含まれる場合に、これが問題を引き起こす可能性がある。これは、テンプレート領域を他のテンプレート領域の「穴」にのみマッピングできるようにすることによって防止される。すなわち、あるテンプレート領域を、別のテンプレート領域によって既にマッピングされている区域にマッピングすることはできない。したがって、図12では、R1は、R2によってのみ囲まれることができ、R1がR0によって囲まれる可能性はない。というのは、R1とR2の両方がR0内で同一の範囲を占めるからである。
【0285】
テンプレート領域を使用する時には、無名メモリを割り振る方法がない。これは、図13に示されるように、メモリ・オブジェクトを領域にマッピングすることによって行われる。すべてのメモリがメモリ・オブジェクトによって表現されるので、メモリがテンプレート領域内で見えるようにするためには、メモリ・オブジェクトをテンプレート領域にマッピングしなければならない。過去において、メモリ割振りは、実際には無名メモリ・オブジェクトの一部のマッピングの特殊な場合にすぎなかった。テンプレート領域を用いる場合、無名メモリ・オブジェクトという概念が実在しない。メモリ・オブジェクトをマッピングするために、各メモリ・オブジェクトを識別しなければならない。
【0286】
テンプレート領域は非常に再帰的であることが理解されるであろう。これは、物理ページに向かって進む再帰であると考えると便利である。物理ページは、固定サイズのテンプレート領域であると考えることができる。これは、実施態様がこの形でなければならないということを暗示するものではない。物理ページがテンプレート領域の最下位の組であると考えることは、概念的な観点から便利である。単一のテンプレート領域を、複数の他のテンプレート領域にマッピングすることができるので、物理ページを複数の「通常」の領域にマッピングすることができる。これによって、異なるテンプレート領域から、異なる属性が関連付けられた同一の物理メモリをアクセスできるようになる。明らかに、異なるテンプレート領域が衝突する属性を有する場合に、物理ページの属性をセットする方法に関して規則が必要である。たとえば、あるテンプレートではそのページがキャッシュ不能と示され、別のテンプレートではそのページをキャッシュしなければならないと示される場合がある。この逆の場合もある。ページ・テーブルを用いると、物理的に不連続なページを仮想的に連続しているように見せることができる。同一のことを、オーバーラップするテンプレート領域に対しても行える。図14では、R0に2つの他の領域R1およびR2が含まれ、R1とR2は、R0内で連続していない。一部のアプリケーションでは、この不連続性を知り、対処しなければならないので、情報の操作が困難になる可能性がある。R1とR2を含むのに十分な大きさの新テンプレート領域R3を作成することができる。R1とR2は、R3内で互いに連続する形でマッピングされる。こうすると、先程のアプリケーションが、R3を利用して、R0に見られる不連続性に対処する必要をなくすことができる。
【0287】
本発明の例示の実施例によれば、テンプレート領域には別個の2つの種類がある。テンプレート領域の第1のタイプは、他のテンプレート領域を含む能力を有するネスト可能テンプレート領域である。これを用いると、上で述べた再帰が可能になる。しかし、この再帰では、実際にメモリを含むことができない。これは、すべてのメモリ(仮想メモリ)がメモリ・オブジェクトによって表現されるからである。メモリ・オブジェクトは、テンプレート領域と異なる実体である。したがって、メモリ・オブジェクトの一部をマッピングする第2のタイプのテンプレート領域がある。これらは、「リーフ(leaf)」領域と考えることができる。図15に、異なるタイプのテンプレート領域の例と、メモリ領域がそれらとどのように関連するかを示す。メモリ・オブジェクトであるリーフ領域は、メモリ・オブジェクトのマッピングされる部分のサイズと正確に同じサイズでなければならないことに留意されたい。すなわち、このテンプレート領域には、メモリ・オブジェクトをマッピングされていない部分があってはならない。図16に、領域へのメモリ・オブジェクトのマッピングの正しくない例を2つ示す。テンプレート領域R3へのMO1のマッピングは、R3が他のテンプレート領域を含むので正しくない。R2へのMO2のマッピングは、R2がMO2のマッピングされる部分より大きいので、正しくない。
【0288】
テンプレート領域には、そのテンプレート領域によって含まれるメモリを扱う方法を示す属性が関連付けられている。下記は、属性の識別と、そのそれぞれの意味および各属性を取り巻くセマンティックスの一部の説明である。
1.テンプレート領域内でメモリが割り振られる時に、補助記憶の割振りを切望する。これがセットされていない時には、補助記憶が遅延割り振りされる。
2.スーパーバイザ(Supervisor)。プロセッサがスーパーバイザ状態で実行中である時に限ってアクセス可能なテンプレート領域を示す。
3.特権(Privileged)。物理メモリが足りない時に予約済みプールからページを割り振ることができる。
4.メモリが割り振られ、テンプレート領域に置かれる時に、そのメモリを表すページが、物理的に連続していなければならない。
5.メモリが割り振られ、テンプレート領域に置かれる時に、そのメモリを表すページが、指示された物理アドレス範囲内になければならない。
6.テンプレート領域内のページが、メモリにワイヤリングされる。このテンプレート領域への新しい割振りは、どれもがワイヤリングされる。この属性がセットされていない場合、テンプレート領域内のページを、名前メモリから追い出すことができる。
7.プロセッサ・キャッシュ属性。
8.アクセス挙動。
9.アクセス権。
10.コヒーレンシ(Coherency)とNORMA。
【0289】
テンプレート領域は、図17に示されるように他の複数の構成要素と相互作用する。構成要素のそれぞれの説明は、下の節で行う。
【0290】
さまざまな仮想メモリ構成要素が、ページ、メモリ・オブジェクト、テンプレート領域、キャッシュ、PMAPおよびメモリ管理ユニットである。
【0291】
本発明による方法で編成された仮想メモリ・システムに関して、下記を観察することができる。
1.物理ページは、多くとも1つのメモリ・オブジェクトに含まれる。これが発生するのは、メモリ・オブジェクトが、「メモリ」を表すのに使用される実体だからである。共用は、ページを含むメモリ・オブジェクトの共用か、メモリ・オブジェクトを含むテンプレート領域の共用のいずれかによって達成される。
2.メモリ・オブジェクトは、それをマッピングしているテンプレート領域のすべてについて知っていなければならない。
3.テンプレート領域は、そのテンプレート領域を含むすべてのPMAP範囲について知っていなければならない。
【0292】
上記によって、物理ページの共用を識別するのに必要なメモリの量をかなり削減することができる。過去の実施態様では、ページを含むPMAPのすべての、ページごとのリストが維持された。これによって、PMAPコードへの望ましくない再帰も導入された。というのは、ページを含むPMAPのリストを構成し、維持するために、PMAPコードが、動的にメモリを割り振る能力を有する必要があったからである。
【0293】
しかし、本発明によれば、PMAPは、そのデータ構造を維持するためにメモリを動的に割り振る必要がない。共用は、テンプレート領域レベルで行われるので、PMAPのリストをかなり小さくすることができる。タスク間で大量の共用を行うシステムでは、これによってかなりの節約をもたらすことができる。たとえば、10ページのテンプレート領域を共用する10個のタスクがあれば、90個のリスト要素が節約される。すなわち、テンプレート要素を用いない場合の100個のリスト(10ページのそれぞれに10要素のリスト)に対して、テンプレート要素を用いる場合には10個のリスト(10要素のリストを有する1つの領域)である。
【0294】
テンプレート領域はマッピングを表すので、テンプレート領域からハードウェア・データ構造を参照することができる。多くのハードウェア実施態様では、2レベル以上のデータ構造が使用される。したがって、実施態様を第2レベル・データ構造全体に敏感にすることによって、テンプレート領域をマッピングしたタスクが、データ構造によって表されるハードウェア・データ構造を再使用できるはずである。たとえば、インテル社の386/486およびペンティアム・プロセッサの場合、ページ・テーブル構造は、2レベルの深さである。第2レベルは、4メガバイト境界上の4メガバイト長のメモリ領域を表す。これらのプロセッサのうちの1つのテンプレート領域の実装では、4メガバイト(または4メガバイトの整数倍)のメモリ領域が作成される時を検出することができ、複数のタスクがそれをマッピングする時に、ハードウェア・データ構造を作成する必要がないことが保証される。共用されないハードウェア・データ構造の場合であっても、この実施態様は、テンプレート領域が他のハードウェア・データ構造のマッピングの案内として役立つので、効率的になり得る。そうする際に、他のハードウェア・データ構造マッピングは、元のマッピングされたハードウェア・データ構造からごくわずかしか変化しない(おそらくは、全く変化しない)可能性があり、このため、将来のデータ構造の作成が単純になり、性能の向上がもたらされる。
【0295】
さらに、本発明を用いると、ページをページ・インする時の熱心なPMAP項目の効率的な実施が可能になる。これによって、ページ障害を大幅に減らすことができる。ページがメモリ内にある場合、そのページに対して障害は発生しない。
【0296】
テンプレート領域とタスクは、どちらもが特殊なマイクロカーネル・オブジェクトである。すなわち、これらは、互いに独立であると考えることができる。しかし、テンプレート領域は、タスクのアドレス空間を定義する。タスクのアドレス空間すなわち、その基本テンプレート領域は、そのタスクが作成される時に定義される。
【0297】
1つのタスクは、基本的に2つのテンプレート領域を知っている。一方の領域は他方の領域に含まれるが、このタスクは内側のテンプレート領域について知る必要があるので、それについて知らされる。この2つのテンプレート領域は、基本テンプレート領域とユーザ・テンプレート領域である。基本テンプレート領域によって、そのタスクのアドレス空間全体が記述される。ユーザ・テンプレート領域は、通常は基本テンプレート領域の内側に置かれ、これによって、そのタスクのユーザ部分によって特殊な特権なしに(すなわち、タスク・ポートだけが必要)操作可能なアドレス空間の部分が記述される。これらはテンプレート領域であるから、そのタスクとシステムの正しい動作のために必要であれば、他のテンプレート領域を含めることができる。図18では、R0が基本テンプレート領域である。R0には、基本テンプレート領域に特有のもう1つのテンプレート領域R3が含まれ、R0には、ユーザ・テンプレート領域R1が含まれる。R1には、もう1つのテンプレート領域R2が含まれる。このタスク内のスレッドは、これらのテンプレート領域のどの内容にもアクセスできるが、このタスクは、テンプレート領域R1およびR2しか操作できないことに留意されたい。
【0298】
タスクがユーザ・テンプレート領域を有する必要はない。この場合、タスクは、そのアドレス空間を操作することができず、そのタスクに代わって操作を実行する他のタスクに頼ることになる。これは、オペレーティング・システム・パーソナリティが、タスクにそのアドレス・マップを随意変更させないようにするのに役立つ(すなわち、アドレス・マップは、オペレーティング・システム・パーソナリティに依存しなければならない)。
【0299】
もう一度図18を参照すると、タスクは、2つのポインタを有するものとして図示されている。第1のポインタは、基本領域を指し、そのタスクの全アドレス空間(そのタスクがアクセスできるもののすべて)を記述している。第2のポインタは、ユーザ領域(領域に関して、ユーザ・プログラムが通常操作できるもの)を指す。タスクの内部または基本領域の内部に、ユーザ・プログラムからアクセス可能であるが、操作可能ではなく、非特権コードによって操作できないテンプレート領域が存在し得ることに留意されたい。さらに留意すべき点として、図18には、4つの領域R0ないしR3がある。タスクの全アドレス空間を記述する基本領域は、R0である。通常、この領域は、計算機アーキテクチャによってその特定のタイプのタスクに許される限りの大きさになる。したがって、たとえば、ほとんどの32ビット・アーキテクチャでは、基本領域が4ギガバイトの領域を記述することになる。これは、基本領域に4ギガバイトの情報が含まれるという意味ではない。そうではなくて、タスクが4ギガバイトの情報にアクセスできるのである。ユーザ領域は、R1によって記述される。R1を用いると、タスク内の非特権コードが、R1の内部の領域を操作し、領域を作成し、R1に新領域をマッピングし、R1から領域のマッピングを解除することができるようになる。しかし、R1は、R3に対する機能を全く実行できない。R1は、たとえば、R3の内容をアクセスする可能性がある(R3の特権による)が、R1は、領域自体としてのR3について具体的に知ることはできない。さらに、R1とR3は、R0が存在することを知らず、その内容も全く知らない。したがって、タスクがそのアドレス空間内で知ることのできる唯一の領域は、ユーザ領域によって指され、R1やR2などのユーザ領域に含まれる領域である。
【0300】
あるシナリオでは、あるタスクのユーザ領域が存在せず、そのタスクがそのマッピング情報を全く変更できない環境が作成される場合がある。このタスクは、それに代わって操作を実行するために、他のサーバなど、他の何らかのエージェントに依存するはずである。これが望ましいオペレーティング・システム環境の1つに、それ自体のアドレス空間を操作できるアプリケーション・プログラムを避けなければならない環境がある。
【0301】
もう1つのシナリオでは、たとえばカーネル自体について、ユーザ領域と基本領域の両方が、同一の領域を指す。そうすることによって、カーネル・タスクは、そのアドレス空間の一部だけではなく、アドレス空間全体を操作できる。
【0302】
領域をスーパーバイザ状態にエクスポートする時には、テンプレート領域の概念を用いていくつかのことを単純化できる。第1に、スーパーバイザ・テンプレート領域に、新コードをロードすることができる。第2に、スーパーバイザ・モードで走行するコードの一部を、簡単にページ可能にすることができる。これらの特徴のどちらもが、一般的なテンプレート領域サポートに必要なインターフェース以外の追加インターフェースを必要としない。
【0303】
ユーザ・アクセス状態とスーパーバイザ・アクセス状態の間でアクセス保護を維持することが重要である。これは、プロセッサがスーパーバイザ状態である時に限ってテンプレート領域をアクセスできることを示す属性を維持することによって達成される。ユーザ・タスクは、スーパーバイザ領域が存在することを「知る」ことはできるが、その内容をアクセスすることはできない。通常、スーパーバイザ・テンプレート領域は、テンプレート領域自体が操作されないようにするために、基本テンプレート領域内に置かれる。
【0304】
走行中のシステムは、通常、比較的少ない数のスーパーバイザ・テンプレート領域を有する。これらは、2つの可能な範疇に含まれる傾向を有する。テンプレート領域の1つの組は、カーネル・インターフェース・ライブラリを提供するための使用可能性を有するために個々のタスクに固有になる傾向を有する。これは、複数のカーネル呼出しを行うというペナルティを課すことなく、個々のタスクにカーネルへの専用インターフェースを与える可能性を有する。これを図19に示す。
【0305】
図19は、ほとんどの環境に、保護されるがタスクのアドレス空間にマッピングしなければならないカーネルの部分またはスーパーバイザ実体があることを示す図である。これは、テンプレート領域に、タスクのアドレス空間に現れるカーネルの部分をマッピングすることによって、テンプレート領域を用いて達成される。この部分は、ユーザがそれを操作できなくするために、基本領域にマッピングすることができる。通常、ユーザ/スーパーバイザ遷移が発生する方法のために、スーパーバイザの一部が、そのタスクのアドレス空間内にあることが必要である。しかし、この部分は、ユーザまたはアプリケーション・プログラムによってアクセス可能にならないように保護される。さらに、この手法を用いると、共用カーネル領域を有するだけでなく、異なるライブラリをインターフェース・ライブラリとしてマッピングすることによって、タスクごとの基準でアプリケーション・カーネル・インターフェースをカスタマイズすることも可能になる。インターフェース・ライブラリも、基本領域内にあるように見え、アプリケーション・コードによって操作できない形で保護される。これを、図19のR5およびR6に示す。共用カーネルは、この図の左右でR3として示されている。
【0306】
マイクロカーネル自体も、カーネル・タスクと称する1タスクであり、他のタスクと同様に、基本テンプレート領域を有する。マイクロカーネルのタスク基本テンプレート領域に含まれるテンプレート領域の、すべてではないにせよほとんどは、スーパーバイザ・テンプレート領域である。この基本テンプレート領域は、別のタスクがカーネル機能にアクセスできるようにするために、そのタスクの基本テンプレート領域に含まれる可能性がある。しかし、他のタスクのユーザ・テンプレートとは異なり、領域は基本テンプレート領域と同一である。カーネルのテンプレート領域を、まず図19に示す。その詳細な構造の例を、図20に示す。図20は、特定のテンプレート領域が、ワイヤリング不能であることを示す属性を有することができることを示すことによって、カーネルの一部を、ページ可能にすることができることを示す図である。カーネルの機能は、カーネルのテンプレート領域のうちの1つに新テンプレート領域をマッピングすることによって拡張できる。
【0307】
図20では、マイクロカーネル自体がタスクであるから、テンプレート領域を使用してカーネル・タスク自体を編成している。カーネル・タスクは、図20では同一の領域R0を指す基本ポインタおよびユーザ・ポインタを有し、その結果、カーネル・タスクは、その全アドレス空間を操作する特権を有する。カーネル・タスクのマップ内の2つの主な副領域、R1およびR3が図示されている。R3は、それ自体を「ワイヤリング」させる属性を有し、その結果、絶対にメモリから追い出されない。しかし、カーネルには、不在であることが許容される部分があり、これは、その領域のページングを可能にする属性を有する領域R1に含まれる。したがって、カーネル内でページ可能なコードは、ページ可能属性をセットされたテンプレート領域に置くことができる。ページ可能でないコードは、ページ可能属性をセットされていないテンプレート領域に置くことができる。そうする際に、適当なワイヤリングされた領域またはページ可能な領域のいずれかに新領域を単純にマッピングすることによって、カーネルに新コードをロードすることが非常に簡単になる。
【0308】
以下で、テンプレート領域内のマッピングの例を述べる。プログラムは、オープン中にファイル・サーバを呼び出すことができる。ファイル・サーバは、ファイルのサイズを判定し、そのファイルを含めるのに十分な大きさの仮想メモリ空間を表すテンプレート領域を作成する。たとえば、ファイルが700000バイトの場合、ファイル・サーバは、700000バイトの仮想メモリ空間を表すテンプレート領域を作成する。ファイル・サーバは、そのファイルを表すのに使用するメモリ・オブジェクトも作成する。このメモリ・オブジェクトは、潜在的に許可のないファイルを表し、したがって、クライアントが読取り専用のファイル・オープンと読み書き両用のファイル・オープンのどちらを望んだかに無関係に、同一のメモリ・オブジェクトになるはずである。この例には、2つのクライアントがある。一方のクライアントは、ファイルを読取り専用としてオープンすると決定し、もう一方のクライアントは、ファイルを読み書き両用としてオープンする。メモリ・オブジェクトはファイルの実際の内容を表すので、メモリ・オブジェクトは1つ存在する。しかし、テンプレート領域は2つ存在するはずである。一方のテンプレート領域には、そのファイルの読取り専用マッピングが含まれ、もう一方のテンプレート領域を用いると、そのオブジェクトに書き込むことができる。
【0309】
テンプレート領域のそれぞれが、データのマッピングを表す。たとえば、第2のテンプレート領域は、両方の領域のデータが同一であり、同一になることが保証されるにもかかわらず、オブジェクトを読取り可能であると同時に書込み可能にすることができる属性を有する可能性がある。データに対して行うことができる機能は、どちらのテンプレート領域をアクセスするかに応じて変化する。テンプレート領域のない実施態様の場合、メモリは、少なくとも1つのタスクにマッピングしなければ操作できない。テンプレート領域を用いると、タスクとメモリの直接的な関係の必要が破壊されるので、操作のためにメモリをタスクにマッピングする必要がなくなることに留意されたい。さらに、タスクとメモリの直接的な関係の必要が破壊されているので、テンプレート領域によってマッピングされるメモリ領域は、テンプレート領域がマッピングされるアドレス空間より大きくてもかまわない。その際に、対応するタスクの制約に従ってテンプレート領域をマッピングできるように、テンプレート領域のサイズに制約を加えたり、テンプレート領域を随意分割する理由はない。
【0310】
第1のテンプレート領域は、オブジェクト内のデータに対する読取り専用許可を有する。第2のテンプレート領域は、メモリ・オブジェクト内のデータに対する読み書き許可を有する。それぞれの許可に対応するファイルを含むデータは、メモリ・オブジェクト内にある。ファイル・サーバの役割には、2つの部分がある。第1の役割は、ファイルのマッピングを表すテンプレート領域とファイルを表すメモリ・オブジェクトの間の連係を確立することである。第1テンプレート領域にポインタ情報が置かれ、これによって、メモリ・オブジェクト・ページの位置が識別される。これに対応して、同一のポインタ情報が第2テンプレート領域に置かれ、メモリ・オブジェクト・ページの仮想アドレス空間内の位置が識別される。2つのテンプレート領域の間の相違は、第1のテンプレート領域がオブジェクト内のデータを読み取る許可だけを有するが、第2のテンプレート領域がデータの読取りと書込みの両方の許可を有することである。
【0311】
テンプレート領域の長所の1つが、同一のオブジェクトに対して異なる属性を有する能力である。さらに、領域をネストできるので、テンプレート領域は、他のメモリ・オブジェクトだけでなく、他のテンプレート領域を指すこともできる。したがって、メモリのテンプレート・マップを構成することができる。そうする際に、テンプレート領域によって記述される情報をアクセスするために、そのデータをアクセスするのに必要なハードウェア・マッピングを確立するための明瞭に構成された適度な組のポインタ情報が存在する。たとえば、インテル・アーキテクチャ計算機上には、前に満たされたページ・テーブルまたはページ・テーブルの部分が存在する可能性がある。あるアドレス空間を実際にテンプレート領域にマッピングしたい場合、その作業は、ページ・テーブル・データ構造を完全に作るのではなく、ページ・テーブル・データ構造の一部を指すだけの簡単なことになるはずである。
【0312】
下の表1ないし表14で、タスクおよびテンプレート領域の作成と操作に関連するカーネル呼出しを説明する。
【0313】
テンプレートの作成と操作に関連して使用されるカーネル呼出しは、オブジェクト指向ユーザ・プログラム内で指定できる。オブジェクト指向プログラムは、2つの主要部分すなわち、オブジェクト定義部分と命令ストリーム部分に分割される。ユーザ・プログラムのオブジェクト定義部分には、命令ストリーム内の命令に関連するプログラム・オブジェクトを定義するためのオブジェクト定義テーブルが含まれる可能性がある。ユーザは、カーネル呼出しを使用して、マイクロカーネル・アドレス空間内でテンプレート領域を作成し、メモリ102内でタスクを生成して、ユーザの意図したプログラムの目的を実行する。ユーザは、自分のプログラムに、表1ないし表14に記載されたカーネル呼出しを含めて、テンプレート領域とそれによって定義されるタスクを作成し、操作する。表1ないし表5に示されたカーネル呼出しを用いると、タスクがテンプレート領域の概念を利用できるようになる。表6ないし表14のカーネル呼出しは、テンプレート領域の操作に必要なプリミティブ・テンプレート領域動作である。これらのカーネル呼出しは、マイクロカーネル120、パーソナリティ・ニュートラル・サービス140、パーソナリティ・サーバ150またはアプリケーション・プログラム180によって発行可能である。テンプレート領域の操作のための高水準関数は、表1ないし表14に記載のプリミティブ動作の組合せから作成できる。表1ないし表14に記載されたタスク動作およびテンプレート領域動作は、次の通りである。
・表1 task_create タスクの作成と命名
・表2 task_set_base_region タスクの基本領域のセット
・表3 task_get_base_region タスクの基本領域のゲット
・表4 task_set_user_region タスクのユーザ領域のセット
・表5 task_get_user_region タスクのユーザ領域のゲット
・表6 region_create_nestable 他のテンプレート領域を含むことのできるテンプレート領域の作成
・表7 region_create_leaf メモリ・オブジェクトを参照するテンプレート領域の作成
・表8 region_map_into 小さいテンプレート領域のより大きいテンプレート領域へのマッピング
・表9 region_set_attributes テンプレート領域の属性のセット
・表10 region_get_attributes テンプレート領域の属性のゲット
・表11 region_object_attach リーフ(leaf)・テンプレート領域へのメモリ・オブジェクトの付加
・表12 region_copy あるテンプレートの内容の別のテンプレートへのコピー
・表13 region_get_phys_addrs テンプレート領域を構成する物理ページのリストのゲット
・表14 region_attr_t 異なる領域属性の定義
表1ないし表14を参照すれば、本発明によるタスク動作およびテンプレート領域動作の実行に必要な例のカーネル呼出しの詳細な説明が得られる。
【0314】
【表1】
Figure 0003570525
解説
これは、領域の概念が導入された時に現行の関数task_createをどのように変更できるかの例である。
関数task_createは、parent_taskから新タスクを作成し、新タスクの名前をchild_taskに返す。子タスクのアドレス空間は、parent_taskの基本領域と供給されたuser_regionに基づいて確立される。子タスクのuser_regionは、その基本領域のオフセットuser_starting_offsetにマッピングされる。子タスクには、当初はスレッドが含まれない。子タスクは、親タスクのセキュリティ・トークンを継承する。
子タスクは、タスク作成時に作成またはコピーされる下記の特殊ポートを受け取る。
・[タスク自己ポート] カーネルが新子タスクを知り、それの操作を可能にするのに使用するポート。子タスクは、このポートへの送出権を保持する。このポート名は、呼出し側のタスクにも返される。
・[ブートストラップ・ポート] 子タスクが、必要なシステム・サービス・ポートからの返しを要求するメッセージを送ることができるポート。子タスクは、親タスクからこのポートの送出権を継承する。タスクは、task_set_special_portを使用してこのポートを変更できる。
・[ホスト自己ポート] 子タスクがそのホストに関する情報を要求するのに使用するポート。子タスクは、親ポートからこのポートの送出権を継承する。
・[基本領域ポート] 子タスクの基本領域を記述するポート。このポートによって命名される領域は、親タスクの基本領域のコピーか、親タスクの基本領域への参照のいずれかである。親の領域のコピーは、この基本領域に対する変更のすべてが、個々のタスクの私用であることを意味する。すなわち、これは、親の基本領域とは別個の領域であるが、親タスクと同一のサイズ、属性およびマッピングされた領域(ユーザ領域を除く)を有する。子の基本領域が親の基本領域への参照である場合、基本領域に対する変更のすべてが、両方のタスクから可視である。これは、そのタスクのユーザ領域が、基本領域にマッピングされることを意味する。したがって、ユーザ領域は、異なる開始オフセットにある必要がある。両方のタスクのユーザ領域が同一の領域である場合は、ユーザ領域が同一の開始オフセットにあってかまわない特殊な例である。このポートは、task_get_base_regionを介してアクセス可能である。
・[ユーザ領域ポート] 子タスクのユーザ領域を記述するポート。このポートによって命名される領域は、user_regionによって記述される領域である。子タスクと親タスクのユーザ領域の間に存在し得る唯一の関係は、呼出し側によって決定される。このポートは、task_get_user_regionを介してアクセス可能である。
パラメータ
・parent_task
[入力、タスク・ポート]子タスクのポート権と基本領域を引き出すためのタスク用のポート。
・user_region
[入力、領域ポート]タスクのユーザ・アドレスを記述するのに使用される、領域用のポート。
・user_starting_offset
[入力、vmオフセット]タスクの基本領域内でユーザ領域を置くオフセット。
・copy_base
[入力、論理値]この子タスクの基本領域が親の基本領域のコピーであるか、親の基本領域への追加参照であるかを示す。
・child_task
[出力、タスク・ポートを指すポインタ]新タスクのためにカーネルが割り当てたポート名。
戻り値
【0315】
【表2】
Figure 0003570525
解説
関数task_set_base_regionは、タスクがそのアドレス空間の記述であるとみなす領域をセットする。この領域へのアクセスが必要になるのは、タスクが非ユーザ領域を何らかの形で操作しようとする場合である。これは、タスクがその基本領域内で見るものの内容をタスクごとの基準で管理するのに使用できる。
タスクの基本領域には、通常は、スーパーバイザ属性を有する領域が含まれ、カーネルがタスクの基本領域にマッピングされた領域に含まれ、タスクの基本領域の操作が、システム動作とセキュリティに関係がある可能性があるので、この関数は、ホスト特権ポートへのアクセスを必要とする特権関数である。
パラメータ
・task
[入力、タスク・ポート]基本領域を所望されるタスクのポート。
・host_priv_port
[入力、ホスト特権ポート]ホスト特権ポートのポート。
・region
[入力、領域ポート]タスクの全アドレス空間を表す領域のポート。
戻り値
【0316】
【表3】
Figure 0003570525
解説
関数task_get_base_regionは、タスクの全アドレス空間を記述する領域を記述するポートを返す。この領域へのアクセスが必要になるのは、タスクが非ユーザ領域を何らかの形で操作しようとする場合である。この関数は、タスクがその基本領域で見るものの内容をタスクごとの基礎で管理するのに使用できる。
タスクの基本領域には、通常は、スーパーバイザ属性を有する領域が含まれ、カーネルがタスクの基本領域にマッピングされた領域に含まれ、タスクの基本領域の操作が、システム動作とセキュリティに関係がある可能性があるので、この関数は、ホスト特権ポートへのアクセスを必要とする特権関数である。
パラメータ
・task
[入力、タスク・ポート]基本領域を所望されるタスクのポート。
・host_priv_port
[入力、ホスト特権ポート]ホスト特権ポートのポート。
・region
[出力、領域ポートを指すポインタ]タスクの全アドレス空間を表す領域のポート。
戻り値
【0317】
【表4】
Figure 0003570525
解説
関数task_set_user_regionは、タスクが操作を許可される領域でタスクを「指す」。この領域は、この呼出しを発行する前にタスクの基本領域にマッピングされていなければならない。
パラメータ
・task
[入力、タスク・ポート]ユーザ領域を変更されるタスクのポート。
・region
[入力、領域ポート]タスクのユーザ操作可能アドレス空間を表す領域のポート。
戻り値
【0318】
【表5】
Figure 0003570525
解説
関数task_get_user_regionは、タスクのタスク・アドレス空間のユーザ操作可能領域を記述するポートを返す。この領域へのアクセスが必要になるのは、タスクがそのアドレス空間を何らかの形で操作しようとする場合である。
パラメータ
・task
[入力、タスク・ポート]ユーザ領域を所望されるタスクのポート。
・region
[出力、領域ポートを指すポインタ]タスクのユーザ操作可能アドレス空間を表す領域のポート。
戻り値
【0319】
【表6】
Figure 0003570525
解説
「親」領域から新しい領域を作成する。親領域は、新たに作成される領域に制限を課すのに使用される。親より大きい子領域を作成することはできない。子領域は、親領域の属性も継承する。作成の後、子領域を他のネスト可能領域にマッピングすることができる。子領域は、当初は他の領域にマッピングされていない。
新たに作成される領域は、他の領域を含むことができる領域である。メモリ・オブジェクトは、ネスト可能領域に直接にマッピングすることができない。
パラメータ
・parent_region
[入力、領域ポート]新領域を作成する元の「親」領域に対する参照。新領域は、許可またはサイズに関して、親によって記述されるものを超えることはできない。
・region_size
[入力、vmサイズ]新領域が有することになるサイズ。
・child_region
[出力、領域ポートを指すポインタ]新たに作成された領域の名前。
戻り値
・NOT_A_REGION
parent_regionが、システムに既知の領域でない。
・BAD_SIZE
新領域のために指定されたregion_sizeが、parent_regionのサイズより大きい。
【0320】
【表7】
Figure 0003570525
解説
「親」領域から新しい領域を作成する。親領域は、新たに作成される領域に制限を課すのに使用される。親より大きい子領域を作成することはできない。子領域は、親領域の属性も継承する。作成の後、子領域を他のネスト可能領域にマッピングすることができる。子領域は、当初は他の領域にマッピングされていない。
新たに作成される領域は、メモリ・オブジェクトまたはメモリ・オブジェクトの一部をネスト可能領域にマッピングするのに使用することができる。リーフ(leaf)領域は、メモリ・オブジェクトの一部を記述するのに使用される。これは、1つのメモリ・オブジェクトだけを記述することができる。他の領域を含めることはできない。
パラメータ
・parent_region
[入力、領域ポート]新領域を作成する元の「親」領域に対する参照。新領域は、許可またはサイズに関して、親によって記述されるものを超えることはできない。
・region_size
[入力、vmサイズ]新領域が有することになるサイズ。
・new_region
[出力、領域ポートを指すポインタ]新たに作成された領域の名前。
戻り値
・NOT_A_REGION
parent_regionが、システムに既知の領域でない。
・BAD_SIZE
新領域のために指定されたregion_sizeが、parent_regionのサイズより大きい。
【0321】
【表8】
Figure 0003570525
解説
関数region_map_intoは、小さな領域をとり、これをより大きな領域の一部にマッピングする。from_regionをinto_region内のどこに置くかに関してinto_region_offsetを解釈する方法を指定する複数のオプションが、placementによって指定
される。
パラメータ
・into_region
[入力、領域ポート]小さな領域がマッピングされる、より大きな領域を指定する。
・into_region_offset
[入出力、vmオフセットを指すポインタ]入力としては、from_regionをinto_regionに置くための位置を探し始める開始オフセットを指定する。出力としては、from_regionがマッピングされたinto_region内のオフセットが格納される。
・from_region
[入力、領域ポート]より大きな領域にマッピングされる小さな領域を指定する。
・placement
[入力、領域配置]into_region内でfrom_region用の位置を選択する方法を指定する。
戻り値
・NOT_A_REGION
from_regionまたはinto_regionが、システムに既知の領域でない。このエラーは、into_regionがリーフ(leaf)領域の場合にも発生する。
・BAD_OFFSET
into_region_offsetが、into_regionのサイズより大きい。このエラーは、from_region + info_region_offsetのサイズがinto_regionのサイズより大きい場合にも発生する。
【0322】
【表9】
Figure 0003570525
解説
関数region_set_attributesは、ある領域の絶対属性をセットする。領域の有効属性は、その領域がマッピングされる領域によって決定される。1つの領域を複数の領域にマッピングすることができるので、1つの領域が、複数の有効属性の組を有する可能性がある。この関数は、「特権」属性は全くセットできない。パラメータ
・region
[入力、領域ポート]属性をセットする領域。
・attributes
[入力、領域属性]領域に割り当てられる属性。
・attribute_mask
[入力、領域属性マスク]どの属性を変更するかを示す。
戻り値
・NOT_A_REGION
regionが、システムに既知の領域ではない。
・BAD_ATTRIBUTE
指定された属性のうちの1つまたは複数をセットできなかった。通常、これが発生するのは、この関数を用いて特権属性をセットしようとした時である。
【0323】
【表10】
Figure 0003570525
解説
関数region_get_attributesは、指定された領域の属性を返す。この関数は、領域に関してセットされた属性を返す。領域は、その領域に関してセットされた属性と、それを含む領域の属性とに基づく有効属性の組を有する。1つの領域を複数の領域に含めることができるので、1つの領域が複数の有効属性の組を有する可能性がある。
パラメータ
・region
[入力、領域ポート]属性を返すべき領域。
・attributes
[出力、領域属性を指すポインタ]指定された領域の属性。
戻り値
・NOT_A_REGION
regionが、システムに既知の領域ではない。
【0324】
【表11】
Figure 0003570525
解説
関数region_object_attachは、指定されたオフセットから始まるメモリ・オブジェクトを領域に関連付ける。領域と実際の記憶域の間の連係を最終的に確立するのは、この関数である。記憶域は、メモリ・オブジェクトの内容によって表現される。
一旦領域が付加されたならば、もう一度付加することは絶対にできない(region_object_detachを実行した場合であっても)という議論がある。その理由は、これによってメモリ・オブジェクトへのアクセスが制限され、「ランダム」なタスクがメモリ・オブジェクトのどの部分もマッピングできなくなるはずであるということである。これに対する反論は、現在は領域からメモリ・オブジェクトを得る方法がないので、付加(最初の1回を含む)は、いずれにせよ全メモリ・オブジェクトへのアクセス権を有するタスクでなければ行えないというものである。ある領域の付加と切離しを複数回行えるようにすることによって、1つの領域が、メモリ・オブジェクトへの「制御された」窓として働くことが可能になるはずである。その窓は、そのメモリ・オブジェクトについて知っている、何らかの「信頼される」エージェントによってのみ移動可能である。信頼されない実体は、リーフ領域へのアクセス権だけを有するはずである。
パラメータ
・region
[入力、領域ポート]メモリ・オブジェクトを付加するリーフ領域。
・memory_object
[入力、メモリ・オブジェクト・ポート]供給されたリーフ領域に付加されるメモリ・オブジェクト。
・memory_object_offset
[入力、vmオフセット]供給されたリーフ領域によってマッピングされる、メモリ・オブジェクト内の開始オフセット。
戻り値
・NOT_A_REGION
regionが、システムに既知の領域ではない。このエラーは、regionがリーフ領域でない場合にも発生する。
・BAD_OFFSET
memory_object_offsetが、memory_objectのサイズより大きい。このエラーは、region + memory_object_offsetのサイズがmemory−objectのサイズより大きい場合にも発生する。
【0325】
【表12】
Figure 0003570525
解説
関数region_copyは、from_regionからto_regionへ情報をコピーする。コピーの規則は、from_regionとto_regionの両方が、コピーの範囲に関してそれらを二重書きするメモリ・オブジェクトを有する必要がある、というものである。コピー範囲を二重書きするメモリ・オブジェクトが、単一のメモリ・オブジェクトである必要はない。二重書きされない「穴」が存在しないことだけが必要である。コピーは、region_copyがリターンした時に、データのすべてがto_regionにコピー済になっているような形で実行される。from_regionおよびto_regionを、コピーの実行を所望するタスクにマッピングする必要はない。
パラメータ
・from_region
[入力、領域ポート]データのコピー元の領域。
・from_region_offset
[入力、vmオフセット]from_region内の、コピーを開始する位置の開始オフセット。
・to_region
[入力、領域ポート]データのコピー先の領域。
・to_region_offset
[入力、vmオフセット]to_region内の、最初のデータを置く位置の開始オフセット。
・copy_amount
[入力、vmサイズ]from_regionからコピーしてto_regionに置くバイト数。
戻り値
・NOT_A_REGION
from_regionまたはto_regionが、システムに既知の領域ではない。
・BAD_OFFSET
from_region_offsetが、from_regionのサイズより大きい。to_region_offsetが、to_regionのサイズより大きい。from_region_offset + copy_amountが、from_regionのサイズより大きい。to_region_offset + copy_amountが、to_regionのサイズより大きい。
・NO_DATA
このコピーに含まれるfrom_regionまたはto_regionの一部が、データを有しない(すなわち、下層のメモリ・オブジェクトがない)場合に、このエラーが返される。
【0326】
【表13】
Figure 0003570525
解説
関数region_get_phys_addrsは、regionに含まれるページのすべての物理ページ・アドレスの配列を返す。関数region_get_phys_addrsが意味のある情報を返すためには、regionの有効属性が、REGION_WIRE_TRANSLATIONが真である(すなわち、regionがワイヤリングされ、その物理アドレスが固定されている)ような形にセットされていなければならない。そうでない場合には、エラーが返される。region_get_phys_addrsは、物理アドレスを得るために必要な場合には、regionに含まれる領域のすべてを再帰的に検査することに留意されたい。
パラメータ
・region
[入力、領域ポート]物理ページ・アドレスのリストが返される領域。
・phys_addr_list
[出力、物理アドレスの動的配列を指すポインタ]示された領域を表す物理ページのリスト。
・phys_addr_list_count
[入出力、スカラを指すポインタ]指定された領域に含まれる物理ページ数。
戻り値
・NOT_A_REGION
regionが、システムに既知の領域ではない。
・NOT_FIXED
regionがワイヤリングされていないので、ページが固定された物理アドレスになく、したがって、物理アドレスのリストを返す意味がない。
【0327】
【表14】
Figure 0003570525
解説
構造体region_attr_tには、関数region_get_attributes、region_set_attributesおよびregion_set_priv_attributesによって1領域に対してセットでき、検索できる属性のすべてが含まれる。region_attr_tの各フィールドは、個別の属性を表す。各属性を、下で説明し、特権属性である場合の属性の意味と、その継承規則を解説する。
フィールド
・access
この属性は、その領域に対して許されるアクセス許可を示す。これは、非特権属性である。この属性の有効値は、外側領域に向かって伝播する。この属性の有効値は、外側領域からこの属性の有効値をとり、含まれる領域の属性との論理和関数を実行することによって決定される。
・cache_attr
この属性は、その領域のキャッシュ属性を示す。キャッシュ属性は、どのハードウェア・キャッシュ特性であるべきかを示す。これは特権属性である。これは入出力ワイヤリング特権を必要とする。この属性の有効値は、内側領域に向かって伝播する。この属性の有効値は、特定のページの組に関する最小のキャッシュ可能性によって決定される。すなわち、有効値は、あるメモリ・オブジェクトの同一の区域をマッピングする領域のすべてによって決定される。
・discardable
この属性は、その領域が破棄可能であることを示す。破棄可能とは、この領域に対して関数region_discardを発行できることを意味する。これは非特権属性である。この属性の有効値は、外側領域に向かって伝播する。この属性の有効値は、外側領域からこの属性の有効値をとり、含まれる領域の属性との論理和関数を実行することによって決定される。たとえば、外側領域が破棄可能であり、囲まれる領域がそうでない場合、外側領域に対してregion_discardを発行することはできない。
・eager_backing
この属性は、メモリ・オブジェクトをリーフ領域に付加する時に補助記憶を割り振らなければならないことを示す。これは非特権属性である。この属性の有効値は、内側領域に向かって伝播する。すなわち、外側領域のeager_backingがセットされている場合、それに含まれる領域のすべてが、eager_backingがセットされているかのように扱われる。
・paging_hint
この属性は、指示された領域に関するカーネル・ページングのアドバイスを与える。これは非特権属性である。この属性の有効値は、属性がセットされた時点で内側領域に伝播する。
・privileged
この属性は、この領域に関する要求を満足するために、予約済みページ・プールからメモリを割り振ることができることを示す。これは、ホスト制御ポートを必要とする特権属性である。この属性の有効値は、この属性がセットされている外側領域によって含まれる内側領域に伝播する。
・physically_contiguous
この属性は、この領域に含まれるメモリが物理的に連続していなければならないことを示す。これは、入出力ワイヤリング制御ポートを必要とする特権属性である。この属性の有効値は、この属性がセットされている外側領域によって囲まれる内側領域に伝播する。
・supervisor
この属性は、セットされている時には領域がスーパーバイザ領域であり、そうでない時にはユーザ領域であることを示す。これは、ホスト特権ポートを必要とする特権属性である。この属性は、外側領域から内側領域へ伝播する。
・vm_behavior
この属性は、指示された領域に関して期待されるアクセス・パターンのヒントをカーネルに与える。これは非特権属性である。この属性の有効値は、属性がセットされる時点で内側領域に伝播する。
・wire_attr
この属性は、この領域に関するページ可能性を示す。これは、入出力ワイヤリング制御ポートを必要とする特権属性である。この属性の有効値は、外側領域に含まれる内側領域に伝播する。
・inheritance
この属性は、この領域に関する継承を示す。この属性は、プリミティブ領域動作によって使用されないが、領域関数の上に作成される高水準関数にとって役に立つ可能性のある情報を提供できる。
【0331】
【発明の効果】
単一のテンプレート領域を同時に複数のタスクにマッピングすることができ、各タスク内のテンプレート領域のマッピングではなく、1つのテンプレート領域に対して変更が行われるので、仮想記憶動作の共用がはるかに簡単に達成される。
【図面の簡単な説明】
【図1】ホスト多重プロセッサ100のメモリ102内のマイクロカーネル・システム115の機能ブロック図である。
【図2】スレッドに関連する、クライアントから可視の構造を示す図である。
【図3】クライアントから可視のタスク構造を示す図である。
【図4】一連の送出権と単一の受取り権とを示す、通常のポートを示す図である。
【図5】ポート名前空間またはメッセージの通過に含まれる、一連のポート権を示す図である。
【図6】クライアントから可視の仮想メモリ構造を示す図である。
【図7】マイクロカーネル・アドレス空間内で形成された3つのテンプレート領域を示す図である。
【図8】テンプレート領域R0の属性を使用してマイクロカーネルによって形成された第1のタスクT(A)を示す図である。
【図9】テンプレート領域R0の属性を使用してマイクロカーネルによって形成された第2のタスクT(B)を示す図である。
【図10】2つのタスクへの1つのテンプレート領域のマッピングを示す図である。
【図11】1つのタスクへの1つのテンプレート領域の2回のマッピングを示す図である。
【図12】オーバーラップするテンプレート領域を示す図である。
【図13】メモリ割振りとオーバーラップするテンプレート領域とを示す図である。
【図14】テンプレート領域の縮合を示す図である。
【図15】メモリ・オブジェクトのマッピングを示す図である。
【図16】メモリ・オブジェクトの不正なマッピングを示す図である。
【図17】仮想メモリ構成要素を示す図である。
【図18】あるタスクのテンプレート領域を示す図である。
【図19】異なるカーネル・インターフェース・ライブラリを有するタスクを示す図である。
【図20】カーネル・タスクのテンプレート領域を示す図である。
【符号の説明】
100 ホスト多重プロセッサ
102 メモリ
104 バス
106 補助記憶装置
108 入出力アダプタ
110 プロセッサA
112 プロセッサB
115 マイクロカーネル・システム
120 マイクロカーネル
122 プロセス間通信モジュール(IPC)
124 仮想メモリ・モジュール
125 マシン依存コード
126 タスクおよびスレッド・モジュール
128 ホストおよびプロセッサ・セット
130 入出力サポートおよび割込み
140 パーソナリティ・ニュートラル・サービス(PNS)
142 多重パーソナリティ・サポート
144 デフォルト・ページャ
146 デバイス・サポート
150 パーソナリティ・サーバ
152 主要パーソナリティ

Claims (13)

  1. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するために、前記メモリにマイクロカーネルをロードするステップと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして前記マイクロカーネルを用いて形成するステップと、
    前記テンプレート領域をタスクにマッピングすることによって、前記属性の組を有し前記テンプレート領域を指すタスク・ポインタを有する前記タスクを、前記メモリ内に前記マイクロカーネルを用いて形成するステップと、
    前記テンプレート・ポインタと前記タスク・ポインタとによって、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立するステップと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するために前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立するステップと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システムのためのメモリ管理方法。
  2. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記メモリ内の特殊オブジェクトとしてのテンプレート領域と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するために前記テンプレート領域に対して仮想記憶動作を実行し、これによって前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立するための手段と
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  3. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
    前記データ処理システムの前記メモリに、選択されたオペレーティング・システム・パーソナリティ・プログラムをロードするステップと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記選択されたオペレーティング・システム・パーソナリティ・プログラムから前記マイクロカーネルに呼出しを送るステップと、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングし、前記テンプレート・ポインタと前記タスク・ポインタによって前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立することによって、前記メモリ内で前記マイクロカーネルを用いて形成するステップと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立するステップと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム内で選択されたオペレーティング・システム・パーソナリティ・プログラムを走行させる方法。
  4. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
    前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内の選択されたオペレーティング・システム・パーソナリティ・プログラムと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成される前記メモリ内のテンプレート領域と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立する手段と
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  5. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
    前記データ処理システムの前記メモリにパーソナリティ・ニュートラル・サービス・プログラムをロードするステップと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記パーソナリティ・ニュートラル・サービス・プログラムから前記マイクロカーネルに呼出しを送るステップと、
    前記属性の組を有し、前記テンプレート領域を指すテンプレート・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングすることによって、前記メモリ内に前記マイクロカーネルを用いて形成するステップと、
    前記テンプレート・ポインタと前記タスク・ポインタとによって、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立するステップと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間に第2マッピング関係を確立するステップと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム内でパーソナリティ・ニュートラル・サービス・プログラムを走行させる方法。
  6. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
    前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内のパーソナリティ・ニュートラル・サービス・プログラムと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成された前記メモリ内のテンプレート領域と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスクにマッピングすることによって形成される、前記メモリ内の前記タスクと、
    前記テンプレート・ポインタと前記タスク・ポインタが、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立する手段と
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  7. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するため、前記メモリにマイクロカーネルをロードするステップと、
    前記データ処理システムの前記メモリにアプリケーション・プログラムをロードするステップと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有するテンプレート領域を、前記メモリ内の特殊オブジェクトとして形成するために、前記アプリケーション・プログラムから前記マイクロカーネルに呼出しを送るステップと、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクを、前記テンプレート領域を前記タスクにマッピングすることによって、前記メモリ内で前記マイクロカーネルを用いて形成するステップと、
    前記テンプレート・ポインタと前記タスク・ポインタによって、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立するステップと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立するステップと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システムでアプリケーション・プログラムを走行させる方法。
  8. データ処理システムのメモリ内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ内のマイクロカーネルと、
    前記メモリ内の特殊オブジェクトとしてテンプレート領域を形成するために前記マイクロカーネルに呼出しを送るための、前記データ処理システムの前記メモリ内のアプリケーション・プログラムと、
    仮想アドレス空間を定義する属性の組を有し、メモリ・オブジェクトを指すテンプレート・ポインタを有する、前記呼出しに応答して形成された前記メモリ内のテンプレート領域と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有するタスクであって、前記テンプレート領域を前記タスク・ポインタにマッピングすることによって形成される、前記メモリ内の前記タスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記メモリ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記メモリ・オブジェクトを指す前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記メモリ・オブジェクトとの間の第2マッピング関係を確立する手段と
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  9. プログラムされた命令を記憶するための補助記憶手段と、
    前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
    仮想アドレス空間を定義する属性の組と、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタとを有する、前記メモリ手段内のテンプレート領域と、
    前記メモリ手段内に実行環境を表すデータ構造体としてのタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
    前記マイクロカーネル手段が前記テンプレート領域をタスクへマッピングすることによって形成される、前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記メモリ手段内の前記タスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
    前記プロセッサ手段内での実行のため、前記第1マッピング関係を使用して、前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッド・オブジェクトと、
    前記キャッシュ・オブジェクトに向かう前記テンプレート・ポインタを修正するため前記テンプレート領域に対する仮想記憶動作を実行し、これによって、前記タスクと前記キャッシュ・オブジェクトとの間の前記第1マッピング関係を変更する手段と
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  10. プログラムされた命令を含むキャッシュ・オブジェクトを記憶するためのメモリ手段と、
    属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
    前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内でタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内のタスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
    前記プロセッサ手段内での実行のため、前記第1マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッドと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  11. プログラムされた命令を記憶するための補助記憶手段と、
    前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
    属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
    前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内にタスクを形成するための、前記メモリ手段内のマイクロカーネル手段と、
    前記属性の組を有し、前記テンプレート領域を指すタスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内のタスクと、
    前記テンプレート・ポインタと前記タスク・ポインタとが、前記タスクと前記キャッシュ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合されたプロセッサ手段と、
    前記プロセッサ手段内での実行のため、前記第1マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記タスクに関連する前記メモリ手段内のスレッドと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  12. プログラムされた命令を記憶するための補助記憶手段と、
    前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
    属性の組を有し、前記キャッシュ・オブジェクトに向かう第1テンプレート・ポインタと第2テンプレート・ポインタとを有する、前記メモリ手段内のテンプレート領域と、
    前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内にタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
    前記属性の組を有し、前記テンプレート領域を指す第1タスク・ポインタを有する、前記マイクロカーネル手段によって形成される前記メモリ手段内の第1タスクと、
    前記第1テンプレート・ポインタと前記第1タスク・ポインタとが、前記第1タスクと前記キャッシュ・オブジェクトとの間の第1マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合された第1プロセッサ手段と、
    前記第1プロセッサ手段内での実行のため、前記第1マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第1タスクに関連する前記メモリ手段内の第1スレッドと、
    前記属性の組を有し、前記テンプレート領域を指す第2タスク・ポインタを有する、前記マイクロカーネル手段によって形成された前記メモリ手段内の第2タスクと、
    前記第2テンプレート・ポインタと前記第2タスク・ポインタとが、前記第2タスクと前記キャッシュ・オブジェクトとの間の第2マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合された第2プロセッサ手段と、
    前記第2プロセッサ手段内での実行のため、前記第2マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第2タスクに関連する前記メモリ手段内の第2スレッドと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
  13. プログラムされた命令を記憶するための補助記憶手段と、
    前記補助記憶手段が前記プログラムされた命令をページングするキャッシュ・オブジェクトを記憶するための、前記補助記憶手段に結合されたメモリ手段と、
    属性の組を有し、前記キャッシュ・オブジェクトに向かうテンプレート・ポインタを有する、前記メモリ手段内のテンプレート領域と、
    前記テンプレート領域を実行環境を表すデータ構造体としてのタスクにマッピングすることによって前記メモリ手段内でタスクを作成するための、前記メモリ手段内のマイクロカーネル手段と、
    前記属性の組を有し、前記テンプレート領域を指す第1タスク・ポインタを有する、前記マイクロカーネルによって形成される前記メモリ手段内の第1タスクと、
    前記第1テンプレート・ポインタと前記タスク・ポインタとが、前記第1タスクと前記キャッシュ・オブジェクトとの間のマッピング関係を確立することと、前記プログラムされた命令を実行するための、前記メモリ手段に結合された第1プロセッサ手段と、
    前記第1プロセッサ手段内での実行のため、前記マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第1タスクに関連する前記メモリ手段内の第1スレッドと、
    前記属性の組を有し、前記テンプレート領域を指す第2タスク・ポインタを有する、前記マイクロカーネル手段によって形成された前記メモリ手段内の第2タスクと、
    前記テンプレート・ポインタと前記第2タスク・ポインタとが、前記第2タスクと前記キャッシュ・オブジェクトとの間の前記マッピング関係を確立することと、
    前記プログラムされた命令を実行するための、前記メモリ手段に結合された第2プロセッサ手段と、
    前記第2プロセッサ手段内での実行のため、前記マッピング関係を使用して前記キャッシュ・オブジェクトから前記プログラムされた命令を取り出すための、前記第2タスクに関連する前記メモリ手段内の第2スレッドと
    を含む、マイクロカーネル・アーキテクチャ・データ処理システム。
JP15423095A 1994-06-22 1995-06-21 マイクロカーネル・アーキテクチャ・データ処理システム及びそのメモリ管理方法、オペレーティング・システム・パーソナリティ・プログラムを走行させる方法、アプリケーション・プログラムを走行させる方法 Expired - Fee Related JP3570525B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US263710 1994-06-22
US08/263,710 US5729710A (en) 1994-06-22 1994-06-22 Method and apparatus for management of mapped and unmapped regions of memory in a microkernel data processing system

Publications (2)

Publication Number Publication Date
JPH0816412A JPH0816412A (ja) 1996-01-19
JP3570525B2 true JP3570525B2 (ja) 2004-09-29

Family

ID=23002937

Family Applications (1)

Application Number Title Priority Date Filing Date
JP15423095A Expired - Fee Related JP3570525B2 (ja) 1994-06-22 1995-06-21 マイクロカーネル・アーキテクチャ・データ処理システム及びそのメモリ管理方法、オペレーティング・システム・パーソナリティ・プログラムを走行させる方法、アプリケーション・プログラムを走行させる方法

Country Status (6)

Country Link
US (1) US5729710A (ja)
EP (1) EP0693728A1 (ja)
JP (1) JP3570525B2 (ja)
KR (1) KR0170565B1 (ja)
BR (1) BR9502801A (ja)
CA (1) CA2147529A1 (ja)

Families Citing this family (99)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5875487A (en) * 1995-06-07 1999-02-23 International Business Machines Corporation System and method for providing efficient shared memory in a virtual memory system
US6023711A (en) * 1995-06-08 2000-02-08 International Business Machines Corporation System and method for flexible file encapsulation through latent levels of isolation
US5829013A (en) * 1995-12-26 1998-10-27 Intel Corporation Memory manager to allow non-volatile memory to be used to supplement main memory
US6064811A (en) * 1996-06-17 2000-05-16 Network Associates, Inc. Computer memory conservation system
JPH1049381A (ja) * 1996-07-04 1998-02-20 Internatl Business Mach Corp <Ibm> 複数のデータ処理要求の処理方法及び処理システム、プログラムの実行方法及びシステム
US6434663B1 (en) * 1996-09-06 2002-08-13 Intel Corporation Disk block allocation optimization methodology with accommodation for file system cluster size greater than operating system memory page size
US6681239B1 (en) * 1996-12-23 2004-01-20 International Business Machines Corporation Computer system having shared address space among multiple virtual address spaces
US5913230A (en) * 1997-01-07 1999-06-15 Richardson; John J. Object and method for providing efficient multi-user access to shared operating system kernal code using instancing
WO1998043193A2 (en) * 1997-03-21 1998-10-01 University Of Maryland Spawn-join instruction set architecture for providing explicit multithreading
US5951706A (en) * 1997-06-30 1999-09-14 International Business Machines Corporation Method of independent simultaneous queueing of message descriptors
US6003066A (en) * 1997-08-14 1999-12-14 International Business Machines Corporation System for distributing a plurality of threads associated with a process initiating by one data processing station among data processing stations
US5931919A (en) * 1997-11-07 1999-08-03 Xerox Corporation State-based object transition control and attribute-based locking
US6173248B1 (en) * 1998-02-09 2001-01-09 Hewlett-Packard Company Method and apparatus for handling masked exceptions in an instruction interpreter
US6219770B1 (en) * 1998-03-23 2001-04-17 Compaq Computer Corporation Method and apparatus for managing copy on write operations in a virtual memory
US6223186B1 (en) * 1998-05-04 2001-04-24 Incyte Pharmaceuticals, Inc. System and method for a precompiled database for biomolecular sequence information
US6470436B1 (en) 1998-12-01 2002-10-22 Fast-Chip, Inc. Eliminating memory fragmentation and garbage collection from the process of managing dynamically allocated memory
CA2322950A1 (en) * 1999-01-06 2000-07-13 Koninklijke Philips Electronics N.V. Arrangement for executing program code with reduced memory requirements
US6594671B1 (en) * 1999-06-14 2003-07-15 International Business Machines Corporation Separating privileged functions from non-privileged functions in a server instance
US6549996B1 (en) * 1999-07-02 2003-04-15 Oracle Corporation Scalable multiple address space server
EP1667027A1 (en) 1999-09-07 2006-06-07 Intel Corporation Dynamic memory caching
EP1222546A1 (en) * 1999-09-07 2002-07-17 Fast-Chip Incorporated Dynamic memory caching
US7140015B1 (en) * 1999-09-29 2006-11-21 Network Appliance, Inc. Microkernel for real time applications
US6345351B1 (en) * 1999-11-12 2002-02-05 Telefonaktiebolaget Lm Ericsson(Publ) Maintenance of speculative state of parallel executed jobs in an information processing system
AU2004202666B2 (en) * 1999-11-19 2007-03-22 General Dynamics C4 Systems, Inc. A method of allocating memory and performing a remote procedure call
US6772416B1 (en) * 1999-11-19 2004-08-03 General Dynamics Decision Systems, Inc. Separation kernel with memory allocation, remote procedure call and exception handling mechanisms
US6772212B1 (en) * 2000-03-08 2004-08-03 Phatnoise, Inc. Audio/Visual server
US7490166B2 (en) 2000-05-26 2009-02-10 Citrix Systems, Inc. Remote control of a client's off-screen surface
US20020016878A1 (en) * 2000-07-26 2002-02-07 Flores Jose L. Technique for guaranteeing the availability of per thread storage in a distributed computing environment
US7073173B1 (en) * 2000-12-04 2006-07-04 Microsoft Corporation Code and thread differential addressing via multiplex page maps
ATE480822T1 (de) * 2001-02-13 2010-09-15 Candera Inc Failover-verarbeitung in einem speicherungssystem
US7065755B2 (en) * 2001-03-15 2006-06-20 Sun Microsystems, Inc. Method and apparatus for removing class initialization barriers from shared compiled methods
US7089561B2 (en) * 2001-06-01 2006-08-08 Microsoft Corporation Methods and systems for creating and communicating with computer processes
US6671786B2 (en) * 2001-06-07 2003-12-30 Microsoft Corporation System and method for mirroring memory with restricted access to main physical mirrored memory
US7318238B2 (en) * 2002-01-14 2008-01-08 Microsoft Corporation Security settings for markup language elements
US7058786B1 (en) * 2002-01-17 2006-06-06 Hewlett-Packard Development Company Operating system data communication method and system
JP4777651B2 (ja) * 2002-08-23 2011-09-21 イグジット−キューブ,インク. コンピュータシステム及びデータ保存方法
US7155571B2 (en) * 2002-09-30 2006-12-26 International Business Machines Corporation N-source in-kernel cache for high performance in computer operating systems
US7085909B2 (en) * 2003-04-29 2006-08-01 International Business Machines Corporation Method, system and computer program product for implementing copy-on-write of a file
US20040268139A1 (en) * 2003-06-25 2004-12-30 Microsoft Corporation Systems and methods for declarative client input security screening
US7650601B2 (en) * 2003-12-04 2010-01-19 International Business Machines Corporation Operating system kernel-assisted, self-balanced, access-protected library framework in a run-to-completion multi-processor environment
GB2412761C (en) * 2004-04-02 2011-01-05 Nokia Corp Improvements in or relating to an operating system for a computing device
US20050251804A1 (en) * 2004-05-04 2005-11-10 International Business Machines Corporation Method, data processing system, and computer program product for detecting shared resource usage violations
US7249238B2 (en) 2004-06-15 2007-07-24 International Business Machines Corporation Memory tracking with preservation of alignment semantics
US7562359B1 (en) * 2004-08-26 2009-07-14 Wind River Systems, Inc. User process object code installer
US7831642B1 (en) * 2004-09-30 2010-11-09 Symantec Operating Corporation Page cache management for a shared file
US7793293B2 (en) * 2004-11-01 2010-09-07 Hewlett-Packard Development Company, L.P. Per processor set scheduling
US8214461B1 (en) * 2004-11-23 2012-07-03 Hewlett-Packard Development Company, L.P. Method of processing request by server computer system
US7613671B2 (en) * 2005-02-15 2009-11-03 Fair Isaac Corporation Approach for re-using business rules
US8219823B2 (en) * 2005-03-04 2012-07-10 Carter Ernst B System for and method of managing access to a system using combinations of user information
US8171169B2 (en) * 2005-03-14 2012-05-01 Citrix Systems, Inc. Method and apparatus for updating a graphical display in a distributed processing environment
US8423673B2 (en) 2005-03-14 2013-04-16 Citrix Systems, Inc. Method and apparatus for updating a graphical display in a distributed processing environment using compression
US7519636B2 (en) * 2005-03-30 2009-04-14 Sap Ag Key sequenced clustered I/O in a database management system
US7454477B2 (en) * 2005-05-16 2008-11-18 Microsoft Corporation Zero-copy transfer of memory between address spaces
US8078740B2 (en) * 2005-06-03 2011-12-13 Microsoft Corporation Running internet applications with low rights
US7698510B2 (en) * 2005-06-22 2010-04-13 Hewlett-Packard Development Company, L.P. Systems and methods for identifying and registering a range of virtual memory
US7793299B2 (en) * 2005-08-30 2010-09-07 International Business Machines Corporation System and method for scheduling tasks for execution
US7516291B2 (en) * 2005-11-21 2009-04-07 Red Hat, Inc. Cooperative mechanism for efficient application memory allocation
US7734842B2 (en) * 2006-03-28 2010-06-08 International Business Machines Corporation Computer-implemented method, apparatus, and computer program product for managing DMA write page faults using a pool of substitute pages
US8868930B2 (en) 2006-05-31 2014-10-21 International Business Machines Corporation Systems and methods for transformation of logical data objects for storage
JP5431148B2 (ja) 2006-05-31 2014-03-05 インターナショナル・ビジネス・マシーンズ・コーポレーション ストレージ用論理データオブジェクトの変換方法およびシステム
US8185737B2 (en) * 2006-06-23 2012-05-22 Microsoft Corporation Communication across domains
US20080046724A1 (en) * 2006-07-25 2008-02-21 General Dynamics C4 System, Inc. Method for governing interaction between code within a code base
US20080066183A1 (en) * 2006-09-12 2008-03-13 George Madathilparambil George Master device for manually enabling and disabling read and write protection to parts of a storage disk or disks for users
US8443341B2 (en) * 2006-11-09 2013-05-14 Rogue Wave Software, Inc. System for and method of capturing application characteristics data from a computer system and modeling target system
US7805403B2 (en) 2007-01-07 2010-09-28 Apple Inc. Synchronization methods and systems
US7870277B2 (en) * 2007-03-12 2011-01-11 Citrix Systems, Inc. Systems and methods for using object oriented expressions to configure application security policies
US8631147B2 (en) 2007-03-12 2014-01-14 Citrix Systems, Inc. Systems and methods for configuring policy bank invocations
US7865589B2 (en) 2007-03-12 2011-01-04 Citrix Systems, Inc. Systems and methods for providing structured policy expressions to represent unstructured data in a network appliance
US7853679B2 (en) * 2007-03-12 2010-12-14 Citrix Systems, Inc. Systems and methods for configuring handling of undefined policy events
US8490148B2 (en) 2007-03-12 2013-07-16 Citrix Systems, Inc Systems and methods for managing application security profiles
US7853678B2 (en) 2007-03-12 2010-12-14 Citrix Systems, Inc. Systems and methods for configuring flow control of policy expressions
US7926035B2 (en) * 2007-04-24 2011-04-12 Microsoft Corporation Testing multi-thread software using prioritized context switch limits
WO2008132761A2 (en) 2007-04-26 2008-11-06 Hewlett-Packard Development Company L.P. Method and system for managing heap across process replication
US10019570B2 (en) * 2007-06-14 2018-07-10 Microsoft Technology Licensing, Llc Protection and communication abstractions for web browsers
US20090158299A1 (en) * 2007-10-31 2009-06-18 Carter Ernst B System for and method of uniform synchronization between multiple kernels running on single computer systems with multiple CPUs installed
WO2010030996A1 (en) * 2008-09-15 2010-03-18 Virsto Software Storage management system for virtual machines
US8073674B2 (en) * 2008-09-23 2011-12-06 Oracle America, Inc. SCSI device emulation in user space facilitating storage virtualization
KR101003102B1 (ko) * 2008-09-24 2010-12-21 한국전자통신연구원 멀티 프로세싱 유닛에 대한 메모리 매핑방법, 및 장치
US9442810B2 (en) 2009-07-31 2016-09-13 Paypal, Inc. Cloud computing: unified management console for services and resources in a data center
US8353019B2 (en) * 2010-03-26 2013-01-08 Canon Kabushiki Kaisha Security token destined for multiple or group of service providers
US9112769B1 (en) * 2010-12-27 2015-08-18 Amazon Technologies, Inc. Programatically provisioning virtual networks
US9342348B2 (en) * 2012-01-23 2016-05-17 Brocade Communications Systems, Inc. Transparent high availability for stateful services
US8935475B2 (en) * 2012-03-30 2015-01-13 Ati Technologies Ulc Cache management for memory operations
US9519887B2 (en) * 2014-12-16 2016-12-13 Bank Of America Corporation Self-service data importing
US10225361B2 (en) 2016-06-29 2019-03-05 International Business Machines Corporation Content management in caching services
US11126740B2 (en) * 2016-11-04 2021-09-21 Microsoft Technology Licensing, Llc Storage isolation for containers
US10423478B2 (en) * 2017-08-29 2019-09-24 Red Hat, Inc. Security enhanced out of process user space handling of hardware events
US10437735B2 (en) 2017-12-13 2019-10-08 Red Hat, Inc. Process isolation for out of process page fault handling
CN109086221B (zh) * 2018-07-20 2021-10-29 郑州云海信息技术有限公司 一种增加存储设备内存容量的方法及系统
US20200065013A1 (en) * 2018-08-21 2020-02-27 International Business Machines Corporation Selective memory page initialization
US10997083B2 (en) * 2018-09-04 2021-05-04 Arm Limited Parallel page table entry access when performing address translations
US11741196B2 (en) 2018-11-15 2023-08-29 The Research Foundation For The State University Of New York Detecting and preventing exploits of software vulnerability using instruction tags
US11113128B1 (en) 2019-09-06 2021-09-07 Facebook Technologies, Llc Circular queue for microkernel operating system
US11314566B1 (en) * 2019-09-06 2022-04-26 Facebook Technologies, Llc. Inter-process communication for microkernel operating system
US10795739B1 (en) * 2019-09-06 2020-10-06 Facebook Technologies, Llc Port configuration for microkernel operating system
CN112182580B (zh) * 2019-09-19 2024-04-09 中国科学院信息工程研究所 一种基于处理器芯片的内存漏洞检测方法及电子装置
US10990439B1 (en) * 2019-09-26 2021-04-27 Facebook Technologies, Llc Tracing task execution across services in microkernel-based operating systems
CN112799799A (zh) * 2020-12-29 2021-05-14 杭州涂鸦信息技术有限公司 数据消费方法及装置
CN116136826A (zh) * 2021-11-17 2023-05-19 华为技术有限公司 内存访问方法、芯片、电子设备及计算机可读存储介质

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE331900C (de) * 1921-01-17 Moll Werke Akt Ges Schmiedeeiserner Gliederheizkoerper mit Schraubnippelverbindungen und Abstandshuelsen zwischen den Gliedern
GB416768A (en) * 1932-12-29 1934-09-20 Konrad Zilcken Improvements in and relating to socks and stockings
US4945480A (en) * 1988-02-10 1990-07-31 International Business Machines Corporation Data domain switching on program address space switching and return
DE69032418T2 (de) * 1989-09-08 1999-02-25 Digital Equipment Corp Privatspeicher für Fäden in einem multifaden digitalen Datenverarbeitungssystem
US5428729A (en) * 1991-12-20 1995-06-27 International Business Machines Corporation System and method for computer aided software engineering

Also Published As

Publication number Publication date
BR9502801A (pt) 1997-08-05
KR0170565B1 (ko) 1999-03-30
US5729710A (en) 1998-03-17
EP0693728A1 (en) 1996-01-24
JPH0816412A (ja) 1996-01-19
KR960001993A (ko) 1996-01-26
CA2147529A1 (en) 1995-12-23

Similar Documents

Publication Publication Date Title
JP3570525B2 (ja) マイクロカーネル・アーキテクチャ・データ処理システム及びそのメモリ管理方法、オペレーティング・システム・パーソナリティ・プログラムを走行させる方法、アプリケーション・プログラムを走行させる方法
US5771383A (en) Shared memory support method and apparatus for a microkernel data processing system
US5129084A (en) Object container transfer system and method in an object based computer operating system
US5129083A (en) Conditional object creating system having different object pointers for accessing a set of data structure objects
US5136712A (en) Temporary object handling system and method in an object based computer operating system
US5057996A (en) Waitable object creation system and method in an object based computer operating system
Loepere Mach 3 kernel principles
US5598562A (en) System and method for adding new waitable object types to object oriented computer operating system
US5187790A (en) Server impersonation of client processes in an object based computer operating system
US5475845A (en) Wrapper system for interfacing an object-oriented application to a procedural operating system
Russo An object-oriented operating system
Khalidi et al. The Spring virtual memory system
JP2986073B2 (ja) プロセス間通信方法並びにプロセス間通信用のサブシステムおよびシステム
EP0695993A2 (en) System and method for interprocess communication
Bryant et al. Operating system support for parallel programming on RP3
JP2888420B2 (ja) マルチタスク・アーキテクチャにおけるプロセス間通信方法
Gerber Authorization, Protection, and Allocation of Memory in a Large System
EP0689138A2 (en) Temporary data method and apparatus for a microkernel data processing system
Loepere OSF Mach Final Draft Kernel Principles
Kougiouris A device management framework for an object-oriented operating system
EP0689137A2 (en) Message control structure registration method and apparatus for a microkernel data processing system
Draves et al. The Rialto virtual memory system
Seo et al. An effective design of master-slave operating system architecture for multiprocessor embedded systems
Leblanc et al. The elmwood multiprocessor operating system
Appavoo et al. Utilizing Linux kernel components in K42

Legal Events

Date Code Title Description
A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040616

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20080702

Year of fee payment: 4

LAPS Cancellation because of no payment of annual fees