(57)【要約】  相対的に高い優先順位を有するように第１のオペレーティングシステム（Ｃ５などのリアルタイムオペレーティングシステム）を選択するステップと、相対的に低い優先順位を有するように少なくとも１つの第２のオペレーティングシステム（Ｌｉｎｕｘなどの汎用オペレーティングシステム）を選択するステップと、所定の条件の下で、前記オペレーティングシステム間で切り替えるように構成された共通プログラム（ナノカーネルに類似したハードウェアリソースディスパッチャ）を提供するステップと、前記第１および第２のオペレーティングシステムが前記共通プログラムによって制御できるようにするために、それらに対する修正を提供するステップとを含む、複数の異なるオペレーティングシステムが同じＲＩＳＣ（たとえばＡＲＭ）コンピュータ上で同時に実行できるようにする方法。【選択図】図１
2008510238.tif 000002
【特許請求の範囲】
【請求項１】
複数の異なるオペレーティングシステムが同じコンピュータ上で同時に実行できるようにする方法であって、
相対的に高い優先順位を有するように第１のオペレーティングシステムを選択するステップと、
相対的に低い優先順位を有するように少なくとも１つの第２のオペレーティングシステムを選択するステップと、
所定の条件の下で、前記オペレーティングシステム間で切り替えるように構成された共通プログラムを提供するステップと、
前記第１および第２のオペレーティングシステムが前記共通プログラムによって制御できるようにするために、それらに対する修正を提供するステップと
を含む方法。
【請求項２】
前記第１のオペレーティングシステムがリアルタイムオペレーティングシステムである、請求項１に記載の方法。
【請求項３】
前記第２のオペレーティングシステムが非リアルタイムの汎用オペレーティングシステムである、請求項１に記載の方法。
【請求項４】
前記第２のオペレーティングシステムがＬｉｎｕｘ、あるいはそのバージョンまたは変形である、請求項１に記載の方法。
【請求項５】
前記共通プログラムが、前記オペレーティングシステム間で切り替えるために必要なプロセッサ状態を保存するように、および保存されたバージョンから復元するように構成された、請求項１に記載の方法。
【請求項６】
前記第２のオペレーティングシステムに関するプロセッサ例外が、前記共通プログラムによって仮想様式で処理される、請求項１に記載の方法。
【請求項７】
前記共通プログラムが、何らかのプロセッサ例外を遮断するように、および前記第１のオペレーティングシステムの例外処理ルーチンを処理するために呼び出すように構成された、請求項１に記載の方法。
【請求項８】
前記第２のオペレーティングシステムに関する前記プロセッサ例外が仮想例外として通知される、請求項７に記載の方法。
【請求項９】
前記共通プログラムが、保留中の前記仮想例外に対応する前記第２のオペレーティングシステムの例外処理ルーチンを呼び出すように構成された、請求項８に記載の方法。
【請求項１０】
それぞれが排他的に動作可能な別々のメモリスペースを備えた前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１１】
それぞれが排他的アクセスを有する対象である前記コンピュータの第１の入力および／または出力デバイスを備えた、前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１２】
各オペレーティングシステムが、ほぼ未修正のネイティブルーチンを使用して前記第１の入力および／または出力デバイスにアクセスする、請求項１１に記載の方法。
【請求項１３】
それぞれが共有アクセスを有する対象である前記コンピュータの第２の入力および／または出力デバイスへのアクセスを備えた、前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１４】
すべてのオペレーティングシステムが、前記第１のオペレーティングシステムの前記ルーチンを使用して前記第２の入力および／または出力デバイスにアクセスする、請求項１３に記載の方法。
【請求項１５】
前記第１の、または前記共通プログラムの動作に割り込むことなく、前記第２のオペレーティングシステムを再始動するための再始動ルーチンを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１６】
前記共通プログラムが、前記第２のオペレーティングシステムの前記動作を制御するためのトラップ呼び出しメカニズム、および／または、前記第２のオペレーティングシステム内の状況変化を前記第１のオペレーティングシステムに通知するためのイベントメカニズムを提供する、請求項１５に記載の方法。
【請求項１７】
前記共通プログラムが、前記第２のオペレーティングシステムのカーネルのシステムイメージのコピーを格納し、このような保存されたコピーから前記第２のオペレーティングシステムの前記カーネルを復元するように構成された、請求項１５に記載の方法。
【請求項１８】
前記第１のオペレーティングシステムが、前記第２のオペレーティングシステムのクラッシュを検出できるように、前記第２のオペレーティングシステムの連続する動作を監視できるようにするための協働ルーチンを、前記第１および第２のオペレーティングシステムが有する、請求項１５に記載の方法。
【請求項１９】
前記オペレーティングシステムの前記動作において事前に定義された条件が発生すると、前記共通プログラムがマシン状態変数の状態を出力するように構成された、デバッグルーチンを提供するステップをさらに含む、請求項１に記載の方法。
【請求項２０】
前記オペレーティングシステムと共通プログラムとを単一のコード製品に組み合わせるステップをさらに含む、請求項１に記載の方法。
【請求項２１】
前記オペレーティングシステムと共通プログラムとをコンピュータ製品上の永続メモリに埋め込むステップをさらに含む、請求項１に記載の方法。
【請求項２２】
前記共通プログラムが、前記第１および第２のオペレーティングシステム、および／またはそれらの上で実行中のアプリケーションの間での通信を可能にする、オペレーティングシステム間通信メカニズムを提供するように構成された、請求項１に記載の方法。
【請求項２３】
前記共通プログラムが、通信バスブリッジに対応する仮想入力および／または出力デバイスを定義するため、結果として前記オペレーティングシステムがあたかも通信バスを介するように通信可能である、請求項２２に記載の方法。
【請求項２４】
前記オペレーティングシステムを修正する前記ステップが、前記仮想バスブリッジデバイスを管理するドライバルーチンを追加するステップを含む、請求項２３に記載の方法。
【請求項２５】
請求項１に記載のステップを実行するためのコードを備える、開発キットコンピュータプログラム製品。
【請求項２６】
請求項２０に従って組み合わせられたコードを備える、コンピュータプログラム製品。
【請求項２７】
請求項２４に従ってプログラムが埋め込まれた永続メモリをその中に格納させる、ＣＰＵ、メモリデバイス、および入力／出力デバイスを備える、埋め込み型コンピュータシステム。
【請求項２８】
ＣＰＵ、メモリデバイス、および入力／出力デバイスを備える、コンピュータシステムであって、
相対的に高い優先順位を有する第１のオペレーティングシステムと、
相対的に低い優先順位を有する第２のオペレーティングシステムと、
所定の条件の下で、前記オペレーティングシステム間で切り替えることによって、前記オペレーティングシステムを同時に実行するように構成された共通プログラムと、
を備えるコンピュータコードをその上で実行させる、コンピュータシステム。
【請求項２９】
請求項１〜２４のいずれかに記載の方法を使用して前記第１および第２のオペレーティングシステムを同時に実行するように構成された、請求項２８に記載のコンピュータシステム。
【請求項３０】
前記オペレーティングシステムのそれぞれに、前記共通プログラムに制御を渡すアイドルルーチンが提供された、請求項１に記載の方法。
【請求項３１】
前記アイドルルーチンがプロセッサ停止命令の代用を務める、請求項３０に記載の方法。
【請求項３２】
実行オペレーティングシステムの実行中にプロセッサ例外が発生すると、
（ａ）前記共通プログラムはそれらを処理するために前記第１のオペレーティングシステムの例外処理ルーチンを呼び出すように構成され、
（ｂ）前記実行が所定の第２のオペレーティングシステム向けである場合、仮想例外が作成され、
（ｃ）前記プロセッサ例外が前記第１のオペレーティングシステムによって処理された後、前記共通プログラムは前記実行オペレーティングシステムの実行に戻るように構成され、
（ｄ）前記共通プログラムが次に前記所定の第２のオペレーティングシステムに切り替えられた場合、保留中の前記仮想例外が前記所定の第２のオペレーティングシステムに通知され、
前記仮想例外に対応する前記所定の第２のオペレーティングシステムの例外処理ルーチンが、これを処理するために呼び出される、
請求項１に記載の方法。
【請求項３３】
前記第２のオペレーティングシステムが割り込みをマスキングしないように修正される、請求項１に記載の方法。
【請求項３４】
すべてのハードウェア割り込みは前記第１のオペレーティングシステムによって初期に処理され、第２のオペレーティングシステム向けの割り込みは、その第２のオペレーティングシステムが次に前記共通プログラムによってスケジューリングされるまで仮想化および据え置かれ、その時点でその第２のオペレーティングシステムによって処理される、請求項１に記載の方法。
【請求項３５】
前記共通プログラムは、２次オペレーティングシステムまたはそれぞれの２次オペレーティングシステムが、前記２次システムを前記１次システムによって完全にプリエンプト可能にするために、前記２次オペレーティングシステム内のハードウェア例外マスキングコードを置き換えるように、仮想例外をマスキングするための手段を提供するように構成された、請求項８に記載の方法。
【請求項３６】
前記第２の仮想例外がマスキングされない、請求項９に記載の方法。
【発明の詳細な説明】
【発明の詳細な説明】
【０００１】
本発明は、オペレーティングシステムに関する。より具体的には、本発明は、複数のオペレーティングシステムを同時に実行させるためのシステム、方法、およびコンピュータプログラムに関する。
【０００２】
一部のコンピュータプログラムでは、プログラム内の諸ステップが、定義された時間間隔内または定義された時点で実行されることが重要である。こうしたプログラムの例が、携帯電話を作動させるため、あるいは構内交換機（ＰＢＸ）またはセルラ式基地局を作動させるための、制御プログラムである。通常、プログラムは、イベント後のある時点で、またはある時点内に、外部イベントまたは状態の変化に継続的に応答しなければならない。これが、「リアルタイム」での動作と呼ばれる。
【０００３】
しかしながら、多くの他のプログラムでは、プログラムの実行にかかる時間は重要ではない。これは、スプレッドシートプログラム、ワードプロセッシングプログラム、給与計算パッケージ、および一般的な報告または分析プログラムを含む、ほとんどの一般的なコンピュータプログラムに適用される。他方で、こうしたプログラムにかかる正確な時間は重要でないが、ほとんどの場合、ユーザは可能なより迅速な実行を好む。
【０００４】
アプリケーションプログラムは、オペレーティングシステムを介してそれが実行されるコンピュータと対話する。オペレーティングシステムのアプリケーションプログラミングインターフェース（ＡＰＩ）を使用することによって、アプリケーションプログラムは移植可能な様式で作成できるため、異なるハードウェアリソースを使用して異なるコンピュータ上で実行可能である。加えて、ＬｉｎｕｘまたはＷｉｎｄｏｗｓなどの一般的なオペレーティングシステムはマルチタスキングを提供し、言い換えれば、いくつかのプログラムを同時に動作させることができる。そのためにはスケジューリングを提供し、言い換えれば、異なるプログラム間でコンピュータリソースの使用を共有し、スケジューリングアルゴリズムに従ってそれぞれに時間を割り振る。この種のオペレーティングシステムはかなり広範に使用されているが、一般には、リアルタイムアプリケーションの実行には備えられていないため、多くの制御または通信タスクには好適でない。
【０００５】
したがって、こうしたタスクのためのリアルタイムオペレーティングシステムが開発されてきており、その一例がＣｈｏｒｕｓＯＳ（Ｃｈｏｒｕｓとしても知られる）およびその派生である。Ｃｈｏｒｕｓは、http://www.experimentalstuff.com/Technologies/ChorusOS/index.htmlおよびhttp://www.jaluna.com/のＪａｌｕｎａから、オープンソースソフトウェアとして入手可能である。
【０００６】
これについては、http://www.jaluna.com/developer/papers/COSDESPERF.pdfから入手可能な、２００１年８月、Ｆｒａｎｃｏｉｓ  Ａｒｍａｎｄによる「ＣｈｏｒｕｓＯＳ  Ｆｅａｔｕｒｅｓ  ａｎｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ  ｏｖｅｒｖｉｅｗ」という名称のＳｕｎ  Ｔｅｃｈｉｎｉｃａｌ  Ｒｅｐｏｒｔ、２２２ページに記載されている。
【０００７】
これらのオペレーティングシステムは、他のタイプのプログラムを実行するためにも使用可能であった。しかしながら、当然のことながらユーザは、ＷｉｎｄｏｗｓまたはＬｉｎｕｘなどの汎用オペレーティングシステムのために作成された大量の「レガシー」プログラムが、リアルタイムオペレーティングシステム上で実行するように書き直す必要なしに実行できることを望む。
【０００８】
「デュアルブート」システムを提供すると、ユーザが一方または他方のオペレーティングシステムのいずれかを実行できるようにすることが可能であるが、多くの場合、リアルタイムプログラムを実行しながら同時に「レガシー」プログラムを実行できることが望ましい。たとえば、通信ネットワークインフラストラクチャ機器、第３世代携帯電話および他の高機能電話、ならびに高機能電子ゲーム機器は、リアルタイムアプリケーション（たとえばゲームプレイグラフィックス）および非リアルタイムアプリケーション（ゲームダウンロード）の両方を必要とする可能性がある。
【０００９】
米国特許第５９０３７５２号および米国特許第５７２１９２２号では、非リアルタイムオペレーティングシステム（Ｗｉｎｄｏｗｓなど）の割り込み処理環境においてリアルタイムのマルチタスキングカーネルを提供することによって、リアルタイム環境を非リアルタイムオペレーティングシステムに組み込むことが試みられている。
【００１０】
広範囲に使用される手法の１つが「エミュレーション」である。通常、リアルタイムオペレーティングシステムの下で実行するために、汎用オペレーティングシステム用に作成されたプログラムの各命令を解釈し、対応する一連の命令をリアルタイムオペレーティングシステムの下で実行する、エミュレータプログラムが作成される。しかしながら、１つの命令が常に多くの命令に置き換えられるため、エミュレーションはコンピュータにより多くの負荷をかけ、その結果、性能速度が低下する。仮想マシン（たとえばＪａｖａ（商標）仮想マシンなど）の提供に基づいた手法でも、同様の問題が生じる。仮想マシン実施の例は、欧州特許第１０５９５８２号、米国特許第５４９９３７９号、および米国特許第４７６４８６４号である。
【００１１】
他の同様の技法は、米国特許第５９９５７４５号（Ｙｏｄａｉｋｅｎ）に記載されている。Ｙｏｄａｉｋｅｎは、マルチタスキングのリアルタイムオペレーティングシステムが汎用オペレーティングシステムをそのタスクのうちの１つとして実行し、リアルタイムタスクを実行するために必要に応じてそれをプリエンプト（ｐｒｅ−ｅｍｐｔ）するシステムについて、説明している。
【００１２】
他の手法は、たとえば欧州特許第０３６０１３５号および１９９０年９月の論文「Ｍｅｒｇｉｎｇ  ｒｅａｌ−ｔｉｍｅ  ｐｒｏｃｅｓｓｉｎｇ  ａｎｄ  ＵＮＩＸ  Ｖ」（Ｇｏｓｃｈ）、ＥＬＥＣＴＲＯＮＩＣＳ、６２ページに記載されているように、汎用オペレーティングシステムのモジュールとしてリアルタイムオペレーティングシステムを実行することである。この場合、ハードウェア割り込みは、汎用オペレーティングシステムに関する割り込みはリアルタイムオペレーティングシステムをプリエンプトしないものとする意図で、選択的にマスクされる。
【００１３】
他の手法は、http://opersys.com/ftp/pub/Adeos/adeos.pdfの白書に記載されたＡＤＥＯＳ（Ａｄａｐｔｉｖｅ  Ｄｏｍａｉｎ  Ｅｎｖｉｒｏｎｍｅｎｔ  ｆｏｒ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍｓ）の手法である。
【００１４】
ＡＤＥＯＳは、Ｌｉｎｕｘのみで実施されてきたように思われるが、中でも、複数のオペレーティングシステム実行向けのナノカーネルを提供する。ＡＤＥＯＳの提案される用途の１つは、http://www.aero.polimi.it/~rtai/applications/にあるように、ＡＤＥＯＳがＲＴＡＩ（Ｒｅａｌｔｉｍｅ  Ａｐｐｌｉｃａｔｉｏｎ  Ｉｎｔｅｒｆａｃｅ  ｆｏｒ  Ｌｉｎｕｘ）への割り込みを分配できるようにすることであった。
【００１５】
欧州特許第１０５４３３２号では、「切替え装置」（これについては、完全に理解できるように詳細には説明しない）がリアルタイムおよび汎用のオペレーティングシステムを実行するシステムについて説明している。ハードウェア割り込みは、一般的な割り込みハンドラによって処理され、一部の実施形態では、リアルタイムオペレーティングシステムによって処理され、その後、このシステムは、２次オペレーティングシステムでルーチンによって処理される優先度レベルの低いソフトウェア割り込みを生成する。
【００１６】
本発明の目的は、たとえ複数のオペレーティングシステムが様々な目的用に設計されている場合であっても、それらのシステムを同時に実行するための、改善されたシステム、方法、およびコンピュータプログラムを提供することである。具体的に言えば、本発明は、オペレーティングシステムのうちの１つ（たとえばリアルタイムオペレーティングシステム）が妨害なしに実行可能であり、その他（たとえば汎用オペレーティングシステム）がコンピュータの残りのリソースを使用して実行可能であることを目標としている。より具体的に言えば、本発明は、ＡＲＭプロセッサを使用するなどの、縮小命令セットコンピュータ（ＲＩＳＣ）で使用可能なこうしたシステムを提供することを意図している。
【００１７】
したがって、本発明の諸態様は特許請求の範囲で定義される。本説明は、参照により、本発明者等が以前に出願した、２００３年４月９日出願の欧州特許第０３２９０８９４．９号、２００４年４月７日にＥＰＯで出願のＰＣＴ／ＥＰ０４／００３７３１号、および２００３年１０月１日出願の欧州特許第０３２９２４２８．４号を組み込んでいる。
【００１８】
ＡＲＭプロセッサに基づく多くのアーキテクチャに関する特定の問題の１つが、キャッシュメモリユニットが仮想アドレッシングモードを使用することである。複数のオペレーティングシステムがそれぞれそれ自体のメモリスペース内で実行中の場合、それぞれが、物理メモリアドレスへの仮想メモリの異なるマッピングを使用する。これにより、結果として、他のオペレーティングシステムへの切り替え後、誤ったデータがキャッシュから取り出されることになる。これを解決する方法の１つが、キャッシュメモリのコンテンツを各オペレーティングシステムスイッチ上にフラッシュすることである。しかしながら、リアルタイムアプリケーションの場合、これは、第１に切り替えにおける遅延を増加させるため、および第２にキャッシュをフラッシュした後の最初のメモリアクセスを遅らせるため、望ましくないことがわかっている。したがって、本発明の一態様では、オペレーティングシステムすべてに同じカーネル仮想マッピングを使用させる。
【００１９】
他の問題は、ＡＲＭプロセッサがいくつか（ほとんどのプロセッサに見られる一般的な「ユーザ」および「スーパバイザ」モードとは対照的に５つまたは６つ）の追加の実行モードを有することである。したがって、オペレーティングシステムを変更することには、実行モードを変更することも含まれる可能性がある。これを可能にするためには、オペレーティングシステムの切り替えごとにすべてのレジスタの状態を（たとえばスタックに）保存することが含まれることになる。そのため、こうした切り替えは速度が低下することになる。したがって本発明の一態様では、すべてのオペレーティングシステムが、関連するレジスタ（たとえばレジスタ１３から１５）を「スクラッチ」モードで使用する必要があり、その結果、レジスタがどのように見つけられるかまたは残されるかは問題にならない。本発明者等の観察では、どのような方法にしてもこのように実行されることが多く、他のケースではオペレーティングシステムの一部を書き直さなければならない場合がある。その後、オペレーティングシステムは「スーパバイザ」モードに戻り、結果として、ナノカーネルへの（したがって、他のオペレーティングシステムへの）すべての変換はスーパバイザモードからのみ実行される。したがって、オペレーティングシステムが（たとえば、動作を完了した場合にアイドルタスクを呼び出すことによって）他のオペレーティングシステムに切り替えられる場合、これらのレジスタ状態を保存する必要はない。
【００２０】
本発明の一態様では、通常、オペレーティングシステムはより高位のモードを非常に短いコードセグメントに対してのみ使用することがわかったため、本発明者等は、こうしたモードの場合オペレーティングシステムをプリエンプト不可能としている。
【００２１】
対応する利点を備えた他の態様、実施形態、および好ましい特徴は、以下の説明、特許請求の範囲、および図面から明らかとなろう。
【００２２】
次に、本発明の諸実施形態について、添付の図面を参照しながら単なる例として説明する。
【００２３】
はじめに
システムハードウェア
システムが適用可能なコンピュータシステム１００は、システムバス１０４（制御バス、データバス、およびアドレスバスを含む）を介して読み取り専用メモリ（ＲＯＭ）チップ１０６に結合された、ＡＲＭ  Ｌｔｄ（www.arm.com）から入手可能であり、http://www.arm.com/documentation/ARMProcessor_Cores/index.htmlの技術マニュアルおよびデータシートに記載されたような、ＡＲＭプロセッサなどの中央処理装置（ＣＰＵ）１０２と、１つまたは複数バンクのランダムアクセスメモリ（ＲＡＭ）チップ（１０８）と、ディスクコントローラデバイス１１０（たとえば、フロッピィディスクドライブ、ハードディスクドライブ、およびＤＶＤドライブなどの追加の取り外し可能メディアドライブに接続された、ＩＤＥまたはＳＣＳＩコントローラ）と、１つまたは複数の入力／出力ポート（１１２）（たとえば、プリンタなどへの接続用の、１つまたは複数のＵＳＢポートコントローラおよび／またはパラレルポートコントローラ）と、外部または内部の周辺デバイスへのバス接続用の拡張バス１１４（たとえばＰＣＩバス）と、他のシステムチップ１１６（たとえば、グラフィックスおよびサウンドデバイス）とを備える。この種のコンピュータの例が、パーソナルコンピュータ（ＰＣ）およびワークステーションである。しかしながら、本発明を、メインフレーム、コントロールシステム内の埋め込み型マイクロコンピュータ、およびＰＤＡ（この場合、ディスクドライブコントローラなどの示されたデバイスの一部はなくてもよい）などの、他のコンピューティングデバイスに適用することも、本明細書で開示する。
【００２４】
ソフトウェアの管理
図２ａを参照すると、図１のコンピュータ１００は、使用時に、（図１に示された他のデバイスへのＣＰＵによるアクセスを可能にする出力ルーチンを提供する）オペレーティングシステムカーネル２０２と、オペレーティングシステムユーザインターフェースまたはプレゼンテーション層２０４（Ｘ  Ｗｉｎｄｏｗｓなど）と、ミドルウェア層２０６（ネットワーキングソフトウェアおよびたとえばＴＣＰ／ＩＰスタックなどのプロトコルを提供する）と、オペレーティングシステムカーネル２０２を形成するＡＰＩルーチンを呼び出すことによって実行されるアプリケーション２０８ａ、２０８ｂとを備えた、常駐プログラムを実行する。
【００２５】
オペレーティングシステムカーネルは、具体的には以下のような、いくつかのタスクを有する。
・スケジューリング（すなわち、実行中の異なるアプリケーション間でのＣＰＵおよび関連するリソースの共有）
・メモリ管理（すなわち、各タスクへのメモリの割り振り、および必要な場合は、アドオンメモリからのデータおよびプログラムのディスクドライブへのスワッピング）
・ファイルシステムの提供
・デバイスへのアクセスの提供（通常は、ドライバを介する）
・割り込み処理
・アプリケーションがシステムリソースおよびユーザと対話できるようにする、アプリケーションプログラミングインターフェースの提供
【００２６】
カーネルは、Ｕｎｉｘに関しては、いわゆる「モノリシックカーネル」とすることが可能であり、この場合、デバイスドライバはカーネルそれ自体の一部を形成する。別の方法では、Ｃｈｏｒｕｓに関しては「マイクロカーネル」とすることが可能であり、この場合、デバイスドライバはカーネルとは別である。
【００２７】
使用時には、コンピュータ１００が開始されると、ＲＯＭ  １０６に格納されたブートストラッププログラムがディスクコントローラ１１０にアクセスして、ディスク上の永続ストレージからオペレーティングシステムのファイル処理部分をＲＡＭ  １０８へと読み取り、その後、オペレーティングシステムの残りの部分をＲＡＭ  １０８のある領域にロードする。その後、オペレーティングシステムは、ディスクコントローラ１１０を介してディスクドライブから任意のアプリケーションを読み取り、それぞれについてＲＡＭ  １０８内のスペースを割り振り、その割り振られたメモリスペースに各アプリケーションを格納する。
【００２８】
アプリケーションの動作時に、オペレーティングシステムのスケジューラ部分が異なるアプリケーション間でＣＰＵの使用量を分割し、それによってスケジューリングポリシーに従ったプロセッサ上でのそれぞれの時間の共有を可能にする。また、アプリケーションまたはデータによって稀に使用される「スワップアウト」（すなわち、スペースを解放するためにそれらをＲＡＭ  １０８から除去して、それらをディスクに格納すること）により、メモリリソースの使用量も管理する。
【００２９】
最終的に、入力および出力などの機能を実行するために、アプリケーションプログラミングインターフェース（ＡＰＩ）を構成するルーチンがアプリケーションから呼び出され、オペレーティングシステムの割り込み処理ルーチンが割り込みおよびイベントに応答する。
【００３０】
好ましい実施形態の原理の概要
好ましい実施形態では、コンピュータ１００で使用されることになる各オペレーティングシステム２０１、２０２がわずかに書き直され、新しい低水準プログラム４００（本明細書では「ハードウェアリソースディスパッチャ」と呼び、オペレーティングシステムのカーネルではないが、時には「ナノカーネル」と呼ばれる）が作成される。ハードウェアリソースディスパッチャ４００はプロセッサと対話するため、特定タイプのＣＰＵ  １０２に特有のものである。修正されたオペレーティングシステム２０１、２０２のバージョンは、以下で明らかとなる理由から、ハードウェアに特有のものでもある。
【００３１】
ハードウェアリソースディスパッチャ４００それ自体はオペレーティングシステムではない。アプリケーションプログラムとはまったく対話せず、非常に限られた機能を有する。また、仮想マシンまたはエミュレータでもなく、たとえプロセッサ上でネイティブコードを実行しているオペレーティングシステム自体にほとんどの処理をまかせたままであっても、協働するようにオペレーティングシステムを修正する必要がある。
【００３２】
以下の基本機能を実行する。
・複数のオペレーティングシステムそれぞれをロードおよび開始すること
・メモリおよび他のシステムリソースをそれぞれのオペレーティングシステムに割り振ること
・異なるオペレーティングシステムの動作をスケジューリングする（すなわち、それらの間でＣＰＵ時間を分割し、それらの間での変更を管理する）こと
・オペレーティングシステムによる共有が必要なそれらのシステムデバイスへの間接アクセスの「仮想化デバイス」方法を提供すること（デバイスの「仮想化」）
・異なるオペレーティングシステム上で実行中のアプリケーションが互いに通信できるようにするために、オペレーティングシステム間に通信リンクを提供すること
【００３３】
オペレーティングシステムは、実施形態によって等しく扱われない。その代わりに、オペレーティングシステムのうちの１つが「クリティカル（ｃｒｉｔｉｃａｌ）」オペレーティングシステム（これがリアルタイムオペレーティングシステムとなる）として選択され、他のオペレーティングシステムまたはそのそれぞれが、「非クリティカル」または「２次」オペレーティングシステム（これは、Ｌｉｎｕｘなどの汎用オペレーティングシステムまたはそのそれぞれとなる）として扱われる。
【００３４】
ハードウェアリソースディスパッチャが設計される場合、できる限り多くのシステムデバイスを１つまたは他のオペレーティングシステム専用に静的に割り振ることができるように、使用可能なシステムリソース（すなわちデバイスおよびメモリ）をリストするデータ構造（たとえばテーブル）が提供される。
【００３５】
たとえば、プリンタ出力の生成が必要となるアプリケーションをしばしば実行することになる汎用オペレーティングシステム２０２に、パラレルプリンタポートを静的に割り振ることができる。他方で、通信用のリアルタイムオペレーティングシステム２０１に、ＩＳＤＮデジタル回線アダプタポートを永続的に割り振ることができる。このデバイスの静的割り振りが可能な場合はどこでも、各オペレーティングシステムがその既存のドライバを使用して、ハードウェアリソースディスパッチャを呼び出す必要なしに、静的に割り振られたデバイスにアクセスできることを意味する。したがって、こうしたデバイスにアクセスする際に（仮想マシンまたはエミュレータとして動作した場合には存在するような）実行速度の損失がない。
【００３６】
共有しなければならないシステムデバイスの場合、ハードウェアリソースディスパッチャは、非クリティカルオペレーティングシステムによるデバイスの使用を仮想化し、クリティカルオペレーティングシステムに供給されたドライバを使用してアクセスを実行する。同様に、割り込み処理の場合、割り込みはクリティカルオペレーティングシステムの割り込み処理ルーチンに渡され、これが割り込みを処理する（クリティカルオペレーティングシステム向けであった場合）か、または、非クリティカルオペレーティングシステムに転送するためにハードウェアリソースディスパッチャを介して割り込みを戻す（宛先に決められていた場合）。
【００３７】
ブート時には、ハードウェアリソースディスパッチャが第１にロードされ、その後、それぞれのオペレーティングシステムを所定の順序で、すなわちクリティカルオペレーティングシステムから始まり、続いて２次オペレーティングシステムまたはそのそれぞれを順番にロードする。クリティカルオペレーティングシステムには、テーブルから必要なリソースが割り振られ、その中で動作する固定メモリスペースが与えられる。その後、それぞれの２次オペレーティングシステムに、使用可能な残りのリソースから、必要なリソースおよびメモリスペースが順番に割り振られる。
【００３８】
このようにして、実施形態に従い、それぞれにそれ自体のメモリスペースを割り振ることによって、およびオペレーティングシステム専用のデバイスの静的割り振りを提供することによって、オペレーティングシステムによって使用される物理的にできる限り多くのリソースが分離され、共有が不可欠なデバイスのみが共有される。
【００３９】
動作時には、ハードウェアリソースディスパッチャのスケジューラはクリティカルオペレーティングシステムがそのタスクを完了するまで動作できるようにし、その後、次の割り込みまたはイベントが発生するまで、コントロールをそれぞれの非クリティカルオペレーティングシステムに順番に渡す。
【００４０】
したがって、この実施形態は、クリティカルオペレーティングシステムの動作が（そのオリジナルドライバを使用し、任意の割り込みおよびイベント処理への第１のアクセスを有するため）ほとんど変化しない、複数のオペレーティングシステム環境を可能にする。２次オペレーティングシステムは、ほとんどの場合、それら自体のネイティブドライバを使用することになり、多くのシステムデバイスへの排他的アクセスを有することになるため、残りのプロセッサ時間内で効率良く動作することが可能である。最終的に、ハードウェアリソースディスパッチャそれ自体は制限された機能のみを処理するため、小規模プログラムとすることが可能であり、その結果、システムリソースが節約される。
【００４１】
好ましい実施形態は、すでに特定のコンピュータ１００に適合された標準の市販のオペレーティングシステムを限定的に変更するだけでよいため、作成および維持するのにも経済的である。さらに、オペレーティングシステムへの変更は、割り込み処理などのアーキテクチャ特有のファイル処理、および、特定タイプのコンピュータ１００とインターフェースし、残りのオペレーティングシステムほど頻繁に変更される可能性のない、初期設定時の構成に限定されるため、同じオペレーティングシステムの新しいバージョンを複数のオペレーティングシステム様式で動作するように適合させる際に、ほとんど、あるいはまったく作業の必要がない可能性がある。
【００４２】
好ましい実施形態の詳細な説明
この実施形態では、コンピュータ１００はＩｎｔｅｌ  ３８６ファミリプロセッサ（たとえば、Ｐｅｎｔｉｕｍプロセッサ）およびＭｏｔｏｒｏｌａ  ＰｏｗｅｒＰＣ  ７５０（縮小命令セットコンピュータまたは「ＲＩＳＣ」）コンピュータであった（ステップ３０２）。クリティカルオペレーティングシステム２０１はＣ５オペレーティングシステム（http://www.jaluna.comからオープンソースで無料ダウンロードできる、第５世代ＣｈｏｒｕｓＯＳシステムのオープンソースバージョン、Ｊａｌｕｎａ−１のリアルタイムマイクロカーネル）であった。
【００４３】
ステップ３０６では、ＣｈｏｒｕｓＯＳオペレーティングシステムカーネル２０１は、新しいプラットフォームへの移植（すなわち、同じＣＰＵであるが異なるシステムデバイスを備えた新しいコンピュータ上で実行できるように、新しいＢｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅを書き込むこと）と同じ方法で扱われる、複数のオペレーティングシステムモードで動作するように修正される。ブートおよび初期設定シーケンスは、リアルタイムオペレーティングシステムが、それ自体を開始するのではなく、その割り振られたメモリスペース内でハードウェアリソースディスパッチャによって開始されるように修正される。初期設定シーケンスのハードウェアプローブ段階は、クリティカルオペレーティングシステムが、他の２次システムに割り当てられたハードウェアリソースにアクセスしないように修正される。この段階では、使用可能なデバイスを検出するために、ハードウェアリソースディスパッチャから静的ハードウェア割り振りテーブルを読み取る。
【００４４】
状態を検出し、これに応答して何らかのアクションを要求するために、トラップ呼び出し２０１２がクリティカルオペレーティングシステムに追加される。ここでトラップ呼び出しとは、プロセッサに現在のコンテキスト（たとえばレジスタの状態）を保存させ、新しいコンテキストをロードさせる、呼び出しを意味する。したがって、仮想メモリアドレッシングが使用されている場合、アドレスポインタが変更される。
【００４５】
たとえば、リアルタイムオペレーティングシステム２０１がエンドポイントに達する（および、プロセッサリソースを必要としなくなる）と、コントロールをハードウェアリソースディスパッチャに戻して、「アイドル」トラップ呼び出しを発行し、２次オペレーティングシステムを開始することができる。多くのプロセッサは「停止」命令を有する。場合によっては、スーパバイザレベルのコード（たとえばアプリケーションではなくオペレーティングシステム）のみが、こうした「停止」命令を含むことができる。この実施形態では、すべてのオペレーティングシステムが、「停止」命令を除去し、呼び出されると「アイドル」トラップ呼び出しを発行する「アイドル」ルーチン（たとえば実行スレッド）にそれらを置き換えるように、書き直される。
【００４６】
Ｂｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅの一部のドライバは、共有デバイスを２次オペレーティングシステム用に仮想化する際にハードウェアリソースディスパッチャを支援するように、特別に適合される。
【００４７】
入力／出力（Ｉ／Ｏ）バスへのアクセスを提供し、バスにデータを書き込めるようにするものと思われる、追加の「仮想」ドライバ２０１４が、オペレーティングシステムに加えられる。実際には、仮想バスドライバ２０１４はメモリを通信媒体として使用し、何らかの専用メモリをエクスポートして（入力データ用）、他のシステムによってエクスポートされたメモリをインポートする（出力データ用）。この方法では、オペレーティングシステム２０１（またはオペレーティングシステム上で実行中のアプリケーション）は、実際のＩ／Ｏバスによって接続された別々のマシン上で実行中の２つのオペレーティングシステムであるかのように、他のオペレーティングシステム（またはその上で実行中のアプリケーション）にデータを渡すことができる。
【００４８】
２次オペレーティングシステム２０２は、カーネルバージョン２．４．１８を有するＬｉｎｕｘとして選択された（ステップ３０８）。
【００４９】
ステップ３１０では、２次オペレーティングシステムカーネル２０２が、新しいハードウェアアーキテクチャとして扱われる複数のオペレーティングシステム環境で機能できるように修正される。ステップ３０６と同様に、ブートおよび初期設定シーケンスは、２次オペレーティングシステムがハードウェアリソースディスパッチャによって開始できるように、および、ハードウェアリソースディスパッチャテーブルに指定されたような他のシステムに割り当てられたハードウェアリソースにアクセスしないように、修正される。ステップ３０６と同様に、ハードウェアリソースディスパッチャに制御を渡すために、トラップ呼び出し２０２２が追加される。
【００５０】
共有システムデバイス用のネイティブドライバは、ハードウェアリソースディスパッチャによって仮想化されてきたデバイス（割り込みコントローラ、Ｉ／Ｏバスブリッジ、システムタイマ、およびリアルタイムクロック）に対応する新しいドライバ２０２８に置き換えられる。これらのドライバは、コンピュータ１００のそれぞれのデバイス上で何らかの動作を実行するために、ハードウェアリソースディスパッチャの仮想デバイスハンドラ４１６への呼び出しを実行する。ハードウェアリソースディスパッチャのこうした仮想デバイスハンドラ４１６はそれぞれ、システムデバイスと直接対話するように構成された、クリティカルオペレーティングシステム内の「ピア」ドライバルーチンとペアにされる。したがって、仮想デバイスハンドラへの呼び出しは、実際のデバイスにアクセスするために、その仮想デバイス用のクリティカルシステム内のピアドライバまでリレーされる。ステップ３０６と同様に、オペレーティングシステム間通信を可能にするために、仮想Ｉ／Ｏバス用の読み取り／書き込みドライバ２０２４が提供される。
【００５１】
２次オペレーティングシステムの割り込みサービスルーチンは、それぞれがそれぞれの仮想割り込みに（ハードウェアリソースディスパッチャの割り込みハンドラルーチン４１２によって発行される呼び出しの形で）応答し、実際の割り込みまたはイベントには応答しない、仮想割り込みサービスルーチン２０２６を提供するように修正される。２次オペレーティングシステムのルーチン（割り込みサービスルーチンを含む）も、（少なくともすべての例外クリティカル動作において）ハードウェア割り込みのマスキングを除去するように修正される。したがってこの方法では、２次オペレーティングシステム２０２、．．．は、クリティカルオペレーティングシステム２０１によってプリエンプト可能であり、言い換えれば、仮想割り込みへの２次オペレーティングシステム応答自体が、クリティカルオペレーティングシステム２０１に対する実際の割り込みによって、割り込まれることが可能である。これには通常、以下の動作が含まれる。
・イベントのマスキング／マスキング解除（プロセッサレベルでの割り込み）
・イベントのマスク状況の保存／復元
・割り込みソース（割り込みコントローラデバイス）の識別
・ソースレベル（割り込みコントローラデバイス）での割り込みのマスキング／マスキング解除
【００５２】
共有ハードウェアデバイス（Ｉ／Ｏバスブリッジ、システムコンソール、システムタイマ、およびリアルタイムクロック）にアクセスするために、新しい仮想デバイスドライバ２０２８が追加される。これらのドライバは、コンピュータ１００のそれぞれのデバイスにデータを書き込むため、またはこれらからデータを読み取るために、ハードウェアリソースディスパッチャの仮想デバイスハンドラ４１６への呼び出しを実行する。
【００５３】
この実施形態では、これを実行するために、少数の修正済みファイルを備えた新しい仮想ハードウェアリソースディスパッチャのアーキテクチャサブツリー（Ｉ−３８６およびＰｏｗｅｒＰＣの変形ではｎｋ−ｉ３８６およびｎｋ−ｐｐｃ）を追加することによって、Ｌｉｎｕｘカーネル２０７が修正される。未変更ファイルは、それらの既存の形で再使用される。オリジナルのサブツリーは維持されるが使用されない。
【００５４】
ステップ３１２では、ハードウェアリソースディスパッチャ４００が書き込まれる。ハードウェアリソースディスパッチャは、（図４に示されるように）以下の機能に関するルーチンを提供するコードを備える。
・それ自体をブートおよび初期設定すること（４０２）
・ハードウェアリソース（ポートなどのデバイス）のリストおよび各リソースがどのオペレーティングシステムに独自に割り当てられるかを示す割り振りエントリを格納するテーブル（４０３）を格納すること
・ハードウェアリソースディスパッチャ割り振りテーブルを完了する、クリティカルオペレーティングシステムをブートおよび初期設定すること（４０４）
・２次オペレーティングシステムをブートおよび初期設定すること（４０６）
・オペレーティングシステム間で切り替えること（４０８）
・オペレーティングシステム間でスケジューリングすること（４１０）
・割り込みを処理すること（リアルタイムオペレーティングシステムの割り込みサービスルーチンを使用し、必要であれば、２次オペレーティングシステムの仮想割り込みサービスルーチンにデータを供給する）（４１２）
・それぞれのオペレーティングシステムからのトラップ呼び出しを処理すること（４１４）
・２次オペレーティングシステムから共有デバイスへのアクセスを処理すること（４１６）
・仮想Ｉ／Ｏバス上でのオペレーティングシステム間通信を処理すること（４１８）
【００５５】
他の諸実施形態（以下で説明）では、システムデバッグフレームワークも提供することができる。
【００５６】
オペレーティングシステムスイッチャ４０８
あるオペレーティングシステムから他のオペレーティングシステムに切り替えるために、オペレーティングシステムスイッチャ４０８は、現在実行中のオペレーティングシステムの「コンテキスト」、すなわちレジスタ値などの状態変数のセットの現在の値を保存するように、他のオペレーティングシステムの格納済みコンテキストを復元するように、および、他のオペレーティングシステムを呼び出して中止した実行を再始動するように、構成される。プロセッサがメモリのセグメントおよび仮想または間接的なアドレッシング技法を使用する場合、現在のメモリスペースを指すポインタを格納するレジスタまたはデータ構造がこのようにスワップされる。たとえば、オペレーティングシステムはそれぞれ、こうしたメモリスペースを指すポインタ値を含むコンテキストによって定義された、異なるこうしたメモリスペース内で動作する。
【００５７】
詳細には、スイッチャは以下の機能を提供する。
・現在のオペレーティングシステムがアイドル状態になった場合、現在実行中のオペレーティングシステムから、次にスケジューリングされたオペレーティングシステムへと、明示的に切り替える（たとえばトラップ呼び出し）
・ハードウェア割り込みが発生した場合、２次オペレーティングシステムからクリティカルオペレーティングシステムへと暗黙的に切り替える
【００５８】
切り替えは、以下で説明するように、トラップ呼び出し、あるいは実際または仮想の割り込み時に発生する可能性がある。
【００５９】
スケジューラ４１０
スケジューラ４１０は、既存の他のオペレーティングシステムの次に、どの２次オペレーティングシステムが切り替えられることになるか（複数存在する場合）を選択することによって、使用可能な処理時間の一部をそれぞれのオペレーティングシステムに割り振る。この実施形態では、固定の優先順位スケジューリングに基づいてそれぞれ選択される。本明細書では、タイムシェアリング、またはプロセッサ時間の最低保証比率に基づく指定が可能な、他の実施形態も企図される。しかしながらそれぞれのケースで、クリティカルオペレーティングシステムは、アイドル状態の場合にのみプリエンプトされる。
【００６０】
他の実施形態では、すべての２次オペレーティングシステムがＣＰＵにアクセスして優先順位の高いタスクを実行することが可能であり、その後そのタスクがクリティカルシステム内で依然として実行中であるように、クリティカルオペレーティングシステムは、いつプリエンプト可能であるかを明示的にスケジューラ４１０に通知する。したがって、一例では、クリティカルオペレーティングシステムの割り込みサービスルーチンがプリエンプトできないため、クリティカルオペレーティングシステムは、常に外部イベントまたはリアルタイムクロックからのタイミング信号に応答して、リアルタイム動作を維持することができる。
【００６１】
仮想化されたプロセッサ例外の処理
ハードウェアリソースディスパッチャは、以下のように、プロセッサ例外（たとえば、ＣＰＵ割り込みまたはコプロセッサ割り込み）を処理するためのメカニズムを提供するように構成される。
・第１に、クリティカルオペレーティングシステムを介してプロセッサ例外を遮断する
・第２に、対応する仮想例外を１つまたは複数の２次オペレーティングシステムに通知し、そのデータを格納し、次にスケジューラがその２次オペレーティングシステムを呼び出した場合は、２次オペレーティングシステム内の対応する仮想割り込みサービスルーチン２０２６を呼び出す
・第３に、２次オペレーティングシステム内から任意の保留中の仮想例外をマスキングまたはマスキング解除する
【００６２】
仮想化された例外は、通常、以下の２つの異なる目的に使用される
・第１に、ハードウェアデバイス割り込み（非同期プロセッサ例外として送達される）を２次オペレーティングシステムに転送するため
・第２に、オペレーティングシステム間で相互割り込み、すなわち１つのシステムによって他の割り込み用に生成された割り込み（同期例外として送達される）を実施するため
【００６３】
トラップ呼び出しハンドラ４１４
トラップ呼び出しハンドラの動作は、以下の説明から明らかとなろう。その主な目的は、第１のオペレーティングシステムが停止した（したがって、ＣＰＵリソースを必要としない）場合に、スケジューラおよびスイッチャが他のオペレーティングシステムに変更できるようにすることである。追加の役割は、以下の諸実施形態に関して論じられるようなデバッグで使用するために、システムコンソールなどのハードウェアリソースディスパッチャサービスを起動することである。
【００６４】
仮想化デバイス４１６
前述のように、各共有デバイス（たとえば割り込みコントローラ、バスブリッジ、システムタイマ、リアルタイムクロック）について、各オペレーティングシステムは、そのデバイス用にピアレベルドライバのセットを形成するデバイスドライバを提供する。リアルタイムオペレーティングシステムは、実際にデバイスにアクセスするために使用されるドライバを提供し、その他は仮想デバイスドライバを提供する。
【００６５】
ハードウェアリソースディスパッチャの共有デバイスハンドラ４１６は、各デバイスに対して、そのデバイスのすべてのピアデバイスドライバによるアクセスのために、ストアドデータ構造を提供する。デバイスにアクセスしようとするか、またはアクセスした場合、デバイスドライバは、対応するデータ構造に格納されたデータをアクセスの詳細によって更新する。ピアドライバは、（前述のような）相互割り込みを使用してイベントを知らせる信号を発信し、データ構造が更新されたばかりであることを他のピアドライバに通知する。
【００６６】
割り込みコントローラデバイスにアクセスするためのドライバは、前述の仮想化例外メカニズムを使用して、以下のようにハードウェア割り込みを処理する。
・クリティカルオペレーティングシステムのデバイスドライバは、ハードウェア割り込みを処理し、それらを仮想化例外として２次ピアドライバに転送する
・２次オペレーティングシステムは、前述の仮想化例外マスキングおよびマスキング解除ルーチンを使用することによって、割り込みを使用可能および使用不可にする
【００６７】
Ｉ／Ｏバスおよびそれらのブリッジは、それらに接続されたデバイスがすべて同じオペレーティングシステムに割り振られていない場合にのみ、共有されなければならない。したがってデバイスを割り振る場合、可能な範囲内で、同じＩ／Ｏバスに接続されたデバイスは同じオペレーティングシステムに割り振られる。共有が必要な場合、リソース割り振りテーブル４０４は、どのオペレーティングシステムがどのリソースを有するかを示すために、（スペース、割り込みラインおよびＩ／Ｏポートをアドレスする）バス上のリソースの割り振りを示す記述子データを格納する。
【００６８】
実施形態の実施
最終的に、ステップ３１４で、ハードウェアリソースディスパッチャおよびオペレーティングシステム用のコードが、コンピュータ１００で供給するための配布可能２進コンピュータプログラム製品としてコンパイルされる。
【００６９】
本発明の態様に従って供給可能な製品は、ユーザが、使用されることになる異なるオペレーティングシステムを選択し、各オペレーティングシステムについて異なるアプリケーションを構築および選択し、アプリケーションおよびオペレーティングシステムを配布可能製品に埋め込み、オペレーティングシステムのブートおよびアプリケーションの実行可能バイナリの起動に備えることができるようにする、コンピュータプログラムを備えた開発環境製品である。これは、www.jaluna.comから入手可能なＣ５開発環境に基づき、これに類似している。
【００７０】
ブートおよび初期設定中の実施形態の動作
図５を参照すると、この実施形態に従ったブートおよび初期設定プロセスは以下のように実行される。
【００７１】
ＲＯＭ  １０６に格納されたブートストラッププログラム（「トランポリン」）４０２２は、最初に電源が投入された時点で実行され、これによって、残りのハードウェアリソースディスパッチャプログラム４００をメモリにインストールし、これを開始し、システムイメージ構成を記述して（以下で説明するように）引数としてデータ構造を渡す、プログラム４０２４が開始される。
【００７２】
ハードウェアリソースディスパッチャは、システムコンソール用に使用可能なシリアルラインを初期設定する。その後、各オペレーティングシステムに対して、クリティカルオペレーティングシステムから順番にメモリスペース（オペレーティングシステム環境）を割り振る。したがって、ハードウェアリソースディスパッチャは第２レベルシステムのカーネルブートローダとして働く。
【００７３】
その後、各オペレーティングシステムカーネルは、その独自の初期設定段階を実行し、リソース割り振りテーブル４０４内に残るリソース内でそのオペレーティングシステム専用となるリソースを選択し、その初期のサービスおよびアプリケーションを開始する。
【００７４】
図６は、システムイメージを形成するメモリアドレス割り振りの一例を示す。ハードウェアリソースディスパッチャおよびオペレーティングシステムがコンパイルされる場合、メモリ内のあるポジションが割り振られる。図６に示されるように、メモリ内のこれらポジションのセットがシステムイメージを定義する。システムイメージは、ハードウェアリソースディスパッチャが配置されたメモリの第１のバンク６０２と、リアルタイムオペレーティングシステムが配置されたメモリの第２のバンク６０４と、２次オペレーティングシステムが配置されたメモリの第３のバンク６０６と、この実施形態では、２次オペレーティングシステム（Ｌｉｎｕｘ）のルートファイルシステムを含むＲＡＭディスクが配置されたメモリの第４のバンク６０８を備える。
【００７５】
このシステムイメージは、永続ストレージ（たとえば、携帯電話またはＰＢＸなどの典型的なリアルタイムデバイス用の読み取り専用メモリ）に格納される。メモリの残りのバンクは、ロードおよびアプリケーションの実行が可能なその環境として各オペレーティングシステムに割り振りするために使用可能である。
【００７６】
オペレーティングシステムコンテキストに関するメモリの割り振り
ブートされる間に、各オペレーティングシステムは、それ自体の構成に必要な合計サイズを満たすためにメモリの補助部片を割り振る。オペレーティングシステムに割り振られると、メモリのバンクは、オペレーティングシステム自体の物理メモリ管理方式を使用して管理される。オペレーティングシステムは他のすべてのメモリを無視する。
【００７７】
仮想メモリの割り振り
オペレーティングシステムが相互に、またはハードウェアリソースディスパッチャを妨害できないことを保証するために、各オペレーティングシステムには別々の仮想メモリスペースが割り振られる。それぞれのオペレーティングシステムのユーザアドレススペース（すなわち範囲）およびスーパバイザアドレススペース（すなわち範囲）には、重複するアドレスを有する異なる仮想メモリスペースの分化を可能にする、異なるメモリ管理ユニット（ＭＭＵ）コンテキスト識別子（ＩＤ）がそれぞれ割り振られる。ＭＭＵコンテキストＩＤは、コンパイル時（図３のステップ３１４）に各オペレーティングシステムに割り当てられる。
【００７８】
このソリューションにより、異なるオペレーティングシステム間でハードウェアリソースディスパッチャが切り替えられる場合、追加の時間を要する変換キャッシュ（ＴＬＢ）のフラッシュを実行する必要がない。その代わりに、異なるオペレーティングシステム間での切り替えは、現在機能しているオペレーティングシステムのＭＭＵコンテキストＩＤを格納すること、および、切り替えられる２つのオペレーティングシステムの以前に格納されたＭＭＵコンテキストＩＤを再呼び出しすることによって、実施される。
【００７９】
入力／出力デバイスの割り振り
前述のように、割り振りテーブル４０４は、どのデバイスが各オペレーティングシステムに独自に割り振られるかを示す。加えてテーブル４０４は、どの入力／出力リソース（直接メモリアクセス（ＤＭＡ）デバイス、入力／出力ポート、割り込み、など）がこうしたデバイスに排他的に割り振られるかを示すため、いかなる競合もなしにこれらのリソースを直接使用することができる。通常、多くのデバイスは重複しているため、この方法で潜在的な競合を大幅に削減することが可能である。
【００８０】
配布は、オペレーティングシステムの構成方式（たとえば、Ｃ５の場合、デバイスツリーで指定されたデバイス）に基づいている。それらはブート時に、ブート順に、オペレーティングシステムに割り振られるため、クリティカルオペレーティングシステムはテーブル４０４内にある使用可能デバイスの第１の選択権を有し、２次オペレーティングシステムは残りの中から順番に割り振りを受け取る。各オペレーティングシステムは、初期設定されるとこれらのデバイスの存在を検出し、ハードウェアリソースディスパッチャからの対話なしにそれらに関するネイティブドライバを使用する。
【００８１】
２次オペレーティングシステムの「ホット」リブート
本実施形態によれば、他のオペレーティングシステムが実行を継続している間に、（たとえばクラッシュが原因で）２次オペレーティングシステムをリブートすることができる。システムリソースの分離により、２次オペレーティングシステムにおけるクラッシュがクリティカルオペレーティングシステム（または他の２次オペレーティングシステム）の動作の進行を妨害することはなく、その２次オペレーティングシステムのリブートが妨害することもない。
【００８２】
実施形態では、ハードウェアリソースディスパッチャへのシステムの「停止」および「開始」トラップ呼び出しが、クリティカルオペレーティングシステム内からの２次オペレーティングシステムのシャットダウンおよび再始動を支援する。加えて、ハードウェアリソースディスパッチャはブート時に、オリジナルシステムイメージのコピーをハードウェアリソースディスパッチャ割り振りメモリ内の永続メモリに保存する。一例として、この実施形態におけるホット再始動は以下のように管理される。
【００８３】
初期のブートアップ時に、ハードウェアリソースディスパッチャは２次オペレーティングシステムのメモリイメージのコピーを保存する。
【００８４】
クリティカルオペレーティングシステムは、２次オペレーティングシステムの機能を定期的に監視する（たとえば、タイムアウトを設定し、継続動作をチェックするために２次オペレーティングシステム内で実行するピアドライバによってイベントがトリガされるのを待機することによって）ためのソフトウェアウォッチドッグ（ｗａｔｃｈｄｏｇ）ドライバルーチンを含む。
【００８５】
クリティカルオペレーティングシステムは、２次オペレーティングシステムに障害が発生するかまたは停止したことを検出した場合、ハードウェアリソースディスパッチャへの（２次オペレーティングシステムの）「停止」およびその後の「開始」トラップ呼び出しをトリガする。
【００８６】
その後ハードウェアリソースディスパッチャは、２次オペレーティングシステムイメージの保存されたコピーを復元し、再始動するためにこれをメモリからリブートする。実施形態のテストで、Ｌｉｎｕｘ２次オペレーティングシステムはロックアップから数秒でリブート可能であることがわかった。
【００８７】
他の点では、ホット再始動は、たとえば、http://www.jaluna.com/developer/papers/CSI-TR-96-34.pdfから入手可能な、１９９６年８月、Ａｂｒｏｓｓｉｍｏｖ、Ｆ．Ｈｅｒｍａｎｎ、Ｊ．Ｃ．Ｈｕｇｌｙ等による「Ｆａｓｔ  Ｅｒｒｏｒ  Ｒｅｃｏｖｅｒｙ  ｉｎ  ＣＨＯＲＵＳ／ＯＳ．Ｔｈｅ  Ｈｏｔ−Ｒｅｓｔａｒｔ  Ｔｅｃｈｎｏｌｏｇｙ」と題するＣｈｏｒｕｓ  Ｓｙｓｔｅｍｓ  Ｉｎｃ．Ｔｅｃｈｎｉｃａｌ  Ｒｅｐｏｒｔ、１４ページに記載されるような、Ｃｈｏｒｕｓオペレーティングシステムで使用可能な内容に基づく。
【００８８】
ランタイム動作
次に、実施形態のインストールおよびブート後の動作について、詳細に説明する。
【００８９】
ブートおよび初期設定されると、リアルタイムオペレーティングシステムは１つまたは複数のアプリケーション２０７（たとえばＵＤＰ／ＩＰスタック−−ＵＤＰ／ＩＰはＵｎｉｖｅｒｓａｌ  Ｄａｔａｇｒａｍ  Ｐｒｏｔｏｃｏｌ／Ｉｎｔｅｒｎｅｔ  Ｐｒｏｔｏｃｏｌを表す）を実行中であり、２次オペレーティングシステムはいくつかのアプリケーション２０８ａ、２０８ｂ（たとえばワードプロセッサおよびスプレッドシート）を実行中である。リアルタイムオペレーティングシステムのマイクロカーネル２０１および２次オペレーティングシステムのカーネル２０２は、以下を備えるハードウェアリソースディスパッチャインターフェースを介して、ハードウェアリソースディスパッチャと通信する。
・オペレーティングシステムコンテキスト（すなわち、オペレーティングシステムに切り替えるために保存および復元する必要のある状態変数のセット）およびハードウェアリポジトリを表す、データ構造
・オペレーティングシステム環境で実行する機能セット
・ハードウェアリソースディスパッチャ環境で実行するトラップ呼び出しルーチンのセット
【００９０】
どちらのオペレーティングシステムもプロセッサ時間を必要としない（たとえば、どちらも「待機」状態に達している）場合、ハードウェアリソースディスパッチャ４００はクリティカルオペレーティングシステムのアイドルスレッドに切り替え、割り込みまたはイベントに備えて待機する。したがって割り込みは、最初にクリティカルオペレーティングシステムに切り替える必要なしに、クリティカルオペレーティングシステムのサービスルーチンによって即時に処理することができる。
【００９１】
ある地点で、割り込みまたはイベントが発生する。たとえば、データポートでパケットが受け取られ、ＵＤＰ／ＩＰスタックを実行するリアルタイムオペレーティングシステムによってこれを処理できるようにするための割り込みを発生させることができる。別の方法として、ユーザがキーボードまたはマウスを操作して、ワードプロセッシングアプリケーション２０８との対話のために２次オペレーティングシステム２０２のＧＵＩを動作するための割り込みを発生させることができる。別の方法として、システムクロックは、所定の時間が経過したこと、およびアプリケーションが再実行を開始すべきであるか、またはオペレーティングシステム機能を実行すべきであることを、示すことができる。
【００９２】
クリティカルオペレーティングシステムのサービスルーチンは、以下に示すように割り込みを処理する。
【００９３】
割り込みおよびイベントの処理
まだクリティカルオペレーティングシステムでない場合、ハードウェアリソースディスパッチャ割り込みハンドラ４１２は、オペレーティングシステムスイッチャ４０８を呼び出してクリティカルオペレーティングシステムに切り替え、その後、割り込みハンドラルーチン４１２はクリティカルオペレーティングシステム２０１内の割り込みサービスルーチン（ＩＳＲ）を呼び出す。割り込みが、クリティカルオペレーティングシステムに独自に割り当てられたデバイスからであるため、または共有デバイスからであり、ある所定の値を有するために、クリティカルオペレーティングシステム向けである場合、クリティカルオペレーティングシステムＩＳＲは、割り込みを処理するために必要なアクションを実行する。そうでない場合、制御はハードウェアリソースディスパッチャに戻される。
【００９４】
クリティカルから２次へのオペレーティングシステムの切り替え
図７を参照すると、この例の場合、システムはクリティカルオペレーティングシステム２０１上で実行中のアプリケーション２０７ａのスレッド７０２を実行している。
【００９５】
割り込みが発生した場合、クリティカルオペレーティングシステムの割り込みサービスルーチン７０４は割り込みサービスを実行する。終了すると、制御は、スレッド７０２およびクリティカルオペレーティングシステム２０１のスケジューラによって実行された任意のその他のスレッドに戻される。すべてのスレッドの処理が完了すると、クリティカルオペレーティングシステムは実行を終了し、その「アイドル」スレッドをスケジューリングする。これに応じて、クリティカルオペレーティングシステム内の「アイドル」トラップルーチンは、ハードウェアリソースディスパッチャ４００に「アイドル」トラップ呼び出しを発行する。その後、ハードウェアリソースディスパッチャは、以下の動作を行うルーチンを実行する。
・割り込みハンドラ４１２が現時点でいくつかの格納済み仮想割り込みを有する場合、これらは割り込みハンドラ４１２によって２次オペレーティングシステムに転送される。
・ハードウェアリソースディスパッチャのオペレーティングシステムスケジューラ４１０は、実行する２次オペレーティングシステム２０２を選択する。次に、ＯＳスイッチャ４０８は、現在のコンテキスト（通常は、プロセッサＭＭＵおよび状況レジスタ、命令、およびスタックポインタ）をクリティカルＯＳコンテキストストレージ領域７０６に保存する。次に、２次オペレーティングシステム２０２に関する格納済みの実行コンテキスト７０８を取り出し、それらを関係するレジスタに書き込む。
・関係する２次ＯＳに関する仮想割り込みが存在する場合、割り込みハンドラ４１２は、２次オペレーティングシステム内の関連割り込みサービスルーチン７１０を呼び出し、これが割り込みを処理した後、完了すると、中止した２次オペレーティングシステムのスレッド７１２の実行に戻る。
【００９６】
割り込みハンドラ４１２が現時点で保留中の割り込みを有していない場合、ハードウェアリソースディスパッチャのオペレーティングスイッチャ４０８は、復元されたオペレーティングシステムコンテキスト内のストアドプログラムのカウンタ値を使用し、このケースではスレッド７１２で、２次オペレーティングシステムに中止した実行を再開させる。
【００９７】
このようにして、クリティカルオペレーティングシステム２０１が何らかの機能（それ独自のアプリケーションまたはサービスを処理するか、または他のオペレーティングシステム向けの割り込みを処理する）を実行した後、ハードウェアリソースディスパッチャは、スケジューラ４１０によって決定されたように、次の２次オペレーティングシステム２０２に制御を戻す。
【００９８】
割り込み時の２次からクリティカルへのオペレーティングシステムの切り替え
次に、図８を参照しながら、２次オペレーティングシステムからクリティカルオペレーティングシステムへの転送プロセスについて開示する。このケースでは、システムは、クリティカルオペレーティングシステム２０２で実行中のアプリケーション２０８ａのスレッド７１２を実行している。
【００９９】
ハードウェア割り込みが発生すると、ハードウェアリソースディスパッチャは、２次オペレーティングシステムコンテキストをコンテキストストレージ領域７０８内に保存するためのＯＳスイッチャを始動する。その後、１次オペレーティングシステム２０１に切り替え、コンテキストストレージ領域７０６から状態変数の値を復元して、１次オペレーティングシステム２０１の割り込みサービスルーチン７０４を呼び出す。割り込みを処理した後、１次オペレーティングシステム２０１のスケジューラは、ＩＳＲ  ７０４から、以前に実行されていた任意のスレッド７０４（または実行されることになるスレッド）に制御を戻すことができる。
【０１００】
ＩＳＲおよびすべてのスレッドが処理されると、１次オペレーティングシステム２０１は、１次オペレーティングシステム２０１から切り替える（コンテキストストレージ７０６に状態変数を保存）ハードウェアリソースディスパッチャに制御を戻し、図７を参照しながら上記で論じた方法で、選択された２次オペレーティングシステム２０１に切り替える（コンテキストストレージ７０８から状態変数を取り出す）。
【０１０１】
オペレーティングシステム間通信−−仮想バス４１８
仮想バスルーチンは、各オペレーティングシステム内の仮想バスドライバと協働する。ｃＰＣＩバックプレーンにプラグインされたＣｏｍｐａｃｔ  ＰＣＩ（ｃＰＣＩ）ボードと同様に、オペレーティングシステムを接続している物理バスをエミュレートする。各オペレーティングシステムに、この仮想バス上の仮想バスブリッジデバイス向けのドライバルーチンが提供されることで、オペレーティングシステムおよびそれらのアプリケーションは、任意の所望のプロトコルによって生データ転送から全ＩＰプロトコルスタックへの通信が可能となる。
【０１０２】
ハードウェアリソースディスパッチャの仮想バスは、前述の共有メモリおよびシステムの相互割り込み原理に基づいている。詳細には、仮想バスルーチン４１８は、仮想バスブリッジ共有デバイスを定義するＣ５  ｂｕｓｃｏｍ  ＤＤＩ：ｓｙｓｃｏｍをエミュレートすることで、仮想バスを横切るメモリのエクスポート（共有）、および他のオペレーティングシステムへの相互割り込みのトリガを可能にする。
【０１０３】
各２次オペレーティングシステムにおける各仮想バスドライバは、始動時に、ハードウェアリソースディスパッチャのハードウェアリポジトリ内にこうした仮想バスブリッジを作成する。このように実行することによって、その専用メモリの範囲をエクスポート（共有）し、そのホストシステム内で割り込みを発生させる方法を提供する。
【０１０４】
したがって、第１のオペレーティングシステムの仮想バスドライバは、以下のように実行することによって、第２のオペレーティングシステムにデータを送信する。
・第２のオペレーティングシステムのピア仮想バスドライバによってエクスポートされたメモリに書き込む
・第２のオペレーティングシステム内のピアバスドライバがデータを使用可能である旨を通知するために、相互割り込みをトリガする
【０１０５】
逆（着信）方向では、仮想バスドライバは、着信データがそれ自体のエクスポートされたメモリ範囲内に格納されたことを示す相互割り込みを受け取った場合、こうしたデータを（対象とされたアプリケーションまたはルーチンが使用するために）アップストリームに伝播する。
【０１０６】
図９（ａ）を参照すると、同じオペレーティングシステム２０２上で実行中の他の２０８ｂと通信しようとするアプリケーション２０８ａは、そのオペレーティングシステムを介してこれを実行することができる。異なるオペレーティングシステム２０２上で実行中の他の２０８ｂと通信しようとする、一方のオペレーティングシステム２０１上で実行中のアプリケーション２０７ｂは、仮想バスドライバルーチンを使用して他方のオペレーティングシステム２０２にデータを渡し、これをその仮想バスドライバからアプリケーション２０８ｂに伝播する、それ自体のオペレーティングシステムのＡＰＩを使用して仮想バスにデータを書き込むことによってそのように実行する。
【０１０７】
図９（ｂ）を参照すると、この構成を、第１および第２のオペレーティングシステムが異なるコンピュータ１００、１０１上で実行される構成に移行するために必要な変更はわずかであり、オペレーティングシステムが使用するドライバを変更するだけでよいため、仮想バスドライバではなくリアルバス１０３用のドライバを使用する。したがってシステムは、システムが動作するハードウェアと、より無関係になる。
【０１０８】
ハードウェアリソースディスパッチャの仮想バスを横切る通信をアプリケーションが使用できるが、オペレーティングシステムカーネルが内部的に使用することも可能であるため、それらは複数のオペレーティングシステム間で分散されるサービスの実施において協働することができる。この種の「スマート」分散型サービスは、システムのホット再始動に使用される（上記で論じた）ソフトウェアウォッチドッグ、または分散型ネットワークプロトコルスタックを含む。
【０１０９】
欧州特許第１０５４３３２号は、セマフォロックを使用して、共通通信メモリへのアクセスを同期化する。こうしたロックにより、ＲＴとＧＰのオペレーティングシステム間に特別な依存関係が生じる。本実施形態では、ロックなし通信プロトコルを使用してこれが回避される。
【０１１０】
デバッグ
好ましい実施形態では、ハードウェアリソースディスパッチャは、デバッグエージェントとして動作する第２の動作モードを有する。
【０１１１】
この実施形態によれば、第２のモードで、ハードウェアリソースディスパッチャは、シリアル通信ラインを介して他のマシン（「ホスト」マシン）上で実行中のデバッグソフトウェアツールと通信することができる。
【０１１２】
こうしたデバッグツールは、ハードウェアリソースディスパッチャをリモートに制御するために、高水準のグラフィカルユーザインターフェース（ＧＵＩ）を提供する。ハードウェアリソースディスパッチャ仮想化例外メカニズムを使用して、定義された例外が遮断される。その後ユーザは、プロセッサ例外の場合に、ハードウェアリソースディスパッチャがどのように挙動するかを構成および制御することが可能であり、さらに、コードまたは他のシステムのエラーまたは問題を診断できるように、マシンおよびシステムの状態を表示することもできる。
【０１１３】
ユーザは、１つまたは複数のこうしたプロセッサ例外を、オペレーティングシステムからハードウェアリソースディスパッチャへのトラップ呼び出しのための基本として選択することができる。選択された例外に基づいて、実行時に例外またはそれぞれの例外が発生した場合、オペレーティングシステムは停止し、ハードウェアリソースディスパッチャへのトラップ呼び出しを実行した後、現在のコンテキストを保存して、ホスト上のデバッグツールとの対話を可能にする。その後ユーザは、状態変数（スタックポインタ、プログラム、およびアドレスカウンタなど）の現在の状態、および／またはメモリの選択されたブロックのコンテンツを表示させることができる。ユーザは、所与のタイプの例外がデバッグされることになる特定のオペレーティングシステム内でトラップされるべきであること、またはそれらが任意のオペレーティングシステム内で発生した場合は必ずトラップされるべきであること、のいずれかを指定することができる。これに応答して、トラップ呼び出しは、１つのオペレーティングシステム内のみで、またはすべてのオペレーティングシステム内で、実施される。ユーザは、実行を再始動するかまたは単に無視した場合に、通常は所与のタイプの例外がシステムに転送されるかどうかも指定することができる。
【０１１４】
ハードウェアリソースディスパッチャはそれ自体の環境内で実行するため、オペレーティングシステムのデバッグが、そのシステム内から実行できるよりも多く実行できる。重要なことに、デバッグエージェントとして動作するハードウェアリソースディスパッチャと、デバッグされるシステムとの間では、コードが共有されない。これにより、たとえば例外ベクトルまたは割り込みサービスルーチンなどの、カーネルの低レベルコードのデバッグが可能となる。
【０１１５】
この実施形態によれば、デバッグアーキテクチャ全体（ホスト／ターゲット）の他のいくつかの態様は、http://www.jaluna.com/doc/c5/html/DebugGuide/book1.htmlから入手可能な、Ｊａｌｕｎａによって発行された文書「Ｃ５  １．０  Ｄｅｂｕｇｇｉｎｇ  Ｇｕｉｄｅ」に記載された、ＣｈｏｒｕｓおよびＣ５のデバッグシステムに関する態様と同様である。
【０１１６】
セキュアなアーキテクチャ
前述の諸実施形態が、セキュアなアーキテクチャのための確固たる基盤を与えることは明らかであろう。これは、ユーザが通常セキュアでないアプリケーションを実行することになる２次オペレーティングシステムが、指定されたシステムリソースから隔離され、ハードウェアリソースディスパッチャ（および１次オペレーティングシステムのドライバ）を介してのみ、それらにアクセスするためである。したがって、たとえば暗号化／復号を実行し、暗号化されたファイルへのアクセスを可能にし、パスワードおよび他のアクセス情報を管理、格納、および供給し、著作権資料のアクセスおよび複写を管理およびログ記録する、セキュリティアプリケーションを、１次オペレーティングシステム上で実行することができる。２次オペレーティングシステム上で実行中のアプリケーションは、そのオペレーティングシステムに割り振られていないシステムリソースにアクセスすることはできず、オペレーティングシステムが異なるメモリコンテキストで実行する（すなわち異なるスペースを指す異なるアドレッシングポインタを使用する）場合、２次オペレーティングシステム上で実行中のアプリケーションを使用して、１次システム上で動作するアプリケーションを妨害してその動作のセキュリティを弱めることはできない。
【０１１７】
次に、特に好ましい実施形態について説明する。
【０１１８】
１．はじめに
本書は、ＡＲＭアーキテクチャでのＪａｌｕｎａナノカーネル環境について説明する。Ｊａｌｕｎａナノカーネル設計の一般的な原理については、すでに当発明者等の以前の文書、Ｊａｌｕｎａ−２：Ａ  Ｍｕｌｔｉ−Ｓｙｓｔｅｍ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｅｎｖｉｒｏｎｍｅｎｔ（ＪＬ／ＴＲ−０２−８０．０．３）で説明している。むしろ本書では、ナノカーネル実施のＡＲＭ特有の態様、特に、ナノカーネル環境の隅石であるナノカーネルエグゼクティブ（ｅｘｅｃｕｔｉｖｅ）に焦点を当てる。
【０１１９】
本書では、中央処理装置（ＣＰＵ）ならびにメモリ管理ユニット（ＭＭＵ）を共有する複数の独立したオペレーティングシステムを、これらのオペレーティングシステムを横切って同時に実行できる、ナノカーネルエグゼクティブを実施するために、ＡＲＭプロセッサアーキテクチャがどのように使用されるかについて説明する。
【０１２０】
本書では、ナノカーネルエグゼクティブがハードウェア割り込みをどのように処理するかについても説明する。具体的に言えば、ハードウェア割り込みを遮断して、これらを１次オペレーティングシステムに向けて転送するために使用されるメカニズム、および２次オペレーティングシステムに提供されるソフトウェア割り込みメカニズムについて説明する。
【０１２１】
本書では、ナノカーネルがユニプロセッサコンピュータ上で実行中であると想定するため、対称型マルチプロセッサ（ＳＭＰ）アーキテクチャに関する諸態様はここでは対象とされないことに留意されたい。
【０１２２】
２．概要
２．１  仮想アドレススペース
ＭＭＵが所与のＡＲＭアーキテクチャの実施上に存在する場合、すべてのオペレーティングシステムおよびナノカーネルは常に仮想アドレススペース内で実行し、言い換えれば、ＭＭＵは常に使用可能である。内部でナノカーネルコードが実行中のメモリコンテキストは、時間の経過と共に変化する可能性があることに留意されたい。他方で、ナノカーネルはＭＭＵを必要とせず、ＭＭＵなしのＡＲＭプロセッサもサポートする。この場合、すべてのオペレーティングシステムおよびナノカーネルは物理アドレススペースで実行する。
【０１２３】
この説明では、メモリコンテキストという用語は、ルートディレクトリテーブルがシステム制御コプロセッサ（ＣＰ１５）の変換テーブルベースレジスタによって指定される、ハードウェアアドレス変換ツリーを示す。
【０１２４】
通常、ユーザモード保護をサポートするオペレーティングシステムは、専用のユーザ仮想アドレススペースを処理できるように、複数のメモリコンテキスト（１ユーザプロセスについて１つ）を作成する。カーネルは、１つのユーザプロセスから他のユーザプロセスへと切り替えるごとに、メモリコンテキストを変更する。他方で、オペレーティングシステムカーネルは、ユーザアドレススペースと共に、すべてのメモリコンテキスト内で複製される固有のスーパバイザアドレススペースも処理する。ユーザ仮想アドレスおよびスーパバイザ仮想アドレスは、ＡＲＭアーキテクチャ上で決して重複することはない。
【０１２５】
ＭＭＵが存在しない場合、オペレーティングシステムはすべてのプロセッサ間で同じアドレススペースを共有しないため、メモリコンテキストの切り替えは不要である。この場合、オペレーティングシステムはスーパバイザスペースに対して１つのメモリコンテキストのみを使用することがわかっている。
【０１２６】
スーパバイザアドレススペースのマッピングは、静的または動的のいずれであってもよい。静的マッピングはシステムの初期設定時に作成され、通常は使用可能な物理メモリを（全体または部分的に）マッピングする。こうしたマッピングは１対１またはカーネル仮想（ＫＶ）マッピングとも呼ばれる。具体的に言えば、ＫＶマッピングは通常、オペレーティングシステムカーネルのコード、データ、およびｂｓｓセクションをカバーする。動的マッピングは、動的にロードされたカーネルモジュールまたは動的に割り振られた（非連続）メモリチャンクにアクセスするために、ランタイム時に作成される。
【０１２７】
必然的に、ナノカーネルが新しいオペレーティングシステムをＣＰＵ上で実行するようにスケジューリングした場合、メモリコンテキスト（変換テーブルベースレジスタ）は切り替えられるべきである。ＡＲＭアーキテクチャが仮想キャッシュのみをサポートすることから、キャッシュエイリアシング（ａｌｉａｓｉｎｇ）のために必要な可能性のある、メモリコンテキスト切り替え時の非常に費用のかかるキャッシュフラッシュを避けるために、すべてのＫＶマッピングが同じ変換公式を使用する必要があるものと決定された。言い換えれば、すべてのオペレーティングシステムに関するすべてのＫＶマッピングで、物理メモリ位置のスーパバイザアドレスは同じであるものとする。同じアクセスおよびキャッシュ属性を使用するものとする。すべてのオペレーティングシステムは同じスーパバイザアドレススペース（異なる可能性のある変換ツリーではない）を共有すると言える。各オペレーティングシステムは、このスーパバイザスペース内の専用スロットで実行する。説明した要件は、ＭＭＵが存在しない場合も当然当てはまることに留意されたい。
【０１２８】
ナノカーネル環境では、１次コンテキスト、２次コンテキスト、およびナノカーネルコンテキストの、３種類のメモリコンテキストが見分けられる。
【０１２９】
１次メモリコンテキストとは、１次オペレーティングシステムカーネルによって現在使用されているメモリコンテキストである。１次オペレーティングシステムがユーザアドレススペースをサポートしている場合、１次カーネルによって使用される複数のメモリコンテキストが存在する可能性があるが、すでに上記で述べたように、スーパバイザアドレススペースはすべてのこうしたコンテキスト内で同一であることに留意されたい。ナノカーネルはユーザスペースマッピングとは無関係であるため、１次メモリコンテキストはナノカーネルの観点から見れば固有であり、１次カーネルによって確立された静的および動的なスーパバイザマッピングからなる。
【０１３０】
２次メモリコンテキストとは、２次オペレーティングシステムカーネルによって現在使用されているメモリコンテキストである。これは、１次メモリコンテキストと同様である。ナノカーネルの観点から見れば（所与の２次カーネルについて）固有であり、２次カーネルによって確立された静的および動的なスーパバイザマッピングからなる。
【０１３１】
すべてのオペレーティングシステムがナノカーネルによって所有される物理メモリをマッピングする必要があるため、ナノカーネルを直接（セクション２．２を参照すればわかるように、すなわち、実行モードおよびメモリコンテキストを変更するトラップまたは他の特別な命令なしに）呼び出すことができる。このように、ナノカーネルによってエクスポートされたデータ構造（オペレーティングシステムコンテキスト、セクション２．３を参照のこと）にもアクセスすることができる。
【０１３２】
あらゆるオペレーティングシステムは、通信メカニズム実施からの対応する要求時に、他のオペレーティングシステムによって所有される何らかの物理メモリをマッピングできるものとする。
【０１３３】
ナノカーネルメモリコンテキストは、ナノカーネル自体によって構築される。このコンテキストは、すべてのオペレーティングシステム、ならびに組み合わされたシステムイメージによって所有されるすべてのメモリバンクをマッピングする。これは、ほとんどがナノカーネル初期設定段階で使用される。
【０１３４】
対象とされるすべてのメモリコンテキストが同じ変換公式を使用するものであることに留意されたい。
【０１３５】
図１は、１次、２次、およびナノカーネルの、メモリコンテキストの例を示す。この例では、物理メモリサイズは１２８メガバイトである。すべてのオペレーティングシステムおよびナノカーネルは、（Ｌｉｎｕｘカーネルと同様に）０ｘｃ０００００００から始まるシフト１対１（ＫＶ）マッピングを使用する。
【０１３６】
２．２  ナノカーネルの起動およびプリエンプト
ナノカーネルは、機能呼び出しを介して明示的に、または割り込み／例外ハンドラを介して暗黙的に起動される。前者の場合、オペレーティングシステムカーネルはナノカーネルを起動すると言える。後者の場合、ナノカーネルはオペレーティングシステムをプリエンプトすると言える。ナノカーネルは常に、スーパバイザアドレススペースで実行中の特権オペレーティングシステムコードから起動されることを明確に示すことが重要である。他方で、ナノカーネルはオペレーティングシステムカーネル自体、ならびにカーネル制御の下で実行中のユーザプロセスをプリエンプトすることができる。
【０１３７】
組み合わされたシステムイメージがブートされると、ナノカーネルが第１に活動化され、１次および２次のオペレーティングシステムカーネルの実行を開始する。初期設定段階が完了すると、ナノカーネルは受動的な役割を演じる。これは、ナノカーネル内で実行されるコードが、ナノカーネルを起動する１次および２次のカーネルによって明示的に、あるいは外部で生成された同期（すなわち例外）および非同期（すなわち割り込み）イベントによって、駆動されることを意味する。
【０１３８】
ＡＲＭアーキテクチャでは、ナノカーネルの起動に使用されるメカニズムは、１次および２次のオペレーティングシステムからのものとほぼ同じである。どちらの場合も、これは間接的機能呼び出しである。他方で、ナノカーネルは、１次および２次のオペレーティングシステムを異なる方法でプリエンプトする。
【０１３９】
実行環境に関して、ナノカーネルは１次オペレーティングシステムカーネルにかなり近い。しばしば同じメモリコンテキストを使用し、時には同じスーパバイザスタックを使用する。したがって、ナノカーネルは、１次オペレーティングシステムと概ね同じ可用度を有する。他方で、２次オペレーティングシステムとナノカーネルとの間には、２次カーネルの誤作動に対して何らかの保護を提供する障壁がある。しかしながら、こうした保護は絶対ではなく、２次カーネルは依然として１次カーネルならびにナノカーネルをクラッシュさせる可能性があることに留意されたい。
【０１４０】
２．２．１  １次起動
１次オペレーティングシステムカーネルは、単純な間接呼び出しによってナノカーネルを起動する。この起動によってメモリコンテキストは切り替えられない。
【０１４１】
２．２．２  １次プリエンプト
実際に、ＡＲＭアーキテクチャ上でのナノカーネルの現在の実施は、決して１次オペレーティングシステムをプリエンプトしない。１次オペレーティングシステムのプリエンプトは、オペレーティングシステム間でＦＰＵを共有するための遅延（ｌａｚｙ）ポリシーを実施するために使用することができる。
【０１４２】
２．２．３  ２次起動
２次オペレーティングシステムカーネルは、単純な間接呼び出しによってナノカーネルを起動する。ナノカーネルそれ自体が、必要であればメモリコンテキストおよび実行スタックを切り替える。
【０１４３】
２．２．４  ２次プリエンプト
２次オペレーティングシステムをプリエンプトできるように、ナノカーネルはそれ自体の低レベルハンドラをプロセッサ例外テーブルにインストールする。２次オペレーティングシステムが割り込みによってプリエンプトされると、これらの低レベルハンドラはナノカーネルコードにジャンプする。ナノカーネルが他のオペレーティングシステムをＣＰＵ上で実行するようにスケジューリングした場合、明示的な切り替えが実行されるまでメモリコンテキストは変更されないままであることに留意されたい。
【０１４４】
２．３  オペレーティングシステムコンテキスト
ナノカーネルデータは、グローバルデータおよびオペレーティングシステムごとのデータ（ｐｅｒ  ｏｐｅｒａｔｉｎｇ  ｓｙｓｔｅｍ  ｄａｔａ）という、２つのカテゴリで分割することができる。グローバルデータは、グローバルなナノカーネル状態（たとえば、ナノカーネル変換ツリー）を維持し、オペレーティングシステムごとのデータは所与の１次または２次のオペレーティングシステムカーネルに関連して状態を維持する。オペレーティングシステムごとのデータは、オペレーティングシステムコンテキストとも呼ばれる。
【０１４５】
実際に、ナノカーネルはオペレーティングシステムごとに２つのデータ構造を維持する。第１のデータ構造はオペレーティングシステムコンテキストそれ自体である。これは公開され、任意のオペレーティングシステムから可視であり、ナノカーネルインターフェースに関与している。すべてのオペレーティングシステムコンテキストは、ナノカーネルによって所有される専用メモリバンクに配置される。オペレーティングシステムコンテキストについては、ナノカーネルインターフェースに関する他のセクションで詳細に説明する。
【０１４６】
第２のデータ構造は、ナノカーネルに提供される。これには、ナノカーネルエグゼクティブによって内部的に使用されるオペレーティングシステムごとの情報が含まれる。
【０１４７】
３．ナノカーネルエグゼクティブインターフェース
本章では、１次および２次のオペレーティングシステムカーネルにエクスポートされたナノカーネルエグゼクティブインターフェースについて説明する。こうしたインターフェースは、カーネルとナノカーネルとの間のデータ共有（すなわち可視オペレーティングシステムコンテキスト）ならびにナノカーネルメソッドに存在する。ナノカーネルインターフェースはオペレーティングシステムの役割特有であり、（厳密に言えば）１次カーネルと２次カーネルでは異なることに留意されたい。他方で、オペレーティングシステムの役割とは無関係に説明できるこれら２つのインターフェースの間には、非常に重要な交差部分がある。
【０１４８】
３．１  オペレーティングシステムコンテキスト
図１１は、オペレーティングシステムコンテキストを示す。
【０１４９】
すべてのオペレーティングシステムコンテキスト（１次ならびに２次）は固定長であり、オペレーティングシステムｉｄで索引付けされたテーブルに入れられる。オペレーティングシステムコンテキストでは、すべての外部参照が物理アドレスを介して作成されることに留意されたい。オペレーティングシステムは、参照されたデータ構造にアクセスするために、こうした物理アドレスを（ＫＶマッピングからの）仮想アドレスに変換しなければならない。図は、１次および２次の２つのカーネルのみを備えた構成を示す。
【０１５０】
ｐｅｎｄｉｎｇ  ＶＥＸおよびｅｎａｂｌｅｄ  ＶＥＸフィールドは、仮想例外（ＶＥＸ）の現在の状態を示す。仮想化例外メカニズムについては、２次オペレーティングシステムカーネルの例外モデルと共に、本書でより詳細に説明する。
【０１５１】
ｔａｇフィールドは、いわゆるタグリストである。これには、ブートローダによって与えられるブート情報が含まれる。ナノカーネル環境では、タグリストは仮想化され、すべてのオペレーティングシステムコンテキストで複製されることに留意されたい。他のタグの中でも、タグリスト構造は、ブート時間パラメータを指定するブートコマンドラインを含む。こうしたパラメータは、ブートローダによって与えられるか、またはナノカーネル環境変数を介して渡される。コマンドラインはオペレーティングシステム特有である。ナノカーネルは、オペレーティングシステムに関するパラメータのみを含むオペレーティングシステム特有のコマンドラインを作成するために、初期のコマンドラインを解析する。
【０１５２】
ＲＡＭ  ｉｎｆｏフィールドは、ＲＡＭ記述テーブルを指す。ＲＡＭ記述テーブルは、すべてのオペレーティングシステムカーネルによって共有されるグローバルデータ構造である。ＲＡＭリソースがそれらの中でどのように分散されるかを記述する。
【０１５３】
ｄｅｖ  ｉｎｆｏフィールドは、ターゲットボード上に提示されるデバイス記述子のリストを指す。１次オペレーティングシステムによって作成および管理される。オペレーティングシステム間でデバイスがどのように分散されるかを記述する（デバイスは異なるオペレーティングシステムによって共有することはできない）。２次オペレーティングシステムは、このリストを使用して、２次オペレーティングシステムの再始動時に呼び出すことが可能なシャットダウン機能を登録する。
【０１５４】
ＶＩＬフィールドは、保留中のハードウェア割り込みのＦＩＦＯリストである。各エントリは、小さい整数の割り込みｉｄを含む。通常、ＡＲＭベースのボードは大きい数の異なる割り込みソース（しばしば＞６４）を使用する。したがって、保留中の割り込みセットは、ビットマスクとしてではなくリストとして表すことが決められた。実際には、このフィールドをナノカーネル自体が使用することは決してない。このフィールドは、１次および２次のオペレーティングシステムにおける割り込み管理コードを簡略化するためにここに入れられたものである。ナノカーネルは、ｐｅｎｄｉｎｇ  ＶＥＸおよびｅｎａｂｌｅｄ  ＶＥＸフィールド内のｉｎｔｅｒｒｕｐｔ  ＶＥＸビットのみを割り込み管理の目的で使用する。
【０１５５】
ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドは、保留中の相互割り込みのテーブルへの参照である。このテーブルは、オペレーティングシステムｉｄによって索引付けされる。各エントリは、１オペレーティングシステムあたり３２の可能な相互割り込みに対応する。ナノカーネル自体はこのテーブルを使用しない。このフィールドは、相互割り込み交換で１次および２次のオペレーティングシステムを支援するために、コンテキスト構造によって参照される。相互割り込みの送達専用の仮想例外は、ｃｒｏｓｓ  ｉｎｔｅｒｒｕｐｔ  ＶＥＸの１つだけである。ｐｅｎｄｉｎｇ  ＸＩＲＱテーブルは、相互割り込みの数を３２まで拡張することができる（１相互割り込みソースあたり１ビット）。相互割り込みビットは、ソースオペレーティングシステム（すなわち、相互割り込みを送信するオペレーティングシステムカーネル）によってセットされ、宛先オペレーティングシステム（すなわち、相互割り込みを受信するオペレーティングシステムカーネル）によってリセットされる。
【０１５６】
ＩＤフィールドは、固有のオペレーティングシステム識別子を含む。このフィールドは読み取り専用である。識別子０はナノカーネル自体に割り当てられ、識別子１は１次オペレーティングシステムカーネルに割り当てられる。オペレーティングシステム識別子は、ナノカーネルインターフェース内のオペレーティングシステムを指定する。たとえば、オペレーティングシステム識別子は、所与のカーネルに割り当てられたリソース（たとえば、ＲＡＭ記述テーブル内のメモリチャンク）にタグを付けるために使用される。
【０１５７】
オペレーティングシステムコンテキストの最後の部分は、ナノカーネルインターフェースメソッドのアドレスを指定する。これらはＫＶマッピング内のアドレスであるため、いかなる追加の変換もなしにナノカーネルを呼び出すために使用できる。すべてのＫＶマッピングは同じアドレス変換公式を使用するものとすることに留意されたい。
【０１５８】
ナノカーネルは、１次および２次のオペレーティングシステムに対して、異なる機能をエクスポートすることに留意されたい。たとえば、１次および２次のオペレーティングシステムがアイドルメソッドを起動する場合、それらは実際には２つの異なるナノカーネル機能を呼び出す。
【０１５９】
３．２  ナノカーネルメソッド
ナノカーネルは、コンソールＩ／Ｏオペレーションおよびエグゼクティブオペレーションという、２つのメソッドグループを提供する。コンソールＩ／Ｏグループは、カーネルがナノカーネルコンソールシリアルラインへ文字を送信すること、およびここから文字を受信することができるようにする。本書は、多少とも一般的であるコンソールＩ／Ｏメソッドを特に対象とはせず、むしろ、ＡＲＭアーキテクチャ特有のエグゼクティブメソッドに焦点を当てる。
【０１６０】
３．２．１  例外ハンドラのインストール
ＡＲＭアーキテクチャでは、例外テーブルは固有であり、アドレス０ｘ００００００００またはアドレス０ｘｆｆｆｆ００００に配置される。ナノカーネル環境では、この例外テーブルが仮想化されるため、オペレーティングシステムは例外ベクトルをＡＲＭ例外テーブル内に直接インストールするのではなく、このナノカーネルメソッドを起動するものとする。例外番号（すなわち、未定義命令、プリフェッチ打ち切り、データ打ち切り、またはソフトウェア割り込み）ならびに例外ハンドラアドレスが、パラメータとして渡される。
【０１６１】
例外ハンドラアドレスは、オペレーティングシステムコンテキストに格納される。ナノカーネルは後にこれを使用して、追加の間接呼び出しオーバヘッドが最低のオペレーティングシステムに対応する例外を、直接生成することができる。
【０１６２】
ＡＲＭアーキテクチャでは、例外テーブルは例外ハンドラのアドレスは含まないが、一例外あたり１つのプロセッサ命令を含む。この命令は、実際の例外ハンドラへジャンプするために使用される。ナノカーネル環境では、ナノカーネル自体によって提供される非常に小さなプロローグ（ｐｒｏｌｏｇｕｅ）コードにジャンプする。これが、現在のオペレーティングシステムコンテキストから例外ハンドラアドレスを読み取り、そこへジャンプする。現在のオペレーティングコンテキストポインタは、プロローグコードが容易にアクセスできるグローバル変数内に維持される。ナノカーネルは、新しいオペレーティングシステムカーネルがＣＰＵ上で実行されるようにスケジューリングされるごとに、この変数を更新する。
【０１６３】
このように、例外ハンドラは、ネイティブのケースと同じ例外環境（実行モードおよびレジスタコンテンツ）で呼び出される。バンクスタックポインタレジスタは、未定義命令、プリフェッチ打ち切り、およびデータ打ち切りのハンドラの場合、ナノカーネルプロローグコードによってスクラッチされることに留意されたい。ソフトウェア割り込みハンドラ用のバンクスタックポインタレジスタは、そのままで維持される。
【０１６４】
３．２．２  割り込みハンドラのインストール
このナノカーネルメソッドは、直接および間接のｉｎｔｅｒｒｕｐｔ  ＶＥＸハンドラをインストールするために使用される。それらのアドレスはパラメータとして渡される。
【０１６５】
直接割り込みハンドラは、例外ハンドラと同様である。これらは、ハードウェア割り込みを処理するために、ＣＰＵ上で実行中の１次オペレーティングシステムによってのみ使用される。直接割り込みハンドラは、ネイティブのケースと同じ実行環境（実行モードおよびレジスタコンテンツ）で呼び出される。
【０１６６】
間接割り込みハンドラは、他のオペレーティングシステムカーネルによって転送された割り込みを処理するために、ナノカーネルによって起動される。これらは、直接割り込みハンドラに比べてわずかに異なる実行環境で呼び出される。これらについては、本書でさらに詳細に論じる。
【０１６７】
３．２．３  相互割り込みハンドラのインストール
ナノカーネルは、実際のＣＰＵ上には存在しない追加の仮想例外をサポートする。これは相互割り込みＶＥＸである。オペレーティングシステム間通信の隅石である。相互割り込みは通常の割り込みとほとんど同様であるが、ハードウェアデバイスではなくオペレーティングシステムによって生成される。
【０１６８】
このナノカーネルメソッドは、対応する相互割り込みハンドラを記憶させるために使用される。間接割り込みハンドラと同じ実行環境（実行モードおよびレジスタコンテンツ）で呼び出されることになる。
【０１６９】
３．２．４  相互割り込みの通知
このナノカーネルメソッドは、宛先オペレーティングシステム上にｃｒｏｓｓ  ｉｎｔｅｒｒｕｐｔ  ＶＥＸを生成するために使用される。ｐｅｎｄｉｎｇ  ＸＩＲＱテーブル内に対応するビットもセットする。宛先オペレーティングシステムｉｄおよび相互割り込み番号が、パラメータとして渡される。
【０１７０】
３．２．５  アイドル
ナノカーネルは、オペレーティングシステムカーネルがアイドルループ内で呼び出さなければならないアイドルメソッドを提供する。このメソッドは、呼び出し側オペレーティングシステムカーネルが次の割り込みまで何も実行することがない旨を、ナノカーネルに通知する。
【０１７１】
アイドルメソッドを起動すると、結果としてシステムが、２次オペレーティングカーネル（あれば）を実行する準備のできている次のシステムに切り替えられるか、またはすべての２次オペレーティングシステムカーネルがアイドルの場合、１次アイドルメソッドから戻る。
【０１７２】
ナノカーネルは、１次アイドルメソッドに対して、ステートレス（ｓｔａｔｅｌｅｓｓ）およびステートフル（ｓｔａｔｅｆｕｌｌ）という２つの異なる実施を提供する。ステートレスアイドルメソッドから戻る場合、すべてのレジスタはスクラッチされる。ステートフルアイドルメソッドから戻る場合、永続レジスタ（ｒ４〜ｒ１３）が保持される。
【０１７３】
アイドルメソッドの正しい実施は、１次オペレーティングシステムのアイドルループ実施に依存し、対応する構成．ｘｍｌファイル内で選択することが可能である。
【０１７４】
３．２．６  再始動
ナノカーネルは、２次オペレーティングシステムカーネルを再始動するために、１次ならびに２次のオペレーティングシステムによって呼び出し可能な再始動メソッドを提供する。再始動されるオペレーティングシステムのｉｄは、パラメータとして渡される。
【０１７５】
ナノカーネルは宛先オペレーティングシステムの実行を停止し、オペレーティングシステムカーネルのイメージをそのコピーから復元し、最終的に、初期エントリポイントでオペレーティングシステムカーネルの実行を開始する。
【０１７６】
３．２．７  ２次停止
ナノカーネルによって、停止メソッドが２次オペレーティングシステムに提供される。ナノカーネルは、ナノカーネルスケジューラによって切り替えられるのを避けるために、呼び出し元オペレーティングを非実行状態にする。
【０１７７】
停止されたオペレーティングシステムは、前述のナノカーネル再始動メソッドによって、再度開始することができる。
【０１７８】
４．１次実行環境
基本的に、１次オペレーティングシステムカーネルはネイティブ実行環境で実行される。ＡＲＭプロセッサ上のナノカーネル実施は、１次オペレーティングシステム特徴（性能、割り込み待ち時間、プリエンプト待ち時間）に対するナノカーネル環境の影響を最小限にするように努める。１次オペレーティングシステムは、通常、リアルタイムオペレーティングシステムであるため、たとえ、同じプロセッサ上で他の（２次）オペレーティングシステムが同時に実行されている場合であっても、１次カーネルの挙動を未変更のまま維持することが重要である。
【０１７９】
４．１  初期設定
１次オペレーティングシステムは、パワーアッププロセッサ初期設定を実行し、ＲＡＭ内にナノカーネルデータ（必要であれば）をインストールし、初期変換ツリーを作成し、ＭＭＵ（存在すれば）を使用可能にし、ナノカーネルエントリポイントにジャンプする、小規模なトランポリンプログラムを提供する。初期変換ツリーは、トランポリンプログラムおよびナノカーネルをマッピングするものとする。実行モードはスーパバイザモードであり、すべてのハードウェア割り込みが使用不可となる。
【０１８０】
今度はナノカーネルが、オペレーティングシステムのメモリバンクをＲＡＭにインストールし、オペレーティングシステムコンテキストを初期設定して、使用可能とされたＭＭＵ（存在すれば）および使用不可とされたハードウェア割り込みとを備える１次エントリポイントにジャンプする。実行モードはスーパバイザモードのままである。
【０１８１】
ナノカーネル初期設定コードは、そのデータセクションに配置された静的ナノカーネルスタックを使用して実行される。１次オペレーティングシステムカーネルにジャンプした場合、このスタックは依然として有効である。それにもかかわらず、１次オペレーティングシステムカーネルをそれ自体のスタックに可能な限り迅速に切り替えなければならず、このナノカーネルスタックを今後一切使用してはならない。ナノカーネルスタックは、初期設定段階のみならず、次の章で説明するように２次起動およびプリエンプトを処理するために、ランタイム時にも使用される。
【０１８２】
１次オペレーティングシステムカーネルにジャンプする場合、スーパバイザモードのバンクスタックポインタレジスタは、１次オペレーティングシステムコンテキストを指す。プロセッサ割り込みは、１次初期設定段階のはじめに使用不可となる。１次オペレーティングシステムカーネルは、通常、クリティカル初期設定段階が終了すると、割り込みを使用可能にする。
【０１８３】
初期設定段階中に、１次オペレーティングシステムカーネルは、通常、例外ハンドラおよび割り込みハンドラをセットアップするために、ナノカーネルメソッドを起動する。最終的に、１次カーネルはアイドルループに入り、ナノカーネルアイドルメソッドを起動する。
【０１８４】
アイドルメソッドが最初に呼び出された場合、ナノカーネルは、１次オペレーティングシステムカーネルがその実行環境を完全に初期設定したものとみなし、初期設定後の段階に進む。
【０１８５】
こうした初期設定後の段階で、ナノカーネルはナノカーネルメモリコンテキストを完了する。使用可能なすべての物理メモリを発見し、ＲＡＭ  ｉｎｆｏフィールドによって示された対応する記述子に登録することは、１次オペレーティングシステムの仕事であるため、ナノカーネルはそのメモリコンテキストを完了できることに留意されたい。初期設定後が終了すると、ナノカーネルは、２次カーネル実行準備完了（ｒｅａｄｙ  ｔｏ  ｒｕｎ）に切り替えるか、または、すべての２次カーネルがアイドルの場合、１次アイドルメソッドから戻るために、スケジューラを呼び出す。
【０１８６】
ナノカーネルは、グローバルに共有されたデータ構造であるＲＡＭ記述子およびデバイスリストを初期設定するように、１次オペレーティングシステムカーネルに要求する。こうした初期設定は、アイドルメソッドが呼び出される前に実行しなければならない。この時点を過ぎると２次カーネルはグローバルに共有されたデータ構造にアクセスできるため、この要件は当然である。
【０１８７】
具体的に言えば、１次カーネルは、ボード上で使用可能な物理メモリを検出すること、および空き物理メモリチャンクをＲＡＭ記述子に登録することを担当している。
【０１８８】
１次Ｂｏａｒｄ  Ｓｕｐｐｏｒｔ  Ｐａｃｋａｇｅ（ＢＳＰ）に従って、１次カーネルは、ナノカーネル対応ドライバ、特に割り込みコントローラドライバを始動するべきである。
【０１８９】
４．２  １次例外
基本的に、ナノカーネルは、１次オペレーティングシステムがプロセッサ上で実行中の場合に生じる例外を遮断しない。すべてのプログラミング例外は、ネイティブ１次ハンドラによって処理される。ナノカーネルは、対応する例外ハンドラにジャンプするために、小さなプロローグコードのみを実行する。ＡＲＭナノカーネルアーキテクチャへ移植する場合、１次低レベルハンドラを修正する必要はない。
【０１９０】
バンクスタックポインタレジスタは、未定義命令、プリフェッチ打ち切り、およびデータ打ち切りのハンドラの場合、ナノカーネルプロローグコードによってスクラッチされることに留意されたい。ソフトウェア割り込みハンドラ用のバンクスタックポインタレジスタは、そのままで維持される。
【０１９１】
４．３  １次割り込み
１次オペレーティングシステムがＣＰＵ上で実行中に割り込みが発生した場合、ナノカーネルによって追加のコードが導入されることなしに、ネイティブの低レベル（直接）割り込みハンドラが起動される。バンクスタックポインタレジスタはそのままである。
【０１９２】
４．４  転送済み割り込み
２次オペレーティングシステムがプロセッサ上で実行中に割り込みが発生した場合、その割り込みは１次オペレーティングシステムに転送される。こうした割り込み転送プロセスは、以下の主要なステップで進行する。
・割り込みがナノカーネルによって遮断される
・プリエンプトされた２次オペレーティングシステムカーネルの実行が中断され、ナノカーネルは１次実行環境に切り替える
・ナノカーネルが対応する１次オペレーティングシステムカーネルへの割り込みをトリガする
【０１９３】
このような場合、割り込みを処理するために、対応する１次低レベル間接割り込みハンドラが（１次実行環境において）起動される。割り込みが処理されると、１次オペレーティングシステムカーネルはナノカーネルに戻る。
【０１９４】
１次間接割り込みハンドラから戻った後、ナノカーネルは次に実行する２次オペレーティングシステムを決定するために、そのスケジューラを呼び出す。プリエンプトされた２次システムは、割り込み後も続行される必要のないことに留意されたい。他の（優先順位の高い）２次システムは、割り込みによって実行準備が完了する場合がある。
【０１９５】
ＡＲＭアーキテクチャでは、ＣＰＵは、ユーザ、システム、スーパバイザ、未定義、打ち切り、割り込み、および高速割り込みの、７つの異なる実行モードで実行することができる。そのうちの５つは、それらのｐｒｉｖｅｄ／バンクのｒ１３およびｒ１４レジスタを有する。したがって理論上は、ナノカーネルが１つのオペレーティングシステムカーネルから他のオペレーティングシステムカーネルに切り替えられた場合、すべてのバンクレジスタも切り替えられるべきである。オペレーティングシステムの切り替えおよび割り込みの転送の速度を上げるために、スーパバイザレジスタを除くすべてのバンクレジスタをスクラッチとみなすことに決定し、こうした切り替えを常にスーパバイザモードで実行することも決定した。
【０１９６】
２次システムがユーザモードで実行中に割り込みが発生した場合、割り込みハンドラが常に前の状態を保持することから、対応するバンクスタックレジスタは割り込みハンドラによって保持されることに留意されたい。２次システムがスーパバイザモードで実行中に割り込みが発生した場合、ユーザモードバンクレジスタは、すでにオペレーティングシステム自体によって保存されている。
【０１９７】
本発明者等の要件を満たすための最も容易な方法は、２次オペレーティングシステム例外ハンドラを修正することである。それらは常にバンクスタックポインタレジスタを事前に定義された値にセットし、できる限り迅速にスーパバイザモードに切り替えるべきである。ハードウェア割り込みは、スーパバイザモードへの切り替えが完了した場合にのみ、使用可能となるものとする。
【０１９８】
１次オペレーティングシステムが実行している間、こうした状況ではオペレーティングシステムの切り替えが実行できないことから、ＣＰＵの実行モードに関する制約はない。
【０１９９】
ナノカーネルは１次オペレーティングシステムカーネルに割り込みを転送する場合、１次間接割り込みハンドラを起動する。これは、ｒ１０〜ｒ１５レジスタおよびｃｐｓｒレジスタがすでにオペレーティングシステムコンテキストに保存された状態で、スーパバイザモードで起動される。ｒ１０はこのコンテキストへのポインタを含む。構造により、１次オペレーティングシステムは、ナノカーネルがこれに割り込みを転送する場合、常に非アクティブ状態（すなわち、アイドルナノカーネルメソッドと呼ばれる）であることに留意されたい。
【０２００】
間接割り込みハンドラ実行の結果として、１次オペレーティングシステムは新しいタスクをスケジューリングすることが可能であるため、ステートレスアイドルループを実施する場合（割り込みハンドラがアイドル状態で呼び出された場合にすべてのレジスタを保持することを要求しないか、またはアイドルループレジスタを保存せずに単に新しいタスクに切り替える場合）、ナノカーネルはすべてのレジスタ（およびｒ１０〜ｒ１５のみ）をオペレーティングシステムコンテキストに保存すべきである。それらは、ナノカーネルが再度２次オペレーティングシステムに切り替えられると復元されることになる。
【０２０１】
１次オペレーティングシステムがステートフルアイドルループを実施した場合（たとえば、アイドルループが通常の最低優先順位タスクとして実施され、オペレーティングシステムスケジューラが割り込み処理の終わりに直接呼び出された場合）、ｒ０〜ｒ９レジスタは１次オペレーティングシステムによって保持されることになるため、それらの保存を据え置く（ｄｅｆｅｒ）ことができる。ナノカーネルは、異なる２次オペレーティングシステムをスケジューリングする場合にのみ、それらを保存／復元する必要がある。ナノカーネル環境において２つのオペレーティングシステム（１つは１次、１つは２次）のみを実行する場合、ｒ０〜ｒ９レジスタ保存は完全に回避することができる。
【０２０２】
ナノカーネルは、一般的な（最適化されない）割り込み転送（間接割り込みハンドラ起動に先立ってすべてのレジスタが保存された場合）と、最適化された割り込み転送の、両方をサポートする。正しい実施は、１次オペレーティングシステムに依存し、対応する構成．ｘｍｌファイル内で選択することが可能である。
【０２０３】
５．２次実行環境
基本的に２次オペレーティングシステムカーネル実行環境は、割り込み管理を除いて、ネイティブなものにかなり近い。ナノカーネル環境は、２次オペレーティングシステムを他のオペレーティングシステムによって完全にプリエンプトできるようにするために、割り込み管理のネイティブメカニズムを修正する。ナノカーネルアーキテクチャに移植された２次オペレーティングシステムカーネルは、もはやプロセッサレベルでの割り込みを使用不可とせず、むしろナノカーネルによって提供されるソフトウェア割り込みメカニズムを使用する（すなわち仮想例外）。割り込みは、もはやこうした２次オペレーティングシステムカーネルによって直接処理されず、むしろナノカーネルによって遮断され、１次オペレーティングシステムカーネルに転送される。必要であれば、今度は１次オペレーティングシステムが、２次オペレーティングシステムに関するｉｎｔｅｒｒｕｐｔ  ＶＥＸを生成することになる。このｉｎｔｅｒｒｕｐｔ  ＶＥＸは、マスキング解除された場合は２次間接割り込みハンドラによって即時に処理され、マスキングされた場合は据え置かれることになる。
【０２０４】
５．１  初期設定
ナノカーネルは、初期設定時に２次メモリバンクを１次バンクと共にインストールする。他方で、２次カーネルの最終的な初期設定は、初期設定後の段階まで据え置かれる。
【０２０５】
この段階で、ナノカーネルは、２次メモリバンクのコピーを維持するためにメモリを割り振る。その後、こうしたコピーを使用して、再始動時に２次システムの初期イメージを復元する。しかしながら２次システムの再始動はオプションであり、物理メモリの消費を削減するために使用不可とされる可能性がある。
【０２０６】
１次カーネルと同様に、オペレーティングシステムコンテキストがスーパバイザモードでバンクスタックポインタレジスタに渡される。他方で、１次カーネルとは異なり、たとえ２次カーネル初期設定段階であっても、ハードウェア割り込みは使用可能とされる。明らかに、対応する２次ｉｎｔｅｒｒｕｐｔ  ＶＥＸは使用不可とされる。２次カーネル初期設定コードでさえも、１次システムによって完全にプリエンプト可能であることに留意されたい。これは、２次オペレーティングシステムが再始動された場合に１次オペレーティングシステムを妨害しないために、特に重要である。
【０２０７】
ハードウェア割り込みが使用可能とされたにもかかわらず、２次カーネルが開始された場合、仮想例外（ハードウェア割り込みに対応する）は使用不可である。したがって、割り込みは、クリティカル初期設定段階の終わりにカーネルによって明示的に使用可能化されるまで、ナノカーネルによって送達されない。（仮想例外に基づく）ソフトウェア割り込みマスキングメカニズムについて、本書でさらに詳細に説明する。
【０２０８】
２次オペレーティングシステムは、ＭＭＵの使用可能化で開始される。ナノカーネルコンテキストは、初期メモリコンテキストとして使用される。こうした初期の１対１マッピングは、一時的に２次カーネルに提供される。このマッピングは修正されないか、または初期設定コードによって永続的に使用されるべきであり、代わりに、２次カーネルがそれ自体のＫＶマッピングを構築し、可能な限り迅速にこれに切り替えるべきであることに留意されたい。
【０２０９】
通常、２次カーネルは、初期設定コードを実行するためにデータセクションに配置された静的な初期スタックを使用する。
【０２１０】
１次カーネルと同様、通常、初期設定段階中に、２次カーネルは例外ハンドラおよび割り込みハンドラをインストールするためにナノカーネルを起動する。最終的に、２次カーネルはアイドルループに入り、ナノカーネルアイドルトラップを起動する。
【０２１１】
５．２  ２次例外
基本的に、ナノカーネルは、２次オペレーティングシステムがプロセッサ上で実行中の場合に生じる例外を遮断しない。すべてのプログラミング例外は、ネイティブ２次例外ハンドラによって処理される。ナノカーネルは、対応する例外ハンドラにジャンプするために、小さなプロローグコードのみを実行する。ＡＲＭナノカーネルアーキテクチャへ移植する場合、２次低レベルハンドラを修正する必要はない。
【０２１２】
バンクスタックポインタレジスタは、未定義命令、プリフェッチ打ち切り、およびデータ打ち切りのハンドラの場合、ナノカーネルプロローグコードによってスクラッチされることに留意されたい。ソフトウェア割り込みハンドラ用のバンクスタックポインタレジスタは、そのままで維持される。
【０２１３】
５．３  仮想例外
仮想例外（ＶＥＸ）は、オペレーティングシステムカーネルが例外をオペレーティングシステムカーネルに通知し、これを据え置かれた方法で送達できるようにする、ナノカーネルによって提供されるメカニズムである。具体的に言えば、ＶＥＸメカニズムは、ハードウェア割り込みを２次オペレーティングシステムカーネルに関するソフトウェア割り込みに置き換えるために、ＡＲＭナノカーネルアーキテクチャで使用される。
【０２１４】
ＶＥＸインターフェースは、カーネルコンテキスト内に配置された、ｐｅｎｄｉｎｇおよびｅｎａｂｌｅｄという２つのフィールドからなる。これらのフィールドは、２次オペレーティングシステムコンテキストにとってのみ有意であるが、１次と２次、両方のオペレーティングシステムカーネルによってアクセスされる。
【０２１５】
すべての仮想例外は、本来、ｐｅｎｄｉｎｇ（またはｅｎａｂｌｅｄ）フィールド内のビット位置によって列挙される。したがって、ＡＲＭアーキテクチャ上には合計３２の可能な仮想例外が存在する（ｐｅｎｄｉｎｇおよびｅｎａｂｌｅｄフィールドは３２ビットの整数値である）。
【０２１６】
ＡＲＭアーキテクチャ上でナノカーネルによってサポートされる仮想例外は、割り込み、高速割り込み、相互割り込み、および「実行中」の４つのみである。
【０２１７】
以下の表は、仮想例外が実際の例外にどのようにマッピングされるかを示す。
【表１】
2008510238.tif 000003
【０２１８】
仮想例外「実行中」はいかなる実際の例外にも対応せず、実際は、カーネルがアイドルであるかどうかを検出するためにナノカーネルによって内部的に使用される擬似仮想例外である。こうした擬似仮想例外がどのような働きをするかについて、本書でさらに詳細に説明する。
【０２１９】
複数の仮想例外を同時に保留できるが、一度に処理できるのはそれらのうちの１つのみであるため、すべての仮想例外はその番号に従って優先順位付けされる。最高の優先順位は高速割り込みＶＥＸに割り当てられ、最低の優先順位は「実行中」ＶＥＸに割り当てられる。
【０２２０】
２次コンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールドは、通常、割り込みコントローラにドライバを提供する１次カーネルによって更新される。こうしたドライバは、通常、ｐｅｎｄｉｎｇ  ＶＥＸフィールドに適切なビットを設定することによって、仮想例外を２次カーネルに通知する。
【０２２１】
ｅｎａｂｌｅｄ  ＶＥＸフィールドは、仮想例外を使用可能または使用不可にするために、２次カーネルによって更新される。所与の仮想例外は、対応するビットがｅｎａｂｌｅｄ  ＶＥＸフィールドに設定された場合、使用可能とされる。ｅｎａｂｌｅｄ  ＶＥＸフィールドを使用して、２次カーネルは、割り込みに対して保護されたクリティカルセクションを実施する。言い換えれば、２次カーネルは、プロセッサ割り込みを使用不可／使用可能とするために、それ以上ＣＰＳＲレジスタを操作せず、むしろそのカーネルコンテキストのｅｎａｂｌｅｄ  ＶＥＸフィールドを修正する。
【０２２２】
所与の仮想例外は、同時に保留および使用可能化された場合、ナノカーネルによって送達される。ナノカーネルは、ＶＥＸハンドラにジャンプする直前に、対応する保留ビットをリセットする。
【０２２３】
すべてのＶＥＸハンドラが、実際には間接ハンドラであることに留意されたい。それらは、ｒ１０〜ｒ１５レジスタおよびｃｐｓｒレジスタがすでにオペレーティングシステムコンテキストに保存された状態で、スーパバイザモードでナノカーネルによって起動される。ｒ１０は、このコンテキストへのポインタを含む。
【０２２４】
２次カーネルをＡＲＭナノカーネルアーキテクチャ上に移植する場合、ハードウェア割り込みを置き換えるソフトウェア割り込みマスキングメカニズムを考慮するために、低レベル例外ハンドラを依然として修正しなければならない。割り込みハンドラを呼び出す場合、ナノカーネルは、すべての仮想例外が対応する値をｅｎａｂｌｅｄフィールドに書き込むのを使用不可にするだけである。ハードウェア割り込みは、２次オペレーティングシステムを実行している場合、プロセッサレベルで常に使用可能とされるため、低レベル割り込みハンドラ内部であっても１次オペレーティングシステムによってプリエンプトすることができる。このような方法では、ナノカーネル環境において、２次オペレーティングシステムは１次オペレーティングシステムによって完全にプリエンプト可能になる。
【０２２５】
仮想例外は、使用不可状態にある間、１次オペレーティングシステムカーネルによって通知可能である。この場合、例外は２次オペレーティングシステムカーネルに送達されず、むしろ仮想例外が再度使用可能になるまで保留されたままである。したがって、仮想例外が２次オペレーティングシステムカーネルによって再度使用可能になった場合、保留中の仮想例外が存在するかどうかをチェックすべきである。チェックが肯定である場合、２次オペレーティングシステムカーネルは、こうした保留中の仮想例外を処理するために、ナノカーネルを起動すべきである。
【０２２６】
一般に２次カーネルは、以下の２つの場合に、仮想例外を再度使用可能にする。
・コードのクリティカルセクションを保護するために、仮想例外が２次カーネルによってあらかじめ使用不可とされている場合
・間接的な割り込みハンドラの起動の結果として、仮想例外がナノカーネルによって使用不可とされている場合
【０２２７】
５．４  ナノカーネルの再入力
ナノカーネルコードは、ほとんどの場合、ナノカーネルへの再入力を防ぐようにプロセッサレベルで割り込みを使用不可とした状態で実行される。他方で、一部のナノカーネルの起動は長時間かかる場合があるため、１次割り込みの待ち時間を短く維持するために、こうした長い動作を実行する場合、ナノカーネルは割り込みを使用可能にしなければならない。
【０２２８】
長いナノカーネルの動作には、以下の２種類がある。
・同期コンソール出力
動作の持続時間は、シリアルライン速度に依存する。たとえば、９６００ボーレートラインでは、単一文字の出力に最高で１ミリ秒かかる場合がある。
・２次カーネル再始動
動作の持続時間は、コピーから復元されるカーネルイメージサイズに依存する。
【０２２９】
上記に列挙したすべての動作について、ナノカーネルは、割り込み、したがって１次カーネルからの再入力を使用可能にする。他方で、割り込みが使用可能な間、１次割り込みハンドラから戻る場合に他の２次カーネルがスケジューリングされるのを防ぐために、ナノカーネルスケジューラは使用不可となる。言い換えれば、ナノカーネルは（割り込みの結果として）１次カーネルのみによってプリエンプトすることが可能であるが、２次カーネルからの再入力は禁止される。こうした制約により、ナノカーネルは、２次実行環境のためにグローバルリソースを使用することができるようになる。
【０２３０】
２次カーネルから発行される長い動作の中には、１次メモリコンテキストで実行可能なものがある。言い換えれば、こうした動作を実行する前に、ナノカーネルは１次実行コンテキストに切り替えて、割り込みを使用可能にする。動作が完了すると、ナノカーネルは割り込みを使用不可にし、ナノカーネルスケジューラを介して呼び出し元の２次カーネルに戻る。
【０２３１】
１次実行環境への、または１次実行環境からの切り替えによって導入される、余分なオーバヘッドを避けるために、ナノカーネルメモリコンテキストで頻繁に使用されるナノカーネルメソッドを実行することが（たとえ１次メモリコンテキストでも実行可能な場合であっても）好ましいことにも留意されたい。こうした頻繁な動作の典型的な例が、ナノカーネルコンソール上での同期出力である。
【０２３２】
６．スケジューラ
オペレーティングシステムスケジューラの主な役割は、次に実行するタスクを選択することである。ナノカーネルがオペレーティングシステムの実行を制御するため、ナノカーネルスケジューラは次に実行する２次オペレーティングシステムを選択する。言い換えれば、ナノカーネルはシステム全体に特別なスケジューリングレベルを追加する。
【０２３３】
ナノカーネルアーキテクチャでは、１次オペレーティングシステムが、２次システムに対して高い優先順位レベルを有し、１次システムがアイドルループにある場合にのみＣＰＵが２次システムに与えられることに留意されたい。１次カーネルはプリエンプト可能ではなく、アイドルループと呼ばれるアイドルメソッドを介してナノカーネルスケジューラを明示的に起動するということが言える。２次システム実行中に割り込みが発生すると、１次カーネル割り込みハンドラが起動される。１次カーネルの観点から見れば、こうした割り込みはアイドルループを実行している背景スレッドをプリエンプトする。割り込みが処理され、すべての関係タスクが実行されると、１次カーネルはナノカーネルに戻り、ナノカーネルは次に実行する２次システムを決定するためにナノカーネルスケジューラを起動する。１次カーネルの観点から見れば、カーネルは割り込みによってプリエンプトされた背景スレッドに戻るだけである。２次アクティビティは１次カーネルに対してトランスペアレントであり、１次システムの挙動を変更することはない。
【０２３４】
ナノカーネルは異なるスケジューリングポリシーを実施することができる。しかしながら、デフォルトでは、優先順位に基づくアルゴリズムが使用される。同じ優先順位レベルでは、ナノカーネルはラウンドロビンスケジューリングポリシーを使用することに留意されたい。所与の２次カーネルの優先順位は、システムイメージの構築時に静的に構成される。
【０２３５】
どのようなスケジューリングポリシーが実施されても、スケジューラは所与の２次システムの実行準備が完了しているかどうかを検出しなければならない。この条件は、カーネルコンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールドとｅｎａｂｌｅｄ  ＶＥＸフィールドの間のビット単位論理および演算として計算される。非ゼロの結果は、システムの実行準備が完了していることを示す。
【０２３６】
前述のように、ｐｅｎｄｉｎｇ  ＶＥＸとｅｎａｂｌｅｄ  ＶＥＸのペアにおける各ビットは、仮想例外を表す。実行準備完了の基準を言い換えると、少なくとも１つのマスキングされていない保留中の仮想例外がある場合、２次システムは実行準備完了状態にあると言える。
【０２３７】
通常はハードウェアおよびソフトウェアの（相互）割り込みにマッピングされるすべての仮想例外の中に、カーネルが現在アイドルであるかどうかを示す特別な仮想例外（ｒｕｎｎｉｎｇ）が存在する。
【０２３８】
ｒｕｎｎｉｎｇビットは２次カーネルがアイドルメソッドを起動するごとにｐｅｎｄｉｎｇ  ＶＥＸフィールド内で消去され、ｒｕｎｎｉｎｇビットは仮想例外が２次カーネルに送達されるごとにｐｅｎｄｉｎｇ  ＶＥＸフィールド内でセットされる。
【０２３９】
ｒｕｎｎｉｎｇビットは、通常は、実行中の２次カーネルについてｅｎａｂｌｅｄ  ＶＥＸフィールド内で常にセットされる。ナノカーネルは、２次カーネルが開始された場合にこのビットをセットし、２次カーネルが停止された場合にこのビットをリセットする。２次カーネルは、マスキング／マスキング解除割り込みが仮想例外にマッピングされた場合、ｒｕｎｎｉｎｇビットを消去すべきではない。
【０２４０】
外部エージェントは、そのカーネルコンテキスト内のｅｎａｂｌｅｄ  ＶＥＸフィールドを消去／復元することによって、２次カーネルの例外を中断／再開できることに留意されたい。この機能は、１次カーネルタスクとして、スケジューリングポリシーエージェントがナノカーネル外部で実施されることになる可能性をオープンする。加えて、２次カーネル用のデバッグエージェントを１次カーネルに加えられるタスクとしても実行できるようにする。こうした２次デバッグエージェントの利点は、１次オペレーティングシステムによって提供されるすべてのサービスがデバッグ（たとえばネットワーキングスタック）に使用できるようになること、および２次カーネルのデバッグが１次オペレーティングシステム上で実行中のクリティカルタスクと同時に実行できることである。
【０２４１】
７．相互割り込み
本セクションでは、ナノカーネル相互割り込みメカニズムに関する（前述のセクションですでに説明した）情報をほぼ統合する。
【０２４２】
ここでは、以下の２種類の相互割り込みについて考察する。
・２次オペレーティングシステムカーネルに送信される相互割り込み
・１次オペレーティングシステムカーネルに送信される相互割り込み
【０２４３】
相互割り込みを宛先２次オペレーティングシステムに送信するために、ソースオペレーティングシステムカーネルは第１に、オペレーティングシステムコンテキストのｐｅｎｄｉｎｇ  ＸＩＲＱフィールドによって示される相互割り込みテーブルに対応するビットをセットする。その後、ソースオペレーティングシステムカーネルは、宛先オペレーティングシステムコンテキストのｐｅｎｄｉｎｇ  ＶＥＸフィールドに対応するビットをセットしている宛先オペレーティングシステムに、ｃｒｏｓｓ  ｉｎｔｅｒｒｕｐｔ  ＶＥＸを通知する。相互割り込みハンドラはナノカーネルによって呼び出されると、ｐｅｎｄｉｎｇ  ＸＩＲＱフィールドをチェックし、保留中の相互割り込みソースに対応するビットを消去し、最終的にこのソースに接続されたハンドラを起動する。ソースと宛先のどちらのオペレーティングシステムカーネルも、アトミック命令を使用してｐｅｎｄｉｎｇ  ＸＩＲＱフィールドを更新する。１次および２次のどちらのタイプのソースオペレーティングシステムカーネルも、同じアルゴリズムを使用することに留意されたい。
【０２４４】
相互割り込みを１次オペレーティングシステムに送信するために、２次オペレーティングシステムカーネルは第１に、オペレーティングシステムコンテキストのｐｅｎｄｉｎｇ  ＸＩＲＱフィールドによって示される相互割り込みテーブルに対応するビットをセットする。ナノカーネルは、２次オペレーティングシステムを即時にプリエンプトして、１次低レベル相互割り込みハンドラを起動し、これがｐｅｎｄｉｎｇ  ＸＩＲＱフィールドをチェックし、保留中の相互割り込みソースに対応するビットを消去し、最終的にこのソースに接続されたハンドラを起動する。
【０２４５】
オペレーティングシステムカーネルは、相互割り込み番号ゼロを使用してはならない。この割り込みは、停止されたオペレーティングシステムが開始されたこと、または実行中のオペレーティングシステムが停止されたことを、ナノカーネルがオペレーティングシステムに通知するために予約される。言い換えれば、相互割り込み番号ゼロは、実行中のオペレーティングシステムに、グローバルシステムの構成が変更されたことを通知する。これは、オペレーティングシステムコンテキスト内のｒｕｎｎｉｎｇフィールドの状態が変更されるごとに、すべての実行中のオペレーティングシステムにブロードキャストされる。
【０２４６】
他の態様および実施形態
前述の内容から、前述の諸実施形態が単なる例であること、および多くの他の実施形態が可能であることが明らかとなろう。前述のオペレーティングシステム、プラットフォーム、およびプログラミングの技法は、すべて自由に変更することができる。当業者にとって明らかとなるであろう任意の他の修正形態、置換形態、および変形形態は、特許請求の範囲でカバーされているか否かにかかわらず、本発明の範囲内にあるものとみなされるべきである。疑いを避けるために、本明細書に開示された任意およびすべての新規な主題およびそれらの組合せに対する保護が求められる。
【図面の簡単な説明】
【０２４７】
【図１】本発明が実行可能なコンピュータシステムの要素を示すブロック図である。
【図２ａ】従来技術におけるソフトウェアの構成を示す図である。
【図２ｂ】本発明に従ったソフトウェアの構成を示す対応図である。
【図３】図１のコンピュータ向けに図２ｂのソフトウェアを作成する際の段階を示す流れ図である。
【図４】図２ｂの一部を構成するハードウェアリソースディスパッチャの構成要素を示す図である。
【図５】ブートおよび初期設定シーケンスで使用されるプログラムを示す図である。
【図６】ブートおよび初期設定プロセスで使用されるシステムメモリイメージを示す図である。
【図７】１次オペレーティングシステムから２次オペレーティングシステムへの移行を示す図である。
【図８】２次オペレーティングシステムから１次オペレーティングシステムへの移行を示す図である。
【図９】（ａ）は本発明に従った、異なるオペレーティングシステム上で実行するアプリケーション間での通信を示す図であり、（ｂ）は本発明に従った、異なるコンピュータ上の異なるオペレーティングシステム上で実行するアプリケーション間での通信を示す図である。
【図１０】オペレーティングシステムによって使用されるメモリマッピングを示す図である。
【図１１】ナノカーネルとオペレーティングシステムとの間のインターフェースを示す図である。
【図１】
2008510238.tif 000004
【図２ａ】
2008510238.tif 000005
【図２ｂ】
2008510238.tif 000006
【図３】
2008510238.tif 000007
【図４】
2008510238.tif 000008
【図５】
2008510238.tif 000009
【図６】
2008510238.tif 000010
【図７】
2008510238.tif 000011
【図８】
2008510238.tif 000012
【図９】
2008510238.tif 000013
【図１０】
2008510238.tif 000014
【図１１】
2008510238.tif 000015
【手続補正書】
【提出日】平成19年4月20日(2007.4.20)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数の異なるオペレーティングシステムが同じコンピュータ上で同時に実行できるようにする方法であって、
相対的に高い優先順位を有するように第１のオペレーティングシステムを選択するステップと、相対的に低い優先順位を有するように少なくとも１つの第２のオペレーティングシステムを選択するステップと、
所定の条件の下で、前記オペレーティングシステム間で切り替えるように構成された共通プログラムを提供するステップと、
前記第１および第２のオペレーティングシステムが前記共通プログラムによって制御できるようにするために、それらに対する修正を提供するステップと
を含む方法。
【請求項２】
前記第１のオペレーティングシステムがリアルタイムオペレーティングシステムである、請求項１に記載の方法。
【請求項３】
前記第２のオペレーティングシステムが非リアルタイムの汎用オペレーティングシステムである、請求項１に記載の方法。
【請求項４】
前記第２のオペレーティングシステムがＬｉｎｕｘ、あるいはそのバージョンまたは変形である、請求項１に記載の方法。
【請求項５】
前記共通プログラムが、前記オペレーティングシステム間で切り替えるために必要なプロセッサ状態を保存するように、および保存されたバージョンから復元するように構成された、請求項１に記載の方法。
【請求項６】
前記第２のオペレーティングシステムに関するプロセッサ例外が、前記共通プログラムによって仮想様式で処理される、請求項１に記載の方法。
【請求項７】
前記共通プログラムが、何らかのプロセッサ例外を遮断するように、および前記第１のオペレーティングシステムの例外処理ルーチンを処理するために呼び出すように構成された、請求項１に記載の方法。
【請求項８】
前記第２のオペレーティングシステムに関する前記プロセッサ例外が仮想例外として通知される、請求項７に記載の方法。
【請求項９】
前記共通プログラムが、保留中の前記仮想例外に対応する前記第２のオペレーティングシステムの例外処理ルーチンを呼び出すように構成された、請求項８に記載の方法。
【請求項１０】
それぞれが排他的に動作可能な別々のメモリスペースを備えた前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１１】
それぞれが排他的アクセスを有する対象である前記コンピュータの第１の入力および／または出力デバイスを備えた、前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１２】
各オペレーティングシステムが、ほぼ未修正のネイティブルーチンを使用して前記第１の入力および／または出力デバイスにアクセスする、請求項１１に記載の方法。
【請求項１３】
それぞれが共有アクセスを有する対象である前記コンピュータの第２の入力および／または出力デバイスへのアクセスを備えた、前記オペレーティングシステムのそれぞれを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１４】
すべてのオペレーティングシステムが、前記第１のオペレーティングシステムの前記ルーチンを使用して前記第２の入力および／または出力デバイスにアクセスする、請求項１３に記載の方法。
【請求項１５】
前記第１の、または前記共通プログラムの動作に割り込むことなく、前記第２のオペレーティングシステムを再始動するための再始動ルーチンを提供するステップをさらに含む、請求項１に記載の方法。
【請求項１６】
前記共通プログラムが、前記第２のオペレーティングシステムの前記動作を制御するためのトラップ呼び出しメカニズム、および／または、前記第２のオペレーティングシステム内の状況変化を前記第１のオペレーティングシステムに通知するためのイベントメカニズムを提供する、請求項１５に記載の方法。
【請求項１７】
前記共通プログラムが、前記第２のオペレーティングシステムのカーネルのシステムイメージのコピーを格納し、このような保存されたコピーから前記第２のオペレーティングシステムの前記カーネルを復元するように構成された、請求項１５に記載の方法。
【請求項１８】
前記第１のオペレーティングシステムが、前記第２のオペレーティングシステムのクラッシュを検出できるように、前記第２のオペレーティングシステムの連続する動作を監視できるようにするための協働ルーチンを、前記第１および第２のオペレーティングシステムが有する、請求項１５に記載の方法。
【請求項１９】
前記オペレーティングシステムの前記動作において事前に定義された条件が発生すると、前記共通プログラムがマシン状態変数の状態を出力するように構成された、デバッグルーチンを提供するステップをさらに含む、請求項１に記載の方法。
【請求項２０】
前記オペレーティングシステムと共通プログラムとを単一のコード製品に組み合わせるステップをさらに含む、請求項１に記載の方法。
【請求項２１】
前記オペレーティングシステムと共通プログラムとをコンピュータ製品上の永続メモリに埋め込むステップをさらに含む、請求項１に記載の方法。
【請求項２２】
前記共通プログラムが、前記第１および第２のオペレーティングシステム、および／またはそれらの上で実行中のアプリケーションの間での通信を可能にする、オペレーティングシステム間通信メカニズムを提供するように構成された、請求項１に記載の方法。
【請求項２３】
前記共通プログラムが、通信バスブリッジに対応する仮想入力および／または出力デバイスを定義するため、結果として前記オペレーティングシステムがあたかも通信バスを介するように通信可能である、請求項２２に記載の方法。
【請求項２４】
前記オペレーティングシステムを修正する前記ステップが、前記仮想バスブリッジデバイスを管理するドライバルーチンを追加するステップを含む、請求項２３に記載の方法。
【請求項２５】
前記オペレーティングシステムのそれぞれに、前記共通プログラムに制御を渡すアイドルルーチンが提供された、請求項１に記載の方法。
【請求項２６】
前記アイドルルーチンがプロセッサ停止命令の代用を務める、請求項２５に記載の方法。
【請求項２７】
実行オペレーティングシステムの実行中にプロセッサ例外が発生すると、
（ａ）前記共通プログラムはそれらを処理するために前記第１のオペレーティングシステムの例外処理ルーチンを呼び出すように構成され、
（ｂ）前記実行が所定の第２のオペレーティングシステム向けである場合、仮想例外が作成され、
（ｃ）前記プロセッサ例外が前記第１のオペレーティングシステムによって処理された後、前記共通プログラムは前記実行オペレーティングシステムの実行に戻るように構成され、
（ｄ）前記共通プログラムが次に前記所定の第２のオペレーティングシステムに切り替えられた場合、保留中の前記仮想例外が前記所定の第２のオペレーティングシステムに通知され、前記仮想例外に対応する前記所定の第２のオペレーティングシステムの例外処理ルーチンが、これを処理するために呼び出される、
請求項１に記載の方法。
【請求項２８】
前記第２のオペレーティングシステムが割り込みをマスキングしないように修正される、請求項１に記載の方法。
【請求項２９】
すべてのハードウェア割り込みは前記第１のオペレーティングシステムによって初期に処理され、第２のオペレーティングシステム向けの割り込みは、その第２のオペレーティングシステムが次に前記共通プログラムによってスケジューリングされるまで仮想化および据え置かれ、その時点でその第２のオペレーティングシステムによって処理される、請求項１に記載の方法。
【請求項３０】
前記共通プログラムは、２次オペレーティングシステムまたはそれぞれの２次オペレーティングシステムが、前記２次システムを前記１次システムによって完全にプリエンプト可能にするために、前記２次オペレーティングシステム内のハードウェア例外マスキングコードを置き換えるように、仮想例外をマスキングするための手段を提供するように構成された、請求項８に記載の方法。
【請求項３１】
前記第２の仮想例外がマスキングされない、請求項９に記載の方法。
【請求項３２】
縮小命令セットコンピュータ（ＲＩＳＣ）システム上で実施される、前記請求項のいずれかに記載の方法。
【請求項３３】
ＡＲＭプロセッサベースシステム上で実施される、請求項３２に記載の方法。
【請求項３４】
すべてのオペレーティングシステムが同じカーネル仮想マッピングを使用する、請求項３３に記載の方法。
【請求項３５】
すべてのオペレーティングシステムが、オペレーティングシステム間の切り替えがスクラッチモードで発生した場合、前記プロセッサの実行モードの変更によって影響を受ける前記レジスタを使用する、請求項３３に記載の方法。
【請求項３６】
請求項１に記載のステップを実行するためのコードを備える、開発キットコンピュータプログラム製品。
【請求項３７】
請求項２０に従って組み合わせられたコードを備える、コンピュータプログラム製品。
【請求項３８】
請求項２４に従ってプログラムが埋め込まれた永続メモリをその中に格納させる、ＣＰＵ、メモリデバイス、および入力／出力デバイスを備える、埋め込み型コンピュータシステム。
【請求項３９】
ＣＰＵ、メモリデバイス、および入力／出力デバイスを備える、コンピュータシステムであって、
相対的に高い優先順位を有する第１のオペレーティングシステムと、相対的に低い優先順位を有する第２のオペレーティングシステムと、
所定の条件の下で、前記オペレーティングシステム間で切り替えることによって、前記オペレーティングシステムを同時に実行するように構成された共通プログラムと、
を備えるコンピュータコードをその上で実行させる、コンピュータシステム。
【請求項４０】
請求項１〜３５のいずれかに記載の方法を使用して前記第１および第２のオペレーティングシステムを同時に実行するように構成された、請求項３９に記載のコンピュータシステム。
【国際調査報告】
2008510238.tif 000016
2008510238.tif 000017
2008510238.tif 000018
2008510238.tif 000019
2008510238.tif 000020