(57)【要約】      （修正有）【課題】タスク毎に登録された例外処理をカーネルの管理の下、即時性を持って実行することができる情報処理装置を提供する。【解決手段】情報処理装置１は、複数のタスクの実行を制御するためにカーネルによって管理される記憶領域であって、各タスクがタスク毎の例外処理ルーチンを有するか否かを示す属性情報を記憶可能なTCB２５と、カーネル２１を有する。カーネル２１は、例外が発生したときにTCB２５の属性情報を参照し、例外が発生したときのタスクが、タスク毎の例外処理ルーチンを有するか否かを判定し、例外が発生したときのタスクがタスク毎の例外処理ルーチンを有しない場合は、カーネルの管理する例外処理を実行し、例外が発生したときのタスクがタスク毎の例外処理ルーチンを有する場合は、例外が発生したときのタスクの有するタスク毎の例外処理ルーチンを実行する。【選択図】図２
2008305016.tif 000002
【特許請求の範囲】
【請求項１】
システムに含まれる複数のタスクの実行を制御するためにカーネルによって管理される記憶領域であって、各タスクに対応して設けられ、前記各タスクがタスク毎の例外処理ルーチンを有するか否かを示す属性情報を記憶可能なタスク属性情報記憶部と、
例外が発生したときに前記タスク属性情報記憶部の前記属性情報を参照し、前記例外が発生したときのタスクが、前記タスク毎の例外処理ルーチンを有するか否かを判定し、前記例外が発生したときのタスクが前記タスク毎の例外処理ルーチンを有しない場合は、前記カーネルの管理する例外処理を実行し、前記例外が発生したときのタスクが前記タスク毎の例外処理ルーチンを有する場合は、前記例外が発生したときのタスクの有する前記タスク毎の例外処理ルーチンを実行する例外処理実行部と
を有することを特徴とする情報処理装置。
【請求項２】
前記タスク毎の例外処理ルーチンを有するタスクに対して、前記例外と前記例外処理ルーチンとの対応付けるための対応情報が設けられていることを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記タスク毎の例外処理ルーチンを前記対応情報に登録するためのアプリケーションプログラムインターフェースを有することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記タスクが複数存在しかつライブラリルーチンを共有する場合、該ライブラリルーチン内で定義される専用の例外処理ルーチンは、前記ライブラリルーチンを呼び出したタスクの前記対応情報に基づいて決定されることを特徴とする請求項２に記載の情報処理装置。
【請求項５】
前記対応情報は、前記システムの初期化時において、前記例外と前記カーネルの管理する例外処理ルーチンとの対応付けるためのカーネルの対応情報をコピーすることにより、前記タスク制御ブロックに記憶されることを特徴とする請求項３に記載の情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置に関し、特に、例外処理機能を有する情報処理装置に関する。
【背景技術】
【０００２】
従来より、コンピュータにおいてはいわゆる例外処理が行われている。例外処理とは、通常、中央処理装置（以下、CPUという）がプログラムを実行中に発生するもので、プロセスの中断をともなう。いわゆる例外処理には、２つのタイプがある。１つは、アプリケーションプログラムの継続的な実行を保証するための処理の実行要求をイベントとしてカーネル(本書において用語”カーネル”はいわゆる”オペレーティングシステム”或いは”OS”と同じ意味で用いられる)に通知するものであって、カーネルは発生したイベント、即ち例外要因、に対応する例外処理を起動するものである。この例外処理によって、発生した例外に対し適切な処理が施され、適切な処理が施された後、例外の発生元であるアプリケーションプログラムの実行が継続される。もう１つは、異常の検出であって、カーネルは発生したイベント、即ち、例外要因に対し、システム全体を停止させるべきか、或いは、例外を発生させたアプリケーションプログラムのみを停止すべきかを判断し、適切な処理を施すものである。どちらの例外処理もアプリケーションプログラムやシステムそれ自身を機能させるために、或いは、安定的に動作させるために重要な処理となる。
【０００３】
一般に、例外処理では、発生し得る例外の要因１つに対し、対応する１つの専用の例外処理ルーチンが割り当てられる。この例外処理ルーチンは、システムによって規定されるものであって、アプリケーションプログラムが例外処理の内容を規定するものではない。
【０００４】
例えば、MIPSアーキテクチャにおける例外処理の一般的な流れは次のようになる。先ず、タスクの実行中に例外が発生すると、ハードウェアであるプロセッサが例外の発生を検知し、例外の発生した時点において実行されていた命令の仮想アドレスがEPCレジスタに記録される。さらに、発生した例外の種別である例外コードがCauseレジスタの所定のフィールドに記録される。なお、このとき、例えば、アドレスの参照行為が例外の発生原因である場合には、BadVaddrレジスタにその参照先のアドレスが記録される。CPUの状態を制御するStatusレジスタには、例外状態を示すEXLbitが立ち、CPUの実行状態は、カーネルモードへと遷移する。以上が例外発生時のCPU内のコプロセッサレジスタの基本動作である。
【０００５】
一方、ソフトウェアであるカーネルの基本動作は次のようになる。タスクの実行中に例外が発生すると、プロセッサにおいて例外の発生したアドレスがEPCレジスタに記録される。このとき、プログラムカウンタ（以下、PCという）は例外ベクタと呼ばれる所定のアドレスに遷移する。このアドレス遷移により、カーネルは例外の発生を検知し、例外処理を開始する。
【０００６】
カーネルは、コンテキストを退避させ、Causeレジスタに格納されている発生した例外の例外コードを読み出し、発生した例外の種類を特定して、発生した例外の例外コードに対応する例外処理を実行する。カーネルは、例外処理の実行が終わると、コンテキストを戻して例外処理からの復帰処理を実行する。これにより、例外の発生元のタスクに復帰してタスクの実行が継続される。
【０００７】
実行される例外処理は、システム起動時に所定のアプリケーションプログラムインターフェイス（以下、APIという）を用いて登録された処理ルーチンである。ここでは、登録された例外処理の管理がテーブルによってなされていると仮定する。つまり、例外処理の登録は、この管理テーブルに対する例外処理ルーチンのアドレスの登録行為であって、この例外処理管理テーブルの参照は、例外コードをオフセット値として行われる。この例外処理管理テーブルは、カーネルによって管理され、例外処理管理テーブルを、アプリケーションプログラムが直接参照することは通常許されていない。
【０００８】
例外処理ルーチンはシステムの初期化段階においてカーネルに対し専用の手段によって登録される。例えば、μITRON仕様のカーネルであれば、”def_exc()”というAPIが例外処理の登録用に規定されている。このAPIの目的は、１つの例外要因に対して１つの例外処理ルーチンを対応付けることであって、この対応付けはシステムにおいて共通となる。
【０００９】
ところが、以上のような一般的な例外処理の実装においては、システム上で動作するアプリケーションプログラムが決まらないうちに、システムに例外処理が実装されることもある。そのため、システム上において動作するアプリケーションプログラムの特性及び要求を全て満たす例外処理を実装することは不可能である。つまり、システムが提供する各例外処理の処理内容と個別のアプリケーションプログラムが必要とする例外処理に対する要求は必ずしも一致しないこともある。
【００１０】
例えば、整数演算におけるオーバーフローが発生した場合、システムのオーバーフローに対する処理が例外の無効化とアプリケーションプログラムの継続処理とであったと仮定する。一方、あるアプリケーションプログラムにおいては、そのプログラム中の整数演算について飽和演算として扱いたいというニーズがあったと仮定する。より具体的に述べると、そのアプリケーションプログラムにおいて整数演算のオーバーフローが発生した場合、整数演算を強制終了し、更に、演算結果を特定の上限値として出力させる必要があるとする。すなわち、この場合は、システムに実装された例外処理とアプリケーションプログラムの要求する例外処理とのニーズが一致しない例である。
【００１１】
このような問題に対し、例えばμITRON4.0仕様においてタスク例外処理という機能が規定されている。この機能は、実行中のタスク個別に定義されたタスク例外処理を実行要求された時点において、そのタスクコンテキスト上において実行、すなわちそのタスク自らが実行するための仕組みによって実現される。
【００１２】
しかしながら、アプリケーションプログラムの実行にかかわる例外処理とは、例外が発生した時点において適切に処理される必要があり、アプリケーションに依存する側面とアーキテクチャに依存する側面とを併せ持つ処理である。
【００１３】
従って、スタック、ヒープ等のタスクコンテキスト上において動作するコードとして個別の例外処理が規定することも可能であるが、そもそも例外処理は、即時性の観点からカーネルモードによって動作する特権ルーチンとすべきであり、更には、カーネルの権限を越えてカーネルの処理すべき例外処理がブロックされるべきではない。
【００１４】
従来より、システムが提供する例外処理とアプリケーションプログラムが必要とする例外処理との不一致については問題視されている。そのため、複数の例外処理に対し識別子（以下、IDという）を付与し、その個別にIDが付与された複数の例外処理を管理するハードウェアが提案されている（例えば、特許文献１参照）。
【００１５】
この提案によると、ソフトウェアは例外処理のIDをそのハードウェアに登録すると、該当する例外が発生した時に、発生した例外に対応するIDが参照され、参照されたIDと一致する例外処理が選択され、メモリへロードされる。その結果、ソフトウェアが必要とする例外処理がCPUによって実行され得る。
【００１６】
この場合、システム設計時に静的にIDを例外処理に付与し、IDが付与された例外処理を複数のソフトウェア間において共有する。そのため、ソフトウェアを含めたシステム構成は限定的になるという問題がある。
【００１７】
また、アプリケーション毎に実装する例外処理をアーキテクチャに非依存なレベルまで抽象化し、複数の例外処理環境を容易に組み込むことが可能なデータ処理方法が提供されている（例えば、特許文献２参照）。
【００１８】
この提案によると、アプリケーション毎に実装する例外処理は、アーキテクチャに非依存なレベルまで抽象化される。そして、例外が発生すると、カーネルオブジェクトとアプリケーション内の例外要求メッセージ受信オブジェクトとの間に例外の発生を通知するための通信が発生し、更に、例外要求メッセージ受信オブジェクトが、例外処理の実体であるオブジェクトに例外処理要求を送信するというオーバーヘッドが発生する。この方法によると、移植性は向上するが、本来、例外処理が担うアーキテクチャに依存した処理を実行できないという問題がある。
【００１９】
また、例外が発生したPCのアドレスを基にカーネルが対応する例外処理を選択する情報処理装置が提供されている（例えば、特許文献３参照）。
【００２０】
しかし、この提案によると、１つの例外要因に対し、アドレス毎に例外処理を規定することが可能となるが、アドレスに一致する例外処理の検索が膨大となり、例外の発生から対応する処理の起動までの時間を保証できないという問題がある。
【特許文献１】特開２００３−５８３８１号公報
【特許文献２】特開平１１−５３２２３号公報
【特許文献３】特開平７−４４３９８号公報
【発明の開示】
【発明が解決しようとする課題】
【００２１】
そこで、本発明は、タスク毎に登録された例外処理をカーネルの管理の下、即時性を持って実行することができる情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００２２】
本発明の一態様によれば、システムに含まれる複数のタスクの実行を制御するためにカーネルによって管理される記憶領域であって、各タスクに対応して設けられ、前記各タスクがタスク毎の例外処理ルーチンを有するか否かを示す属性情報を記憶可能なタスク属性情報記憶部と、例外が発生したときに前記タスク属性情報記憶部の前記属性情報を参照し、前記例外が発生したときのタスクが、前記タスク毎の例外処理ルーチンを有するか否かを判定し、前記例外が発生したときのタスクが前記タスク毎の例外処理ルーチンを有しない場合は、前記カーネルの管理する例外処理を実行し、前記例外が発生したときのタスクが前記タスク毎の例外処理ルーチンを有する場合は、前記例外が発生したときのタスクの有する前記タスク毎の例外処理ルーチンを実行する例外処理実行部とを有することを特徴とする情報処理装置を提供することができる。
【発明の効果】
【００２３】
本発明の情報処理装置によれば、タスク毎に登録された例外処理をカーネルの管理の下、即時性を持って実行することができる。
【発明を実施するための最良の形態】
【００２４】
以下、図面を参照して本発明の実施の形態を説明する。  
（第１の実施の形態）  
まず図１及び図２に基づき、本実施の形態に係る情報処理装置の構成を説明する。図１は、本実施の形態に係る情報処理装置のハードウェアの構成を示す構成図である。
【００２５】
本実施の形態の情報処理装置１は、CPU１１と、RAM１２と、ROM１３と、入力インターフェイス（以下、入力I/Fという）１４と、出力インターフェイス（以下、出力I/Fという）１５と、通信インターフェイス（以下、通信I/Fという）１６と、バス１７とを備えて構成されている。CPU１１と、RAM１２と、ROM１３と、入力I/F１４と、出力I/F１５と、通信I/F１６とは、互いに、バス１７を介して接続されている。また、入力部１８としてのキーボード及びマウスが入力I/F１４に接続され、出力部１９としてのディスプレイ及びプリンタが出力I/F１５に接続されている。
【００２６】
ユーザが入力部１８を操作すると、入力部１８から出力される信号が入力I/F１４及びバス１７を介してCPU１１へ入力される。CPU１１は、入力された信号に基づきRAM１２上の対応するプログラムを実行する（同RAM１２上のプログラムはシステムの起動時にROM１３に格納されていたプログラムを展開したものであったり、必要に応じてハードディスクドライブのような外部記憶装置に格納されていたプログラムを上記入力に応じて動的に展開するものであったりする）。その後、プログラムの実行結果は、バス１７及び出力I/F１５を介して出力部１９へ出力される。従って、ユーザが入力部１８から実行すべきアプリケーションプログラムを指定すると、その指定されたアプリケーションプログラムがCPU１１によって実行され、その実行結果が出力部１９に出力される。
【００２７】
図２は、本実施の形態に係る情報処理装置のソフトウェアの構成を示すブロック図である。情報処理装置１は、図２に示すように、CPU１１と、CPU１１上において実行されるプログラム群とから構成されているアプリケーションシステムである。そのシステムにおいて実行されるプログラム群は、カーネル２１と、カーネル２１上に設けられたAPI２２と、API２２上に設けられた複数のタスク２４ａ〜２４ｎと、システムの例外処理プログラム２６と、割り込みサービスルーチン（以下、ISRという）２７とを含んで構成されている。
【００２８】
システムの例外処理プログラム２６は、後述するclassic属性のタスクの例外処理を実行するためのプログラムが記述されている。ISR２７は、カーネルによって検出された割り込みの要因に対応して実行される割り込み処理ルーチン(Interrupt Service Routine)である。
【００２９】
また、タスク２４ｂは、タスク内に定義された同タスク専用の例外処理プログラム２３を有する。例外処理プログラム２３は、後述するenhanced属性のタスクの例外処理を実行するためのプログラムが記述されている。
【００３０】
複数のタスク２４ａ〜２４ｎは、それぞれカーネル２１がタスクの制御を行うことを目的とした所定のデータ構造を有するタスク制御部ブロック（以下、TCBという）２５ａ〜２５ｎを含んで構成されている。
【００３１】
TCB２５ａ〜２５ｎは、後述するように、カーネルによって管理される記憶領域である。TCB２５ａ〜２５ｎには、各タスクに対応して設けられ、各タスクがタスク毎の例外処理ルーチンを有すか否かを示す属性情報と、発生した例外と例外処理ルーチンとの対応を示す対応情報とが記憶される。対応情報は、テーブル形式の情報として、例外処理管理テーブルに記憶される。従って、TCB２５ａ〜２５ｎは、タスクの属性情報を記憶するタスク属性記憶部を構成する。
【００３２】
また、カーネル２１は、システム全体の例外処理、すなわちカーネルが管理する例外処理ルーチンを実行するための、発生した例外と例外処理ルーチンとの対応を示す対応情報が記憶された例外処理管理テーブル２１ｔを有する。
【００３３】
カーネルがアプリケーションに対して提供する機能であるAPI２２及びカーネル自身は、TCB２５ａ〜２５ｎへのタスクコンテキストの保存、タスクの属性及び状態の記述、特定の状態を管理するためのキューへの接続等を行う。  
例えば、μITRON仕様のカーネルが提供するタスク生成に関するAPIとして、”cre_tsk()”が規定されている。プログラマは、この”cre_tsk()”を用い、プログラマが作成した関数をタスクとしてカーネルに登録する。このAPIが実行されると、タスクの属性に合わせたコンテキストの初期化及びスタック領域の確保が行われ、その生成されるタスクの属性を上記APIの引数として記述することができる。
【００３４】
本実施の形態では、タスクの属性が拡張され、従来のタスクにはclassic属性が付与され、本実施の形態の対象となるタスクにはenhanced属性が付与される。タスク生成時にenhanced属性が付与された場合、TCBが拡張され、カーネルの有する例外処理管理テーブル２１ｔと同じ構造のテーブルがコピーされ、TCBに追加される。すなわち、enhanced属性のタスクのコンテキストの初期化時に、カーネルの有する例外処理管理テーブル２１ｔの内容がコピーされて、enhanced属性のタスクのTCB上に構成された例外処理管理テーブルに登録される。ゆえに、enhanced属性のタスクの生成は、システムが提供する例外処理プログラムのカーネルへの登録完了後に実施しなければならないという制約条件が存在する。この制約条件は、enhanced属性のタスクがシステムの構成要素ではなく、アプリケーションプログラムである前提があり、実質制約とはならない。
【００３５】
以上のように、タスク固有の例外処理ルーチンを有するタスクに対して、発生した例外と例外処理ルーチンとの対応付けるための対応情報を有する例外処理管理テーブルが、タスクの属性情報と共に、対応するTCBに記憶される。
【００３６】
カーネルは、一般に実行中のタスクを管理する機能を有している。この機能は実行中のタスクに付与されたIDを専用の管理領域に記録し、タスク間で実行権が移り変わる度に実行権を得たタスクのIDが記録される。さらに、カーネルは実行中のプログラムがタスクであるか、割り込み処理及び例外処理等のタスク独立部であるかの区別を行う。この実行中のプログラムの管理はカーネルの基本機能であり、特殊な機能ではない。
【００３７】
図３は、初期化における例外処理の登録の手順を説明するための図である。ここで、図２に示すタスク２４ａにclassic属性が付与されたものとする。以下、タスク２４ａは、タスクＡと呼ぶ。タスクＡの属性は、タスクの生成用APIの”cre_tsk()”により指定することができる。例えば、タスクＡがclassic属性であれば、この”cre_tsk(Ａ,…)”において、タスクＡをclassic属性として指定することができる。タスクＡの生成過程において、カーネルはタスクＡを制御するためのデータ構造を有するTCB Ａを生成する。TCB Ａには、タスク制御情報及びコンテキストが格納される。
【００３８】
一方、図２に示すタスク２４ｂにenhanced属性が付与されたものとする。以下、タスク２４ｂは、タスクＢと呼ぶ。例えば、タスクＢがenhanced属性であるので、この”cre_tsk(Ｂ,…)”において、タスク生成用のAPIにより、タスクＢをenhanced属性として指定することができる。さらに、そのAPIにより、タスクＢの生成過程において、カーネル２１は、タスクＢを制御するためのデータ構造を有するTCB Ｂを生成するが、classic属性のタスクに付与されるTCBを拡張し、タスクＢ専用の対応情報を登録するための例外処理管理テーブル２５ｂｔがTCB Ｂに生成される。
【００３９】
いま、実行中のプログラムがclassic属性のタスク、又は初期化ハンドラ等のタスク独立部であったとする。この実行中のプログラムから例外処理プログラムを登録するためのAPIである”def_exc()”が実行された場合、カーネル２１はカーネル２１が管理する例外処理管理テーブル２１ｔに対し例外処理を登録する。
【００４０】
一方、実行権を得たタスクがenhanced属性のタスクであったとする。enhanced属性のタスクが、初期化ルーチンにおいて例外処理プログラムを登録するためのAPIである”def_exc()”を実行した場合、カーネル２１は、このenhanced属性のタスクＢのTCB Ｂ中に専用に用意されている例外処理管理テーブル２５ｂｔに対し、そのタスク独自の例外処理を登録する。
【００４１】
次に、例外処理の実行の手順について説明する。図４は、classic属性のタスクの例外処理の実行の流れを説明するための図であり、図５は、enhanced属性のタスクの例外処理の実行の流れを説明するための図である。
【００４２】
いま、実行権を得たタスクが、図４に示すようにclassic属性のタスクＡとする。このタスクＡを実行中に例外が発生すると、CPU１１が例外の発生を検知し、例外の発生した時点において実行されていた命令の仮想アドレスがEPCレジスタに記録される。さらに、発生した例外の種別である例外コードがCauseレジスタの所定のフィールドに記録される。なお、このとき、アドレスの参照行為が例外の発生原因である場合には、BadVaddrレジスタにその参照先のアドレスが記録される。CPU１１の状態を制御するStatusレジスタには、例外状態を示すEXLbitが立ち、CPU１１の実行状態は、カーネルモードへと遷移する。
【００４３】
CPU１１において例外の発生したアドレスがEPCレジスタに記録されると、PCは例外ベクタと呼ばれる所定のアドレスに遷移する。このアドレス遷移により、例外処理実行部の機能を有するカーネル２１は例外の発生を検知し、例外処理を開始する。
【００４４】
カーネル２１は、コンテキストを退避させ、Causeレジスタに格納されている発生した例外の例外コードを読み出し、発生した例外の種別を特定する。カーネル２１は、実行中のタスクＡのIDから、タスクＡのTCB Ａにアクセスし、タスクＡがclassic属性であることを認識する。カーネル２１は、実行中のタスクＡがclassic属性であると認識すると、カーネル２１は、カーネル２１が管理する例外処理管理テーブル２１ｔを、発生した例外コードをオフセットとして用いて、参照し、実行すべき例外処理ルーチンのアドレスを読み出す。読み出されたシステム固有の例外処理プログラムは、カーネル２１の管理の下で実行される。
【００４５】
カーネル２１は、システム固有の例外処理の実行が終わると、タスクＡのコンテキストを戻して例外処理からの復帰処理を実行する。これにより、例外の発生元のタスクＡに復帰してタスクＡの実行が継続される。これは通常の例外処理の流れである。
【００４６】
一方、実行権を得たタスクが、図５に示すようにenhanced属性のタスクＢとする。このタスクＢを実行中に例外が発生すると、CPU１１ではclassic属性と同じ処理が実行される。
【００４７】
カーネル２１は、コンテキストを退避させ、Causeレジスタに格納されている発生した例外の例外コードを読み出し、発生した例外の種別を特定する。カーネル２１は、実行中のタスクＢのIDから、タスクＢのTCB Ｂにアクセスし、タスクＢがenhanced属性であることを認識する。カーネル２１は、実行中のタスクＢがenhanced属性であると認識すると、カーネル２１は、このタスクＢのTCB Ｂ内にタスクＢ用の例外処理管理テーブル２５ｂｔが存在することを認識し、TCB Ｂ内の例外処理管理テーブル２５ｂｔを、発生した例外コードをオフセットとして用いて、参照し、実行すべき例外処理ルーチンのアドレスを読み出す。読み出されたタスク固有の例外処理プログラムは、カーネル２１の管理の下で実行される。この場合の例外処理ルーチンは、タスクＢ内に記述されており、カーネル２１によって読み出されて実行される。
【００４８】
カーネル２１は、タスク固有の例外処理の実行が終わると、タスクＢのコンテキストを戻して例外処理からの復帰処理を実行する。これにより、例外の発生元のタスクＢに復帰してタスクＢの実行が継続される。
【００４９】
ここで、例外処理実行部の機能を有するカーネル２１が実行する、上述した例外処理の流れについて説明する。図６は、カーネル２１が実行する例外処理の流れの例を示すフローチャートである。この例外処理は、例外の発生により開始される。
【００５０】
まず、あるプログラムを実行中に例外が発生する（ステップＳ１）と、実行中のプログラムが中断される。  
次に、例外の発生したときのPCのアドレスがEPCレジスタに記録され、PCのアドレスは例外ベクタと呼ばれる所定のアドレスに遷移する。PCのアドレスが例外ベクタに遷移すると、例外ベクタに配置されたルーチンを経由し、カーネル２１の例外ハンドラが起動し、例外処理がカーネル２１によって開始される（ステップＳ２）。
【００５１】
カーネル２１が例外処理を開始すると、カーネル２１は、発生した例外によって中断されたプログラムのコンテキストの退避を行い、CPU１１のCauseレジスタにアクセスし、例外の要因を判定する（ステップＳ３）。続いて、カーネル２１は、例外を発生させたプログラムがタスクかを判定する（ステップＳ４）。例外を発生させたプログラムがタスクではない場合、NOとなり、ステップＳ８に進む。一方、例外を発生させたプログラムがタスクの場合、YESとなり、カーネル２１は、カーネル２１の管理情報から実行中のタスクのIDを読み出す（ステップＳ５）。カーネル２１は、このIDを基に、このIDの指すタスクのTCBにアクセスする。カーネル２１は、タスクのTCBにアクセスし、タスクの属性を読み出す（ステップＳ６）。そのTCBには、そのタスクの属性が記載されている。
【００５２】
次に、カーネル２１は、例外の発生したタスクがenhanced属性か否か、すなわち例外の発生したときのタスクが、タスク固有の例外処理ルーチンを有するか否か、を判定する（ステップＳ７）。タスクの属性がclassic属性の場合には、NOとなり、カーネル２１が管理する例外処理管理情報を有する例外処理管理テーブル２１ｔを参照する（ステップＳ８）。タスクの属性がenhanced属性の場合には、YESとなり、例外を発生させたタスクのTCB内に定義された例外処理管理情報を有する例外処理管理テーブルを参照する（ステップＳ９）。
【００５３】
次に、カーネル２１は、カーネル２１が管理する例外処理管理情報又は例外を発生させたタスクのTCB内に定義された例外処理管理情報から、例外要因に該当する例外処理ルーチンを実行する（ステップＳ１０）。すなわち、例外が発生したときのタスクが、タスク毎の例外処理ルーチンを有しない場合は、カーネルの管理する例外処理を実行し、例外が発生したときのタスクが、タスク毎の例外処理ルーチンを有する場合は、例外が発生したときのタスクの有するタスク毎の例外処理ルーチンを実行する。
【００５４】
最後に、例外処理が実行されると、カーネル２１は、コンテキストの復帰を行い、例外処理からの復帰処理を行う（ステップＳ１１）。復帰処理が行われると、例外処理から例外の発生元のプログラムに復帰して、このプログラムの実行が継続される。
【００５５】
以上のように、実行権を得たタスクがenhanced属性のタスクであり、enhanced属性のタスクにおいて例外処理プログラムを登録するためのAPIである”def_exc()”が実行された場合、カーネルは、このenhanced属性のタスクのTCB中に専用に用意されている例外処理管理テーブルに対し、そのタスク独自の例外処理を登録することが可能となる。
【００５６】
更に、enhanced属性のタスクの実行中に例外が発生した場合には、カーネルは、このタスクのTCB内にタスク独自に登録された例外処理によって、発生した例外を処理することが可能となる。
【００５７】
上述した例では、enhanced属性のタスクの場合、タスクの生成段階においてカーネル２１の例外処理管理テーブルがＴＣＢ内の同タスク専用の例外処理管理テーブルにコピーされるが、独自の例外処理を実装及び登録させたいときには、タスク内に独自の例外処理ルーチンを記述し、そのルーチンを実行するように同タスクのＴＣＢ内に存在する例外処理管理テーブルにおける実行ルーチンのアドレスを書き換える。このようにすれば、タスク独自の例外処理を容易に実行させることができる。
【００５８】
一方、classic属性のタスク及びタスク独立部において例外が発生した場合には、カーネルが管理する例外処理管理テーブルに登録された例外処理によって、発生した例外を処理することが可能となる。
【００５９】
よって、本実施の形態の情報処理装置によれば、実行されるアプリケーションプログラムの仕様に合致した例外処理をタスク毎に登録できることにより、１つのカーネル環境上に異なる思想の下に設計された複数のアプリケーションプログラムを実装することができ、且つ、登録された例外処理をカーネルの管理の下、即時性を持って実行することができる。
【００６０】
（第２の実施の形態）  
次に、第２の実施の形態について説明する。第１の実施の形態において、各enhanced属性のタスクは、独自の例外処理を各タスクの例外処理管理テーブルに規定している。しかし、あるタスクが独立した、共有可能な関数をcallして利用する場合、その関数がどのような例外処理を必要とするかを事前に把握し、その例外処理を実装し、検証するのではシステム開発の効率は向上しない。即ち、共有ルーチンを利用するタスクが、そのタスクに共有ルーチン固有の例外処理を実装するべきではない。共有ルーチンが、特殊な例外処理を必要としているのであれば、その例外処理は、共有ルーチンが供給すべきであり、その共有ルーチンの開発過程において、その例外処理が十分検証されている必要がある。
【００６１】
そこで、本実施の形態では、複数のタスク間において共有されるライブラリルーチンにおいても固有の例外処理の設定を可能とする。具体的には、カーネルが、共有ルーチンの入り口及び出口において、enhanced属性のタスクのTCB内にある例外処理管理テーブルの書き換え及び書く戻しを行う。特定の例外処理を要求する共有ルーチンをcallすることが許されるタスクとは、enhanced属性のタスクであって、classic属性のタスク及びタスクから独立した処理からの実行は許されない。
【００６２】
本実施の形態に係る情報処理装置１のハードウェア及びソフトウェアの構成は、第１の実施の形態と同様なため説明を省略する。  
図７は、共有ルーチンにおける例外処理の登録の手順を説明するための図である。ここで、図２に示すタスク２４ｂ及びタスク２４ｎに、それぞれenhanced属性が付与されたものとする。以下、タスク２４ｂ及びタスク２４ｎは、それぞれタスクＢ及びタスクＮと呼ぶ。タスクＢは、enhanced属性のため、TCB Ｂ内にタスクＢ専用の例外処理管理テーブル２５ｂｔを有し、同様に、タスクＮも、TCB Ｎ内にタスクＮ専用の例外処理管理テーブル２５ｎｔを有する。
【００６３】
図７に示すように、タスクＢ及びタスクＮの間において、”fft_SIMD”なる関数が共有されている。この共有ルーチンは、タスクＢ及びタスクＮから独立な存在であり、タスクＢ及びタスクＮの設計者は共有ルーチン”fft_SIMD”の機能は知っているが、この共有ルーチンが内部でどのような例外処理を必要としているかについては十分な情報を得ていない。従って、共有ルーチンは、その機能と同時に必要な例外処理を提供する必要がある。
【００６４】
そこで、この共有ルーチンの入り口において、例外処理を登録するためのAPIである”def_exc(FPE,&Ex_SIMD)”を実行し、共有ルーチンが持つ関数”Ex_SIMD”を”FPE”要因の例外として登録している。この共有ルーチンをcallしているタスクＢ及びタスクＮは、それぞれenhanced属性であり、例外処理ルーチン”Ex_SIMD”は、TCB Ｂ及びTCB Ｎ内に生成されているそれぞれの例外処理管理テーブルに登録される。
【００６５】
図８は、共有ルーチンの実行中に発生した例外処理の実行の流れを説明するための図である。図８に示すように、タスクＮが共有ルーチンをcallすると、共有ルーチンの先頭では、この共有ルーチンが必要とする固有の例外処理の登録が行われる。例えば、μITRON仕様であれば、”def_exc()”を実行することにより、タスクＮのTCB Ｎ内に存在する例外処理管理テーブル２５ｎｔに共有ルーチンが指定する例外処理が登録される。
【００６６】
タスクＮによりcallされた共有ルーチンが実行されているときに例外が発生すると、カーネル２１は、実行中のタスクＮのIDから、タスクＮのTCB Ｎにアクセスし、タスクＮがenhanced属性であることを認識する。カーネル２１は、実行中のタスクＮがenhanced属性であると認識すると、このタスクＮのTCB Ｎ内にタスクＮ用の例外処理管理テーブル２５ｎｔが存在することを認識し、TCB Ｎ内の例外処理管理テーブル２５ｎｔを発生した例外コードをオフセットとして用いて参照し、実行すべき例外処理ルーチンのアドレスを読み出す。読み出された共有ルーチン固有の例外処理プログラムは、カーネル２１の管理の下において実行される。カーネル２１は、共有ルーチン固有の例外処理プログラムを実行後、例外処理からの復帰処理を行う。
【００６７】
また、タスクＢが共有ルーチンを実行しているときに例外が発生すると、同様に、共有ルーチン固有の例外処理プログラムがカーネル２１の管理の下において実行される。タスクＢ及びタスクＮは、共有ルーチン”fft_SIMD”がTCB B及びTCB Ｎそれぞれに生成された例外処理管理テーブルの一部を書き換える場合、その書き換えられた例外要因に対し、必要に応じて登録内容の上書きによる無効化、即ち、書き換えられる前の例外処理を再登録することができる。
【００６８】
以上のように、共有ルーチンの入り口において例外処理プログラムを登録するためのAPIである”def_exc()”が実行されると、その共有ルーチンをcallするタスクは、共有ルーチンの関数が必要とする例外処理を独自に保有することなしに、共有ルーチン固有の例外処理を実行することができる。
【００６９】
よって、本実施の形態の情報処理装置によれば、第1の実施の形態と同様に実行されるアプリケーションプログラムの仕様に合致した例外処理をタスク毎に登録できることにより、１つのカーネル環境上に異なる思想の下に設計された複数のアプリケーションプログラムを実装することができ、且つ、登録された例外処理をカーネルの管理の下、即時性を持って実行することができる。
【００７０】
更に、共有ルーチンを実行中に発生した例外については、そのタスクの実行中にcallされる共有ルーチンの入り口において、共有ルーチン固有の例外処理を実行中のタスクの例外処理管理テーブルに登録することにより、このタスクの設計者は、共有ルーチンがどのような例外処理を必要とするかを事前に把握する必要がなく、システム開発の効率を向上させることができる。
【００７１】
（第３の実施の形態）
次に、第３の実施の形態について説明する。本実施の形態に係る情報処理装置１は、マルチOSを有する。本実施の形態に係る情報処理装置１のハードウェア構成は、第１の実施の形態と同様のため、説明を省略する。図９は、マルチOSのソフトウェア構成の例を示すブロック図である。このマルチOSは、リアルタイムカーネルの１つのタスクとして汎用OSを実装する方式であり、公知例US5,995,745において提案されている。
【００７２】
図９に示すように、マルチOSは、リアルタイムカーネル３１上で動作する１つのタスクとして別のOSが実装されている。以下、このタスクとして実装されたOSは、OSタスク３２と呼ぶ。OSタスク３２にenhanced属性が付与されると、OSタスク３２の動作を管理するリアルタイムカーネル３１は、OSタスク３２のTCB３３内にOSタスク３２専用の例外処理管理テーブルを生成する。
【００７３】
OSタスクを実行中に例外が発生したときの例外処理の実行の手順を説明する。図１０は、OSタスク３２を実行中に例外が発生したときの例外処理の流れの例を説明するための図である。
【００７４】
OSタスク３２を実行中に例外が発生すると、リアルタイムカーネル３１は、実行中のOSタスク３２のIDから、OSタスク３２のTCB３３にアクセスし、OSタスク３２がenhanced属性であることを認識する。リアルタイムカーネル３１は、実行中のOSタスク３２がenhanced属性であると認識すると、このOSタスク３２のTCB３３内にOSタスク３２用の例外処理管理テーブルが存在することを認識し、TCB３３内の例外処理管理テーブルを発生した例外コードをオフセットとして用いて参照し、実行すべき例外処理ルーチンのアドレスを読み出す。読み出されたOSタスク固有の例外処理プログラムは、リアルタイムカーネル３１の管理の下において実行される。リアルタイムカーネル３１は、OSタスク３２固有の例外処理プログラムを実行後、例外処理からの復帰処理を行う。
【００７５】
以上のように、マルチOS環境において、リアルタイムカーネル３１上において１つのタスクとして実装されるOSタスクにenhanced属性が付与されると、このOSタスクのTCB内に、このOSタスク専用の例外処理管理テーブルが生成される。この場合、OSタスクの初期化ルーチン内において、OSタスクに相当する汎用OS固有の例外処理を、このOSタスク専用の例外処理管理テーブルに登録することができる。従って、この汎用OSが、このリアルタイムカーネルのタスクとして実行権を得ている間に発生した例外については、この汎用OSに対応するタスクのTCB内の例外処理管理テーブルに登録された汎用OS固有の例外処理が実行される。
【００７６】
よって、上述した各実施の形態の情報処理装置によれば、実行されるアプリケーションプログラムの仕様に合致した例外処理をタスク毎に登録できることにより、１つのカーネル環境上に異なる思想の下に設計された複数のアプリケーションプログラムを実装することができ、且つ、登録された例外処理をカーネルの管理の下、即時性を持って実行することができる。
【００７７】
なお、リアルタイムカーネル上においてタスクとして実装される汎用OSは、複数あってよい。この場合にも、本実施の形態の例外処理により、複数の汎用OSが実装されるマルチOS環境においても適切に汎用OS毎の例外の振り分けが実施され、実装された複数の汎用OS環境を矛盾することなく安定に実行することが可能となる。
【００７８】
以上のように、上述した各実施の形態によれば、アプリケーションプログラムの実行時に発生し得る例外処理は、システム固有の例外処理だけに限定されず、タスク毎に規定することができる。タスク毎に規定された例外処理ルーチンを有する、拡張されたタスクと、従来のカーネルの管理するシステム固有の例外処理ルーチンだけを実行するタスクとを、各タスクに付与されるタスク管理情報としての属性により区別することができる。その属性情報を参照することにより、拡張された属性を有するタスクに対して、そのタスク固有の例外処理を実行させることが出来る。
【００７９】
そのために、カーネルは拡張された属性を有するタスクを管理するためのデータ構造を拡張し、カーネルが有する例外処理管理テーブルと同じデータ構造を拡張された属性を有するタスクに付加する。また、カーネルはこの拡張属性を与えたタスク用の例外処理管理テーブルにそのタスク独自の例外処理を登録するための手段、具体的には上述したAPIを提供する。よって、各アプリケーションプログラムの要求仕様に合致した例外処理をタスク毎に実装可能であり、かつ、カーネルは例外発生時に実行中のタスクの属性情報に基づいて適切な例外処理を実行することが可能となる。
【００８０】
以上のように、上述した各実施の形態によれば、複数のアプリケーションプログラムを動的に生成し、かつ実行できるカーネル環境において、１つの例外要因に対し複数の例外処理を登録する手段が提供され、そして、発生する例外に対し実行中のアプリケーションプログラムに合わせて実行されるべき例外処理を切り替えて実行することができる情報処理装置が実現できる。
【００８１】
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【００８２】
【図１】第１の実施の形態に係る情報処理装置のハードウェアの構成を示す構成図である。
【図２】第２の実施の形態に係る情報処理装置のソフトウェアの構成を示すブロック図である。
【図３】例外処理の登録の手順を説明するための図である。
【図４】classic属性のタスクの例外処理の実行の流れを説明するための図である。
【図５】enhanced属性のタスクの例外処理の実行の流れを説明するための図である。
【図６】カーネルが実行する例外処理の流れの例を示すフローチャートである。
【図７】共有ルーチンにおける例外処理の登録の手順を説明するための図である。
【図８】共有ルーチンの実行中に発生した例外処理の実行の流れを説明するための図である。
【図９】マルチOSのソフトウェア構成の例を示すブロック図である。
【図１０】OSタスクを実行中に例外が発生したときの例外処理の流れを説明するための図である。
【符号の説明】
【００８３】
１  情報処理装置、１１  ＣＰＵ、２１  カーネル、２２  ＡＰＩ、２３  例外処理プログラム  ２４ａ  ２４ｂ  ２４ｎ  タスク、２５ａ  ２５ｂ  ２５ｎ  ＴＣＢ、２１ｔ  ２５ｂｔ  ２５ｎｔ  例外処理管理テーブル
【図１】
2008305016.tif 000003
【図２】
2008305016.tif 000004
【図３】
2008305016.tif 000005
【図４】
2008305016.tif 000006
【図５】
2008305016.tif 000007
【図６】
2008305016.tif 000008
【図７】
2008305016.tif 000009
【図８】
2008305016.tif 000010
【図９】
2008305016.tif 000011
【図１０】
2008305016.tif 000012