(57)【要約】  本発明は、複数の異なるオペレーティングシステムを、Ｉｎｔｅｌまたは類似する複合命令セットコンピュータアーキテクチャである同一コンピュータ上で同時に動作させる方法であって、相対的に高い優先順位を有する第１オペレーティングシステム（Ｃ５などのリアルタイムオペレーティングシステム）を選択することと、相対的に低い優先順位を有する少なくとも１つの副オペレーティングシステム（Ｌｉｎｕｘなどの汎用オペレーティングシステム）を選択することと、所定の条件の下で各オペレーティングシステムの間で切り替えるように構成された共通プログラム（ナノカーネルに似たハードウェアリソースディスパッチャ）を提供することと、第１および第２のオペレーティングシステムを共通プログラムによって制御できるようにするために、第１および第２のオペレーティングシステムを修正することとを含むものである。【選択図】  図２ｂ
2007509387.tif 000002
【特許請求の範囲】
【請求項１】
複数の異なるオペレーティングシステムを同一コンピュータ上で同時に動作させる方法であって、
相対的に高い優先順位を有する第１のオペレーティングシステムを選択するステップと、
相対的に低い優先順位を有する少なくとも１つの第２のオペレーティングシステムを選択するステップと、
所定の条件に従って前記各オペレーティングシステムをこれらの間で切り替えるように組まれた共通プログラムを提供するステップと、
前記第１および第２のオペレーティングシステムが前記共通プログラムによって制御されるようにするために、前記第１および第２のオペレーティングシステムに対して修正を加えるステップと、
を含む方法。
【請求項２】
前記第１および第２のオペレーティングシステムが、それぞれ第１および第２のメモリコンテキストに関連するとともに、前記共通プログラムが、第３のメモリコンテキストに関連しており、
前記各オペレーティングシステムの間で切り替えるときに、現在のメモリコンテキストを前記第１、第２、または第３のメモリコンテキストに切り替えるステップを含む、請求項１に記載の方法。
【請求項３】
前記第１のオペレーティングシステムに、または、前記第１のオペレーティングシステムから切り替えるときに、前記現在のメモリコンテキストを前記第１メモリコンテキストに切り替えるステップをさらに含む、請求項２に記載の方法。
【請求項４】
前記第１のオペレーティングシステムによって前記共通プログラムを呼び出すステップと、前記第１のメモリコンテキストで前記共通プログラムの実行を開始するステップとをさらに含む、請求項２または３に記載の方法。
【請求項５】
前記共通プログラムによって前記第１のオペレーティングシステムをプリエンプトするステップと、前記第１のメモリコンテキストで前記共通プログラムの実行を開始するステップとをさらに含む、請求項２または３に記載の方法。
【請求項６】
前記第２のオペレーティングシステムから切り替えるときに、前記現在のメモリコンテキストを前記第３のメモリコンテキストに切り替えるステップを含む、請求項２に記載の方法。
【請求項７】
前記第２のオペレーティングシステムによって前記共通プログラムを呼び出すステップをさらに含み、前記現在のメモリコンテキストが、前記第３メモリコンテキストである、請求項６に記載の方法。
【請求項８】
前記共通プログラムによって前記第２のオペレーティングシステムをプリエンプトするステップをさらに含み、前記現在のメモリコンテキストが、前記第３のメモリコンテキストである、請求項６に記載の方法。
【請求項９】
前記第２のオペレーティングシステムが、トラップ呼出しによって前記共通プログラムを呼び出す、請求項８に記載の方法。
【請求項１０】
前記第１のオペレーティングシステムが、リアルタイムオペレーティングシステムである、請求項１〜９のいずれかに記載の方法。
【請求項１１】
前記第２のオペレーティングシステムが、非リアルタイム汎用オペレーティングシステムである、請求項１〜１０のいずれかに記載の方法。
【請求項１２】
前記第２のオペレーティングシステムが、Ｌｉｎｕｘまたはその版もしくはその変形である、請求項１〜１１のいずれかに記載の方法。
【請求項１３】
前記共通プログラムが、前記各オペレーティングシステムの間で切り替えるのに必要なプロセッサ状態を保存し、保存された版から復元するように構成される、請求項１〜１２のいずれかに記載の方法。
【請求項１４】
前記第２のオペレーティングシステムに関するプロセッサ例外が、前記共通プログラムによって仮想的な形で処理される、請求項１〜１３のいずれかに記載の方法。
【請求項１５】
前記共通プログラムが、いくつかのプロセッサ例外をインターセプトし、それらにサービスするために前記第１のオペレーティングシステムの例外処理ルーチンを呼び出すように構成される、請求項１〜１４のいずれかに記載の方法。
【請求項１６】
前記第２のオペレーティングシステムに関する前記プロセッサ例外が、仮想例外として通知される、請求項１〜１５のいずれかに記載の方法。
【請求項１７】
前記共通プログラムが、保留中である前記仮想例外に対応する前記第２のオペレーティングシステムの例外処理ルーチンを呼び出すように構成される、請求項１６に記載の方法。
【請求項１８】
前記オペレーティングシステムのそれぞれに、前記オペレーティングシステムのそれぞれがその中で排他的に動作できる別々のメモリ空間を提供するステップをさらに含む、請求項１〜１７のいずれかに記載の方法。
【請求項１９】
前記オペレーティングシステムのそれぞれに、前記オペレーティングシステムのそれぞれが排他的にアクセスできる前記コンピュータの第１の入力デバイスおよび／または出力デバイスを提供するステップをさらに含む、請求項１〜１８のいずれかに記載の方法。
【請求項２０】
各オペレーティングシステムが、実質的に変更されていないネイティブルーチンを使用して前記第１の入力デバイスおよび／または出力デバイスにアクセスする、請求項１〜１９のいずれかに記載の方法。
【請求項２１】
前記オペレーティングシステムのそれぞれに、前記オペレーティングシステムのそれぞれが共用アクセスを有する前記コンピュータの第２の入力デバイスおよび／または出力デバイスへのアクセスを提供するステップをさらに含む、請求項１〜２０のいずれかに記載の方法。
【請求項２２】
すべてのオペレーティングシステムが、前記第１のオペレーティングシステムのルーチンを使用して前記第２の入力デバイスおよび／または出力デバイスにアクセスする、請求項２１に記載の方法。
【請求項２３】
前記第１のオペレーティングシステムまたは前記共通プログラムの動作に割り込まずに前記第２のオペレーティングシステムを再始動する再始動ルーチンを提供するステップをさらに含む、請求項１〜２２のいずれかに記載の方法。
【請求項２４】
前記第２デバイスがコプロセッサを含んでおり、
前記第１のオペレーティングシステムと前記第２のオペレーティングシステム（またはその逆）の間で切り替えるときに、前記コプロセッサの状態は変更されず、
これにより、前記コプロセッサへの間に入るアクセスなしで前記オペレーティングシステムが元に切り替わる場合に、その動作が割り込まれずに完了できる、請求項２１に記載の方法。
【請求項２５】
１つまたは複数のオリジナルアドレステーブルが、オペレーティングシステムによる使用のために前記コンピュータによって提供され、
前記共通プログラムが、前記オリジナルアドレステーブルにアクセスするとともに、メモリ内の他の場所において、各オペレーティングシステムによってそれぞれが使用される、各オペレーティングシステムのテーブルごとに１つ、前記オリジナルテーブルと同一の構造を有する複数の複製されたテーブルを提供し、
前記オペレーティングシステムが、前記オリジナルアドレステーブルに書き込む命令を、前記複製されたテーブルにアクセスするルーチン呼出しに置換するために変更される、請求項１に記載の方法。
【請求項２６】
前記各オペレーティングシステムおよび共通プログラムを単一コード製品に組み合わせるステップをさらに含む、請求項１〜２５のいずれかに記載の方法。
【請求項２７】
前記各オペレーティングシステムおよび共通プログラムをコンピュータ製品上の永続メモリに組み込むステップをさらに含む、請求項１〜２６のいずれかに記載の方法。
【請求項２８】
前記各オペレーティングシステムに、その中で前記共通プログラムに制御を渡すアイドルルーチンが設けられる、請求項１〜２７のいずれかに記載の方法。
【請求項２９】
前記アイドルルーチンが、プロセッサホールト命令の代わりに用いられる、請求項２８に記載の方法。
【請求項３０】
請求項１〜２９のいずれかの前記ステップを実行するコードを備えるデベロッパキットコンピュータプログラム製品。
【請求項３１】
請求項３０に従って組み合わされたコードを備えるコンピュータプログラム製品。
【請求項３２】
ＣＰＵ、メモリデバイス、および入出力デバイスを備え、請求項３１に従って組み込まれたプログラムをその中の永続メモリに格納された、組み込みコンピュータシステム。
【請求項３３】
ＣＰＵ、メモリデバイス、および入出力デバイスを備えるコンピュータシステムであって、
相対的に高い優先順位を有する第１のオペレーティングシステムと、
相対的に低い優先順位を有する第２のオペレーティングシステムと、
所定の条件の下で前記各オペレーティングシステムの間でこれらを切り替えることによって、前記オペレーティングシステムを同時に動作させるように構成された共通プログラムと、
を含むコンピュータコードをその上で実行する、コンピュータシステム。
【請求項３４】
請求項１〜２９のいずれかに記載の方法を使用して前記第１および第２のオペレーティングシステムを同時に動作させるように構成された、請求項３３に記載のコンピュータシステム。
【請求項３５】
プロセッサおよびメモリを備えており、
それぞれ第１および第２のメモリコンテキスト内で第１および第２のオペレーティングシステムを動作させるとともに、前記第１および第２のオペレーティングシステムの間でこれらを切り替えるように前記第１または第３のメモリコンテキストで動作可能な共通プログラムを動作させるコンピュータコードをその上で実行させ、
その中で前記共通プログラムが動作する前記メモリコンテキストが、前記切替動作に依存する、コンピュータシステム。
【請求項３６】
前記コンピュータが、複合命令セットアーキテクチャを有する、請求項１〜３５のいずれかに記載のシステム、製品、または方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オペレーティングシステムに関する。具体的には、本発明は、複数のオペレーティングシステムを同時に動作させるシステム、方法、およびコンピュータプログラムに関する。
【０００２】
いくつかのコンピュータプログラムでは、プログラムのステップが、規定された時間内にまたは規定された時刻に実行されることが重要である。そのようなプログラムの例としては、携帯電話機を動作させる制御プログラム、または構内交換機（ＰＢＸ）もしくはセルラ基地局を動作させる制御プログラムが挙げられる。通常、プログラムは、外部イベントまたは状態の変化に対して、一貫した形で、そのイベントの後の特定の時刻にまたはある時間以内に応答しなければならない。これを「リアルタイム」での動作と称する。
【０００３】
しかし、多数の他のプログラムについては、そのプログラムを実行するのに要する時間は、重要ではない。これは、スプレッドシートプログラム、ワードプロセッシングプログラム、給与パッケージ、および一般的なレポート作成プログラムまたは分析プログラムを含めて、大抵の一般的なコンピュータプログラムにあてはまる。その一方で、そのようなプログラムが要する正確な時間はクリティカルでないが、大抵の場合、ユーザは、可能であるならば、よりすばやい実行を好む。
【０００４】
アプリケーションプログラムは、それが動作するコンピュータと、オペレーティングシステムを介して相互作用する。オペレーティングシステムのアプリケーションプログラミングインターフェース（ＡＰＩ）を使用することによって、アプリケーションプログラムをポータブルな形で記述することができ、その結果、そのアプリケーションプログラムを、異なるハードウェアリソースを有する異なるコンピュータで実行できるようになる。さらに、ＬｉｎｕｘまたはＷｉｎｄｏｗｓなどの一般的なオペレーティングシステムは、マルチタスキングを提供する。言い換えると、これらのオペレーティングシステムは、複数のプログラムを同時に実行することを可能にする。それを行うために、これらのオペレーティングシステムは、スケジューリングを提供する。言い換えると、これらのオペレーティングシステムは、異なるプログラムの間でコンピュータのリソースの使用を共用し、スケジューリングアルゴリズムに従って各プログラムに時間を割り振る。この種のオペレーティングシステムは、非常に広い範囲で使用されているが、一般に、リアルタイムアプリケーションを動作させる準備がなく、したがって、多数の制御タスクまたは通信タスクに不適切である。
【０００５】
したがって、そのようなタスクに関して、リアルタイムオペレーティングシステムが開発され、その一例が、ＣｈｏｒｕｓＯＳ（Ｃｈｏｒｕｓとも称する）およびその派生物である。Ｃｈｏｒｕｓは、オープンソースソフトウェアとしてｈｔｔｐ：／／ｗｗｗ．ｅｘｐｅｒｉｍｅｎｔａｌｓｔｕｆｆ．ｃｏｍ／Ｔｅｃｈｎｏｌｏｇｉｅｓ／ＣｈｏｒｕｓＯＳ／ｉｎｄｅｘ．ｈｔｍｌから、およびｈｔｔｐ：／／ｗｗｗ．ｊａｌｕｎａ．ｃｏｍ／のＪａｌｕｎａから入手可能である。
【０００６】
ＣｈｏｒｕｓＯＳは、ｈｔｔｐ：／／ｗｗｗ．ｊａｌｕｎａ．ｃｏｍ／ｄｅｖｅｌｏｐｅｒ／ｐａｐｅｒｓ／ＣＯＳＤＥＳＰＥＲＦ．ｐｄｆから入手できる「ＣｈｏｒｕｓＯＳ  Ｆｅａｔｕｒｅｓ  ａｎｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ  ｏｖｅｒｖｉｅｗ」、Ｆｒａｎｃｏｉｓ  Ａｒｍａｎｄ、Ｓｕｎ  Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ、２００１年８月、２２２頁で説明されている。
【０００７】
これらのオペレーティングシステムを使用して、他のタイプのプログラムを動作させることもできる。しかし、ユーザは、当然、ＷｉｎｄｏｗｓまたはＬｉｎｕｘなどの汎用オペレーティングシステム用に記述された膨大な数の「レガシ（ｌｅｇａｃｙ）」プログラムを、リアルタイムオペレーティングシステムで動作させるためにこれらを書き直す必要なしに実行できることを望む。
【０００８】
「デュアルブート」システムを提供し、ユーザが一方のオペレーティングシステムまたは他方のオペレーティングシステムのいずれかを動作させることを可能にすることができるが、リアルタイムプログラムを動作させるのと同時に「レガシ」プログラムを動作できることが望ましい場合が多数ある。例えば、遠隔通信ネットワークインフラストラクチャ機器、第３世代携帯電話機および他の高度な電話機、ならび高度な電子ゲーム機器が、リアルタイムアプリケーション（例えば、グラフィックスを再生するゲーム）および非リアルタイムアプリケーション（ゲームのダウンロード）の両方を必要とする可能性がある。
【０００９】
米国特許第５９０３７５２号および米国特許第５７２１９２２号では、非リアルタイムオペレーティングシステム（Ｗｉｎｄｏｗｓなど）の割込み処理環境にリアルタイムマルチタスキングカーネルを設けることによって、非リアルタイムオペレーティングシステムにリアルタイム環境を組み込む試みが行われている。
【００１０】
広く使用されている１つの手法が、「エミュレーション」である。通常、汎用オペレーティングシステム用に記述されたプログラムの各命令を解釈し、リアルタイムオペレーティングシステムの下で対応する一連の命令を実行するエミュレータプログラムが、リアルタイムオペレーティングシステムの下で動作するように記述される。しかし、１つの命令が、必ず多数の命令によって置換されるので、エミュレーションは、より重い負荷をコンピュータにかけ、性能がより低下する。類似する問題が、仮想計算機（例えば、Ｊａｖａ（商標）仮想計算機）を提供することに基づく手法から生じる。仮想計算機実装の例が、欧州特許第１０５９５８２号、米国特許第５４９９３７９号、および米国特許第４７６４８６４号である。
【００１１】
さらに同様な技法が、米国特許第５９９５７４５号（Ｙｏｄａｉｋｅｎ）に記載されている。Ｙｏｄａｉｋｅｎは、マルチタスキングリアルタイムオペレーティングシステムが、そのタスクの１つとして汎用オペレーティングシステムを動作させ、リアルタイムタスクの実行に必要なときにそれに取って代わる（プリエンプトする）システムを説明している。
【００１２】
もう１つの手法が、例えば欧州特許第０３６０１３５号および記事「Ｍｅｒｇｉｎｇ  ｒｅａｌ−ｔｉｍｅ  ｐｒｏｃｅｓｓｉｎｇ  ａｎｄ  ＵＮＩＸ  Ｖ」、（Ｇｏｓｃｈ）、ＥＬＥＣＴＲＯＮＩＣＳ、１９９０年９月、６２頁に記載されている、汎用オペレーティングシステムのモジュールとしてリアルタイムオペレーティングシステムを動作させることである。この例では、ハードウェア割込みは、汎用オペレーティングシステムに関係するハードウェア割込みがリアルタイムオペレーティングシステムをプリエンプトしてはならないという意図で、選択的にマスクされる。
【００１３】
もう１つの手法が、ｈｔｔｐ：／／ｏｐｅｒｓｙｓ．ｃｏｍ／ｆｔｐ／ｐｕｂ／Ａｄｅｏｓ／ａｄｅｏｓ．ｐｄｆのホワイトペーパーに記載されたＡＤＥＯＳ（Ａｄａｐｔｉｖｅ  Ｄｏｍａｉｎ  Ｅｎｖｉｒｏｎｍｅｎｔ  ｆｏｒ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ）の手法である。
【００１４】
ＡＤＥＯＳは、とりわけ複数のオペレーティングシステムを動作させることを意図されたナノカーネルを提供するが、Ｌｉｎｕｘと共に実装されただけであるように思われる。ＡＤＥＯＳの提案された用途の１つが、ＡＤＥＯＳにＲＴＡＩ（Ｒｅａｌｔｉｍｅ  Ａｐｐｌｉｃａｔｉｏｎ  Ｉｎｔｅｒｆａｃｅ  ｆｏｒ  Ｌｉｎｕｘ）に割込みを分配させることであったが、ＲＴＡＩについては、ｈｔｔｐ：／／ｗｗｗ．ａｅｒｏ．ｐｏｌｉｍｉ．ｉｔ／〜ｒｔａｉ／ａｐｐｌｉｃａｔｉｏｎｓ／を参照されたい。
【００１５】
欧州特許第１０５４３３２号に、「スイッチングユニット」（完全な理解に十分に詳細には説明されていない）が、リアルタイムオペレーティングシステムおよび汎用オペレーティングシステムを動作させるシステムが記載されている。ハードウェア割込みが、共通の割込みハンドラによって処理され、いくつかの実施形態では、ハードウェア割込みはリアルタイムオペレーティングシステムによって処理され、このリアルタイムオペレーティングシステムは、副オペレーティングシステム内のルーチンで処理されるソフトウェア割込みをより低い優先順位レベルで生成する。
【００１６】
本発明の目的は、複数のオペレーティングシステムを、これらが異なる目的のために設計されている場合であっても、同時に動作させる改善されたシステム、方法、およびコンピュータプログラムを提供することである。特に、本発明は、オペレーティングシステムのうちの１つ（例えば、リアルタイムオペレーティングシステム）が、邪魔されずに動作することを可能にし、他のオペレーティングシステム（例えば、汎用オペレーティングシステム）が、コンピュータの残りのリソースを使用して、できる限り良好に動作することを可能にすることを目指す。
【００１７】
したがって、一態様で、本発明は、複数のオペレーティングシステムが、わずかに修正され、それらの間でスケジューリングする共通のプログラムを設けられ、オペレーティングシステムのうちの１つ（「主」オペレーティングシステムまたは「クリティカル」オペレーティングシステム）が、別のオペレーティングシステム（「副」オペレーティングシステムまたは非クリティカルオペレーティングシステム）より優先されるシステムを提供する。本発明は、クリティカルオペレーティングシステムに優先的にハードウェアを割り振り、クリティカルオペレーティングシステムのアクセスに干渉する１つまたは複数の副オペレーティングシステムアクセスを拒否することが好ましい。本発明は、アクセスが副オペレーティングシステムによって要求される場合であっても、クリティカルオペレーティングシステムドライバを使用して共用リソースにアクセスすることが好ましい。しかし、決して、米国特許第５９９５７４５号のように、クリティカルオペレーティングシステムが副オペレーティングシステムを「動作させる」のではない。各システムは、一緒に動作している他のシステムを無視し、共通プログラム（従来技術のナノカーネルに対応する）だけと通信し、この共通プログラムが、クリティカルオペレーティングシステムのドライバへのアクセスを仲介する。
【００１８】
副オペレーティングシステムが割り込みをマスクできないように変更され、その割込みサービスルーチンが、割込みが発生したことを示すメッセージに応答するように変更されることが好ましい。共通プログラムは、すべてのハードウェア例外を主オペレーティングシステムの割込みサービスルーチンに渡すことによって、すべてのハードウェア例外を処理し、ハードウェア割込みが副オペレーティングシステムのうちの１つにあてられたものである場合に、割込みメッセージまたは割込み通知が生成される。副オペレーティングシステムが次に共通プログラムによってスケジューリングされるときに、そのメッセージまたは通知が、この副オペレーティングシステムに渡され、共通プログラムが、その割込みサービスルーチンを呼び出して、その割込みをサービスする。
【００１９】
したがって、副オペレーティングシステムは、割込み発生時に、いかなる形でも主オペレーティングシステム（または、一般的に、より重要性の高い副オペレーティングシステム）に取って代わる（プリエンプトする）ことができない。というのは、すべてが、まず主オペレーティングシステムによって処理され、主オペレーティングシステムが実行を終了し、それらの宛先である副オペレーティングシステムがスケジューリングされた後に、その副オペレーティングシステムに通知されるだけであるからである。
【００２０】
したがって、そのような割込みの処理は、主オペレーティングシステムでクリティカルタスクが発生しなくなるまで延期される。しかし、そのような割込みが最終的に実施されるときに、副オペレーティングシステムのルーチンが、実質的に変更されない形で動作することができ、その結果、挙動が、（遅延を除いて）副オペレーティングシステムの期待する通りになる。
【００２１】
そのようなシステムが、参照によって本明細書に組み込まれている、我々が以前に出願したＰＣＴ出願ＰＣＴ／ＥＰ０４／００３７１号に記載されている。
【００２２】
本発明は、Ｉｎｔｅｌ  ＩＡ−３２アーキテクチャに基づくものなどの複合命令セットコンピュータ（ＣＩＳＣ）での実装に関する。ＣＩＳＣプロセッサは、複数のレジスタを有し、これらのレジスタの状態を、オペレーティングシステムの間で切り替えるときに保存したり、取り出したりする必要がある。ＣＩＳＣプロセッサは、複数のメモリアドレッシングモードを有する場合があり、その結果、異なるオペレーティングシステムが異なるモードでアプリケーションを動作させる場合があり、状態を保存したり、取り出したりする必要がある洗練されたデータ構造体を有する場合がある。そのような要因が、複数のオペレーティングシステムを同時に安定した状態で実行できるシステムの実現を自明でないものにする。
【００２３】
周知のＩｎｔｅｌ  ＩＡ−３２アーキテクチャの背景理解のために、次が、参照によって組み込まれている。
Ｉｎｔｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｏｆｔｗａｒｅ  Ｄｅｖｅｌｏｐｅｒ’ｓ  Ｍａｎｕａｌ、Ｖｏｌｕｍｅ  １：Ｂａｓｉｃ  Ａｒｃｈｉｔｅｃｔｕｒｅ（Ｏｒｄｅｒ  Ｎｕｍｂｅｒ  ２４５４７０−０１１）
Ｉｎｔｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｏｆｔｗａｒｅ  Ｄｅｖｅｌｏｐｅｒ’ｓ  Ｍａｎｕａｌ、Ｖｏｌｕｍｅ  ２：Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｒｅｆｅｒｅｎｃｅ（Ｏｒｄｅｒ  Ｎｕｍｂｅｒ  ２４５４７１−０１１）
Ｉｎｔｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ  Ｓｏｆｔｗａｒｅ  Ｄｅｖｅｌｏｐｅｒ’ｓ  Ｍａｎｕａｌ、Ｖｏｌｕｍｅ  ３：Ｓｙｓｔｅｍ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｇｕｉｄｅ（Ｏｒｄｅｒ  Ｎｕｍｂｅｒ  ２４５４７２−０１１）
【００２４】
上のすべてが、米国イリノイ州マウントプロスペクト６００５６−７６４１私書箱７６４１のＩｎｔｅｌ  Ｃｏｒｐｏｒａｔｉｏｎ社から無料で入手可能であり、ｈｔｔｐ：／／ｗｗｗ．ｉｎｔｅｌ．ｃｏｍからダウンロードすることができる。
【００２５】
制限なしに、本明細書で開示される革新的特徴の一部は、次の通りである。
Ａ−メソッドへの呼出しによってプロセッサ命令を置換するオペレーティングシステムの適合。これは、ハードウェアリソースデスパッチャのリソースを使用する。および、排他的ではないが、特に、
Ｂ−ベクトルテーブル（ＧＤＴテーブルおよびＩＤＴテーブルなど）などのメモリアドレッシングデータ構造体を読み取るか書き込む命令の置換。これは、次を可能にする、
Ｃ−ハードウェアリソースデスパッチャによるアクセスのためにオリジナルのメモリアドレッシングデータ構造体を残す、置換されたプロセッサ呼出しを介してアクセスされるのではなくメソッドによって呼び出される、Ｌｉｎｕｘなどのオペレーティングシステムにプロキシデータ構造体を提供するためのオリジナルメモリアドレッシングデータ構造体（ＧＤＴテーブルおよびＩＤＴテーブルなど）の複製、
Ｄ−ハードウェアリソースデスパッチャによって使用されるデータ構造体内の「パブリック」部分または「オープン」部分と「プライベート」部分または「隠し」部分の提供、
Ｅ−オペレーティングシステム間ならびに（既知のように）単一オペレーティングシステム上のアプリケーション間の浮動小数点ユニット（ＦＰＵ）の「レイジイ」転送、
Ｆ−オペレーティングシステムの間でクリーンに切り替えるためのタスクゲートの使用、および、
Ｇ−メモリコンテキストを変更することなしに主オペレーティングシステムとハードウェアリソースデスパッチャの間ですばやく切り替えるための、タスクゲートではなくある特定のルーチンの使用（その結果、すべてのレジスタを保存する必要がなくなり、切替がより高速になる）、
Ｈ−副オペレーティングシステムが割込み、例外をマスクしないようにする、好ましくは、
Ｉ−タスク切替動作中に（非常に短い持続時間を有する）および／または
Ｊ−非常に長い持続時間のハードウェアリソースデスパッチャ動作中に（ＲＳ−２３２通信または文字出力など）、
Ｋ−コンテキスト切替に２つの別々のスタック構造（１つはトラップ用、もう１つは非同期タスク用）を使用すること、
Ｌ−ハードウェアリソースデスパッチャを動作させるために主オペレーティングシステムの監視コンテキストの一部を使用すること。
【００２６】
他の態様、実施形態、および好ましい特徴は、対応する利益と共に、次の説明、請求項、および図面から明白になる。
【００２７】
添付図面を参照して、本発明の実施形態を例示的に説明する。
【概説】
【００２８】
［システムハードウェア］
本システムを適用可能なコンピュータシステム１００は、Ｉｎｔｅｌ  Ｃｏｒｐｏｒａｔｉｏｎ社から入手可能なＰｅｎｔｉｕｍ  ４（商標）ＣＰＵまたはＭｏｔｏｒｏｌａ社から入手可能なＰｏｗｅｒＰＣ  ＣＰＵ（本実施形態は、この両方で実現されている）などの中央処理装置（ＣＰＵ）１０２を含む。ＣＰＵ１０２は、システムバス１０４（制御バス、データバス、およびアドレスバスを含む）を介して、読取専用メモリ（ＲＯＭ）チップ１０６と、ランダムアクセスメモリ（ＲＡＭ）チップ（１０８）の１つまたは複数のバンクと、ディスクコントローラデバイス１１０（例えば、フロッピーディスクドライブ、ハードディスクドライブ、およびＤＶＤドライブなどの追加リムーバブルメディアドライブに接続されたＩＤＥコントローラまたはＳＣＳＩコントローラ）と、１つまたは複数の入出力ポート（１１２）（例えば、１つもしくは複数のＵＳＢポートコントローラおよび／またはプリンタなどに接続するためのパラレルポートコントローラ）と、外付けまたは内蔵の周辺デバイスへのバス接続のための拡張バス１１４（例えば、ＰＣＩバス）と、他のシステムチップ１１６（例えば、グラフィックスデバイスおよびサウンドデバイス）とに結合されている。このタイプのコンピュータの例が、パーソナルコンピュータ（ＰＣ）およびワークステーションである。しかし、メインフレーム、制御システム内の組込みマイクロコンピュータ、およびＰＤＡ（この場合に、ディスクドライブコントローラなど、示されたデバイスの一部が存在しない場合がある）などの他のコンピューティングデバイスへの本発明の適用も、本明細書で開示する。
［ソフトウェアの管理］
【００２９】
図２ａを参照すると、図１のコンピュータ１００は、使用中に、オペレーティングシステムカーネル２０２（図１に示された他のデバイスへのＣＰＵによるアクセスを可能にする出力ルーチンを提供する）と、オペレーティングシステムユーザインターフェースレイヤまたはオペレーティングシステムプレゼンテーションレイヤ２０４（Ｘ  Ｗｉｎｄｏｗｓなど）と、ミドルウェアレイヤ２０６（例えば、ＴＣＰ／ＩＰスタックなどのネットワーキングソフトウェアおよびプロトコルを提供する）とを含む常駐プログラム、及び、アプリケーション２０８ａ，２０８ｂを動作させる。アプリケーション２０８ａおよび２０８ｂは、オペレーティングシステムカーネル２０２を形成するＡＰＩルーチンへの呼出しを行うことによって動作する。
【００３０】
オペレーティングシステムカーネルは、複数のタスク、特に次のものを有する。
・  スケジューリング（すなわち、動作中の異なるアプリケーションの間でのＣＰＵおよび関連リソースの共用）と、
・  メモリ管理（すなわち、各タスクへのメモリの割振り、および必要な場合の、メモリアドオンからディスクドライブへのデータおよびプログラムのスワップ）と、
・  ファイルシステムの提供と、
・  デバイスへのアクセスの提供（通常、ドライバを介する）と、
・  割込み処理と、
・  アプリケーションがシステムリソースおよびユーザと相互作用することを可能にするアプリケーションプログラミングインターフェースの提供。
【００３１】
カーネルは、Ｕｎｉｘに関するいわゆる「モノリシックカーネル」とすることができ、この場合に、デバイスドライバが、カーネル自体の一部を形成する。代替案では、カーネルを、Ｃｈｏｒｕｓに関する「マイクロカーネル」とすることができ、この場合、デバイスドライバは、カーネルと別々である。
【００３２】
使用に際して、コンピュータ１００が始動するとき、ＲＯＭ  １０６にストアされたブートストラッププログラムが、ディスクコントローラ１１０にアクセスして、オペレーティングシステムのファイル処理部分をディスク上の永久ストレージからＲＡＭ  １０８に読み取り、次に、オペレーティングシステムの残りをＲＡＭ  １０８のある領域にロードする。次に、オペレーティングシステムは、ディスクコントローラ１１０を介してディスクドライブからすべてのアプリケーションを読み取り、それぞれのためにＲＡＭ  １０８内に空間を割り振り、その割り振られたメモリ空間に各アプリケーションをストアする。
【００３３】
アプリケーションの動作中に、オペレーティングシステムのスケジューラ部分が、ＣＰＵの使用を異なるアプリケーションの間で分割し、各アプリケーションがスケジューリングポリシに従ってプロセッサの時間を共用することを可能にする。スケジューラは、頻繁には使用されていないアプリケーションまたはデータを「スワップアウトする」（すなわち、これらをＲＡＭ  １０８から除去して空間を解放し、これらをディスクにストアする）ことによって、メモリリソースの使用も管理する。
【００３４】
最後に、アプリケーションプログラミングインターフェース（ＡＰＩ）を構成するルーチンが、アプリケーションから呼び出されて、入力および出力などの機能を実行し、オペレーティングシステムの割込み処理ルーチンが、割込みおよびイベントに応答する。
【好ましい実施形態の原理の概要】
【００３５】
好ましい実施形態では、コンピュータ１００で使用される各オペレーティングシステム２０１および２０２がわずかに書き直され、新しい低水準プログラム４００（本明細書では「ハードウェアリソースディスパッチャ」と称し、オペレーティングシステムのカーネルではないが、時々「ナノカーネル」と称する）が作成される。ハードウェアリソースディスパッチャ４００は、プロセッサと相互作用するので、特定のタイプのＣＰＵ  １０２に固有である。修正変更されたオペレーティングシステム２０１および２０２の版も、下で明らかになる理由から、ハードウェアに固有の版である。
【００３６】
ハードウェアリソースディスパッチャ４００自体は、オペレーティングシステムではない。ハードウェアリソースディスパッチャ４００は、アプリケーションプログラムと一切相互作用せず、非常に限られた機能性を有する。ハードウェアリソースディスパッチャ４００は、仮想計算機またはエミュレータではなく、処理のほとんどをオペレーティングシステム自体に委ね、プロセッサ上でネイティブコードを動作させるが、協力するようにオペレーティングシステムを修正することを必要とする。ハードウェアリソースディスパッチャ４００は、次の基本機能を実行する。
・  複数のオペレーティングシステムのそれぞれをロードし、始動することと、
・  メモリおよび他のシステムリソースをオペレーティングシステムのそれぞれに割り振ることと、
・  異なるオペレーティングシステムの動作をスケジューリングする（すなわち、ＣＰＵ時間をそれらの間で分割し、それらの間での切替を管理する）ことと、
・  オペレーティングシステムによって共用される必要があるシステムデバイスへの間接アクセスの「仮想化されたデバイス」メソッドを提供する（デバイスを「仮想化する」）ことと、
・  異なるオペレーティングシステムで動作するアプリケーションが互いに通信できるようにするために、オペレーティングシステムの間の通信リンクを提供すること。
【００３７】
各オペレーティングシステムは、この実施形態によって、同等には扱われない。そうではなく、複数のオペレーティングシステムのうちの１つが、「クリティカル」オペレーティングシステムとして選択され（これは、リアルタイムオペレーティングシステムになる）、１つまたは複数の他のオペレーティングシステムのそれぞれが、「非クリティカル」または「副」オペレーティングシステムとして扱われる（これは、Ｌｉｎｕｘなどの各汎用オペレーティングシステムになる）。
【００３８】
ハードウェアリソースディスパッチャは、設計されるときに、できる限り多くのシステムデバイスを複数のオペレーティングシステムのうちの一方または他方に排他的に静的に割り振ることを可能とするために、使用可能なシステムリソース（すなわち、デバイスおよびメモリ）をリストしたデータ構造体（例えば、テーブル）を与えられる。
【００３９】
例えば、パラレルプリンタポートを、プリンタ出力を作ることを必要とするアプリケーションをしばしば動作させる汎用オペレーティングシステム２０２に静的に割り振ることができる。その一方で、ＩＳＤＮデジタル回線アダプタポートを、通信のためにリアルタイムオペレーティングシステム２０１に永久的に割り振ることができる。この可能な所に必ずデバイスを静的に割り振ることは、各オペレーティングシステムが、ハードウェアリソースディスパッチャを呼び出す必要なしに、静的に割り振られたデバイスにアクセスするのにその既存のドライバを使用できることを意味する。したがって、そのようなデバイスにアクセスする際の実行速度の損失（仮想計算機またはエミュレータとして操作される場合のような）はない。
【００４０】
共用されなければならないシステムデバイスの場合に、ハードウェアリソースディスパッチャが、非クリティカルオペレーティングシステムによるデバイスの使用を仮想化し、クリティカルオペレーティングシステムと共に提供されるドライバを利用してアクセスを実行する。同様に、割込み処理に関して、割込みは、クリティカルオペレーティングシステム割込み処理ルーチンに渡され、この割込み処理ルーチンは、その割込みを処理する（クリティカルオペレーティングシステム宛である場合）か、非クリティカルオペレーティングシステムへの転送のためにハードウェアリソースディスパッチャを介して渡す（非クリティカルオペレーティングシステム宛である場合）かのいずれかを行う。
【００４１】
ブート時に、ハードウェアリソースディスパッチャが、まずロードされ、次に、所定のシーケンス（クリティカルオペレーティングシステムから始め、１つまたは複数の各副オペレーティングシステムが続く）でオペレーティングシステムのそれぞれをロードする。クリティカルオペレーティングシステムは、それが必要とするリソースをテーブルから順番に割り振られ、そのシステムがその中で動作する固定されたメモリ空間を有する。次に、各副オペレーティングシステムが、使用可能な残りのリソースから、それが必要とするリソースおよびメモリ空間を順番に割り振られる。
【００４２】
したがって、この実施形態によれば、オペレーティングシステムによって使用されるリソースが、各オペレーティングシステムにそれ自体のメモリ空間を割り振ることと、各オペレーティングシステムへの排他的なデバイスの静的割振りを提供することによって、物理的にできる限り分離され、共用が必須のデバイスだけが共用される。
【００４３】
動作中に、ハードウェアリソースディスパッチャスケジューラは、クリティカルオペレーティングシステムが、そのタスクを終了するまで動作することを許容し、その後、次の割込みまたはイベントが発生するまで、各非クリティカルオペレーティングシステムに順番に制御を渡す。
【００４４】
したがって、この実施形態は、クリティカルオペレーティングシステムの動作が事実上変更されない（クリティカルオペレーティングシステムがそのオリジナルドライバを使用し、すべての割込み処理およびイベント処理への最初のアクセスを有するので）マルチオペレーティングシステム環境を可能にする。副オペレーティングシステムは、残りのプロセッサ時間内で効率的に動作することができる。というのは、大抵の場合、副オペレーティングシステムが、それ自体のネイティブドライバを使用し、システムデバイスの多くへの排他的アクセスを有するからである。最後に、ハードウェアリソースディスパッチャ自体は、限られた機能だけを処理するので、小さいプログラムにすることができ、その結果、システムリソースが節約される。
【００４５】
この好ましい実施形態は、特定のコンピュータ１００に既に適合されている標準的な市販オペレーティングシステムに対する限られた変更だけを用いるので、作成および保守が経済的でもある。さらに、オペレーティングシステムに対する変更は、割込み処理などのアーキテクチャ固有ファイル処理の問題と、特定のタイプのコンピュータ１００とインターフェースし、オペレーティングシステムの残りほど頻繁に変更される可能性が低い初期化時の構成とに制限されるので、複数オペレーティングシステムの形で働くように同一のオペレーティングシステムの新版を適合させる作業は、ほとんどまたはまったくない可能性がある。
【好ましい実施形態の詳細な説明】
【００４６】
この実施形態では、コンピュータ１００が、Ｉｎｔｅｌ  ３８６ファミリプロセッサ（例えば、Ｐｅｎｔｉｕｍプロセッサ）である（ステップ３０２）。クリティカルオペレーティングシステム２０１は、Ｃ５オペレーティングシステム（オープンソースで入手可能であり、ｈｔｔｐ：／／ｗｗｗ．ｊａｌｕｎａ．ｃｏｍから無料でダウンロードされる、ＣｈｏｒｕｓＯＳシステムの第５世代のオープンソース版であるＪａｌｕｎａ−１のリアルタイムマイクロカーネル）であった。
【００４７】
ステップ３０６で、ＣｈｏｒｕｓＯＳオペレーティングシステムカーネル２０１を、複数オペレーティングシステムモードで動作するように修正するが、これは、新しいプラットフォームへのｓ移植と同一の形で扱われる（すなわち、同一ＣＰＵを有するが異なるシステムデバイスを有する新しいコンピュータでの実行を可能にするために新しいＢｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅを記述する）。ブートおよび初期化のシーケンスを変更して、リアルタイムオペレーティングシステムを、それ自体を始動するのではなく、それに割り振られたメモリ空間内でハードウェアリソースディスパッチャによって始動できるようにする。初期化シーケンスのハードウェアプローブステージを変更して、クリティカルオペレーティングシステムが、他の副システムに割り当てられるハードウェアリソースにアクセスしないようにする。クリティカルオペレーティングシステムは、ハードウェアリソースディスパッチャから静的ハードウェア割振りテーブルを読み取って、それが使用可能なデバイスを検出する。
【００４８】
トラップ呼出し２０１２をクリティカルオペレーティングシステムに追加して、状態を検出し、それに応答して、あるアクションを要求する。本明細書でのトラップ呼出しは、プロセッサに現在のコンテキスト（例えば、レジスタの状態）を保存させ、新しいコンテキストをロードさせる呼出しを意味する。したがって、仮想メモリアドレッシングが使用される場合に、アドレスポインタが変更される。例えば、リアルタイムオペレーティングシステム２０１が、エンドポイントに達し（プロセッサリソースを要求するのをやめる）ときに、制御をハードウェアリソースディスパッチャに戻し、「ｉｄｌｅ（アイドル）」トラップ呼出しを発行して、副オペレーティングシステムを始動することができる。多くのプロセッサが、「ｈａｌｔ（ホールト）」命令を有する。いくつかの場合に、スーパーバイザレベルコード（例えば、アプリケーションではなくオペレーティングシステム）だけに、そのような「ｈａｌｔ」命令を含めることができる。この実施形態では、すべてのオペレーティングシステムが、「ｈａｌｔ」命令を除去し、これらを「ｉｄｌｅ」ルーチン（例えば、実行スレッド）に置換するように書き直され、この「ｉｄｌｅ」ルーチンは、呼び出されたときに、「ｉｄｌｅ」トラップ呼出しを発行する。
【００４９】
Ｂｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅのいくつかのドライバは、特に、ハードウェアリソースディスパッチャが副オペレーティングシステムのために共用されるデバイスを仮想化するのを支援する。
【００５０】
追加の「仮想」ドライバ２０１４が追加され、この仮想ドライバ２０１４は、オペレーティングシステムにとっては、入出力バスへのアクセスを提供し、データをバスに書き込むことを可能にするように見える。実際には、仮想バスドライバ２０１４は、通信媒体としてメモリを使用し、あるプライベートメモリをエクスポートし（入力データ用）、他のシステムによってエクスポートされたメモリをインポートする（出力データ用）。このようにして、オペレーティングシステム２０１（またはそのオペレーティングシステムで動作するアプリケーション）が、実際の入出力バスによって接続された別々の機械で動作している２つのオペレーティングシステムであるかのように、別のオペレーティングシステム（またはそのオペレーティングシステムで動作するアプリケーション）にデータを渡すことができる。
【００５１】
副オペレーティングシステム２０２は、カーネルバージョン２．４．１８を有する（ステップ３０８）Ｌｉｎｕｘとして選択された（ステップ３０８）。
【００５２】
ステップ３１０で、副オペレーティングシステムカーネル２０２を変更して、新しいハードウェアアーキテクチャとして扱われる複数オペレーティングシステム環境で機能することを可能にする。ステップ３０６と同様に、ブートおよび初期化のシーケンスを変更して、副オペレーティングシステムをハードウェアリソースディスパッチャによって始動することを可能にし、ハードウェアリソースディスパッチャテーブルで指定される他のシステムに割り当てられるハードウェアリソースにアクセスしないようにする。ステップ３０６と同様に、ハードウェアリソースディスパッチャに制御を渡すために、トラップ呼出し２０２２を追加する。
【００５３】
共用されるシステムデバイスのネイティブドライバは、ハードウェアリソースディスパッチャによって仮想化されたデバイス（割込みコントローラ、入出力バスブリッジ、システムタイマ、およびリアルタイムクロック）を扱う新しいドライバ２０２８によって置換される。これらのドライバは、コンピュータ１００のそれぞれのデバイスに対するある動作を実行するために、ハードウェアリソースディスパッチャの仮想デバイスハンドラ４１６への呼出しを実行する。ハードウェアリソースディスパッチャの各そのような仮想デバイスハンドラ４１６は、クリティカルオペレーティングシステム内の「ピア」ドライバルーチンと対にされ、このピアドライバルーチンは、システムデバイスと直接に相互作用するように構成される。したがって、仮想デバイスハンドラへの呼出しは、実際のデバイスアクセスを行うために、その仮想化されたデバイス用のクリティカルシステム内のピアドライバまで中継される。ステップ３０６と同様に、仮想入出力バスの読み書きドライバ２０２４が、オペレーティングシステム間通信を可能にするために設けられる。
【００５４】
副オペレーティングシステムの割込みサービスルーチンを変更して、それぞれが実際の割込みまたはイベントではなく、それぞれの仮想割込み（ハードウェアリソースディスパッチャの割込みハンドラルーチン４１２によって発行される呼出しの形の）に応答する仮想割込みサービスルーチン２０２６を設ける。副オペレーティングシステムのルーチン（割込みサービスルーチンを含む）も、ハードウェア割込みのマスク（少なくとも、すべての例外クリティカル動作の）を除去するように変更される。したがって、この形で、副オペレーティングシステム２０２、・・・が、クリティカルオペレーティングシステム２０１によってプリエンプトされる。言い換えると、仮想割込みに対する副オペレーティングシステム応答自体に、クリティカルオペレーティングシステム２０１に関する実際の割込みによって割り込むことができる。これには、通常、次のものが含まれる。
・  イベントのマスク／マスク解除（プロセッサレベルでの割込み）と、
・  イベントマスク状況の保存／復元と、
・  割込みソース（割込みコントローラデバイス）の識別と、
・  ソース（割込みコントローラデバイス）レベルでの割込みのマスキング／マスク解除。
【００５５】
新しい仮想デバイスドライバ２０２８が、共用されるハードウェアデバイス（入出力バスブリッジ、システムコンソール、システムタイマ、およびリアルタイムクロック）へのアクセスのために追加される。これらのドライバは、コンピュータ１００のそれぞれのデバイスにデータを書き込む、またはそこからデータを読み取るために、ハードウェアリソースディスパッチャの仮想デバイスハンドラ４１６への呼出しを実行する。
【００５６】
これをもたらすために、Ｌｉｎｕｘカーネル２０７が、この実施形態で、少数の変更されたファイルを用いて新しい仮想ハードウェアリソースディスパッチャアーキテクチャサブツリー（Ｉ−３８６変形およびＰｏｗｅｒＰＣ変形のｎｋ−ｉ３８６およびｎｋ−ｐｐｃ）を追加することによって変更される。未変更のファイルは、その既存の形で再利用される。オリジナルサブツリーは、保存されるが、使用されない。
【００５７】
ステップ３１２で、ハードウェアリソースディスパッチャ４００を記述する。ハードウェアリソースディスパッチャに、次の機能（図４に示された）のルーチンを提供するコードが含まれる。
・  それ自体をブートし初期化する機能（４０２）と、
・  各リソースが一意に割り当てられるオペレーティングシステムを示す割振りエントリとハードウェアリソース（ポートなどのデバイス）のリストをストアするテーブルをストアする機能（４０３）と、
・  ハードウェアリソースディスパッチャ割振りテーブルを完了する、クリティカルオペレーティングシステムをブートし、初期化する機能（４０４）と、
・  副オペレーティングシステムをブートし、初期化する機能（４０６）と、
・  オペレーティングシステムの間で切り替える機能（４０８）と、
・  オペレーティングシステムの間でスケジューリングする機能（４１０）と、
・  割込みを処理する（リアルタイムオペレーティングシステム割込みサービスルーチンを使用し、必要な場合に副オペレーティングシステムの仮想割込みサービスルーチンにデータを供給する）機能（４１２）と、
・  オペレーティングシステムのそれぞれからのトラップ呼出しを処理する機能（４１４）と、
・  副オペレーティングシステムから共用されるデバイスへのアクセスを処理する機能（４１６）と、
・  仮想入出力バスでのオペレーティングシステム間通信を処理する機能（４１８）。
【００５８】
もう１つの実施形態（下で説明する）で、ハードウェアリソースディスパッチャは、システムデバッギングフレームワークも提供することができる。
［オペレーティングシステムスイッチャ４０８］
【００５９】
あるオペレーティングシステムから別のオペレーティングシステムに切り替えるために、オペレーティングシステムスイッチャ４０８は、現在実行中のオペレーティングシステムの「コンテキスト」（レジスタ値など、状態変数の組の現在の値）を保存し、別のオペレーティングシステムのストアされたコンテキストを復元し、それが止まった所から実行を再開するためにその別のオペレーティングシステムを呼び出すように構成されている。したがって、プロセッサがメモリのセグメントと、仮想アドレッシング技法または間接アドレッシング技法とを使用する場合に、現在のメモリ空間へのポインタをストアしたレジスタまたはデータ構造体が、スワップされる。例えば、オペレーティングシステムは、それぞれ、そのようなメモリ空間へのポインタ値を含むコンテキストによって定義される、異なるそのようなメモリ空間内で動作する。
【００６０】
詳細に言うと、スイッチャは、次を提供する。
・  現在のオペレーティングシステムがアイドルになるときの、現在動作しているオペレーティングシステムから次にスケジューリングされたオペレーティングシステムへの明示的な切替（例えば、トラップ呼出し）と、
・  ハードウェア割込みが発生したときの、副オペレーティングシステムからクリティカルオペレーティングシステムへの暗黙の切替。
【００６１】
切替は、下で説明するように、トラップ呼出し、実際の割込み、または仮想割込みの際に発生する可能性がある。
［スケジューラ４１０］
【００６２】
スケジューラ４１０は、あるオペレーティングシステムから出た後に、次にどの副オペレーティングシステム（複数が存在する場合に）に切り替えるかを選択することによって、使用可能な処理時間の一部を各オペレーティングシステムに割り振る。この実施形態では、各副オペレーティングシステムが、固定優先順位スケジューリングに基づいて選択される。時分割またはプロセッサ時間の保証された最小限のパーセンテージに基づく指定を可能にする他の実施形態も、本明細書で企図されている。しかし、どの場合でも、クリティカルオペレーティングシステムは、アイドル状態であるときに限ってプリエンプトされる。
【００６３】
他の実施形態では、クリティカルシステムでまだ動作中のタスクより優先順位の高いタスクを実行するためにすべての副オペレーティングシステムがＣＰＵへのあるアクセスをできることを許可するために、クリティカルオペレーティングシステムが、いつそれをプリエンプトできるかを、スケジューラ４１０に明示的に知らせることができる。したがって、１つの例では、クリティカルオペレーティングシステムの割込みサービスルーチンをプリエンプトすることができず、その結果、クリティカルオペレーティングシステムは、外部イベントまたはリアルタイムクロックからのタイミング信号に必ず応答できるようになり、リアルタイム動作が維持される。
［仮想化されたプロセッサ例外の処理］
【００６４】
ハードウェアリソースディスパッチャは、次のように、プロセッサ例外（例えば、ＣＰＵ割込みまたはコプロセッサ割込み）を処理する機構を提供するように構成される。
・  第１に、クリティカルオペレーティングシステムを介してプロセッサ例外をインターセプトし、
・  第２に、対応する仮想例外を１つまたは複数の副オペレーティングシステムにポストし、そのデータをストアし、スケジューラがその副オペレーティングシステムを次に呼び出すときに、その副オペレーティングシステム内の対応する仮想割込みサービスルーチン２０２６を呼び出し、
・  第３に、副オペレーティングシステム内からのすべての保留中の仮想例外をマスクするかマスクを解除する。
【００６５】
仮想化された例外は、通常、次の２つの異なる目的に使用される。
・  第１に、ハードウェアデバイス割込み（非同期プロセッサ例外として配送される）を副オペレーティングシステムに転送するため、
・  第２に、オペレーティングシステム間クロス割込みすなわち、あるシステムによって別の割込みのために生成された割込み（非同期例外として配送される）を実装するため。
［トラップ呼出しハンドラ４１４］
【００６６】
トラップ呼出しハンドラの動作は、次の説明から明らかになる。その主目的は、スケジューラおよびスイッチャが、第１のオペレーティングシステムが停止した（したがって、ＣＰＵリソースを必要としない）ときに別のオペレーティングシステムに変更することを可能にすることである。追加の役割は、後の実施形態に関して説明するデバッギングで使用するためにシステムコンソールなどのハードウェアリソースディスパッチャサービスを呼び出すことである。
［仮想化されたデバイス４１６］
【００６７】
上で示したように、共用されるデバイス（例えば、割込みコントローラ、バスブリッジ、システムタイマ、リアルタイムクロック）ごとに、各オペレーティングシステムがデバイスドライバを提供し、そのデバイスに関するピアレベルドライバの組を形成する。リアルタイムオペレーティングシステムは、デバイスに実際にアクセスするのに使用されるドライバを提供し、他のオペレーティングシステムは、仮想デバイスドライバを提供する。
【００６８】
ハードウェアリソースディスパッチャの共用されるデバイスハンドラ４１６は、各デバイスのすべてのピアデバイスドライバによるアクセスのための、デバイスごとのストアされたデータ構造体を提供する。デバイスがアクセスされるべきときまたはアクセスされたときに、デバイスドライバは、アクセスの詳細を用いて、対応するデータ構造体にストアされたデータを更新する。ピアドライバは、クロス割込み（上で述べた）を使用して、データ構造体が更新されたばかりであることを他のピアドライバに通知するためにイベントをシグナリングする。
【００６９】
割込みコントローラデバイスにアクセスするためのドライバは、次のように、ハードウェア割込みを処理するために上で述べた仮想化された例外機構を使用する。
・  クリティカルオペレーティングシステムデバイスドライバが、ハードウェア割込みを処理し、これらを、仮想化された例外として副ピアドライバに転送し、
・  副オペレーティングシステムが、上で述べた仮想化された例外のマスクルーチンおよびマスク解除ルーチンを使用することによって、割込みをイネーブルおよびディスエーブルする。
【００７０】
入出力バスおよびそのブリッジは、それらに接続されたデバイスのすべてが同一のオペレーティングシステムに割り振られていない場合に限って、共用されなければならない。したがって、デバイスを割り振る際に、可能な範囲まで、同一の入出力バスに接続されたデバイスが、同一のオペレーティングシステムに割り振られる。共用が必要な場合に、リソース割振りテーブル４０４に、どのオペレーティングシステムがどのリソースを有するかを示すために、バス上のリソース（アドレス空間、割込み線、および入出力ポート）の割振りを示す記述子データがストアされる。
［実施形態の実装］
【００７１】
最後に、ステップ３１４で、ハードウェアリソースディスパッチャおよびオペレーティングシステムのコードが、コンピュータ１００と共に供給される配布可能バイナリコンピュータプログラム製品としてコンパイルされる。
【００７２】
本発明の一態様に従って供給できる製品は、ユーザが、使用される異なるオペレーティングシステムを選択し、各オペレーティングシステムの異なるアプリケーションをビルドし、選択し、配布可能な製品にアプリケーションおよびオペレーティングシステムを組み込み、オペレーティングシステムのブートおよびアプリケーションの実行可能バイナリの起動を提供することを可能にするコンピュータプログラムを含む、開発環境製品である。これは、ｗｗｗ．ｊａｌｕｎａ．ｃｏｍから入手可能なＣ５開発環境に基づき、これに似ている。
［ブートおよび初期化の間の実施形態の動作］
【００７３】
図５を参照すると、本発明によるブートプロセスおよび初期化プロセスは、次のように実行される。
【００７４】
ＲＯＭ  １０６にストアされたブートストラッピングプログラム（「ｔｒａｍｐｏｌｉｎｅ」）４０２２が、電力が始めて供給されるときに実行され、プログラム４０２４を始動し、このプログラム４０２４が、ハードウェアリソースディスパッチャプログラム４００の残りをメモリにインストールし、始動し、引数として、システムイメージ構成を記述したデータ構造体（下で説明する）を渡す。
【００７５】
ハードウェアリソースディスパッチャは、システムコンソールに使用することができるシリアル回線を初期化する。次に、ハードウェアリソースディスパッチャは、クリティカルオペレーティングシステムから始めて、各オペレーティングシステムのメモリ空間（オペレーティングシステム環境）を順番に割り振る。したがって、ハードウェアリソースディスパッチャは、第２レベルシステムカーネルブートローダとして働く。
【００７６】
次に、各オペレーティングシステムカーネルが、それ自体の初期化フェーズをすべて行い、リソース割振りテーブル４０４に残っているリソースの中でそのオペレーティングシステムに排他的なリソースを選択し、その最初のサービスおよびアプリケーションを始動する。
【００７７】
図６に、システムイメージを形成するメモリアドレス割振りの例を示す。ハードウェアリソースディスパッチャおよびオペレーティングシステムがコンパイルされるときに、メモリ内の位置が割り振られる。メモリ内のこれらの位置の組が、図６に示されたシステムイメージを定義する。システムイメージに、ハードウェアリソースディスパッチャが構成されるメモリの第１バンク６０２と、リアルタイムオペレーティングシステムが構成されるメモリの第２バンク６０４と、副オペレーティングシステムが構成されるメモリの第３バンク６０６と、この実施形態では、副オペレーティングシステム（Ｌｉｎｕｘ）のルートファイルシステムを含むＲＡＭディスクが構成されるメモリの第４バンク６０８とが含まれる。
【００７８】
このシステムイメージは、永続ストレージ（例えば、携帯電話機またはＰＢＸなどの通常のリアルタイムデバイスでは読取専用メモリ）にストアされる。メモリの残りのバンクは、各オペレーティングシステムにその環境として割り振るのに使用可能であり、この環境内で、各オペレーティングシステムがアプリケーションをロードし、動作させることができる。
［オペレーティングシステムコンテキスト用のメモリの割振り］
【００７９】
ブートされている間に、各オペレーティングシステムは、それ自体の構成が必要とする総サイズを満足するために、相補的なメモリを割り振る。オペレーティングシステムに割り振られたならば、メモリのバンクは、そのオペレーティングシステム自体の物理メモリ管理方式を使用して管理される。他のすべてのメモリは、オペレーティングシステムによって無視される。
［仮想メモリ割振り］
【００８０】
各オペレーティングシステムは、オペレーティングシステムが互いにまたはハードウェアリソースディスパッチャと干渉できないことを保証するために、別々の仮想メモリ空間を割り振られる。オペレーティングシステムのそれぞれのユーザアドレス空間（すなわち範囲）およびスーパーバイザアドレス空間（すなわち範囲）は、それぞれ、異なるメモリ管理ユニット（ＭＭＵ）コンテキスト識別子（ＩＤ）を割り振られ、このＭＭＵコンテキストＩＤが、オーバーラップするアドレスを有する異なる仮想メモリアドレス空間の区別を可能にする。ＭＭＵコンテキストＩＤは、各オペレーティングシステムがコンパイルされるとき（図３のステップ３１４）に、各オペレーティングシステムに割り当てられる。
【００８１】
この解決策は、ハードウェアリソースディスパッチャが異なるオペレーティングシステムの間で切り替えるときに、追加の時間を要する変換キャッシュ（ＴＬＢ）のフラッシュの必要をなくす。その代わりに、異なるオペレーティングシステムの間の切替は、現在機能するオペレーティングシステムのＭＭＵコンテキストＩＤをストアし、切り替えられる２つのオペレーティングシステムの以前にストアされたＭＭＵコンテキストＩＤをリコールすることによって達成される。
［入出力デバイスの割振り］
【００８２】
上で示したように、割振りテーブル４０４は、どのデバイスが各オペレーティングシステムに一意に割り振られているかを示す。さらに、テーブル４０４は、どの入出力リソース（直接メモリアクセス（ＤＭＡ）デバイス、入出力ポート、割込みなど）がそのようなデバイスに排他的に割り振られており、したがって、衝突なしのこれらのリソースの直接使用が可能であるかを示す。通常、多数のデバイスが複製され、したがって、この形で、潜在的な衝突を実質的に減らすことが可能である。
【００８３】
分配は、オペレーティングシステム構成方式（例えば、Ｃ５の場合に、デバイスツリーで指定されたデバイス）に基づく。デバイスは、ブート時に、ブートの順序でオペレーティングシステムに割り振られ、その結果、クリティカルオペレーティングシステムが、まず、テーブル４０４内の使用可能なデバイスを最初に選択し、次に、副オペレーティングシステムが、残っているものの中で割振りを受け取る。各オペレーティングシステムは、初期化時に、これらのデバイスの存在を検出し、ハードウェアリソースディスパッチャからの相互作用なしで、それらのためのネイティブドライバを使用する。
［副オペレーティングシステムの「ホット」リブート］
【００８４】
現在の実施形態によれば、他のオペレーティングシステムが動作を継続している間に、副オペレーティングシステムをリブートする（例えば、クラッシュのゆえに）ことが可能である。システムリソースの分離のゆえに、副オペレーティングシステムのクラッシュは、クリティカルオペレーティングシステム（または他の副オペレーティングシステム）の進行中の動作に干渉せず、副オペレーティングシステムのリブートも、これらに干渉しない。
【００８５】
この実施形態では、ハードウェアリソースディスパッチャへのシステムの「停止」トラップ呼出しおよび「始動」トラップ呼出しが、クリティカルオペレーティングシステム内からの副オペレーティングシステムのシャットダウンおよび再始動を支援する。さらに、ハードウェアリソースディスパッチャは、オリジナルシステムイメージのコピーを、ブート時に、ハードウェアリソースディスパッチャに割り振られたメモリ内の永続メモリに保存する。一例として、この実施形態のホット再始動は、次のように管理される。
【００８６】
最初のブートアップ時に、ハードウェアリソースディスパッチャが、副オペレーティングシステムメモリイメージのコピーを保存する。
【００８７】
クリティカルオペレーティングシステムに、副オペレーティングシステムの機能を周期的に監視する（例えば、副オペレーティングシステムの継続動作を検査するために、タイムアウトを設定し、副オペレーティングシステム内で動作するピアドライバによってトリガされるイベントを待つことによって）ソフトウェアウォッチドックドライバルーチンが含まれる。
【００８８】
副オペレーティングシステムが障害を発生したか停止したことをクリティカルオペレーティングシステムが検出した場合に、クリティカルオペレーティングシステムは、ハードウェアリソースディスパッチャへの「停止」トラップ呼出しおよびその後の「始動」トラップ呼出し（副オペレーティングシステムの）をトリガする。
【００８９】
次に、ハードウェアリソースディスパッチャが、副オペレーティングシステムイメージの保存されたコピーを復元し、メモリからリブートして、再始動する。実施形態のテストで、Ｌｉｎｕｘ副オペレーティングシステムを、ロックアップから数秒以内にリブートできることがわかった。他の点で、ホット再始動は、例えば次の文献に記載のように、Ｃｈｏｒｕｓオペレーティングシステムで使用可能なホット再始動に基づく。
【００９０】
「Ｆａｓｔ  Ｅｒｒｏｒ  Ｒｅｃｏｖｅｒｙ  ｉｎ  ＣＨＯＲＵＳ／ＯＳ．  Ｔｈｅ  Ｈｏｔ−Ｒｅｓｔａｒｔ  Ｔｅｃｈｎｏｌｏｇｙ」、Ａｂｒｏｓｓｉｍｏｖ，Ｆ．Ｈｅｒｍａｎｎ、Ｊ．Ｃ．Ｈｕｇｌｙ他、Ｃｈｏｒｕｓ  Ｓｙｓｔｅｍｓ  Ｉｎｃ．Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ、１９９６年８月、１４頁、ｈｔｔｐ：／／ｗｗｗ．ｊａｌｕｎａ．ｃｏｍ／ｄｅｖｅｌｏｐｅｒ／ｐａｐｅｒｓ／ＣＳＩ−ＴＲ−９６−３４．ｐｄｆから入手可能。
［ランタイム動作］
【００９１】
インストールおよびブートの後のこの実施形態の動作を、これから詳細に説明する。
【００９２】
ブートされ、初期化された後に、リアルタイムオペレーティングシステムは、１つまたは複数のアプリケーション２０７（例えば、ＵＤＰ／ＩＰスタック。ＵＤＰ／ＩＰは、ユニバーサルデータグラムプロトコル／インターネットプロトコルを表す）を動作させており、副オペレーティングシステムは、複数のアプリケーション２０８ａおよび２０８ｂ（例えば、ワードプロセッサおよびスプレッドシート）を動作させている。リアルタイムオペレーティングシステムマイクロカーネル２０１および副オペレーティングシステムカーネル２０２は、次を含むハードウェアリソースディスパッチャインターフェースを介してハードウェアリソースディスパッチャと通信する。
【００９３】
・  オペレーティングシステムコンテキスト（すなわち、そのオペレーティングシステムに切り替えるために保存され、復元される必要がある状態変数の組）およびハードウェアリポジトリを表すデータ構造体と、
・  オペレーティングシステム環境で実行される機能の組と、
・  ハードウェアリソースディスパッチャ環境で実行されるトラップ呼出しルーチンの組。
【００９４】
両方のオペレーティングシステムがプロセッサ時間を必要としない（例えば、両方が「待ち」状態に達した）場合に、ハードウェアリソースディスパッチャ４００は、クリティカルオペレーティングシステムのアイドルスレッドに切り替え、このスレッドで割込みまたはイベントを待つ。したがって、割込みを、まずクリティカルオペレーティングシステムに切り替える必要なしに、クリティカルオペレーティングシステムのサービスルーチンによって即座に処理することができる。
【００９５】
ある時点で、割込みまたはイベントが発生する。例えば、パケットが、データポートで受信され、ＵＤＰ／ＩＰスタックを実行するリアルタイムオペレーティングシステムによってこれを処理できるようにするための割込みが引き起こされる。その代わりに、ユーザが、キーボードまたはマウスを操作する場合があり、これによって、ワードプロセッシングアプリケーション２０８との相互作用のために副オペレーティングシステム２０２のＧＵＩを操作する割込みが引き起こされる。その代わりに、システムクロックが、所定の時間が経過し、アプリケーションが再実行を開始しなければならないか、オペレーティングシステム機能を実行しなければならないことを示す場合がある。
【００９６】
その後、クリティカルオペレーティングシステムのサービスルーチンが、下で説明するように、その割込みにサービスする。
［割込みおよびイベントの処理］
【００９７】
まだクリティカルオペレーティングシステム内でない場合に、ハードウェアリソースディスパッチャの割込みハンドラ４１２が、オペレーティングシステムスイッチャ４０８を呼び出して、クリティカルオペレーティングシステムに切り替え、その後、割込みハンドラルーチン４１２を呼び出して、クリティカルオペレーティングシステム２０１の割込みサービスルーチン（ＩＳＲ）を呼び出す。その割込みが、クリティカルオペレーティングシステムに一意に割り当てられたデバイスからのものであるため、または共用されるデバイスからのものであり、ある所定の値を有するため、クリティカルオペレーティングシステムを示すことが意図されている場合、クリティカルオペレーティングシステムＩＳＲが、その割込みを処理するのに必要な処置を講ずる。そうでない場合には、制御が、ハードウェアリソースディスパッチャに渡される。
［クリティカルオペレーティングシステムから副オペレーティングシステムへの切り替え］
【００９８】
図７を参照すると、この例では、システムが、クリティカルオペレーティングシステム２０１で動作するアプリケーション２０７ａのスレッド７０２を実行している。
【００９９】
割込みが発生した場合に、クリティカルオペレーティングシステムの割込みサービスルーチン７０４が、割込みサービスを実行する。終了時に、制御が、スレッド７０２およびクリティカルオペレーティングシステム２０１のスケジューラによって実行される他のすべてのスレッドに渡される。すべてのスレッドの処理が完了したときに、クリティカルオペレーティングシステムは、実行を終了しており、その「ｉｄｌｅ」スレッドをスケジューリングする。したがって、クリティカルオペレーティングシステムの「ｉｄｌｅ」トラップルーチンが、「ｉｄｌｅ」トラップ呼出しをハードウェアリソースディスパッチャ４００に発行する。次に、ハードウェアリソースディスパッチャが、次を行うルーチンを実行する。
・  割込みハンドラ４１２が、現在、あるストアされた仮想割込みを有する場合に、これらの仮想割込みが、割込みハンドラ４１２によって副オペレーティングシステムに転送される。
・  ハードウェアリソースディスパッチャオペレーティングシステムスケジューラ４１０が、実行すべき副オペレーティングシステム２０２を選択する。次に、ＯＳスイッチャ４０８が、クリティカルＯＳコンテキストストレージ領域７０６に現在のコンテキスト（通常は、プロセッサＭＭＵレジスタ、プロセッサ状況レジスタ、命令ポインタ、およびスタックポインタ）を保存する。次に、ＯＳスイッチャ４０８が、副オペレーティングシステム２０２のストアされた実行コンテキスト７０８を取り出し、これを、関係するレジスタに書き込む。
・  関係する副ＯＳに関する仮想割込みがある場合に、割込みハンドラ４１２は、副オペレーティングシステム内の関連する割込みサービスルーチン７１０を呼び出し、この割込みサービスルーチン７１０が、その割込みにサービスし、その後、完了時に、副オペレーティングシステムのスレッド７１２の実行の、それが止まった場所に戻る。
【０１００】
割込みハンドラ４１２が、現在、保留中の割込みを有しない場合には、ハードウェアリソースディスパッチャオペレーティングスイッチャ４０８が、復元されたオペレーティングシステムコンテキスト内のストアされたプログラムカウンタ値を使用して、止まった場所、この例ではスレッド７１２から副オペレーティングシステムに実行を再開させる。
【０１０１】
したがって、クリティカルオペレーティングシステム２０１が、ある機能を実行した（それ自体のアプリケーションまたはサービスにサービスしたか、別のオペレーティングシステム宛の割込みにサービスしたのいずれか）後に、ハードウェアリソースディスパッチャは、スケジューラ４１０による決定に従って、次の副オペレーティングシステム２０２に制御を渡す。
［割込み時の副オペレーティングシステムからクリティカルオペレーティングシステムへの切替］
【０１０２】
図８を参照して、副オペレーティングシステムからクリティカルオペレーティングシステムへの遷移のプロセスを、これから開示する。この場合に、システムは、クリティカルオペレーティングシステム２０２で動作するアプリケーション２０８ａのスレッド７１２を実行している。
【０１０３】
ハードウェア割込みが発生するときに、ハードウェアリソースディスパッチャは、ＯＳスイッチャを起動して、副オペレーティングシステムコンテキストをコンテキストストレージ領域７０８に保存する。ハードウェアリソースディスパッチャは、次に、コンテキストストレージ領域７０６から状態変数の値を復元することによって主オペレーティングシステム２０１に切り替え、主オペレーティングシステム２０１の割込みサービスルーチン７０４を呼び出す。割込みにサービスした後に、主オペレーティングシステム２０１のスケジューラが、ＩＳＲ  ７０４から前に実行されていた任意のスレッド７０４（または実行すべきスレッド）に制御を渡すことができる。
【０１０４】
ＩＳＲおよびすべてのスレッドが処理されたときに、上で図７を参照して述べた形で、主オペレーティングシステム２０１が、ハードウェアリソースディスパッチャに制御を渡し、ハードウェアリソースディスパッチャが、主オペレーティングシステム２０１から切り替え（コンテキストストレージ領域７０６に状態変数を保存することによって）、選択された副オペレーティングシステム２０１に切り替える（コンテキストストレージ７０８から状態変数を取り出すことによって）。
［オペレーティングシステム間通信−仮想バス４１８］
【０１０５】
仮想バスルーチンは、各オペレーティングシステム内の仮想バスドライバと協力する。仮想バスルーチンは、コンパクトＰＣＩ（ｃＰＣＩ）バックプレーンに挿入されたｃＰＣＩボードに似た、オペレーティングシステムを接続する物理バスをエミュレートする。各オペレーティングシステムは、この仮想バス上の仮想バスブリッジデバイス用のドライバルーチンを設けられ、これによって、オペレーティングシステムおよびそのアプリケーションが、生のデータ転送から完全なＩＰプロトコルスタックまでのすべての所望のプロトコルによって通信できるようになる。
【０１０６】
ハードウェアリソースディスパッチャ仮想バスは、上で既に述べた、共用メモリおよびシステムクロス割込みの原理に基づく。詳細に言うと、仮想バスルーチン４１８は、Ｃ５  ｂｕｓｃｏｍ  ＤＤＩをエミュレートし、このＣ５  ｂｕｓｃｏｍ  ＤＤＩは、仮想バスブリッジ共用デバイスを定義し、仮想バスにまたがるメモリのエクスポート（共用）および他のオペレーティングシステム内へのクロス割込みのトリガを可能にするｓｙｓｃｏｍである。
【０１０７】
各副オペレーティングシステム内の各仮想バスドライバは、スタートアップ時に、ハードウェアリソースディスパッチャハードウェアリポジトリ内にそのような仮想バスブリッジを作成する。それを行うことによって、各仮想バスドライバは、そのプライベートメモリの領域をエクスポート（共用）し、そのホスティングシステム内で割込みを送出する形を提供する。
【０１０８】
したがって、第１オペレーティングシステムの仮想バスドライバは、次によって第２オペレーティングシステムにデータを送る。
・  第２オペレーティングシステムのピア仮想バスドライバによってエクスポートされたメモリに書き込み、次に、
・  データが第２オペレーティングシステム内のピアバスドライバから使用可能であることを通知するためにクロス割込みをトリガする。
【０１０９】
逆の（着信）方向では、仮想バスドライバは、それ自体がエクスポートしたメモリ領域にそのようなデータがストアされたことを示すクロス割込みを受け取ったときに、着信データをアップストリームに伝搬させる（それがあてられたアプリケーションまたはルーチンによる使用のために）。
【０１１０】
図９の（ａ）を参照すると、同一のオペレーティングシステム２０２で動作する別のアプリケーション２０８ｂと通信しなければならないアプリケーション２０８ａは、そのオペレーティングシステムを介してそれを行うことができる。異なるオペレーティングシステム２０２で動作する別のアプリケーション２０８ｂと通信しなければならない、あるオペレーティングシステム２０１で動作するアプリケーション２０７ｂは、そのオペレーティングシステムのＡＰＩを使用することによって仮想バスにデータを書き込むことによってそれを行い、このオペレーティングシステム２０１は、仮想バスドライバルーチンを使用してそのデータを他方のオペレーティングシステム２０２に渡し、オペレーティングシステム２０２は、その仮想バスドライバを使用してそのデータをアプリケーション２０８ｂに伝搬させる。
【０１１１】
図９の（ｂ）を参照すると、第１および第２のオペレーティングシステムが異なるコンピュータ１００および１０１で動作する構成にこの構成を移植するのに必要な変更は、少ない。オペレーティングシステムによって使用されるドライバを変更し、その結果、これらが、仮想バスドライバではなく実際のバス１０３を使用するようにすることだけが必要である。したがって、このシステムは、それが動作するハードウェアからより独立したものになる。
【０１１２】
ハードウェアリソースディスパッチャ仮想バスを介する通信は、アプリケーションから使用可能であるが、オペレーティングシステムカーネルによって内部的に使用することもでき、その結果、オペレーティングシステムカーネルが、複数のオペレーティングシステムの間で分散されたサービスの実装で協力できるようになる。この種の「スマート」分散サービスに、システムホット再始動（上で述べた）に使用されるソフトウェアウォッチドッグまたは分散ネットワークプロトコルスタックが含まれる。
［デバッギング］
【０１１３】
好ましい実施形態で、ハードウェアリソースディスパッチャは、第２の動作モードを有し、このモードでは、デバッギングエージェントとして働く。
【０１１４】
この実施形態によれば、第２のモードで、ハードウェアリソースディスパッチャが、シリアル通信回線を介して、別の計算機（「ホスト」計算機）で動作するデバッギングソフトウェアツールと通信することができる。
【０１１５】
そのようなデバッギングツールは、ハードウェアリソースディスパッチャをリモートコントロールするために、高水準のグラフィカルユーザインターフェース（ＧＵＩ）を提供する。ハードウェアリソースディスパッチャの仮想化された例外機構が、規定された例外をインターセプトするのに使用される。ユーザは、コードまたは他のシステムのエラーまたは問題の診断をイネーブルするために、プロセッサ例外の場合にハードウェアリソースディスパッチャがどのように振る舞うかを構成し、制御し、計算機状態およびシステム状態を表示することもできる。
【０１１６】
ユーザは、オペレーティングシステムからハードウェアリソースディスパッチャへのトラップ呼出しの基礎として、１つまたは複数のそのようなプロセッサ例外を選択することができる。選択された例外を基礎として、各例外が実行中に発生するときに、オペレーティングシステムが、停止され、ハードウェアリソースディスパッチャへのトラップ呼出しを実行し、ハードウェアリソースディスパッチャは、現在のコンテキストを保存し、ホスト側のデバッギングツールとの相互作用をイネーブルする。次に、ユーザは、状態変数（スタックポインタ、プログラムカウンタ、およびアドレスカウンタなど）の現在の状態および／またはメモリの選択されたブロックの内容を表示させることができる。ユーザは、デバッグされる特定のオペレーティングシステム内で所与のタイプの例外をトラップしなければならないこと、またはどのオペレーティングシステム内でも、発生したときに必ず所与のタイプの例外をトラップすることのいずれかを指定することができる。それに応答して、トラップ呼出しが、１つまたはすべてのオペレーティングシステム内で実装される。ユーザは、所与のタイプの例外が、実行を再始動するときにシステムに普通に転送されるか、単純に無視されるかを指定することもできる。
【０１１７】
ハードウェアリソースディスパッチャは、それ自体の環境で実行するので、オペレーティングシステム内から行えるもの以上にそのオペレーティングシステムをデバッグすることができる。重要なことに、デバッグエージェントとして働くハードウェアリソースディスパッチャとデバッグされるシステムの間に、共用されるコードがない。これによって、例えば、例外ベクトルまたは割込みサービスルーチンなどのカーネル低水準コードさえデバッグすることが可能になる。
【０１１８】
この実施形態による全体的な（ホスト／ターゲット）デバッギングアーキテクチャの他のいくつかの他の態様は、Ｊａｌｕｎａが発行し、ｈｔｔｐ：／／ｗｗｗ．ｊａｌｕｎａ．ｃｏｍ／ｄｏｃ／ｃ５／ｈｔｍｌ／ＤｅｂｕｇＧｕｉｄｅ／ｂｏｏｋｌ．ｈｔｍｌで入手できる文書「Ｃ５  １．０  Ｄｅｂｕｇｇｉｎｇ  Ｇｕｉｄｅ」に記載されたＣｈｏｒｕｓおよびＣ５のデバッギングシステムの態様に似ている。
［セキュアアーキテクチャ］
【０１１９】
上で説明した実施形態が、セキュアアーキテクチャの堅固な基礎を与えることは明瞭である。これは、ユーザが通常非セキュアアプリケーションを動作させる副オペレーティングシステムが、指定されたシステムリソースから隔離され、ハードウェアリソースデスパッチャ（および主オペレーティングシステムのドライバ）を介してのみこれらにアクセスするからである。したがって、例えば、暗号化／復号を実行するもの、暗号化されたファイルへのアクセスを可能にするもの、パスワードおよび他のアクセス情報を管理し、ストアし、供給するもの、著作権材料のアクセスおよび複製を管理し、ログ記録するものなどのセキュリティアプリケーションを、主オペレーティングシステム上で動作させることができる。副オペレーティングシステムで動作するアプリケーションは、そのオペレーティングシステムに割り振られていないシステムリソースにアクセスすることができず、オペレーティングシステムが異なるメモリコンテキストで動作する（すなわち、異なる空間への異なるアドレッシングポインタを使用する）場合に、副オペレーティングシステムで動作するアプリケーションを使用して、主システムで動作するアプリケーションに干渉して、その動作のセキュリティを弱めることはできない。
［Ｉｎｔｅｌアーキテクチャ実施形態の特徴］
【０１２０】
次では、ハードウェアリソースデスパッチャを、（非制限的な意味で）ナノカーネルとして説明する。このセクションでは、ナノカーネル実装のＩＡ−３２  Ｉｎｔｅｌ固有態様、特にナノカーネル環境の礎石であるナノカーネルエグゼクティブ（ｎａｎｏｋｅｒｎｅｌ  ｅｘｅｃｕｔｉｖｅ）に焦点を合わせる。
【０１２１】
このセクションでは、オペレーティングシステムにまたがって中央処理装置および浮動小数点プロセッサユニット（ＣＰＵおよびＦＰＵ）ならびにメモリ管理ユニット（ＭＭＵ）を共有する複数の独立なオペレーティングシステムを同時に動作させることができるナノカーネルエグゼクティブを実装するために、ＩＡ−３２  Ｉｎｔｅｌプロセッサアーキテクチャがどのように使用されるかを説明する。
【０１２２】
このセクションでは、ナノカーネルエグゼクティブがハードウェア割込みをどのように処理するかも説明する。具体的には、ハードウェア割込みをインターセプトし、主オペレーティングシステムに転送するのに使用される機構と、副オペレーティングシステムに提供されるソフトウェア割込み機構とを説明する。
【０１２３】
ナノカーネルが、ユニプロセッサコンピュータで動作していると仮定され、したがって、対称型マルチプロセッサ（ＳＭＰ）アーキテクチャに関する諸態様に本明細書で対処しないことに留意されたい。
【概要】
【０１２４】
仮想アドレス空間
ＩＡ−３２  Ｉｎｔｅｌアーキテクチャでは、ナノカーネルが、必ず仮想アドレス空間内で動作する、言い換えると、ＭＭＵが必ずイネーブルされる。その一方で、ナノカーネルコードが実行しているメモリコンテキストは、経時的に変化する場合がある。
【０１２５】
この説明では、用語メモリコンテキストは、ルートディレクトリテーブルがＣＲ３レジスタによって指定されるＩＡ−３２アドレス変換ツリーを指定する。
【０１２６】
通常、ユーザモードプロセスをサポートするオペレーティングシステムは、プライベートユーザ仮想アドレス空間を処理できるようにするために、複数のメモリコンテキスト（ユーザプロセスあたり１つ）を作成する。カーネルは、あるユーザプロセスから別のユーザプロセスに切り替えるたびにメモリコンテキストを変更する。その一方で、ユーザアドレス空間と一緒に、オペレーティングシステムカーネルは、すべてのメモリコンテキストに複製される一意のスーパーバイザアドレス空間も処理する。ユーザ仮想アドレスおよびスーパーバイザ仮想アドレスは、ＩＡ−３２  Ｉｎｔｅｌアーキテクチャでは絶対にオーバーラップしない。
【０１２７】
スーパーバイザアドレス空間マッピングは、静的または動的のいずれかとすることができる。静的マッピングは、システム初期化時に作成され、通常は、（全体をまたは部分的に）使用可能な物理メモリをマッピングする。そのようなマッピングを、１対１マッピングまたはカーネル仮想（ＫＶ）マッピングとも呼ぶ。具体的に言うと、ＫＶマッピングは、通常、カーネルのコードセクション、データセクション、およびｂｓｓセクションをカバーする。動的マッピングは、動的にロードされるカーネルモジュールまたは動的に割り振られる（不連続な）メモリチャンクにアクセスするために、ランタイムに作成される。
【０１２８】
３種類すなわち、主、副、およびナノカーネルのメモリコンテキストが、ナノカーネル環境で区別される。
【０１２９】
主メモリコンテキストは、主カーネルによって現在使用されているメモリコンテキストである。主オペレーティングシステムがユーザアドレス空間をサポートする場合に、主カーネルによって使用される複数のメモリコンテキストがある場合があるが、既に上で述べたように、スーパーバイザアドレス空間が、すべてのそのようなコンテキスト内で同一であることに留意されたい。ナノカーネルは、ユーザマッピングの世話をしないので、主メモリコンテキストは、ナノカーネルの展望から一意であり、主カーネルによって確立された静的スーパーバイザマッピングおよび動的スーパーバイザマッピングにある。
【０１３０】
副メモリコンテキストは、副カーネルによって現在使用されているメモリコンテキストである。やはり、副オペレーティングシステムがユーザアドレス空間をサポートする場合に、副カーネルによって使用される複数のメモリコンテキストがある場合があるが、スーパーバイザアドレス空間は、すべてのそのようなコンテキスト内で同一である。ナノカーネルは、副カーネルによって確立された静的ＫＶマッピングだけを知っているので、副メモリコンテキストは、ナノカーネルの展望から一意であり（所与の副カーネルに関して）、そのような１対１マッピングからなる。ナノカーネルが、ナノカーネルによって使用される副カーネルデータへの静的ＫＶマッピングを介するアクセス可能性を必要とすることに留意することが重要である。副カーネルへのナノカーネルインターフェースを記述したそのようなデータ構造体を、先のセクションでリストする。
【０１３１】
ナノカーネルメモリコンテキストは、ナノカーネル自体によって作られる。このコンテキストは、主カーネルならびにすべての副カーネルによって確立されたすべてのＫＶマッピングを複製したものである。そのようなメモリコンテキストを作成できるようにするために、ナノカーネルは、すべてのＫＶマッピングとの互換性を必要とする。２つのＫＶマッピングが互換であるのは、これらがオーバーラップしないか、同一である場合に限られる。
【０１３２】
複数の同一の副カーネルを動作させるときに、そのＫＶマッピングが、当然、同一であり、したがって互換であることに留意されたい。しかし、主オペレーティングシステムが副オペレーティングシステムと異なるときに、問題が生じる場合がある。この場合に、ＫＶマッピング互換性を得るために、システムのうちの１つを変更する必要がある場合がある。
【０１３３】
ナノカーネルメモリコンテキストは、主に、例えばナノカーネルコンソールへの入出力動作を実行するために、副カーネルが、ナノカーネルによって処理される割込み、トラップ、または例外イベントによってプリエンプトされるときにナノカーネルコードを実行するのに使用される。ナノカーネルメモリコンテキストは、副実行環境から主実行環境へおよびその逆の切替を可能にする中間アドレス空間としても使用される。
【０１３４】
ナノカーネルバイナリは、主ＫＶマッピングに加わり、ナノカーネルコードは、主メモリコンテキストまたはナノカーネルメモリコンテキストのいずれかで実行している。言い換えると、ナノカーネルコードは、主カーネルによって定義される１対１マッピング内の定位置で実行している。ナノカーネルが主カーネルをプリエンプトするときに、ナノカーネルコードは、主メモリコンテキストで実行している。ナノカーネルが副カーネルをプリエンプトするときに、ナノカーネルコードは、主ＫＶマッピングを複製したナノカーネルコンテキストで実行している。一般に、主カーネルによって呼び出されるナノカーネル動作が、主メモリコンテキスト内で実行され、したがって、主スーパーバイザアドレス空間が、直接にアクセス可能なので、ナノカーネルによって使用される主データに対する制約がないことに留意されたい。その一方で、ナノカーネルは、副カーネルへ／からの切替中にナノカーネルによって使用される一部の主カーネルデータへの静的ＫＶマッピングを介するアクセス可能性を必要とする。主カーネルへのナノカーネルインターフェースを記述したそのようなデータ構造体を、先のセクションでリストする。
【０１３５】
図１０に、主、副、およびナノカーネルの仮想アドレス空間の例を示す。
【０１３６】
この例では、物理メモリサイズが１２８メガバイトである。主カーネルは、０から始まる自明な１対１（ＫＶ）マッピング（Ｃ５マイクロカーネルに似た）を使用し、副カーネルは、０×ｃ０００００００から始まるシフトされた１対１（ＫＶ）マッピング（Ｌｉｎｕｘカーネルに似た）を使用する。これらのＫＶマッピングは、互換であり、ナノカーネルアドレス空間は、両方の１対１マッピングを２回複製することによって、物理メモリをマッピングする。
【０１３７】
図１１に、メモリコンテキストが経時的にどのように切り替わるかを示す。最初に、副オペレーティングシステムが、副メモリコンテキストで動作している。時刻ｔ０に、現在の副カーネルが、ナノカーネルコンソールに文字を出力するためにナノカーネルにトラップする。このトラップが、現在のメモリコンテキストをナノカーネルメモリコンテキストに切り替える。［ｔ０，ｔ１］期間中に、ナノカーネル（ナノカーネルメモリコンテキストで動作している）が、ナノカーネルコンソールに文字をプリントアウトする。時刻ｔ１に、ナノカーネルが、副カーネルにリターンし、副メモリコンテキストに切り替える。時刻ｔ２に、副オペレーティングシステムの動作中に割込みが発生する。この割込みは、現在のメモリコンテキストをナノカーネルメモリコンテキストに切り替え、ナノカーネル割込みハンドラを呼び出す。この割込みを主カーネルに転送するために、ナノカーネルは、ナノカーネルメモリコンテキストから主メモリコンテキストに切り替え、時刻ｔ３に主割込みハンドラを呼び出す。この割込み要求処理中の時刻ｔ４に、主カーネルが、ナノカーネルコンソールにメッセージを出力するためにナノカーネルのｗｒｉｔｅメソッドを呼び出す。これが、メモリコンテキストを切り替えない単純な間接呼出しであり、ｗｒｉｔｅ動作が、完全に主メモリコンテキスト内で実行されることに留意されたい。
【０１３８】
時刻ｔ５に、ナノカーネルが、ｗｒｉｔｅメソッドから主カーネルにリターンし、主カーネルは、時刻ｔ６まで割込み要求処理を継続する。この時刻ｔ６に、主カーネルが、割込みハンドラからリターンし、ナノカーネルが、割り込まれた副オペレーティングシステムの実行を継続するために、その副オペレーティングシステムに切り替える。そのような切替は、主メモリコンテキストで開始され、中間ナノカーネルコンテキストを経て、最終的に時刻ｔ７に副メモリコンテキストで終わる。
ナノカーネルの呼出しおよびプリエンプション
【０１３９】
ナノカーネルは、関数呼出し／トラップを介して明示的にまたは割込み／例外ハンドラを介して暗黙のうちにのいずれかで呼び出される。前者の場合に、オペレーティングシステムカーネルがナノカーネルを呼び出すと言う。後者の場合に、ナノカーネルがオペレーティングシステムをプリエンプトすると言う。ナノカーネルが、必ず、スーパーバイザアドレス空間で動作する特権コードから呼び出されることを強調することが重要である。その一方で、ナノカーネルが、カーネル自体ならびにカーネルの制御下で動作するユーザプロセスとしてプリエンプトすることができる。
【０１４０】
システムがブートされたならば、まずナノカーネルがアクティブ化され、次に、ナノカーネルが、主カーネルおよび副カーネルの実行を開始する。初期化フェーズが終わったならば、ナノカーネルが、受動的な役割を演じる。これは、ナノカーネル内で実行されるコードが、主カーネルおよび副カーネルがナノカーネルを明示的に呼び出す（呼出しまたはトラップによって）ことによって、または外部で生成された同期イベント（すなわち例外）または非同期イベント（すなわち割込み）によって駆動されることを意味する。
【０１４１】
ＩＡ−３２  Ｉｎｔｅｌアーキテクチャでは、ナノカーネルの呼出しおよびプリエンプションに使用される機構が、主オペレーティングシステムおよび副オペレーティングシステムについて異なる。実行環境に関して、ナノカーネルは、主カーネルに対してまったく閉ざされている。ナノカーネルは、同一のメモリコンテキストを使用し、時々、同一のスーパーバイザスタックを使用する。したがって、ナノカーネルは、主カーネルとほぼ同一の可用性を有する。その一方で、副オペレーティングシステムとナノカーネルの間に、副カーネル誤動作に対する保護を提供する障壁がある。しかし、そのような保護が、絶対的ではなく、副カーネルが、それでも主カーネルならびにナノカーネルをクラッシュさせることができることに留意されたい。
［主呼出し］
【０１４２】
主カーネルは、単純な間接呼出しによってナノカーネルを呼び出す。メモリコンテキストは、呼出しによって切り替えられない。
［主プリエンプション］
【０１４３】
ナノカーネルは、割込みゲートを介して主オペレーティングシステムをプリエンプトする。メモリコンテキストは、プリエンプションによって切り替えられず、ネイティブ主スーパーバイザスタックが、プリエンプションを処理するのに使用される。
【０１４４】
ナノカーネルは、まれな場合にのみ主オペレーティングシステムをプリエンプトする。これらの場合のうちの１つが、この文書でさらに説明する、カーネルの間でのＦＰＵ共用をレイジイな形で処理するのにナノカーネルによって使用されるデバイス使用不能例外（＃ＮＭ）である。
［副呼出し］
【０１４５】
副カーネルは、トラップによってナノカーネルを呼び出す。ナノカーネルは、タスクゲートによってそのようなトラップをインターセプトし、このタスクゲートは、ナノカーネルメモリコンテキストに切り替え、トラップタスク実行を開始する。
［副プリエンプション］
【０１４６】
副オペレーティングシステムのナノカーネルプリエンプションは、呼出し機構に似ており、タスクゲートに基づく。副システムが、割込みまたは例外によってプリエンプトされるときに、対応するタスクゲートが、ナノカーネルメモリコンテキストに切り替え、対応するナノカーネルタスクの実行を開始する。
カーネルコンテキスト
【０１４７】
ナノカーネルデータを、２つのカテゴリすなわち、グローバルデータおよびカーネルごとのデータに分けることができる。グローバルデータは、グローバルナノカーネル状態（例えば、ナノカーネルメモリコンテキスト）を保ち、カーネルごとのデータは、所与の主カーネルまたは副カーネルに関連する状態を保つ。カーネルごとのデータを、カーネルコンテキストとも呼ぶ。
【０１４８】
カーネルコンテキストは、２つの部分すなわち、可視部分および隠し部分からなる。可視部分は、パブリックであり、ナノカーネルインターフェースに加わる。カーネルコンテキストのこの部分は、ナノカーネルインターフェースに関する下のセクションで詳細に説明する。隠し部分は、カーネルに可視ではなく、ナノカーネルエグゼクティブによって内部的に使用される。
［ナノカーネルエグゼクティブインターフェース］
【０１４９】
この章では、主カーネルおよび副カーネルにエクスポートされるナノカーネルエグゼクティブインターフェースを説明する。そのようなインターフェースは、カーネルとナノカーネルの間で共用されるデータ（すなわち、可視カーネルコンテキスト）ならびにナノカーネルメソッドにある。ナノカーネルインターフェースが、カーネルの役割に固有であり、（厳密に言って）主カーネルおよび副カーネルについて異なることに留意されたい。その一方で、カーネルの役割と独立に説明できる、この２つのインターフェースの間の非常に大きい重なりがある。
可視カーネルコンテキスト
【０１５０】
図１２に、カーネルコンテキストの可視部分を示す。
【０１５１】
すべてのカーネルコンテキスト（主ならびに副）が、環状リストでリンクされる。ｎｅｘｔフィールドは、そのようなリスト内の次のカーネルコンテキストを参照する。カーネルコンテキストの可視部分内で、すべての参照が、物理アドレスを介して行われることに留意されたい。カーネルは、参照されたオブジェクトにアクセスするために、そのような物理アドレスを仮想アドレス（ＫＶマッピングからの）に変換しなければならない。この図には、２つのカーネルすなわち主カーネルおよび副カーネルだけを有する構成が示されている。主コンテキストは、副コンテキストをポイントし、副コンテキストは、主コンテキストをポイントする。
【０１５２】
ｐｅｎｄｉｎｇ  ＶＥＸフィールドおよびｅｎａｂｌｅｄ  ＶＥＸフィールドは、仮想例外の現在の状態を反映する。主カーネル例外はナノカーネルによって仮想化されないので、これらのフィールドが、主コンテキストについて無意味であることに留意されたい。仮想化された例外の機構は、この文書で、副カーネル実行モデルと一緒に詳細に説明する。
【０１５３】
ｂｏｏｔ  ｉｎｆｏフィールドは、ＢＩＯＳによって与えられるブートパラメータをポイントする。このフィールドは、読取専用である。
【０１５４】
そのようなデータ構造体が、カーネル固有であり、したがって、カーネルコンテキスト内にも置かれることに留意されたい。他のフィールドの中でも、ブートパラメータ構造体は、ブート時間パラメータを指定するブートコマンドラインをポイントする。そのようなパラメータは、ブートローダ（例えば、ＧＲＵＢブートローダ）に与えられるか、ナノカーネル環境を介して渡されるのいずれかである。コマンドラインは、カーネル固有であり、カーネルコンテキスト内にも置かれる。ナノカーネルは、対応するカーネルに関するパラメータだけを含むカーネル固有コマンドラインを作成するために、最初のコマンドラインを解析する。
【０１５５】
ＲＡＭ  ｉｎｆｏフィールドは、ＲＡＭ記述テーブルをポイントする。このフィールドは、読取専用である。ＲＡＭ記述テーブルは、すべてのカーネルによって共用されるグローバルデータ構造体である。ＲＡＭ記述テーブルは、ＲＡＭリソースがカーネルにまたがってどのように分配されるかを記述する。
【０１５６】
ｄｅｖ  ｉｎｆｏフィールドは、ナノカーネルによって抽象化された仮想デバイスのリストをポイントする。このフィールドは、副カーネルについては読取専用であり、主カーネルについては読み書きである。デバイスリストは、グローバルであり、すべてのカーネルによって共用される。このリスト内の各仮想デバイスは、ナノカーネルによって指定されるデータ構造体によって表される。このデータ構造体は、通常、ナノカーネルによって定義されるルールを使用して、主ピアドライバと副ピアドライバの両方によってアクセスされる。主ピアドライバは、仮想デバイスをサポートするサーバの役割を演じ、副ピアドライバは、実際のデバイスではなく仮想デバイスを使用してクライアントの役割を演じる。このリストは、主カーネルだけによって作成され（、変更され）る。副カーネルは、このリストをブラウズすることだけを許可される。
【０１５７】
ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドは、保留中のクロス割込みを指定する。このフィールドは、ナノカーネル自体によっては使用されない。このフィールドは、クロス割込み交換の際に主カーネルおよび副カーネルを助けるためにコンテキスト構造体によってホスティングされる。クロス割込み配送専用の１つの例外だけがある。ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドは、クロス割込みの個数を３２個まで（クロス割込みソースごとに１ビット）拡張することを可能にする。クロス割込みビットは、ソースカーネル（すなわち、クロス割込みを送るカーネル）によってセットされ、宛先カーネル（すなわち、クロス割込みを受け取るカーネル）によってリセットされる。
【０１５８】
ＩＤフィールドに、一意のカーネル識別子が含まれる。このフィールドは、読取専用である。識別子０は、ナノカーネル自体に割り当てられ、識別子１は、主カーネルに割り当てられる。カーネル識別子は、ナノカーネルインターフェース内でカーネルを指定する。例えば、カーネル識別子は、所与のカーネルに割り当てられたリソース（例えば、ＲＡＭ記述テーブル内のメモリチャンク）にタグを付けるのに使用される。
【０１５９】
ｒｕｎｎｉｎｇフィールドは、カーネル状態すなわち、動作中または停止を指定するフラグである。このフィールドは、読取専用である。ナノカーネルは、カーネルを起動する前にこのフラグをセットし、カーネルが停止した後にこのフラグをクリアする。カーネルが再始動されるときに、ｒｕｎｎｉｎｇフラグは、まずクリアされ、その後にセットされる。すべてのカーネルが、カーネルコンテキストの環状リストをブラウズし、すべての動作中のピアカーネルを見つけるためにｒｕｎｎｉｎｇフラグを分析することができる。ｒｕｎｎｉｎｇフラグが、主カーネルについて常にセットされていることに留意されたい。
【０１６０】
可視カーネルコンテキストの最後の部分は、役割固有である。
【０１６１】
主コンテキストは、ナノカーネルインターフェースメソッドのアドレスを指定する。主カーネルは、間接関数呼出しを介してナノカーネルを呼び出すためにこのアドレスを使用する。メソッドアドレスは、ナノカーネルによってセットアップされ、主カーネルによって変更されてはならない。ナノカーネルインターフェースメソッドは、次のセクションで詳細に説明する。
【０１６２】
副カーネルは、ナノカーネルを呼び出すのに、間接呼出しではなくトラップ機構を使用する。したがって、ナノカーネルインターフェースメソッドのアドレスは、副コンテキストには存在しない。その代わりに、副コンテキストは、ＣＲ０レジスタのＴＳビット状態を保持するｓｅｃｏｎｄａｒｙ  ＴＳ  ｂｉｔフィールドを有する。この文書でさらに詳細に説明するようにレイジイな形でＦＰＵリソースを管理するために、ＴＳビットのそのようなソフトウェアイメージを、副カーネルによって使用することができる。
ナノカーネルメソッド
【０１６３】
ナノカーネルは、２つのグループのメソッドすなわち、コンソール入出力動作およびエグゼクティブ動作を提供する。コンソール入出力グループは、カーネルがナノカーネルコンソールシリアル回線に／から文字を送る／受け取ることを可能にする。この文書は、多かれ少なかれ包括的であるコンソール入出力メソッドに特に対処するのではなく、ＩＡ−３２  Ｉｎｔｅｌアーキテクチャ固有であるエグゼクティブメソッドに焦点を合わせる。
【０１６４】
基本的に、ナノカーネル環境は、いくつかのＩＡ−３２  Ｉｎｔｅｌプロセッサ命令をナノカーネルメソッドに置換する。そのような置換される命令は、通常、次のＩＡ−３２  Ｉｎｔｅｌプロセッサレジスタのロードまたはストアを行う。
・  Ｇｌｏｂａｌ  Ｄｅｓｃｒｉｐｔｏｒ  Ｔａｂｌｅ  Ｒｅｇｉｓｔｅｒ（ＧＤＴＲ）
・  Ｉｎｔｅｒｒｕｐｔ  Ｄｅｓｃｒｉｐｔｏｒ  Ｔａｂｌｅ  Ｒｅｇｉｓｔｅｒ（ＩＤＴＲ）
・  Ｔａｓｋ  Ｒｅｇｉｓｔｅｒ（ＴＲ）
［Ｌｏａｄ／Ｓｔｏｒｅ  ＧＤＴ  Ｒｅｇｉｓｔｅｒ（ＬＧＤＴ／ＳＧＤＴ）］
【０１６５】
ＩＡ−３２  ｌｇｄｔ／ｓｇｄｔ命令を介してＧＤＴレジスタに／から直接にロード／ストアするのではなく、ナノカーネル環境では、カーネルが、それを行うためにｌｇｄｔ／ｓｇｄｔナノカーネルメソッドを呼び出さなければならない。これらのメソッドは、主カーネルでは間接呼出し、副カーネルではトラップであることを除いて、主カーネルおよび副カーネルについて似ている。
【０１６６】
プロセッサ命令に似て、ｌｇｄｔ／ｓｇｄｔナノカーネルメソッドは、ネイティブテーブルベースアドレス（仮想アドレス）およびネイティブテーブル限度（バイト単位のテーブルのサイズ）を含む６バイトメモリ位置を指定する１つのパラメータだけをとる。ネイティブＧＤＴが、必ずＫＶマッピング内に置かれなければならない（主カーネルの場合であっても）ことを強調することが重要である。
【０１６７】
ナノカーネルは、カーネルごとのグローバル記述子テーブルを管理する。この（実）テーブルは、図１３に示されたカーネルコンテキストの隠し部分に常駐する。実ＧＤＴと一緒に、ナノカーネルは、ｌｇｄｔメソッドを介してナノカーネルに与えられるネイティブＧＤＴへのポインタも保持する。ナノカーネルは、セグメント記述子をコピーすることによって、ネイティブＧＤＴから実ＧＤＴを初期化する。しかし、実ＧＤＴの一部が、ナノカーネルセグメント用に予約済みであることに留意されたい。ナノカーネルは、ネイティブテーブルと実テーブルの間のマッピングを指定するビットストリングを処理する。実テーブル内のエントリごとに、このマッピングは、そのエントリがナノカーネルセグメントに使用される、またはそのエントリがネイティブテーブルから継承され、したがって対応するカーネルセグメントのコピーを含むかどうかを指定する。ナノカーネルセグメントに使用される実際のエントリは、ｌｇｄｔメソッドによって更新されない。
【０１６８】
ナノカーネルセグメントは、実テーブルの末尾に置かれ、このテーブルのデフォルトサイズは、２５６エントリである。カーネルをナノカーネルアーキテクチャに移植するときには、ネイティブテーブル内でカーネルセグメントを構成し直す（テーブルの先頭に移動する）か実ＧＤＴのサイズを増やすのいずれかによって、カーネルセグメントとナノカーネルセグメントの間のオーバーラップを回避しなければならない。
［Ｌｏａｄ／Ｓｔｏｒｅ  ＩＤＴ  Ｒｅｇｉｓｔｅｒ（ＬＩＤＴ／ＳＩＤＴ）］
【０１６９】
ＩＡ−３２  ｌｉｄｔ／ｓｉｄｔ命令を介してＩＤＴレジスタへ／から直接にロード／ストアするのではなく、ナノカーネル環境では、カーネルが、それを行うためにｌｉｄｔ／ｓｉｄｔナノカーネルメソッドを呼び出さなければならない。これらのメソッドは、主カーネルでは間接呼出し、副カーネルではトラップであることを除いて、主カーネルおよび副カーネルについて似ている。
【０１７０】
プロセッサ命令に似て、ｌｉｄｔ／ｓｉｄｔナノカーネルメソッドは、ネイティブテーブルベースアドレス（仮想アドレス）およびネイティブテーブル限度（バイト単位のテーブルのサイズ）を含む６バイトメモリ位置を指定する１つのパラメータだけをとる。ネイティブＩＤＴが、必ずＫＶマッピング内に置かれなければならない（主カーネルの場合であっても）ことを強調することが重要である。
【０１７１】
ナノカーネルは、カーネルごとの割込み記述子テーブルを管理する。この（実）テーブルは、図１３に示されたカーネルコンテキストの隠し部分に常駐する。実ＩＤＴと一緒に、ナノカーネルは、ｌｉｄｔメソッドを介してナノカーネルに与えられるネイティブＩＤＴへのポインタも保持する。ナノカーネルは、ゲート記述子をコピーすることによって、ネイティブＩＤＴから実ＩＤＴを初期化する。
【０１７２】
ナノカーネルが、例外をインターセプトするために実テーブル内にそれ自体のゲートをインストールできることに留意されたい。例えば、ナノカーネルは、レイジイな形でＦＰＵ共用を管理するために、デバイス使用不能例外（＃ＮＭ）をインターセプトする。したがって、ＧＤＴに似て、ナノカーネルは、ネイティブテーブルと実テーブルの間のマッピングを指定するビットストリングを処理する。実テーブル内のエントリごとに、このマッピングは、そのエントリがナノカーネルゲートを用いてインストールされた、またはそのエントリがネイティブテーブルから継承され、したがって対応するカーネルゲートのコピーを含むかどうかを指定する。ナノカーネルゲートを用いてインストールされる実際のエントリは、ｌｉｄｔメソッドによって更新されない。
【０１７３】
実テーブルのサイズは、ネイティブテーブルサイズ以上でなければならない。カーネルをナノカーネルアーキテクチャに移植するときにこの要件が満足されない場合には、実テーブルサイズを増やすか、ネイティブテーブルサイズを減らすのいずれかを行わなければならない。
［Ｌｏａｄ  Ｔａｓｋ  Ｒｅｇｉｓｔｅｒ（ＬＴＲ）］
【０１７４】
ＩＡ−３２  ｌｔｒ命令を介してタスクレジスタに直接にロードするのではなく、ナノカーネル環境では、カーネルが、それを行うためにｌｔｒナノカーネルメソッドを呼び出さなければならない。このメソッドは、主カーネルでは間接呼出し、副カーネルではトラップであることを除いて、主カーネルおよび副カーネルについて似ている。
【０１７５】
プロセッサ命令に似て、ｌｔｒナノカーネルメソッドは、タスク状態セグメント（ＴＳＳ）をポイントするセグメントセレクタを指定する１つのパラメータだけをとる。セグメントセレクタによってポイントされるＴＳＳが、必ずＫＶマッピング内に置かれなければならない（主カーネルの場合であっても）ことを強調することが重要である。
［Ｉｄｌｅ］
【０１７６】
ナノカーネルは、アイドルループ内でカーネルによって呼び出されなければならないｉｄｌｅメソッドを提供する。ｉｄｌｅメソッドは、ＩＡ−３２  Ｉｎｔｅｌ  ｈｌｔ命令と同等であり、呼出し側カーネルが次の割込みまで行うべきことがないことをナノカーネルに知らせる。このメソッドは、主カーネルでは間接呼出し、副カーネルではトラップであることを除いて、主カーネルおよび副カーネルについて似ている。
【０１７７】
ｉｄｌｅメソッド呼出しは、動作の準備ができている次の副カーネル（ある場合に）へのシステム切替またはすべての副カーネルがアイドルであるときの主ｉｄｌｅメソッドからのリターンをもたらす。ｉｄｌｅメソッドは、パラメータを有しない。
【０１７８】
主ｉｄｌｅメソッドは、イネーブルされたプロセッサ割込みと共に呼び出されなければならず、必ず、ディスエーブルされたプロセッサ割込みと共に呼出し側にリターンする。したがって、ナノカーネルｉｄｌｅメソッドからリターンしたならば、主カーネルは、次の割込みまでプロセッサをサスペンドするために、ＩＡ−３２  ｓｔｉ命令およびそれに続くＩＡ−３２  ｈｌｔ命令を直接に実行することができる。
【０１７９】
副ｉｄｌｅトラップは、イネーブルされた割込みまたはディスエーブルされた（ソフトウェア）割込みのいずれかと共に呼び出すことができ、必ず、イネーブルされた割込みと共に呼出し側にリターンする。実際に、副ｉｄｌｅトラップは、暗黙のうちに割込みをイネーブルし、割込みが仮想例外（ＶＥＸ）としてこのカーネルに送られた後に呼出し側にリターンする。
［Ｒｅｓｔａｒｔ］
【０１８０】
ナノカーネルは、副カーネルを再始動するために、主カーネルならびに副カーネルによって呼び出すことができるｒｅｓｔａｒｔメソッドを提供する。このメソッドは、主カーネルでは間接呼出し、副カーネルではトラップであることを除いて、主カーネルおよび副カーネルについて似ている。
【０１８１】
メソッドパラメータは、再始動されるカーネルの識別子を指定する。ナノカーネルは、カーネル実行を停止し、コピーからカーネルイメージを復元し、最後に、初期エントリポイントでカーネル実行を開始する。
［副Ｒｅｂｏｏｔ］
【０１８２】
ｒｅｂｏｏｔトラップが、ナノカーネルによって副カーネルに提供される。そのようなトラップは、リブートするときに副カーネルによって呼び出される。このトラップは、カーネル自体に対して呼び出されるｒｅｓｔａｒｔトラップと同等である。
［副Ｈａｌｔ］
【０１８３】
ｈａｌｔトラップが、ナノカーネルによって副カーネルに提供される。そのようなトラップは、停止するときに副カーネルによって呼び出される。ナノカーネルは、ナノカーネルスケジューラが呼出し側カーネルに切り替えないようにするために、呼出し側カーネルを非動作状態にする
【０１８４】
停止されたカーネルは、上で説明したｒｅｓｔａｒｔナノカーネルメソッドによってもう一度始動することができる。
［主実行環境］
【０１８５】
基本的に、主カーネルは、ネイティブ実行環境で実行している。ＩＡ−３２  Ｉｎｔｅｌプロセッサでのナノカーネル実装は、主オペレーティングシステム特性（性能、割込み待ち時間、プリエンプション待ち時間）に対するナノカーネル環境の影響を最小限にしようと試みる。主オペレーティングシステムは、通常はリアルタイムオペレーティングシステムなので、他の（副）オペレーティングシステムが同一のプロセッサ上で同時に動作している場合であっても、主カーネル挙動を変化しないままに保つことが重要である。
初期化
【０１８６】
ナノカーネルは、まず、ディスエーブルされたＭＭＵを用いてすなわち物理空間で、ブートローダによって始動される。基本的に、ナノカーネル初期化コードは、物理メモリ内の主メモリバンク（主カーネルのコード／データ／ｂｓｓセクションを含む）をインストールし、主エントリポイントにジャンプする。
【０１８７】
主カーネルにジャンプする前に、ナノカーネルは、主カーネルコンテキスト、特に実ＧＤＴおよび実ＩＤＴを初期状態に初期化する。
【０１８８】
最初の主ＧＤＴは、ナノカーネルのコードセグメントおよびデータセグメントを指定する２つの有効なエントリだけを有する。カーネルのコードセグメントおよびデータセグメントに使用されるセレクタは、ナノカーネルインターフェースによって、それぞれ０×１０および０×１８に固定される。したがって、カーネルをＩＡ−３２ナノカーネルアーキテクチャに移植するときには、上記のコードセレクタおよびデータセレクタを使用しなければならない。
【０１８９】
最初の主ＩＤＴならびにタスクレジスタ内のすべてのゲートが、無効である（０にされている）。
【０１９０】
ナノカーネル初期化コードは、データセクション内に置かれた静的ナノカーネルスタックを使用して実行される。主カーネルにジャンプするときに、このスタックは、まだ有効である。それにもかかわらず、主カーネルは、できる限り早くそれ自体のスタックに切り替えなければならず、絶対に将来にこのナノカーネルスタックを使用してはならない。ナノカーネルスタックは、次の章で説明する副呼出しおよび副プリエンプションを処理するために、初期化フェーズだけではなく、ランタイムにも使用される。
【０１９１】
主カーネルにジャンプするときに、％ｅｓｉレジスタが、カーネルコンテキストをポイントし、ｅｆｌａｇｓレジスタが、クリアされている。したがって、プロセッサ割込みは、主初期化フェーズの始めにはディスエーブルされている。主カーネルは、通常、クリティカルな初期化フェーズが終わった後に割込みをイネーブルする。
【０１９２】
初期化フェーズ中に、主カーネルは、通常、ＧＤＴレジスタ、ＩＤＴレジスタ、およびタスクレジスタをセットアップするために、ナノカーネルメソッドを呼び出す。最後に、主カーネルが、アイドルループに入り、ナノカーネルｉｄｌｅメソッドを呼び出す。
【０１９３】
ｉｄｌｅメソッドが始めて呼び出されるときに、ナノカーネルは、主カーネルがその実行環境を完全に初期化し終えたと考え、ポスト初期化フェーズに進む。
【０１９４】
そのようなポスト初期化フェーズで、ナノカーネルは、次の章で説明するように、ナノカーネルメモリコンテキストを作り、副カーネルコンテキストを初期化する。ナノカーネルメモリコンテキスト作成が、ポスト初期化フェーズまで延期されることに留意されたい。というのは、この作成が、変換ツリーを作るための物理メモリの割振りを必要とするが、使用可能なメモリリソースが、主カーネル初期化コードによって発見され、登録されるからである。ポスト初期化が終わったならば、ナノカーネルは、動作の準備ができた副カーネルに切り替えるか、すべての副カーネルがアイドルである場合に主ｉｄｌｅメソッドからリターンするために、スケジューラを呼び出す。
【０１９５】
ナノカーネルは、主カーネルがグローバルに共用されるデータ構造体すなわち、ＲＡＭ記述子および仮想デバイスリストを初期化することを必要とする。そのような初期化は、ｉｄｌｅメソッドが呼び出される前に行われなければならない。この要件は、自然である。というのは、この瞬間の後に、副カーネルが、グローバルに共用されるデータ構造体にアクセスできるからである。
【０１９６】
具体的に言うと、主カーネルは、基板上で使用可能な物理メモリを検出し、空き物理メモリチャンクをＲＡＭ記述子に登録する責任を負う。
【０１９７】
主Ｂｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅ（ＢＳＰ）に従って、主カーネルは、ナノカーネル対応ドライバを始動しなければならず、これらのドライバは、仮想デバイスリストに投入しなければならない。そのような仮想デバイスは、副カーネルに提供され、したがって、最初の副カーネルが始動される前に作成されなければならない。
インターセプトされる例外
【０１９８】
基本的に、ナノカーネルは、主オペレーティングシステムがプロセッサ上で動作しているときに発生する例外をインターセプトしない。すべてのプログラミング例外、トラップ、および割込みが、ネイティブ主ハンドラによって処理される。主低水準ハンドラは、ＩＡ−３２  Ｉｎｔｅｌナノカーネルアーキテクチャに移植するときに変更する必要がない。
【０１９９】
上のルールからの例外は、ＦＰＵエミュレーションに関連する次のプログラミング例外である。
・  無効オペコード例外（＃ＵＤ）
・  デバイス使用不能例外（＃ＮＭ）
【０２００】
ＦＰＵエミュレーション機能は、この文書でさらに説明するＦＰＵ共用のレイジイ機構を実装するために、ナノカーネルによって使用される。
【０２０１】
もう１つの特別な事例が、主オペレーティングシステムのホストベースのリモートシステムデバッギングを提供するためにナノカーネルに組み込むことができるデバッグエージェントである。この場合に、デバッグエージェントは、通常、上でより一般的な項目で説明したように、デバッグ機能（例えば、単一命令トレース）またはプログラムエラー（例えば、ページフォールト）のいずれかに関連するいくつかの同期例外をインターセプトする。
転送される割込み
【０２０２】
割込みが、副オペレーティングシステムがプロセッサ上で動作している間に発生したときに、その割込みは、主オペレーティングシステムに転送される。そのような割込み転送プロセスは、次の主要なステップを経る。
・  割込みが、ナノカーネルによってインターセプトされ、
・  プリエンプトされた副カーネルの実行が、サスペンドされ、ナノカーネルが、主実行環境に切り替え、
・  ナノカーネルが、ｉｔｎ命令を使用して、主カーネルへの対応する割込みをトリガする。
【０２０３】
その形で、対応する主低水準割込みハンドラが、割込みを処理するために呼び出される（主実行環境内で）。割込みが処理されたならば、主カーネルは、ｉｒｅｔ命令を実行することによってナノカーネルにリターンする。
【０２０４】
主割込みハンドラからリターンした後に、ナノカーネルは、次に動作させる副オペレーティングシステムを決定するために、スケジューラを呼び出す。プリエンプトされた副システムが、必ずしも割込みの後に継続されないことに留意されたい。もう１つの（より高い優先順位の）副システムが、割込みのゆえに動作の準備ができる場合がある。
［副実行環境］
【０２０５】
基本的に、副カーネル実行環境は、割込み管理を除いて、ネイティブ実行環境に対してまったく閉ざされている。ナノカーネル環境は、副オペレーティングシステムを完全にプリエンプト可能にするために、割込み管理のネイティブ機構を変更する。ナノカーネル構造体に移植された副カーネルは、もはやプロセッサレベルで割込みをディスエーブルするのではなく、ナノカーネルによって提供されるソフトウェア割込みマスク機構（すなわち、仮想例外）を使用する。割込みは、もはやそのような副カーネルによって直接に処理されるのではなく、ナノカーネルによってインターセプトされ、主カーネルに転送され、その後に限って、任意選択として、延期された形で副カーネルによって処理される。
初期化
【０２０６】
ナノカーネルは、初期化時に、主バンクと一緒に副メモリバンクをインストールする。その一方で、副カーネルの最後の初期化、具体的にはカーネルコンテキストセットアップは、ポスト初期化フェーズまで延期される。
【０２０７】
このフェーズで、ナノカーネルは、副メモリバンクのコピーを保つためにメモリを割り振る。そのようなコピーは、その後、再始動時に副システムの初期イメージを復元するのに使用される。しかし、副システム再始動は、任意選択であり、物理メモリ消費を減らすためにディスエーブルすることができる。
【０２０８】
主カーネルに似て、ナノカーネルは、実ＧＤＴおよび実ＩＤＴならびにカーネルコンテキストの隠し部分（図１３を参照されたい）に置かれる初期ＴＳＳを初期化する。
【０２０９】
主実ＧＤＴに似て、最初の副実ＧＤＴは、ナノカーネルのコードセグメントおよびデータセグメントを指定する２つの有効なエントリを有する。ナノカーネルのコードおよびデータに関するセグメントセレクタは、ナノカーネルインターフェースによって、それぞれ０×１０および０×１８に割り当てられる。さらに、副実ＧＤＴに、ナノカーネルタスクによって使用されるナノカーネルＴＳＳデータ構造体を指定する記述子が含まれる。そのようなナノカーネルタスクは、次の節で説明するように、副例外をインターセプトするのに使用される。ナノカーネルＴＳＳ記述子は、実ＧＤＴの終りに置かれる。
【０２１０】
実ＩＤＴ内で、ナノカーネルが、ハードウェア割込みおよびナノカーネルトラップをインターセプトするために、タスクゲートをインストールする。副初期化時の致命的例外を処理できるようにするために、すべての他の例外も、ネイティブＩＤＴがｌｉｄｔナノカーネルトラップを介してインストールされるまで、一時的にナノカーネルによってインターセプトされる。そのような未解決の（致命的）例外が発生する場合に、ナノカーネルは、単純に副カーネルを停止させるが、主システムおよび他の副システムの邪魔はしない。ネイティブＩＤＴがインストールされたならば、最初に使用された致命的例外ゲートが、ネイティブ例外ゲートによってオーバーライドされる。しかし、これが、次の節で説明する永久的にインターセプトされる例外に関係しないことに留意されたい。
【０２１１】
ナノカーネルは、副カーネルを起動し、副カーネルコンテキスト内に置かれた初期ＴＳＳへのタスク切替を実行する。図１４に、初期ＴＳＳがタスク切替の前にどのように初期化されるかを示す。非０フィールドだけがこの図に示され、すべて０のフィールドが陰を付けられていることに留意されたい。
【０２１２】
主カーネルに似て、カーネルコンテキスト物理アドレスが、％ｅｓｉレジスタで渡される。その一方で、主カーネルと異なって、割込みフラグ（ＩＦ）が、プロセッサフラグフィールド（ＥＦＬＡＧＳ）内でセットされ、副カーネル初期化フェーズ中であってもプロセッサ割込みがイネーブルされる。副カーネル初期化コードさえもが、主システムによって完全にプリエンプト可能であることに留意されたい。これは、副オペレーティングシステムが再始動されるときに主オペレーティングシステムを邪魔しないようにするために特に重要である。
【０２１３】
イネーブルされたハードウェア割込みにもかかわらず、仮想例外（ハードウェア割込みに対応する）は、副カーネルが始動されるときにディスエーブルされる。したがって、割込みは、クリティカル初期化フェーズの終りにカーネルによって明示的にイネーブルされるまで、ナノカーネルによって配送されない。ソフトウェア割込みマスク機構（仮想例外に基づく）は、この文書でさらに詳細に説明する。
【０２１４】
ＣＲ３フィールドは、１対１変換ツリーをポイントする。そのような初期１対１マッピングが、一時的に副カーネルに供給される。このマッピングが、初期化コードによって変更されても永久的に使用されてもならず、その代わりに、副カーネルが、できる限り早くそれ自体のＫＶマッピングを作り、それに切り替えなければならないことに留意されたい。
【０２１５】
スタックポインタは、副カーネルが始動されるときには無効である。通常、副カーネルは、その初期化コードを実行するために、データセクションに置かれた静的初期スタックを使用する。
【０２１６】
主カーネルに似て、初期化フェーズ中に、副カーネルは、通常、ＧＤＴレジスタ、ＩＤＴレジスタ、およびタスクレジスタをセットアップするために、ナノカーネルトラップを呼び出す。最後に、副カーネルが、アイドルループに入り、ナノカーネルｉｄｌｅトラップを呼び出す。
インターセプトされる例外
【０２１７】
副例外をインターセプトするために、ナノカーネルは、実ＩＤＴの対応するエントリにタスクゲートをインストールする。したがって、そのような例外が発生するときに、ＩＡ−３２  Ｉｎｔｅｌプロセッサは、タスク切替を実行し、このタスク切替は、プロセッサ状態を現在のタスク状態セグメント（ＴＳＳ）に保存し、例外タスクゲートによって指定されるＴＳＳからプロセッサ状態を復元する。
【０２１８】
インターセプトされる例外ごとに、ナノカーネルは、実ＧＤＴに置かれた専用セグメント記述子によってポイントされる専用ＴＳＳデータ構造体を作成する。そのようなナノカーネルセグメント（ナノカーネルＴＳＳデータ構造体を参照するのに使用される）は、実ＧＤＴの終りに置かれる。すべてのナノカーネルＴＳＳデータ構造体が、ナノカーネル実行環境に従って同様に初期化される。図１５に、ナノカーネルＴＳＳの非０フィールドを示す。ＴＳＳデータ構造体の０にされる部分は、この図では陰を付けられている。
【０２１９】
ＥＩＰフィールドに、ナノカーネル例外スタックのアドレスが格納される。ＥＢＸフィールドは、例外記述子をポイントする。複数のインターセプトされる例外を、同一のナノカーネル例外タスク内で多重化できることに留意されたい。例えば、同一のタスクが、すべてのハードウェア例外をインターセプトするのに使用される。この場合に、そのような多重化されたタスクが、例外固有情報を入手するために、例外記述子（％ｅｂｘレジスタで使用可能）を使用することができる。
【０２２０】
すべてのインターセプトされる例外を、その性質に従って、割込み、トラップ、およびプログラミング例外（フォールト）として分類することができる。
【０２２１】
ナノカーネルは、いつ主カーネルにを転送するためにすべてのハードウェア割込み（マスク不能割込み（ＮＭＩ）を含む）をインターセプトする。
【０２２２】
ナノカーネルによってインターセプトされるトラップは、実際には、次のナノカーネル呼出しである。
・  汎用トラップ
・  ＸＩＲＱトラップ
・  ＳＴＩトラップ
・  ＩＲＥＴトラップ
【０２２３】
汎用トラップは、コンソール入出力、ｌｇｄｔ／ｓｇｄｔ、ｌｉｄｔ／ｓｉｄｔ、ｌｔｒ、ｈａｌｔ、ｒｅｂｏｏｔ、ｒｅｓｔａｒｔなど、すべての性能クリティカルでないナノカーネル呼出しを組み合わせる。ナノカーネルメソッド番号および引数は、通常のトラップに関して汎用レジスタで渡される。汎用トラップは、％ｅａｘにコーディングされた番号に従ってナノカーネルメソッドを呼び出す共通の例外タスクによって処理される。
【０２２４】
他の３つのトラップは、性能クリティカルであり、特定のナノカーネルタスクによって処理される。これらのトラップは、引数を有しない。
【０２２５】
ＸＩＲＱトラップは、主カーネルにクロス割込みを送る。ＸＩＲＱトラップタスクは、例外がハードウェア割込みではなくソフトウェア割込みに対応する主カーネルに転送されることを除いて、割込みタスクと同等である。したがって、割込みに似て、ＸＩＲＱトラップは、現在の副カーネルをプリエンプトする。
【０２２６】
保留中の仮想例外を処理するために副カーネルによって呼び出されるＳＴＩトラップとＩＲＥＴトラップの両方。これらのトラップは、ソフトウェア割込みマスク機構に加わり、仮想例外専用の次の節で詳細に説明される。
【０２２７】
主カーネルに似て、ナノカーネルは、通常、下で説明するいくつかの特別な場合を除いて、プログラミング例外をインターセプトしない。
【０２２８】
ナノカーネルは、ＦＰＵエミュレーションに関連する次の例外をインターセプトする。
・  無効オペコード例外（＃ＵＤ）
・  デバイス使用不能例外（＃ＮＭ）
【０２２９】
ＦＰＵエミュレーション機能は、この文書でさらに説明するＦＰＵ共用のレイジイ機構を実装するために、ナノカーネルによって使用される。
【０２３０】
もう１つの特別な事例が、副オペレーティングシステムのホストベースのリモートシステムデバッギングを提供するためにナノカーネルに組み込むことができるデバッグエージェントである。この場合に、デバッグエージェントは、通常、デバッグ機能（例えば、単一命令トレース）またはプログラムエラー（例えば、ページフォールト）のいずれかに関連するいくつかの同期例外をインターセプトする。しかし、そのようなデバッグエージェントの設計は、この文書の範囲外である。
仮想例外
【０２３１】
仮想例外（ＶＥＸ）は、カーネルが延期された形で副カーネルに例外をポストし、配送することを可能にする、ナノカーネルによって提供される機構である。具体的に言うと、ＶＥＸ機構は、ハードウェア割込みを副カーネル用のソフトウェア割込みに置換するためにＩＡ−３２  Ｉｎｔｅｌナノカーネルアーキテクチャで使用される。
【０２３２】
ＶＥＸインターフェースは、カーネルコンテキストに置かれる２つのフィールドすなわち、ｐｅｎｄｉｎｇおよびｅｎａｂｌｅｄにある。これらのフィールドは、副カーネルコンテキストに関してのみ意味があるが、主カーネルと副カーネルの両方によってアクセスされる。すべての仮想例外が、ｐｅｎｄｉｎｇ（またはｅｎａｂｌｅｄ）フィールド内のビット位置によって自然に列挙される。したがって、ＩＡ−３２  Ｉｎｔｅｌアーキテクチャ上のナノカーネルによってサポートされる合計３２個の仮想例外がある（ｐｅｎｄｉｎｇフィールドおよびｅｎａｂｌｅｄフィールドは、３２ビット整数値である）。
【０２３３】
下の表に、仮想例外が実例外にどのようにマッピングされるかを示す。
【表１】
2007509387.tif 000003
【０２３４】
０から１６までの仮想例外は、ハードウェア割込みにマッピングされる。仮想例外１７は、副カーネルにクロス割込みを配送するのに使用される実例外４６にマッピングされる。１８から３０までの仮想例外は、現在は使用されておらず、将来の拡張用に予約済みである。仮想例外３１は、どの実例外にも対応せず、実際には、ナノカーネルによって内部的に使用される、カーネルがアイドルであるかどうかを検出する順序である擬似仮想例外である。そのような擬似仮想例外がどのように働くかを、この文書でさらに詳細に説明する。
【０２３５】
複数の仮想例外を同時に保留中にすることができるが、あるときにそのうちの１つしか処理することができないので、すべての仮想例外が、その番号に従って優先順位を付けられる。最高の優先順位が、ＮＭＩに割り当てられ、最低の優先順位が、動作中擬似例外に割り当てられる。
【０２３６】
副コンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールドは、通常は、仮想ＰＩＣデバイスのドライバを提供する主カーネルによって更新される。そのようなドライバは、通常、ｐｅｎｄｉｎｇ  ＶＥＸフィールド内の適当なビットをセットすることによって、副カーネルに仮想例外（割込み）をポストする。
【０２３７】
ｅｎａｂｌｅｄ  ＶＥＸフィールドは、仮想例外をイネーブルし、またはディスエーブルするために、副カーネルによって更新される。所与の仮想例外は、対応するビットがｅｎａｂｌｅｄ  ＶＥＸフィールドでセットされている場合にイネーブルされる。ｅｎａｂｌｅｄ  ＶＥＸフィールドを使用して、副カーネルは、割込みに対して保護されたクリティカルセクションを実装する。言い換えると、副カーネルは、もはやプロセッサ割込みをディスエーブル／イネーブルするのにｃｌｉおよびｓｔｉというＡ−３２命令を使用するのではなく、そのカーネルコンテキストのｅｎａｂｌｅｄ  ＶＥＸフィールドを変更する。
【０２３８】
所与の仮想例外は、それが保留中であると同時にイネーブルされている場合に、ナノカーネルによって配送される。ナノカーネルは、副例外ハンドラにジャンプする直前に、対応する保留中ビットをリセットする。
【０２３９】
仮想例外を副カーネルに配送するときに、ナノカーネルは、ネイティブＩＤＴからのゲート記述子を解釈する。副カーネルの低水準ハンドラの変更を最小にするために、ナノカーネルは、ＩＡ−３２  Ｉｎｔｅｌプロセッサの場合と同一の状態でゲートハンドラを呼び出す。言い換えると、ナノカーネルは、ＩＡ−３２  Ｉｎｔｅｌハードウェアが行うのと同一の形で、スタックポインタ、コードセグメント、およびスタックセグメントを切り替え、例外フレームをスーパーバイザスタックにプッシュする。
【０２４０】
しかし、副カーネルをＩＡ−３２ナノカーネルアーキテクチャに移植するときに、ハードウェア割込みマスク機構と置換されるソフトウェア割込みマスク機構を考慮に入れるために、低水準例外ハンドラを変更しなければならないことに留意されたい。割込みゲートハンドラを呼び出すときに、ナノカーネルは、ｅｎａｂｌｅｄフィールドに０×８０００００００を書き込むことによって、すべての仮想例外をディスエーブルするだけである。ハードウェア割込みは、副カーネルを動作させるときにプロセッサレベルで必ずイネーブルされ、したがって、副カーネルを、低水準割り込みゲートハンドラの内部であっても主カーネルによってプリエンプトすることができる。その形で、ナノカーネル環境では、副オペレーティングシステムが、主オペレーティングシステムによって完全にプリエンプト可能になる。
【０２４１】
仮想例外を、その例外がディスエーブル状態である間に主カーネルによってポストすることができる。この場合に、例外は、副カーネルに配送されるのではなく、その例外が再イネーブルされるまで保留中にされる。したがって、仮想例外が副カーネルによって再イネーブルされるときに、仮想例外が保留中であるかどうかの検査を行わなければならない。検査が肯定の場合に、副カーネルは、そのような保留中の仮想例外を処理するために、ナノカーネルを呼び出さなければならない。そのような呼出しは、ＳＴＩトラップまたはＩＲＥＴトラップのいずれかによって実行される。
【０２４２】
一般に、副カーネルは、次の２つの場合、すなわち
・  コードのクリティカルセクションを保護するために、仮想例外が前に副カーネルによってディスエーブルされているときと、
・  割込みゲート呼出しの結果として仮想例外がナノカーネルによってディスエーブルされているとき仮想例外を再イネーブルする。
【０２４３】
前者の場合に、副カーネルは、保留中の仮想例外がある場合に、ＳＴＩトラップを使用してその仮想例外を処理する。保留中の例外が処理されたならば、ナノカーネルが、副カーネル実行を継続するためにＳＴＩトラップからリターンする。
【０２４４】
後者の場合に、副カーネルは、例外ハンドラからリターンするときに、ＩＲＥＴトラップを使用して、保留中の仮想割込みを処理する。ＩＲＥＴトラップが、ｉｒｅｔ  ＩＡ−３２命令を置換することと、そのトラップが実行されるときに、例外フレームがまだスーパーバイザスタックにプッシュされていることに留意されたい。また、ナノカーネルが、ＩＲＥＴトラップからリターンするのではなく、保留中の例外が処理された後に、副オペレーティングシステム実行が、最初の仮想例外によってプリエンプトされた点で継続されることに留意されたい。言い換えると、ＩＲＥＴトラップは、トラップ時にスタックの最上部に置かれていた例外フレームに保存された状態にリターンする。
ナノカーネル再入
【０２４５】
ナノカーネルコードは、主として、再入インカーネルを防ぐためにプロセッサレベルで割込みをディスエーブルされた状態で実行される。その一方で、一部のナノカーネル呼出しが、長い時間を要する場合があり、したがって、ナノカーネルは、主割込み待ち時間を短く保つために、そのような長い動作を実行するときに割込みをイネーブルしなければならない。
【０２４６】
長いナノカーネル動作には、次の３種類がある。
・  同期コンソール出力
【０２４７】
動作持続時間は、シリアル回線速度に依存する。例えば、９６００ボーレート回線では、単一文字出力が１ミリ秒を要する場合がある。
・  ｌｇｄｔおよびｌｉｄｔ
【０２４８】
動作持続時間は、テーブルサイズに依存する。これらの動作は、主カーネルについてディスエーブルされた割込みと共に行うことができる。というのは、これらの命令が、通常、いずれにせよ通常は割込みがディスエーブルされる初期化時に発行されるからである。しかし、副ｌｇｄｔメソッドおよび副ｌｉｄｔメソッドについては、副カーネルをいつでも再始動できるので、割込みをディスエーブルしたままにすることは、明らかに許容可能ではない。
・  副カーネル再始動
【０２４９】
動作持続時間は、コピーから復元されるカーネルイメージサイズに依存する。
【０２５０】
上にリストしたすべての動作について、ナノカーネルは、割込みをイネーブルし、したがって、主カーネルからの再入をイネーブルする。その一方で、割込みがイネーブルされるときに、ナノカーネルスケジューラは、主割込みハンドラからリターンするときに別の副カーネルがスケジューリングされないようにするために、ディスエーブルされる。言い換えると、ナノカーネルは、主カーネルだけがプリエンプトすることができる（割込みの結果として）が、副カーネルからの再入は、禁止される。そのような制限は、ナノカーネルが副実行環境についてグローバルリソースを使用することを可能にする。例えば、インターセプトされる例外に使用されるＴＳＳデータ構造体は、グローバルであり、すべての副カーネルにまたがって共用される。
【０２５１】
副カーネルから発行されるいくつかの長い動作を、主メモリコンテキストで実行することができる。言い換えると、そのような動作を実行する前に、ナノカーネルが、主実行コンテキストに切り替え、その後、割込みをイネーブルする。その動作が終わったならば、ナノカーネルは、割込みをディスエーブルし、ナノカーネルスケジューラを介して呼出し側副カーネルにリターンする。
【０２５２】
しかし、いくつかの長い動作は、副ＫＶマッピングに置かれたデータ構造体へのアクセスを必要とするので、これらの動作を主メモリコンテキストで実行できないことに留意されたい。そのような動作の通常の例が、それぞれネイティブＧＤＴデータ構造体およびネイティブＩＤＴデータ構造体にアクセスする副ｌｇｄｔメソッドおよび副ｌｉｄｔメソッドである。したがって、これらの動作は、ナノカーネルメモリコンテキストで行われなければならない。
【０２５３】
また、主実行環境へ／からの切替によって導入される余分なオーバーヘッドを防ぐために、頻繁に使用されるナノカーネルメソッドをナノカーネルメモリコンテキストで実行することが好ましい（これらを主メモリコンテキストでも実行できる場合であっても）ことに留意されたい。そのような頻繁な動作の通常の例が、ナノカーネルコンソールでの同期出力である。
【０２５４】
上の議論は、ナノカーネルが、アクティブ化された副ＧＤＴおよび副ＩＤＴを有するナノカーネルメモリコンテキストでコードを実行している間に、プロセッサ割込みをイネーブルできなければならないことを示す。言い換えると、ナノカーネルは、副ナノカーネルメソッドを実行するトラップタスクを動作させている間の割込みタスクへのタスク切替をサポートしなければならない。
【０２５５】
そのようなタスクネスティングをサポートするために、ナノカーネルは、図１３に示されたカーネルコンテキストの隠し部分に置かれるカーネルごとのＴＳＳスタックを処理する。このデータ構造体は、副カーネルコンテキストについてのみ意味を持つ。スタックの最上部は、現在のＴＳＳすなわち、タスクレジスタによってポイントされるＴＳＳをポイントする。このスタックは、副カーネルへ／からのタスク切替が実行されるたびに更新される。ナノカーネルタスクが、タスクゲートによってアクティブ化されるときに、タスクＴＳＳが、このスタックにプッシュされる。ナノカーネルが、ナノカーネルタスクからリターンするときに、一番上のＴＳＳがスタックから除去される。ＴＳＳスタックは、スタック最下部に置かれるネイティブ副ＴＳＳを変更する副ｌｔｒメソッドによっても更新される。
【０２５６】
図１６に、ＴＳＳスタックの通常の状態を示す。この図の上半分は、副カーネルが割込みによってプリエンプトされるときのＴＳＳスタック評価を示す。この図の下半分は、長い副動作を実行するナノカーネルが割込みによってプリエンプトされるときのＴＳＳスタック評価を示す。ＴＳＳスタックが、絶対に空にならず、最大スタック深さが、３つまでに制限されていることに留意されたい。
【０２５７】
ネイティブＴＳＳは、必ずスタック最下部に置かれる。このＴＳＳは、ネイティブ副カーネル実行環境によって使用される。上で説明したように、副カーネルは、カーネルコンテキストの隠し部分に置かれる初期ＴＳＳを使用して始動される。初期化フェーズ中に、副カーネルは、通常、ｌｔｒナノカーネルメソッドを使用してそれ自体のネイティブＴＳＳをインストールする。そのようなネイティブＴＳＳは、ＴＳＳスタック内の初期ＴＳＳをオーバーライドする。
【０２５８】
副カーネルが割込みによってプリエンプトされるか、ナノカーネルメソッドがトラップを介して呼び出されたならば、対応するナノカーネルタスクが、タスクゲートによってアクティブ化される。ナノカーネルタスクは、必ず、それ自体のＴＳＳへのポインタをこのスタックにプッシュする。割込みの場合に、ナノカーネル割込みタスクは、単純に、割込みを処理するために主カーネルに切り替える。トラップの場合に、ナノカーネルは、長いメソッドのコードを実行している間に割込みをイネーブルすることができる。
【０２５９】
割込みがイネーブルされているときに、ナノカーネルメソッドを、タスクゲートによってアクティブ化されたナノカーネル割込みタスクによってプリエンプトすることができ、この割込みタスクが、割込みを処理するために主カーネルに切り替える。割込みが処理されたならば、主カーネルは、割り込まれたメソッドの実行を再開するためにナノカーネルにリターンする。
【０２６０】
トラップタスクおよび割込みタスクをネストすることができるので、タスクコードを実行するときに異なる（オーバーラップしない）スタックを使用することが必要である。ナノカーネルは、割込みタスクで特別な割込みスタックを使用する。
【０２６１】
割込みが、トラップタスク内で発生するときに、プロセッサは、割込みタスクに切り替え、汎用レジスタをトラップタスクＴＳＳ（この瞬間の現在のＴＳＳである）に保存する。したがって、割込みが、トラップタスク内でもう一度ディスエーブルされたならば、トラップＴＳＳのＥＩＰフィールド、ＥＢＸフィールド、およびＥＳＰフィールドを再初期化する必要がある。というのは、これらが、割込みによって破壊される可能性があるからである。
［スケジューラ］
【０２６２】
オペレーティングシステムスケジューラの主な役割は、次に動作するタスクを選択することである。ナノカーネルは、オペレーティングシステムの実行を制御するので、ナノカーネルスケジューラは、次に動作する副オペレーティングシステムを選択する。言い換えると、ナノカーネルは、システム全体に余分なスケジューリングレベルを追加する。
【０２６３】
ナノカーネルアーキテクチャでは、主オペレーティングシステムが、副オペレーティングシステムに関して最高の優先順位を有し、ＣＰＵが、主システムがアイドルループに入っているときに限って副システムに与えられることに留意されたい。主カーネルが、プリエンプト可能ではなく、アイドルループ内で呼び出されるｉｄｌｅメソッドを介してナノカーネルスケジューラを明示的に呼び出すと言うことができる。副システムを動作させているときに割込みが発生したならば、主カーネル割込みハンドラが呼び出される。主カーネルの展望から、そのような割込みは、アイドルループを実行するバックグラウンドスレッドをプリエンプトする。割込みが処理され、すべての関連するタスクが終わったならば、主カーネルは、ナノカーネルにリターンし、このナノカーネルは、次に動作する副システムを決定するためにナノカーネルスケジューラを呼び出す。主カーネルの展望から、カーネルは、単に、割込みによってプリエンプトされたバックグラウンドスレッドにリターンする。副アクティビティは、主カーネルに透過的であり、主システム挙動を変更しない。
【０２６４】
ナノカーネルは、異なるスケジューリングポリシを実装することができる。しかし、デフォルトで、優先順位ベースのアルゴリズムが使用される。同一の優先順位レベルでは、ナノカーネルがラウンドロビンスケジューリングポリシを使用することに留意されたい。所与の副カーネルの優先順位は、システムイメージ作成時に静的に構成される。
【０２６５】
どのスケジューリングポリシが実装される場合でも、スケジューラは、所与の副システムが動作の準備ができているかどうかを検出しなければならない。この条件は、カーネルコンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールドとｅｎａｂｌｅｄ  ＶＥＸフィールドの間のビット単位論理積演算として計算される。非０の結果が、システムが動作の準備ができていることを示す。
【０２６６】
上で説明したように、ｐｅｎｄｉｎｇ  ＶＥＸおよびｅｎａｂｌｅｄ  ＶＥＸ対の各ビットが、仮想例外を表す。動作の準備ができていることの判断基準を言い直すと、少なくとも１つのマスクされていない保留中の仮想例外がある場合に、副システムは動作の準備ができた状態であると言うことができる。
【０２６７】
通常はハードウェア割込みおよびソフトウェア（クロス）割込みにマッピングされるすべての仮想例外の中に、カーネルが現在アイドルであるかどうかを反映する特別な仮想割込み（ｒｕｎｎｉｎｇ）がある。
【０２６８】
ｒｕｎｎｉｎｇビットは、副カーネルがｉｄｌｅメソッドを呼び出すたびにｐｅｎｄｉｎｇ  ＶＥＸフィールド内でクリアされ、ｒｕｎｎｉｎｇビットは、仮想例外が副カーネルに配送されるたびにｐｅｎｄｉｎｇ  ＶＥＸフィールド内でセットされる。
【０２６９】
ｒｕｎｎｉｎｇビットは、通常、動作中の副カーネルのｅｎａｂｌｅｄ  ＶＥＸフィールド内で必ずセットされている。ナノカーネルは、副カーネルが始動されるときにこのビットをセットし、副カーネルが停止されるときにこのビットをリセットする。副カーネルは、仮想例外にマッピングされた割込みをマスク／マスク解除するときに、絶対にｒｕｎｎｉｎｇビットをクリアしてはならない。
【０２７０】
外部エージェントが、カーネルコンテキスト内のｅｎａｂｌｅｄ  ＶＥＸフィールドをクリア／復元することによって副カーネルの実行をサスペンド／再開できることに留意されたい。この機能は、スケジューリングポリシエージェントをナノカーネルの外部で主カーネルタスクとして実装する可能性を開く。さらに、これは、副カーネル用のデバッグエージェントを主カーネル上のタスクとして動作させることを可能にする。そのような副デバッグエージェントの利益は、主オペレーティングシステムによって提供されるすべてのサービスが、デバッグに使用可能になり（例えば、ネットワーキングスタック）、副カーネルデバッギングを、主オペレーティングシステムで動作するクリティカルタスクと同時に行えることである。
［クロス割込み］
【０２７１】
このセクションでは、主として、ナノカーネルクロス割込み機構に関する情報（前の節で既に与えた）を整理統合する。
【０２７２】
次の２種類のクロス割込みを、ここで検討する。
・  副カーネルに送られるクロス割込み
・  主カーネルに送られるクロス割込み
【０２７３】
クロス割込みを宛先副カーネルに送るためには、ソースカーネルが、まず、宛先カーネルコンテキストのｐｅｎｄｉｎｇ  ＸＩＲＱフィールド内のクロス割込みソースに対応するビットをセットする。次に、ソースカーネルは、宛先カーネルコンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールド内の対応するビットをセットすることによって、宛先カーネルにクロス割込みＶＥＸをポストする。クロス割込みハンドラは、ナノカーネルによって呼び出されたならば、ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドを検査し、保留中のクロス割込みソースに対応するビットをクリアし、最後に、このソースにアタッチされたハンドラを呼び出す。ソースカーネルと宛先カーネルの両方が、アトミック命令を使用してｐｅｎｄｉｎｇ  ＸＩＲＱフィールドを更新する。同一のアルゴリズムが、主と副の両方のタイプのソースカーネルによって使用されることに留意されたい。
【０２７４】
クロス割込みを主カーネルに送るためには、副カーネルが、まず、主カーネルコンテキストのｐｅｎｄｉｎｇ  ＸＩＲＱフィールド内のクロス割込みソースに対応するビットをセットする。次に、副カーネルは、ＸＩＲＱトラップを実行することによってナノカーネルを呼び出す。ナノカーネルは、即座に副カーネルをプリエンプトし、主低水準クロス割込みハンドラを呼び出し、このハンドラが、ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドを検査し、保留中のクロス割込みソースに対応するビットをクリアし、最後に、このソースにアタッチされたハンドラを呼び出す。
【０２７５】
クロス割込み０は、カーネルによって使用されてはならない。この割込みは、停止したカーネルが始動されたことまたは動作中のカーネルが停止されたことをナノカーネルがカーネルに通知するために予約されている。言い換えると、クロス割込み０は、グローバルシステム構成が変化したことを動作中のカーネルに通知する。これは、カーネルコンテキスト内でｒｕｎｎｉｎｇフィールドの状態が変更されるたびに、すべての動作中のカーネルにブロードキャストされる。
［ＦＰＵ管理］
【０２７６】
ＦＰＵエンジンは、通常、ナノカーネル環境で動作するすべてのオペレーティングシステムによって共用されるコンピューティングリソースである。
【０２７７】
ＩＡ−３２  Ｉｎｔｅｌアーキテクチャでは、ナノカーネルが、レイジイな形でＦＰＵ共用を管理する。これは、あるオペレーティングシステムから別のオペレーティングシステムへの切替が発生するときに、ＦＰエンジンが、新たにスケジューリングされるオペレーティングシステムに即座に与えられるのではなく、新たにスケジューリングされたシステムが実際に浮動小数点命令を実行し、浮動小数点レジスタにアクセスするまで、ＦＰＵ切替が延期されることを意味する。
【０２７８】
そのようなレイジイＦＰＵディスパッチアルゴリズムは、ナノカーネルがシステム切替時間を減らすことを可能にする。これは、主割込み待ち時間を減らすために特に重要である。というのは、ＦＰＵが、通常、割込みレベルでは使用されず、したがって、通常、副オペレーティングシステムをプリエンプトし、主割込みハンドラを呼び出すためにＦＰＵレジスタを保存し、復元する必要がないからである。
【０２７９】
ナノカーネルは、現在ＦＰＵを使用しているカーネルのコンテキストをポイントするＦＰＵオーナーグローバル変数を処理する。ＦＰＵオーナーがない場合には、ＦＰＵオーナーコンテキストに０がセットされる。ＦＰＵコンテキストは、カーネルコンテキストの隠し部分に置かれる。そのようなコンテキストは、カーネルがＦＰＵオーナーでないときにＦＰＵエンジンの状態（すなわち、浮動小数点レジスタおよび状況）を保つ。明らかに、ＦＰＵオーナーの状態は、ＦＰＵエンジンハードウェアによって保たれる。ナノカーネルがＦＰＵオーナーを変更するときに、ＦＰＵ状態が、古いＦＰＵコンテキストに保存され、新しいＦＰＵコンテキストから復元される。
【０２８０】
ナノカーネルは、ＦＰＵが非ＦＰＵオーナーによって使用されるときに例外を誘発するために、ＣＲ０レジスタのエミュレーションビット（ＥＭ）を使用する。ＣＲ０レジスタイメージは、カーネルコンテキストの隠し部分に加わる。ＣＲ０レジスタは、システム切替時に保存され（古いコンテキストに）、復元される（新しいコンテキストから）。ＥＭビットは、ＦＰＵオーナー以外のすべてのカーネルコンテキストでセットされ、ＦＰＵオーナーではクリアされる。さらに、ナノカーネルが、すべての非ＦＰＵオーナーに関する無効オペコード（＃ＵＤ）例外およびデバイス使用不能（＃ＮＭ）例外をインターセプトし、ＦＰＵオーナーが、これらの例外をネイティブな形で処理する。
【０２８１】
ＦＰＵ切替は、ナノカーネルがＦＰＵ関連例外すなわち＃ＵＤまたは＃ＮＭのいずれかをインターセプトするときに発生する。２つのカーネルの間でＦＰＵエンジンを切り替えるために、ナノカーネルは、現在のＦＰＵオーナーを解放し、新しいＦＰＵオーナーを割り当てる。
【０２８２】
現在のＦＰＵオーナーを解放するために、ナノカーネルは、現在のＦＰＵ状態をカーネルコンテキストに保存し、ＣＲ０レジスタイメージ内のＥＭビットをセットする。さらに、ナノカーネルゲートが、＃ＵＤ例外および＃ＮＭ例外をインターセプトするために実ＩＤＴ内にインストールされる。
【０２８３】
新しいＦＰＵオーナーを割り当てるために、ナノカーネルは、カーネルコンテキストからＦＰＵ状態を復元し、ＣＲ０イメージ内のＥＭビットをクリアする。さらに、ネイティブゲートが、ＦＰＵを所有している間にネイティブな形で＃ＵＤ例外および＃ＮＭ例外を処理するために実ＩＤＴ内にインストールされる。
【０２８４】
ナノカーネルは、保存動作および復元動作を最適化するために、ＣＲ４レジスタのＯＳＦＸＳＲビットを使用する。ＣＲ４レジスタイメージは、カーネルコンテキストの隠し部分に加わる。これは、システム切替時に保存され（古いコンテキストに）、復元される（新しいコンテキストから）。ナノカーネルは、標準または拡張のどちらのタイプのＦＰＵコンテキストを保存しまたは復元しなければならないかを判定するために、ＣＲ４レジスタイメージを使用する。これは、ナノカーネルが、ＭＭＸ機能もＳＩＭＤ機能も使用しないオペレーティングシステムについて拡張ＦＰＵコンテキストを保存／復元しないことを可能にする。
【０２８５】
ナノカーネルは、レイジイＦＰＵ切替を実装するためにＣＲ０レジスタのＥＭビットを使用するので、カーネルは、このビットの状態を変更することを許可されない。具体的には、これは、ＦＰＵエミュレーションが、ナノカーネルアーキテクチャに移植されたカーネルによってサポートされないことを意味する。
【０２８６】
通常、オペレーティングシステムカーネルが、プロセス間のレイジイＦＰＵ切替を実装するためにＣＲ０レジスタのＴＳビットを使用することに留意されたい。ＣＲ０レジスタイメージは、カーネルコンテキストに加わり、したがって、システム切替時に保存され、復元されるので、ネイティブＦＰＵ管理を、ナノカーネル環境でほとんど無変更のままに保つことができる。
【０２８７】
しかし、ＴＳビットが、タスク切替によって自動的にセットされることに留意されたい。これは、ＴＳビットがカーネルの観点から論理的にクリアされている場合であっても、副カーネル内でＦＰＵ例外が発生し得ることを意味する。そのような偽のＦＰＵ例外は、副例外をインターセプトするためにナノカーネルによって使用されるタスクゲートによって導入される。そのような偽のＦＰＵ例外を検出し、静かに無視する（ＴＳビットをクリアするのみ）ために、副カーネルは、ＴＳビットのソフトウェアコピーを処理しなければならない。ナノカーネルは、カーネルコンテキスト内にこの目的専用のフィールドを設けることによって、このタスクにおいて副カーネルを支援する。
【他の態様および実施形態】
【０２８８】
前述から、上で説明した実施形態が例にすぎず、多数の他の実施形態が可能であることは明らかである。言及したオペレーティングシステム、プラットフォーム、およびプログラミング技法は、すべて、自由に変更することができる。当業者に明白な他のすべての変更、置換、および変形は、添付請求項に含まれるものであってもそうでなくても、本発明の範囲内と考えられなければならない。不確かさをなくすために、本明細書で開示されたすべての新規の主題およびその組合せについて、保護が求められる。
【図面の簡単な説明】
【０２８９】
【図１】本発明を実行できるコンピュータシステムの要素を示すブロック図である。
【図２ａ】従来技術のソフトウェアの構成を示す図である。
【図２ｂ】本発明によるソフトウェアの構成を示す対応する図である。
【図３】図１のコンピュータのために図２ｂのソフトウェアを作成するステージを示す流れ図である。
【図４】図２ｂの一部を形成するハードウェアリソースディスパッチャのコンポーネントを示す図である。
【図５】ブートおよび初期化シーケンスで使用されるプログラムを示す図である。
【図６】ブートプロセスまたは初期化プロセスで使用されるシステムメモリイメージを示す図である。
【図７】主オペレーティングシステムから副オペレーティングシステムへの遷移を示す図である。
【図８】副オペレーティングシステムから主オペレーティングシステムへの遷移を示す図である。
【図９】（ａ）は本発明による、異なるオペレーティングシステムで動作するアプリケーションの間の通信を示す図である。（ｂ）は本発明による、異なるコンピュータの異なるオペレーティングシステムで動作するアプリケーションの間の通信を示す図である。
【図１０】主、副、およびナノカーネルの仮想アドレス空間の例を示す図である。
【図１１】メモリコンテキストが経時的にどのように切り替わるかを示す図である。
【図１２】ナノカーネルコンテキストの可視部分を示す図である。
【図１３】ナノカーネルコンテキストの隠し部分を示す図である。
【図１４】初期ＴＳＳがタスク切替の前にどのように初期化されるかを示す図である。
【図１５】ナノカーネルＴＳＳの非ゼロフィールドを示す図である。
【図１６】ＴＳＳスタックの通常の状態を示す図である。
【図１７】セグメント化およびページングがＩｎｔｅｌアーキテクチャのメモリアドレッシングでどのように使用されるかを示す図である。
【図１８】Ｉｎｔｅｌのシステムレベルレジスタおよびデータ構造体を示す図である。
【図１】
2007509387.tif 000004
【図２ａ】
2007509387.tif 000005
【図２ｂ】
2007509387.tif 000006
【図３】
2007509387.tif 000007
【図４】
2007509387.tif 000008
【図５】
2007509387.tif 000009
【図６】
2007509387.tif 000010
【図７】
2007509387.tif 000011
【図８】
2007509387.tif 000012
【図９】
2007509387.tif 000013
【図１０】
2007509387.tif 000014
【図１１】
2007509387.tif 000015
【図１２】
2007509387.tif 000016
【図１３】
2007509387.tif 000017
【図１４】
2007509387.tif 000018
【図１５】
2007509387.tif 000019
【図１６】
2007509387.tif 000020
【図１７】
2007509387.tif 000021
【図１８】
2007509387.tif 000022
【国際調査報告】
2007509387.tif 000023
2007509387.tif 000024
2007509387.tif 000025
2007509387.tif 000026