本発明の実施の形態について説明する。
以下、図面を用いて本発明の実施の形態について説明する。図1は本発明の実施の形態における計算機100の構成を示す図である。
計算機100は、プロセッサ101、主記憶装置102、バス109、割り込み信号線110、クロック割り込み生成器111、割り込み制御装置112、ブート手順を格納している記憶装置118、および、割り込みバス119より構成されている。
割り込み信号線110は、外部の入出力機器と割り込み制御装置112を接続している。外部機器が割り込みを発生すると、割り込み信号線110を経由して割り込み制御装置112が信号を受けとり、割り込み制御装置112は、この信号を数値化して、割り込みバス119を介してプロセッサ101に渡す。
クロック割り込み生成器111は、周期的な割り込みを生成する。
割り込み制御装置112は、外部機器からの割り込み要求を受け付け、要求元にしたがって数値化された割り込み信号を生成し、プロセッサ101に送る。また、プロセッサ101からの指示により、特定の機器からの割り込み信号をプロセッサ101に通知しないようにすることができるとする。
プロセッサ101は、演算装置103、割り込みテーブルレジスタ104、ページテーブルレジスタ105、および、アドレス変換装置106より構成されている。
割り込みテーブルレジスタ104は、割り込みテーブル107の仮想アドレスを指し示している。割り込みテーブルの詳細については後述するが、割り込み番号毎の割り込みハンドラの開始アドレスを記録している。図1で、割り込みテーブルレジスタ104と割り込みテーブル107の接続を破線で記載しているのは
、割り込みテーブルレジスタ104が割り込みテーブルの仮想アドレスを指し示すためである。割り込みが発生すると、プロセッサ101は割り込み制御装置112から数値化された割り込み番号を受ける。この番号をインデックスとして割り込みテーブル107より割り込みハンドラアドレスを取得し、割り込みハンドラに制御を渡す。
ページテーブルレジスタ105は、ページテーブル108を指し示している。
ページテーブルレジスタ105は、ページテーブル108の物理アドレスを格納している。
アドレス変換装置106は、演算装置が要求する命令アドレス、あるいは、オペランドが格納されているアドレスを受けとり、ページテーブルレジスタ105の指しているページテーブル108の内容に基づき仮想−実アドレス変換を実施する。
計算機100には外部入出力装置としてキーボード113、ディスプレイ114、磁気ディスク115、その他の外部機器116、および、117が接続している。ディスプレイ114を除く機器は割り込み信号線110により割り込み制御装置112に接続している。
主記憶装置102の内容について簡単に説明する。現在、計算機101では2つのオペレーティングシステムが動作している。それぞれを第一のオペレーティングシステム、第二のオペレーティングシステムと呼ぶことにする。また、計算機を起動すると第一のOSが起動するように設定されており、外部機器116、および、117は第二のOSにより管理される機器であるとする。
第一のOSは、起動時の初期化処理で、その他のオペレーティングシステム用に、この場合は第二のOS用に物理メモリ領域を予約する。つまり、第一のOSが、第二のOS用に予約された物理メモリ領域を利用できないように物理メモリ領域を確保する。図1は、この奪った領域に第二のOSがロードされている様子を示している。
更に、第一のOSの初期化過程では、第一のOSから外部機器116、および
、117の利用する割り込み番号や入出力アドレスを、既に利用済みであるとして予約する。
また、第一のOSは、すべてのオペレーティングシステムから参照可能な共通領域を持つ。その共通領域に、割り込みテーブル107、割り込み管理プログラム、割り込みハンドラ、各オペレーティングシステムから呼びだし可能なインターフェイスモジュール等を格納する。
本発明の実施の形態の、動作概要について説明する。本実施の形態では、第二のOSは第一のOSよりも優先して動作する。優先して動作するとは、第一のOSは第二のOSがアイドル状態であるときのみ動作可能であることを示す。第二のOSの処理が終了しない限り、第一のOSは動作できない。
また、第二のOSが管理するデバイスが割り込みを発生すると、第一のOSの処理は中断され、制御は第二のOSに移る。第二のOS実行中に第一の割り込みが発生しても、その割り込み処理は第一のOSが実行されるまで延期される。
さらに、第一のOSと第二のOSは明確に区分されており、割り込みハンドラなどを配置する共通領域以外は、互いにアクセスできないようにする。これにより、2つのオペレーティングシステムが誤って互いの領域にアクセスして障害が起きることを防いでいる。
以下、上記の機能を実現する本発明の実施形態について説明する。
図2は、本発明の実施の形態における2つのオペレーティングシステムの関係を概念的に示した図である。それぞれのオペレーティングシステムは、それぞれ独立したアドレス空間を保持する。201は第一のOSの仮想空間で、202は第二のOSの仮想空間を示している。ここで、第二のOSの空間202に対応する実記憶は、図1の主記憶102の第二のOSの領域になる。
仮想空間の一部分には、共通領域203がマップされる。共通領域203に対応する実記憶は、図1の主記憶102の共通領域として示した領域である。共通領域203は、もともとは第一のOSのカーネルの領域の一部である。第二のOSをロードする手順が、アドレス空間202を構築する時に、共通領域203をアドレス空間202にマッピングするように第二のOS用のページテーブルを作成する。この手順については後述する。
図2は、各オペレーティングシステムが管理するハードウェアを示している。
第一のOSは、キーボード113、ディスプレイ114、および、磁気ディスク115を、第二のOSは入出力装置116、および、117を管理することを示している。クロック111と割り込み制御装置112は、もともとは第一のOSが管理しているハードウェアであるが、共通領域203中のプログラムが管理することを示している。
次に、ページテーブルの構成について説明する。図3は、本発明の実施の実施の形態でのページテーブルの構成を示している。
300がページテーブルである。ページテーブル300は、プロセッサ101の仮想アドレス空間の仮想ページ毎に、それぞれの仮想ページを記述するエントリを持っている。それぞれのエントリは、有効ビット301と、物理ページ番号302により構成される。
有効ビット301は、その仮想ページに対応する物理ページが割り当てられているか、つまり、仮想−実アドレス変換が可能かを示している。例えば、ページテーブル300の仮想ページ3は、有効ビットがセットされていないので、仮想ページ3に対応する物理ページが存在しないことを示している。有効ビット301がセットされていない仮想ページへのアクセスが発生すると、プロセッサはページフォルトを発生する。
物理ページ番号302は、仮想ページに対応する物理ページ番号を記録している。
アドレス変換装置106は、ページテーブルレジスタ105の指し示しているページテーブルの内容を参照して、演算装置103の生成する仮想アドレスを実アドレスに変換する。プロセッサ101は、変換により得られた実アドレスにより主記憶装置102を参照する。
ページテーブルを切替えることにより独立した空間を構築することができ、図2に示した第一のオペレーティングシステムの空間、および、第二のオペレーティングシステムの空間の構築が可能である。また、共通領域203については、両方のオペレーティングシステムのページテーブルの共通領域に対応する部分に
、同じ物理ページをマップするように設定しておけば、共通領域を実現できる。
次に、割り込みテーブルの構成について説明する。図4は、割り込みテーブルの構成を示している。
400が割り込みテーブルである。割り込みテーブル400は、プロセッサ101が割り込み制御装置112から受ける割り込み番号毎の、割り込みハンドラの仮想アドレス401を記録している。プロセッサ101は割り込み要求を割り込み制御装置112から受けると、割り込み番号に対応する割り込みハンドラのアドレスを、割り込みテーブルレジスタ104の指し示している割り込みテーブル400から取得し、そのアドレスに制御を移すことで割り込み処理を開始する
。
図5は、割り込み制御装置112を示している。割り込み制御装置112は、割り込みマスクレジスタ501、および、選択装置502を持っている。
割り込みを発生する入出力装置は、割り込み信号線110により割り込み制御装置112と接続する。入出力機器の発生する割り込みは、割り込み信号線110のどの信号線に接続するかにより優先順位が付けられる。ここでは、割り込み0番に対応する割り込み信号がもっとも優先度が高い割り込みであるとする。
割り込み信号線110は、選択装置502に接続している。選択装置502は
、割り込み信号を受けると、プロセッサがその割り込みを受け付けたことを通知するまで、未処理の割り込みがあることを記録している。
割り込みマスクレジスタ501は、入出力機器の発生した割り込みをプロセッサに通知してよいかを記録している。割り込みマスクレジスタ501は、プロセッサ101から入出力命令により設定可能である。
選択装置502は、割り込み信号線110から割り込み要求を受けた時と、割り込みマスクレジスタ501の内容が書き換えられた時に、選択装置502が記録している未処理割り込みと、割り込みマスクレジスタ502の内容を比較して
、プロセッサに割り込みを通知するかどうかを決める。具体的には、選択装置502が記録している未処理割り込みのうち、割り込みマスクレジスタ501に割り込み可能と設定されていて、優先度の最も高い割り込みから順にプロセッサに通知する。選択した割り込みについて、選択装置502は、通知する割り込み信号に対応する数字信号を、割り込みバス119経由でプロセッサ101に送る。
プロセッサ101は、割り込みを受けた時に、入出力命令により選択装置502に記録されている未処理割り込み記録を解消できる。
次に、本発明の実施の形態における、計算機のブート手順について説明する。
ブート手順の始めの部分は、読みとり専用記憶装置である118に格納されている。記憶装置118は、プロセッサの物理アドレス空間のある決められたアドレスにマップされるようにバス109を介してプロセッサ101に接続している
。この手順は、ハードウェア構成の検出、オペレーティングシステムカーネルをロードするプログラムの主記憶へのローディングを実施する。
プロセッサ101がリセットされると、プロセッサ101は予め定められた物理アドレスに制御を移す。記憶装置118は、この時に実行されるプログラムを格納しており、プロセッサ101がリセットされた時にこのプログラムに制御を渡せるように物理アドレス空間にマップされている。
記憶装置118に格納されているプログラムは、磁気ディスク装置112に格納されている第一のOSのカーネルローダを主記憶装置102にロードして実行する。カーネルローダは、磁気ディスク装置112の予め定められた位置にあり
、記憶装置118に格納されたプログラムは、容易にこれを見つけることができる。
カーネルローダの処理手順について説明する。図6は、本発明の実施の形態における、オペレーティングシステムのカーネルローダの処理手順を示すフローチャートである。
このカーネルローダは、オペレーティングシステムのファイルシステム構造を理解して、ファイル名よりファイルの格納位置を特定し、主記憶に読み込むことができるよう構成されている。
カーネルローダの処理手順について説明する。まず、カーネルにパラメータとして渡す主記憶リスト1101、ロードモジュールリスト1104、および、デバイスリスト1102を初期化し、カーネル用のページテーブル領域を割り当てる(ステップ601)。3つのリストの構成については後述する。
主記憶リスト1101は、主記憶装置102の利用状況を示すデータ構造であり、カーネルローダが以降の処理で物理メモリの割り当てをする場合は、主記憶リスト1101を参照、および、変更して実施する。
次に、ハードウェア構成の検査(ステップ602)、および、ハードウェア構
成データの作成(ステップ603)を実施する。ステップ602においては、計算機100にどのような接続されているかハードウェアが検査する。続くステップ603では、ステップ602の結果に基づいてハードウェア構成に関するデータ構造であるデバイスリスト1102を作成する。オペレーティングシステムカーネルは、このデバイスリスト1102を参照してカーネル初期化処理を実施する。
次に、オペレーティングシステムカーネルの構成情報700を磁気ディスク装置112より読み込み、パラメータテーブル1100に構成情報のアドレスを設定する(ステップ604)。オペレーティングシステムのカーネルは、カーネル
本体のファイルと、その他のデバイスドライバのファイルといったように、複数のファイルから構成されていても良い。構成情報700は、予め決められたファイル名で磁気ディスク112に格納されており、ロードプログラムはこれを見つけることができる。
本発明の実施形態におけるカーネル構成情報のデータ構造を図7に示す。700は、カーネル構成情報を記録しているファイルの内容を示している。構成情報ファイル700は、カーネルローダやオペレーティングシステムが参照するデータを格納している。格納されているデータには名前がつけられており、プログラムは名前からそれに対応するデータを取得することができる。図7の例では、名前がオブジェクトファイル(701)というエントリがあり、そのデータが702に格納されている。また、secondary OSには、第二のOS用のデータ(704
)を格納しているとする。
カーネルローダの処理手順の説明を続ける。構成情報700を読み込んだ後、構成情報700中のオブジェクトファイルという名前のつけられたデータに格納されているカーネル構成ファイルのすべてについて、主記憶装置102に読み込み(ステップ606)、ロードモジュールリスト1104にエントリを追加し(
ステップ607)、カーネル用のページテーブルの設定(ステップ608)を実
施する。ここでは、kernel、driver1、および、driver2というファイル名のオブジェクトファイルをロードする。
ロードモジュールリストエントリの追加と、カーネル用のページテーブルの設定は、主記憶102にロードしたオブジェクトファイルに格納されているデータにしたがって実施する。カーネルを構成するオブジェクトファイルには、そのファイル内容をマップする仮想アドレス、ファイルの大きさなどが含まれている。
これを参照してページテーブルを構築する。オブジェクトファイルのデータ構造については後述する。
最後に、ページテーブルレジスタ105を、構築したページテーブルのアドレスに設定し、プロセッサを仮想アドレス変換モードに移行させ(ステップ609
)、構築した主記憶リスト1101、デバイスリスト1102、カーネル構成情
報テーブル1103、および、ロードオブジェクトリスト1104の組から成るパラメータテーブル1110をパラメータとして、カーネルの初期化ルーチンに制御を渡す(ステップ610)。カーネルのエントリポイントは、カーネルファ
イル内のデータに記録されている。
次に、カーネルを構成するオブジェクトファイルの構造について説明する。図8は、本発明の実施の形態での、カーネルを構成するオブジェクトファイルの構造を示す図である。
800は、オブジェクトファイル全体を示している。オブジェクトファイル800は、801ないし811のヘッダ部分と、812ないし813のセクション部分より構成される。
ヘッダ部分の構成について説明する。ヘッダマップアドレス801とヘッダサイズ802は、オブジェクトファイル800ヘッダ部分のカーネル空間での格納位置を記述している。ヘッダ部分は、ヘッダマップアドレス801に記録されているアドレスに読み込まれる。
初期化エントリ803は、オブジェクトファイル800の初期化用ルーチンのアドレスを記録している。カーネルは、カーネル初期化時に各オブジェクトファイルの初期化ルーチンを呼ぶときに、各オブジェクトファイルの初期化エントリ803を参照して初期化ルーチンを見つける。
セクション数804は、オブジェクトファイル800に含まれているセクションの数を記録している。セクションとは、オブジェクトファイル内の連続しているデータ領域で、これを単位としてカーネルの仮想空間へのマッピングを決定する。例えば、オブジェクトファイルは、実行コードが格納されているセクションと、そのオブジェクトファイルが参照するデータを格納しているセクションを含んでいる。これらのセクションはオブジェクトファイル作成時にコンパイラにより作成される。
外部参照テーブルオフセット805と外部参照テーブルサイズ806は、このオブジェクトファイル内の実行コードが参照する、他のオブジェクトファイルの公開参照の情報を格納する外部参照テーブル810を記述している。外部参照テーブル810は、オブジェクトファイル800のヘッダ部分に含まれており、外部参照テーブルオフセット805は、ヘッダの先頭からの外部参照テーブル810のオフセットを記録している。
公開参照テーブルオフセット807と公開参照テーブルサイズ808は、このオブジェクトファイルが他のオブジェクトファイルの実行コードに公開しているモジュールとデータの情報を格納している公開参照テーブル811を記述している。公開参照テーブル811は、オブジェクトファイル800のヘッダ部分に含まれており、公開参照テーブルオフセット807は、ヘッダの先頭からの公開参照テーブル811のオフセットを記録している。
セクションデータ809は、オブジェクトファイル800に含まれる各セクションについてのデータを格納している。セクションデータは、セクション数804の数だけある。セクションデータの構成については後述する。
セクションデータの後に外部参照テーブル810と、公開参照テーブル811が続き、ヘッダ部分を構成する。
ヘッダ部分の後には、各セクションの本体812、813が格納されている。
セクションデータ809の構成について説明する。セクション開始オフセット820とセクションサイズ821は、オブジェクトファイル800内での、当該セクションの開始オフセットと、当該セクションの大きさを記録している。
セクションは、セクションマップアドレス822に記録されたアドレスに配置されるようにカーネルの仮想空間にマップされる。セクション名称823には、当該セクションの名前を示す文字列が格納されている。
外部参照テーブルの構造について説明する。図9は、外部参照テーブルの構造を示している。テーブル810の先頭には、このテーブルに含まれる外部参照情報の数901が格納されている。
続いて、オブジェクトファイル名902、外部参照名903が格納されている
。オブジェクトファイル名902と外部参照名903は、文字列テーブル905へのオフセット値を格納しており、実際の文字列による名称は文字列テーブル905内に格納されている。
外部参照アドレス904には、この当該外部参照エントリで記述される外部参照の実際のアドレスが格納される。カーネルは、オブジェクトファイルを主記憶にロードするときに、当該の外部参照を含むオブジェクトファイルの公開参照のテーブルを参照して関数、あるいは、データのアドレスを取得し、外部参照アドレス904に設定する。オブジェクトファイルの実行コードは、外部関数アドレス904に格納されたアドレスを参照して、他のオブジェクトファイル内の関数の呼び出しや、データの参照をするようコンパイルされており、他オブジェクトモジュールにある関数の実行や、データ参照が可能である。
オブジェクトファイル名902、外部参照名903、および、外部参照アドレス904が1つの外部参照を定義し、外部参照数901に記録されている数だけ
、これらのエントリが連続して配置される。その後に、文字列テーブル905が格納される。文字列テーブルは、オブジェクトファイル名や、外部参照名の文字列を格納している。
公開参照テーブルの構造について説明する。図10は、公開参照テーブルの構造を示す図である。
テーブル811の先頭には、この公開参照テーブル811により他のオブジェクトモジュールに公開される参照名の数1001が記録されている。1つの公開参照は、公開参照名1002と公開参照アドレス1003により記述される。公開参照名1002は、文字列テーブル1004へのオフセット値を格納しており
、実際の文字列による名前は文字列テーブル1004に格納されている。公開参照アドレス1003は、この参照に対応するアドレスを格納している。
次に、ステップ601から始まるブート手順が作成するハードウェア構成データと、ロードオブジェクトデータの構成について説明する。図11がハードウェア構成データとロードオブジェクトデータの構成を示す図である。
パラメータテーブル1100は、カーネルローダが作成するデータ構造である
。パラメータテーブル1100から始まる3つのリストは、ローダが構築するカーネルの仮想空間に配置されるので、カーネルから参照可能である。
パラメータテーブル1100は、ローダが構築した3つのリストの先頭へのポインタと、1つのテーブルへのポインタを保持している。3つのリストとは、主記憶リスト1101、デバイスリスト1102、および、ロードオブジェクトリスト1104で、1つのテーブルはカーネル構成情報テーブル1103である。
それぞれについて説明する。
主記憶リスト1101は、主記憶ブロック記述データ1110のリストである
。主記憶ブロック記述データ1110は、ベースアドレス1111、ブロックサイズ1112、ブロック利用状況1113、および、次の主記憶ブロック記述データへのポインタ1114から構成されている。
主記憶ブロック記述データは、ある連続した主記憶領域についての利用状況を記録している。ベースアドレス1111は連続領域の開始物理アドレスを示し、ブロックサイズ1112は連続領域の大きさを格納している。ブロック利用状況1113は、当該連続領域が未使用であるか、あるいは、ローダにより割り当て済みであるかを示す値が格納されている。そして、次エントリへのポインタ1114によりリストを構成している。図11では、1110の次のエントリは1120である。主記憶リスト1101を参照することで、物理メモリの利用状態を知ることができる。
デバイスリスト1102は、カーネルローダが検出したハードウェアデバイスに関するデータを格納しており、ステップ603で作成されている。デバイスリスト1103は、デバイスデータ1150からなるリストである。デバイスデータ1150は、デバイスタイプ1151、デバイス情報1152、および、次のデバイスデータへのポインタ1153より構成される。
デバイスタイプ1151は、このデバイスデータエントリ1150により記述されるデバイスの種類を示す値が格納されている。デバイス情報1152は、デバイスの種類に特有なデータを格納している。例えば、割り込み番号やI/Oアドレスなどがそれに相当する。そして、次エントリへのポインタ1153によりリストを構成している。
カーネル構成情報テーブルへのポインタ1103は、カーネルローダが主記憶102に読み込んだカーネル構成情報ファイル700の内容を指し示している。
ロードオブジェクトリスト1104は、カーネルローダが主記憶にロードしたオブジェクトファイルに関するデータを保持している。ロードオブジェクトリストは、ロードオブジェクトデータ1130のリストである。ロードオブジェクトデータ1130は、オブジェクトファイル名1131、オブジェクトアドレス1132、および、次のロードオブジェクトデータへのポインタ1133より構成されている。
オブジェクトファイル名1131は、ロードオブジェクトデータ1130により記述されているオブジェクトファイルのファイル名である。オブジェクトアドレス1132は、当該オブジェクトファイルのヘッダ領域がロードされているカーネル空間のアドレスを格納している。そして、次エントリへのポインタ1133によりリストを構成している。
ロードオブジェクトリスト1104は、カーネルローダがカーネルを構成するオブジェクトファイルを読み込む時に同時に作成している(ステップ607)。
次に、本発明の実施の形態における第一のOSの初期化手順について説明する
。図12は、第一のOSの初期化手順を示すフローチャートである。
まず、パラメータとして渡されたパラメータテーブル1100中のロードオブジェクトリスト1104を参照して、カーネルローダがロードしたオブジェクトファイルの外部参照アドレス解決を実施する(ステップ1201)。アドレス解
決では、各オブジェクトファイルにある外部参照テーブル810の、外部参照アドレス904を決定する。アドレスは、各オブジェクトファイルの公開参照テーブル811を参照して決定する。
続く、ステップ1202では、カーネル起動時のパラメータとして渡されたパラメータテーブル1100の主記憶リスト1101を参照して、第二のOS用に主記憶領域を確保する。
具体的には、カーネル構成情報テーブル700より第二のOSの情報を取り出す。図7の例では、第二のOSの構成情報は704に格納されている。この構成情報704を参照して、確保すべき主記憶の大きさを決定する。そして、主記憶リスト1101の空きブロックエントリの内容を変更して、主記憶領域を割り当てる。この処理は、第一のOSが空きメモリ管理を始める前に実施する。
これにより、第一のOSから見ると、第二のOSに割り当てた主記憶領域は存在しないことになり、第一のOSから参照されることがなくなる。したがって、割り当てた領域は、第二のOSが自由に使うことのできる主記憶領域となる。これは、図1の第二のOSの領域に相当する。
次のステップ1203では、カーネル内部のデータ構造の初期化を実施する。
この初期化には、後で述べるデバイス管理テーブルの初期化も含む。
ステップ1204では、第二のOSが管理するデバイスを予約する。ここで予約するとは、第一のOSから利用できないようにすることである。具体的には、第一のOSが管理しているデバイス管理テーブルへの登録を実施する。
第二のOSが管理するデバイス資源は、パラメータテーブル1100のカーネル構成情報テーブル1103の指すテーブル700に格納されている、第二のOSの構成情報を参照して決める。この実施形態では、図7の704に格納されているデータがそれに相当する。
デバイス管理テーブルについて説明する。図13は、第一のOSのデバイス管理テーブルの構造を示した図である。デバイス管理テーブルは、割り込みベクタ管理テーブル1300と、I/Oアドレス管理リスト1310の2つのデータ構造からなる。
割り込みベクタ管理テーブル1300は、プロセッサ101が受け付ける各割り込み番号について、第一のOSがその割り込み番号を利用するかどうかを示す値を格納している。カーネルは、デバイスドライバが初期化時に割り込み番号を要求した場合に、このテーブル1300を検査し、要求された割り込み番号が利用されているか検査し、そうでない場合にのみ要求された割り込み番号を使用する権利をデバイスドライバに与える。既に利用済みであると記されている場合は
、そのデバイスは第一のOSからは利用できないことになる。
図2の入出力装置116と117を例として説明する。入出力装置116と117は、それぞれ割り込み番号4と5と要求すると仮定する。入出力装置116と117は、第二のOSが管理するデバイスである。入出力装置116と117の要求する割り込み番号は、カーネル構成情報テーブル700の第二のOSの構成情報704に記録されている。ステップ1204では、この構成情報704を参照して、割り込みベクタ管理テーブルの、割り込み番号4と5のエントリに利用中であることを示す値を格納する。この処理は、第一のOSがデバイス管理を開始する前に実施するため、第一のOSは、入出力装置116と117にアクセスすることができなくなり、装置116と117を第二のOSの管理下におくことができる。
I/Oアドレス管理リスト1310についても同様である。I/Oアドレス管理リスト1310は、I/Oアドレス範囲を表現するエントリ1320からなるリストである。エントリ1320は、第一のOSが利用するI/Oアドレス範囲1321と、リストを構成するための次のエントリへのポインタ1322からなる。割り込みベクタ管理テーブル1300と同様、デバイスドライバが初期化時にI/Oアドレス範囲を要求した場合、カーネルは、そのアドレス範囲が既に利用されているかI/Oアドレス管理リスト1310により検査し、未使用である場合、このリスト1310にエントリを追加して、利用許可を与える。
第二のOSが管理するデバイスが要求するI/Oアドレス範囲は、割り込み番号と同様にカーネル構成情報テーブル700に格納されているので、それを参照すれば要求アドレスを知ることができ、第一のOSがデバイス管理を開始する前にI/Oアドレスを予約できる。
ステップ1202の処理により、第一のOSから完全に独立した第二のOS専用の空間を構築することが可能になる。さらに、ステップ1204の処理により
、第一のOS上で動作するユーザプログラムは、第二のオペレーティングシステムが管理するデバイス、この例では、入出力装置116と117へのアクセスが不可能になる。また、装置116と117の割り込み番号とI/Oアドレスを利用するデバイスドライバを導入することを禁止できる。
この2つのステップの処理の効果として、第一のOSが関知しない部分に第二のOSを導入することが可能になる。
続くステップ1205、ないし、ステップ1207は通常のオペレーティングシステムの初期化処理と同じである。ステップ1205のシステムデバイスの初期化では、カーネルが直接管理するシステムデバイスの初期化を実施する。システムデバイスとは、クロック割り込みなど、第一のOSの実行に不可欠で、第一のOSが必ず存在していると仮定しているデバイスである。
ステップ1206では、カーネルローダがロードしたオブジェクトファイルについて、それぞれの初期化エントリを実行する。初期化エントリアドレスは、オブジェクトファイルのヘッダ部分に格納されている。最後に、初期プロセスを作成する(ステップ1207)。
次に、本発明の実施の形態における、第二のOSのロード手順について説明する。図14は、第二のOSのロード手順を示すフローチャートである。
まず、第二のOS用に割り当てた物理メモリ領域に、第二のOSのオブジェクトファイルを読み込む必要がある。しかし、第二のOSの物理メモリ領域は、そのままでは第一のOSから書き込むことはできないので、割り当てた物理メモリ領域を第一のOSの仮想空間に一時的にマッピングする(ステップ1401)。
ステップ1402では、マッピングした領域に、第一のOSのファイル読み込み手順を利用して、第二のOSのオブジェクトファイルを読み込む。なお、第二のOSのオブジェクトファイルの形式は、第一のOSのオブジェクトファイル形式800と同じ形式であるとする。
次に、第二のOS用のページテーブルを作成する(ステップ1403)。このページテーブルも第二のOS用の領域に作成する。この時に、第一のOSと共有する部分について、第二のOSの空間からも参照できるように、ページテーブルを構築する。
共通領域203について、割り込み処理や共通データの管理を実施するデバイスドライバ(以下サポートドライバ)をロードした領域を共通領域203とする
。このデバイスドライバがロードされたアドレスは、ロードオブジェクトリスト1104より知ることができる。また、
続くステップ1404で、第二のOSのカーネルの外部参照を解決する。但し
、第二のOSが直接参照できる他のオブジェクトファイルの参照は、共通領域203に配置されている関数とデータ、つまり、サポートドライバの公開参照のみである。したがって、ここでは、サポートドライバのオブジェクトファイルのヘッダ部分に格納されている公開参照テーブル811を参照して、第二のOSのカーネルオブジェクトファイルの外部参照テーブル810の外部アドレス904を決定する。
次に、第二のOSの公開参照のアドレスを、共通領域のデータ領域に割り当てられた外部参照アドレステーブルに書き込む。共通領域となっているサポートドライバは、第一のOSのデバイスドライバとして、第一のOSの機構にしたがって読み込むため、第二のOSの公開参照とリンクすることはできない。
ここでは、サポートドライバのデータ領域内に必要な外部参照名と、それに対応する外部アドレスを格納するテーブルを予め用意しておく。サポートドライバの実行コードは、このテーブルを参照して第二のOSのカーネルの公開関数の呼びだし、公開データの参照を実施するように記述する。そして、第二のOSのロード時に、このテーブルの外部アドレス欄にサポートドライバの公開参照のアドレスを書き込むこととする。
これで、第二のOS領域の設定を終了し、第一のOSのカーネル領域にマップした、第二のOS用の物理メモリ領域のマッピングを解除する(ステップ1406)。
次に、OSコンテクストテーブル1510の第二のOSのコンテクストと、OS識別変数1530を設定する(ステップ1407)。OSコンテクストは、実
行オペレーティングシステムを切り替えるときに参照するデータ構造で、ページテーブルアドレス値とスタックポインタの初期値とで構成する。ここでは、ページテーブルレジスタ値として第二のOSをマップするページテーブルのアドレスを、スタックポインタ値として第二のOSのカーネルスタックの初期アドレスを設定する。OS識別変数1530には、第一のOSが実行中であることを示す値を格納する。OSコンテクストテーブル1510とOS識別変数1530については後述する。
次に、第二のOSの初期化モジュールを実行する(ステップ1408)。これ
には、オペレーティングシステム空間の切替が伴う。オペレーティングシステムの切替えについては、別のフローチャートにより説明する。また、第二のOSの初期化モジュールは公開参照になっており、サポートドライバはそのアドレスを知ることができる。
最後に、ステップ1409にて、現在の割り込みテーブル104に登録されている第一のOSの割り込みハンドラのアドレスを、割り込み識別テーブル1520のハンドラの欄1522にコピーし、割り込みテーブルレジスタ値を、サポートドライバに割り当てた割り込みテーブルのアドレスに変更する。これは、プロセッサ101の割り込みテーブルレジスタ104の変更により実施する。
割り込みテーブルをサポートドライバ内のテーブルに変更するのは、割り込み発生時にどちらのオペレーティングシステムが実行していても、常にプロセッサ101の仮想アドレス空間に割り込みテーブルが存在している必要があるためである。割り込みテーブルに登録される割り込みハンドラも、サポートドライバ内に配置する。サポートドライバの領域は、ステップ1403にて、第二のOSの仮想空間にもマッピングして共通領域203とするので、いつでも参照できることになる。サポートドライバの割り込み処理については後述する。
また、ステップ1409では、第一のOSの割り込み管理情報も変更する。具体的には、割り込み禁止レベルに関連するデータ構造を変更するが、これについては後述する。
共通領域203に格納するデータ構造について説明する。図15は、共通領域203のうちのデータ領域1500に格納するデータ構造を示した図である。図15にしたがって順に説明する。
1510は、OSコンテクストテーブルである。OSコンテクストテーブル1510は、第一のOSと第二のOSとの間の切替えに必要なデータを保持する。
この実施の形態では、第一のOSは第二のOSがアイドル状態の時のみ走行できるとする。この場合、第一のOS実行中のある時点で第二のOSへの切替が起こり、第二のOSの実行が終了した時点で、第一のOSに制御を戻せば良い。
したがって、それぞれで保存しておかなければならないコンテクストは1組で良い。第一のOSのコンテクストについては、OS切替が要求された時点でのページテーブルレジスタ値1511と、スタックポインタ値1512を保存しておけば、第二のOS実行終了後に、第一のOSに制御を復帰させることができる。
また、第一のOSから第二のOSへ制御を切り替えるときには第二のOSは動作していない。したがって、第二のOSのコンテクストは、ページテーブルアドレスもスタックポインタも固定の値でよい。第二のOSのページテーブルレジスタ値1513とスタックポインタ値1514は、第二のOSをロードするときに設定する(ステップ1407)。
1520は、割り込み識別テーブルである。割り込み識別テーブル1520は
、外部割り込みの割り込み番号毎に、どちらのオペレーティングシステムが割り込みを処理するかを示す値1521と、割り込みハンドラのアドレス1522が記録されている。外部割込みが発生すると、共通領域203内の割り込みハンドラが割り込みを捕獲し、この割り込み識別テーブル1520の処理OS1521を参照して、どちらのOSに処理させるかを決定し、ハンドラ1522のアドレスへ制御を渡す。割り込み処理の詳細については、後述する。
1530は、実行中のオペレーティングシステムを示す値を格納しているOS識別変数である。この変数1530は、ステップ1601から始まるOS切り替え手順でOS切り替えの度に設定する。割り込み処理では、この変数1530を参照して割り込み処理手順を決定する。
1540は、第二のOSの実行中に、第一のOSが管理しているデバイスの割り込みが発生したかを示す遅延割り込み状態変数である。この変数1540は、どの割り込み番号の割り込みが発生したかを記録している。OS切り替え手順は
、第二のOSの実行が終了したときにこの変数1540を検査して、割り込み処理を起動するか決定する(ステップ1608)。
オペレーティングシステムの切替え手順について説明する。図16は、本発明の実施の形態における、オペレーティングシステムの切替え手順を示すフローチャートである。この切り替え手順は、第一のOSの実行中に呼び出され、第二のOSの切り替えを実施する。
図16に示した手順は、第二のOSへの切り替え後に実行する第二のOSのモジュールのアドレスと、そのモジュールへ渡す引数を引数として受ける。第二のOSのモジュールのアドレスは、共通領域203内に設定した、外部参照アドレステーブルを参照すれば知ることができる。
まず、始めのステップ1601で、現在のスタックポインタ値とページテーブルレジスタ値を、OSコンテクストテーブル1510の、第一のOSのコンテクストとして保存する。ステップ1601では、現在のスタックポインタ値を1512に、現在のページテーブルレジスタ105の値を1511に保存する。
他のレジスタコンテクストについて、OSコンテクストテーブル1510に保存する必要はない。必要があれば、第一のOSのスタックに保存すればよい。
スタックポインタとページテーブルレジスタ値を保存した後、ステップ1602にて、ページテーブルレジスタ105に第二のOSを仮想空間にマップするページテーブルのアドレスを設定する。これは、OSコンテクストテーブル1510の1513に記録されている。更に、スタックポインタを第二のOS用に設定する。これも、テーブル1600の第二のOSのスタックポインタ1514に格納されている。
次のステップ1603で、第一のOSの割り込み状態を示す遅延割り込み状態変数1540をクリアする。状態変数1540は、第二のOS実行中に発生した
、第一のOSが管理しているデバイスからの割り込みの発生状況を記録する変数である。第二のOSを実行する前に、これをクリアしておく。
そして、現在実行中のOSの示しているOS識別変数1530を、第二のOSを示す値に書き換える(ステップ1604)。スタックポインタ、ページテーブ
ルレジスタ105、および、OS識別変数1530は、常に一貫した値になっていなければならないので、ここまでのステップ1601、ないし、1604は全ての外部割り込みを禁止した状態で実行しなければならない。
続くステップ1605で、引数として渡されたモジュールのアドレスへ制御を移し、第二のオペレーティングシステムに制御を渡す。本発明のこの実施の形態においては、第一のOSは第二のOSが実行していない時、つまり、第二のOSがアイドル状態のときだけ実行できるとする。したがって、第二のOSの処理が終了した時に、ステップ1606へ制御が戻る。
ステップ1606では、ステップ1601でOSコンテクストテーブル15100に保存したページテーブルレジスタ値1511と、スタックポインタ値1512のそれぞれを回復する。続くステップ1607で、OS識別変数1530を第一のOSが実行中であることを示す値に変更する。この2つのステップの処理も割り込みを禁止した状態で実行しなければならない。
次に、第二のOSの実行中に発生した、第一のOSが管理するデバイスの外部割り込みを処理する。まず、ステップ1608では、遅延割り込み状態変数1540を検査して、割り込みが発生したかどうか検査する。発生していない場合は
、OS切替え手順は終了し、呼出元に復帰する。
そうでない場合、割り込みが発生している場合は、ステップ1609を実行する。このステップでは、第二のOSの実行中に発生した割り込みを、第一のOSが管理している延期割り込み状態変数に、未処理の割り込みがある旨を記録する
。続いて、第一のOSの割り込み処理を起動する(ステップ1610)。全ての
割り込み処理が終了した時に、OS切替え手順の呼出元に復帰する。
本発明の実施の形態における割り込み処理について説明する。図17は、本実施形態の割り込み処理手順を示すフローチャートである。この手順を実行するモジュールは、割り込みハンドラとしてプロセッサの割り込みテーブル107に登録される。さらに、この割り込みハンドラは、両方のオペレーティングシステムから参照できる共通領域203に配置する。
外部割り込みが発生して、プロセッサ101により割り込みハンドラが起動されると、割り込みハンドラは割り込み要因を検査し、割り込みを発生したデバイスが第一のOSが管理するデバイスか、第二のOSが管理するデバイスか判定する(ステップ1701)。この判定は、割り込み識別テーブル1520を割り込
み番号をインデックスとしてOS欄1521を参照することより実施する。第一のOSのデバイスである場合はステップ1702へ、第二のOSのデバイスの場合はステップ1705へ進む。例えば、図15でいえば、割り込み番号が1であれば第一のOSの割り込みであり、割り込み番号4であれば第二のOSの割り込みとなる。
割り込みが第一のOSのデバイスの割り込みである場合、ステップ1702を実行する。ステップ1702では、割り込み発生時に実行していたOSを判定する。この判定は、OS識別変数1530を参照して実施する。実行中のOSが第一のOSの場合はステップ1703へ、第二のOSの場合はステップ1704へ進む。
ステップ1703から始まる処理は、第一のOSが管理しているデバイスが、第一のOSを実行中に割り込みを発生した場合の処理である。ステップ1703では、あたかもステップ1701から始まる処理が存在せず、第一のOSの割り込みハンドラが、直接プロセッサ101から制御を受けたように見えるようにコンテクストを設定する。ここでコンテクストとは、スタックの内容やレジスタの内容を示す。そして、第一のOSの割り込みハンドラへ制御を渡す。第一のOSの割り込みハンドラのアドレスは、割り込み識別テーブル1520のハンドラ欄1522に格納されている。例えば、割り込み番号1の割り込みであるならば、1をインデックスとして割り込み識別テーブルを参照して、ハンドラアドレスを求める。
この場合、ステップ1701から始まる手順には制御は戻らず、第一のOSが処理を続ける。
第一のOSが管理しているデバイスが、第二のOSを実行中に割り込みを発生した場合、ステップ1704を実行する。ステップ1704では、遅延割り込み状態変数1540に割り込みを発生したデバイスの割り込み番号を記録する。割り込みハンドラの処理はこれで終了する。この場合の割り込みの処理は、実行OSが第一のOSに切り替わったときに実行される(ステップ1608)。
発生した外部割込みが、第二のOSが管理するデバイスの割り込みだった場合
、ステップ1705へ進み、どちらのOSが実行中であるか検査する。ここでも
、OS識別変数1530によって実行中のOSを判定する。第一のOSが実行中の場合は、ステップ1706へ、第二のOSが実行中の場合はステップ1711へ進む。
第二のOSが管理するデバイスの割り込みが、第二のOSの実行中に発生した場合、ステップ1711を実行する。ステップ1711は、第二のOSの割り込みハンドラを起動する。第二のOSの割り込みハンドラのアドレスは、割り込み識別テーブル1520のハンドラ欄1522に記録されている。第二のOSの割り込みハンドラ処理が終了して制御が戻ってきたら、この割り込みハンドラも終了し、割り込まれた時のコンテクストを回復して制御を元に戻す。
第二のOSが管理するデバイスの外部割込みが、第一のOSの実行中に発生した場合、ステップ1706を実行する。この場合は、第一のOSの実行よりも第二のOSの処理を優先して実行する。
まず、ステップ1706では、コンテクストを保存する。ここでのコンテクストとは、割り込み処理が終了した後で第一のOSに戻すときに、割り込まれたときの状態を回復するのに必要なスタックの内容とレジスタの内容を示す。このコンテクストは、第一のOSのカーネルのスタックに保存する。
続いて、実行OSの切り替えと第二のOSの割り込み処理の起動を実行する(
ステップ1707、1708)。これは、ステップ1601から始まる手順によ
り実行する。
第二のOSの処理が終了した時点で、第一のOSへの切り替えを実行し(ステップ1709)、割り込み時のコンテクストを回復し(ステップ1710)、第
一のOSの処理を再開する。ステップ1709の処理は、必ずしも、ステップ1701から始まる処理と同一のモジュール内で実行されなくてもよい。第一のOSへの切り替えにより処理はこのモジュールへ復帰する。
2つのオペレーティングシステムで共有しているクロック割り込みの処理について説明する。クロック割り込みはは、共通領域内の割り込みハンドラにより捕獲する。この割り込みハンドラでは、まず、第二のOSのクロック割り込み用の割り込みハンドラを実行する。第二のOSの割り込みハンドラはハンドラ2欄1523に格納されている。第二のOSの割り込みハンドラの実行が終了したら、図17のステップ1702から始まる処理により第一のOSの割り込み処理を実行する。第一の割り込みハンドラのアドレスはハンドラ欄1522に格納されている。
次に、第一のOSの割り込み制御部分について説明する。これは、第一のOSの割り込み制御によって、誤って第二のOSが管理するデバイスの割り込みが禁止にされてしまわないようにするための処理である。
第一のOSは、割り込み禁止レベルにより割り込みを制御しているとする。割り込み禁止レベルは、オペレーティングシステムのカーネル内の割り込み処理の延長で動作する部分と、そうでない部分との間の排他制御を実現するために必要となる機構である。
第一のOSは、割り込み制御装置112をプログラムすることで割り込み禁止レベルを実現する。つまり、割り込み制御装置112の割り込みマスクレジスタ502をプログラムして、選択的に外部割り込みをマスクにする。第一のOSは第二のOSについて全く知らないので、第一のOSが割り込み禁止レベルを変更したときに、第二のOSのデバイスの割り込みがマスクされてしまう可能性がある。これを防ぐために、第一のOSの割り込み制御部分を変更する。
図18は、割り込み禁止レベルを実現する第一のOSが管理しているデータ構造を示している。1800は、割り込み禁止レベルテーブルである。それぞれの割り込みレベルは数値で表現され、それぞれの割り込み禁止レベルについて、何番の外部割り込みをマスクするかを示している。テーブル1800のチェックのつけられているところは割り込みをマスクする設定することを示している。例えば、割り込み禁止テーブル1800では、割り込み禁止レベル0では、どの割り込みもマスクされないことを示している。また、割り込み禁止レベル3では、割り込み番号3、ないし、5の割り込みを割り込み制御装置112によりマスクすることを示している。割り込み禁止レベル5では、すべての割り込みが割り込み制御装置112によりマスクされる。
本発明では、第二のOSの初期化時に、この割り込み禁止レベルテーブル1800を変更する(ステップ1409)。ステップ1409では、第二のOSが管
理するデバイスが発生する割り込みについて、第一のOSがそれらの割り込みをマスクしないように割り込み禁止レベルテーブルを変更する。具体的には、割り込み識別テーブル1520のOS欄1521を参照して、第二のOSが管理する割り込み番号について、割り込み禁止レベルテーブル1800のチェックをクリアする。
この例では、割り込み番号4と5が第二のOSが処理する割り込みとなっている。したがって、割り込み禁止レベルテーブル1800のすべての割り込み禁止レベルの、割り込み番号4と5の欄(1801と1802のすべて)をクリアする。
これにより、第一のOSが割り込み禁止レベルを変更しても、第二のOSが管理するデバイスの割り込みはマスクされなくなる。
以上により、一台の計算機で2つのオペレーティングシステムを同時に動作させることが可能になる。
本発明によれば、第一のOSに変更を加えて2つのオペレーティングシステムを同時に動作させる場合、変更箇所がオペレーティングシステムカーネルの初期化部分、デバイス資源予約、および、割り込み禁止制御部分に限定されるため、簡単に2つのオペレーティングシステムを動作させることが可能になる。
仮想計算機による方式では、物理メモリやI/Oチャネルを仮想化するために特権命令のエミュレーションが必要になるが、これをソフトウェアで実現するとオーバーヘッドが大きくなり問題である。仮想計算機方式では、このオーバーヘッド削減のために、特殊なハードウェアを持つことが多くなっている。しかし、本発明では、それぞれのデバイスについて、デバイスを管理するオペレーティングシステムを予め決定し、さらに、物理メモリについて利用できる範囲を初期化時に決定することにより、オペレーティングシステム同士が互いに干渉しないようにして、仮想計算機でのような複雑なソフトウェアによる制御を廃止し、高速化のためのハードウェアも不要とした。
本発明によれば、第一のOSの機能を補完するOSを容易に追加することが可能である。従来技術においても、第一のOSの構成要素として、例えばデバイスドライバとして新たな機能をカーネルに追加することは可能である。しかし、第一のOSの構成要素としてしまったのでは、その構成要素は第一のOSの管理下でしか動作できない問題がある。つまり、第一のOSが障害により停止してしまったとき、追加した機能モジュールも動作することはできないのである。
本発明によれば、新たな機能を実現する構成要素を、第一のOSと独立して構成することができ、第一のOSが停止してしまったとしても、その機能モジュールだけは継続して動作することが可能になる。この実施形態については、後述する。信頼性を要求される機能モジュールを第二のOSとして組み込めば、第一のOSが停止してしまったときでも、何らかの回復処理を実現させるといったことが可能になる。このように本発明は、計算機システムの高信頼化を実現する手段となり得る発明である。
また、この実施形態では、第二のOSが第一のOSに優先して処理を実行するとして説明した。第一のOSは、第二のOSがアイドル時にしか動作できないことや、第二のOSの割り込みはいつでもすぐに処理することにより、第二のOSを優先させている。これにより、第一のOSが実時間処理に適合していなくても
、第二のOSとして実時間処理に向くOSを導入すれば、第一のOSの特徴を活かしたままで、実時間処理性能に優れた計算機システムを構築することが可能になる。例えば、第一のOSが優れたGUI(Graphical UserInterface)を持って
いるが実時間処理性能に欠ける場合、第一のOSよりも優先して動作する実時間処理向きオペレーティングシステムを第二のOSとして導入してやることで、GUIにも優れ、実時間処理にも優れた計算機システムの構築ができる。
このように、本発明は、特別なハードウェアの支援なしで、第一のOSに欠けている機能を容易に導入する方法であり、さらに、その機能は第一のOSとは全く独立して動作させることを可能にする。
次に、本発明の第二の実施形態について説明する。第二の実施形態は、これまで説明してきた実施の形態の拡張である。この実施の形態では、第一のOSが障害により停止しても動作しつづける第二のOSの導入が実現可能である。
第一の実施形態に加えて、第一OS実行状態変数1550を共通領域に置く。
この変数1550は、第一のOSが通常動作しているか、そうでないかを示す値を格納している。この変数1550は、第二のOSをロードする時の処理で、通常動作を示す値に初期化する。
図19は、本発明の第二の実施の形態の第一のOSの停止処理手順を示すフローチャートである。この処理手順は、第一のOSの停止処理を実行するモジュールを変更して実装する。
まず、第一のOSの停止処理モジュールに制御がきたら、第一OS実行状態変数1550を第一のOSが停止していることを示す値に設定する(ステップ1901)。その後、第一のOSの停止処理を実行する(ステップ1902)。最後
に、第一のOSへの割り込みをマスクして、第二のOSが処理するデバイスの割り込みを許可して(ステップ1903)、割り込みが発生するまで待つ(ステッ
プ1904)。割り込みが発生すると、実行OSの切り替えられ、第二のOSが
処理を実行する。
更に、実行OS切り替え手順を変更する。第一の実施の形態では、ステップ1601から始まる手順により実行OSの切り替えを実行した。第二の実施の形態では、この手順で第二のOSのモジュールを実行した後、つまり、ステップ1605の後で、第一OS実行状態変数1550を検査する。ここで、第一OS実行状態変数1550が、第一のOSが停止していることを示す値になっているならば、ステップ1606以降の処理を実行せずに、割り込み待ちを実行する。
以上のデータ構造と手順により、第一のOSが停止しても第二のOSの実行を継続することが可能になる。この実施形態では、第一のOSの停止処理モジュールを変更するとしたが、第一のOSがエラーにより停止したときの停止処理過程で実行されるモジュールを変更して、第一のOSの停止を検出して割り込み待ちをしても同様の効果を実現できる。
本発明の第3の実施の形態について説明する。これまで説明してきた実施の形態では、カーネル本体を変更することにより2つのOSの同時実行等を実現してきた。第3の実施の形態では、カーネル本体を変更せずに、前記の実施の形態の機能を実現する。
様々の種類のハードウェアをサポートするオペレーティングシステムでは、ハードウェア依存の処理がカーネル本体からは切り離されて、別のオブジェクトファイルとして構成されている場合がある。例えば、割り込み制御装置112が計算機により異なる場合や、バス109の構成が異なってI/Oアドレス空間が計算機により異なる場合である。
図20は、このようなオペレーティングシステム、つまり、割り込み制御装置やバスなどの基盤となるハードウェアの違いを吸収するためのコードやデータがカーネル本体とは分離されたオブジェクトファイルにある場合の、カーネル領域の様子を示した図である。
カーネル領域2000には、プロセッサ101のカーネルモードで実行されるモジュールや、オペレーティングシステムが管理するデータ構造がある。カーネル本体2001は、メモリ管理、プロセススケジューリング、および、ファイルシステムなどの、ハードウェア非依存の処理を実施するコードやデータを持っている。カーネル本体2001とハードウェア依存部2002の間には、ハードウェア依存部2002の提供しなければならないモジュールと、カーネル本体2001が提供するモジュールに関する規約が定められている。ハードウェア依存部2002をこの規約にあわせて構築すれば、様々な計算機上でこのオペレーティングシステムを動作させることが可能になる。
この規約に従ったハードウェア依存の処理は、別オブジェクトファイルに分離され、カーネル本体とは切り離された領域2002にマップされている。カーネル本体2001とハードウェア依存部2002は、第一の実施の形態の場合と同様の外部参照機構により互いの公開モジュールを呼び出すことができ、見かけ上は1つのカーネルとして機能する。
このような場合は、カーネル本体のオブジェクトファイルを変更することなく
、分離されたハードウェア依存の処理を実施するオブジェクトファイルの変更により第一の実施の形態、および、第二の実施の形態と同様の効果を得ることが可能である。
具体的には、分離されたオブジェクトファイルの処理において、物理メモリの割り当てが可能であること、割り込みレベル管理処理を変更できること、および
、I/O資源の予約ができることが必要である。さらに、このオブジェクトファイル中にステップ1701から始まる割り込みハンドラと割り込みテーブル107を配置し、プロセッサの割り込みテーブルレジスタ104に登録する。そして
、この分離されたオブジェクトファイルを共通領域203として第二のOSからも参照できるようにする。以上により、本発明の第一の実施の形態と同様の効果を得ることができる。
さらに、ハードウェア依存オブジェクトファイルが、第一のOSが停止したときに実行されるモジュールを持つ規定になっていれば、そのモジュールを変更すれば第一のOSの停止を検出でき、本発明の第二の実施の形態と同様の効果を得ることができる。
この実施の形態においては、カーネル本体を変更する必要がない。これにより
、変更しなければならない部分が更に限定できる、カーネル本体を変更するよりも容易に実施可能となる。
次に、本発明の第4の実施の形態について説明する。これまで説明してきた実施の形態では、共通領域203に配置していたのはサポートドライバや、ハードウェア依存オブジェクトファイルなどのオブジェクトファイルであった。しかし
、本当に共通領域203に配置しなければならないモジュールとデータは、割り込みテーブル107、ステップ1701から始まる割り込みハンドラ、ステップ1601から始まるOS切り替え手順、および、図15に示したデータ構造分だけである。特に、第3の実施例でのようにハードウェア依存部の処理を実施するオブジェクトファイル全体を共通領域203として第二のOSからも参照できるようにしてしまうと、第二のOSが誤って第一のOSのデータ構造にアクセスしてしまう可能性が高くなり問題である。
第4の実施の形態では、オブジェクトファイルの特定のセクションのみを共通領域203として第二のOSに見せる方法を提供する。この実施の形態では、オブジェクトファイルを生成するコンパイラが、命令コードとデータを配置するセクションをプログラム上で指定できる機能を持っている必要がある。
通常のオブジェクトファイルは、セクションとして命令コードを含むテキストセクションと、データを含むデータセクションを持っている。これに加えて、コンパイラの機能により共通領域203のためのセクションを追加する。さらに、オブジェクトファイルのヘッダ部分に格納されているセクションデータ809を参照して共通領域セクションのアドレス範囲を決定し、その部分だけを第二のOSに見せるようにページテーブルを構築すればよい。
ハードウェア依存処理をするモジュールを含むオブジェクトファイルを変更する場合を例として説明する。変更個所のうち初期化に関連する部分、例えば、物理メモリの割り当て、I/O資源の予約、割り込みレベル管理部分の変更は第二のOSに見せる必要はない。第二のOSからも参照できなければならないのは、割り込みテーブル107、ステップ1701から始まる割り込みハンドラ、ステップ1601から始まるOS切り替え手順、および、図15に示したデータ構造分だけである。これらを、共通領域セクションに配置するようにプログラムを記述し、コンパイラの機能により共通領域セクションを生成する。
図21は、生成されたオブジェクトファイルの構成を示している。2100は
、生成されたオブジェクトファイルを示す。オブジェクトファイル2100のヘッダ部の2101、ないし、2104は、オブジェクトファイル2100に含まれているセクションのデータを記述している。このうち2103と2104が、共通領域203用に新規に作成したセクションを表現するセクションデータである。対応するセクションは2107と2108である。セクションデータ2103と2104の内容にしたがってセクション2107と2108のアドレスを求め、それらの領域だけを第二のOSのカーネル領域にマップするように第二のOSのページテーブルを構成すれば、ハードウェア依存オブジェクトファイル2100の他の部分を第二のOSから隠すことができる。
第4の実施の形態によれば、これまで説明した実施の形態よりも、更にOS間の独立性を高めることができ、OS間の干渉の少ない安全な計算機システムの構築が可能になる。
次に、本発明の第5の実施の形態について説明する。第5の実施の形態では、マルチプロセッサ構成の計算機で第二のOSを導入が可能になる。
図22は、本発明の第5の実施の形態での計算機装置を示す図である。2200は計算機装置である。計算機2200は2つのプロセッサ2201と2202
、および、主記憶装置2203を持っている。また、第一の実施の形態と同様に
、計算機起動プログラムを格納している記憶装置2204を持っている。
プロセッサ2201と2202について、プロセッサを起動したときと、初期化のための割り込みを受けた時とでは、制御を渡す物理アドレスが異なるものとする。
記憶装置2204に格納されている初期化割り込み処理プログラムは、予め定めた物理アドレスに格納されている値を物理アドレスとして、そのアドレスに制御を渡す。
また、バス2209を介して磁気ディスク装置2206、クロック割り込み生成装置2207、および、入出力装置2207等のデバイスが接続している。割り込みを発生するデバイスは、割り込み制御装置2205に接続し、更に、割り込みバス2211を介してプロセッサ2201と2202に接続している。各プロセッサは他のプロセッサに割り込みを送ることができるとする。
割り込み制御装置2205について説明する。割り込み制御装置2205は、マルチプロセッサ構成のための機能を持っている。割り込み制御装置2205は
、第一の実施の形態での割り込み制御装置112の割り込みマスク機能に加えて
、それぞれのデバイスからの割り込みをどのプロセッサ、あるいは、プロセッサ群に通知するかを指定する機能を持っている。
図23は、割り込み制御装置2205の構成を示す図である。選択装置2301と割り込みマスクレジスタ2302の働きは、第1の実施の形態と同じである
。それらに加えて、割り込み制御装置2205は、割り込み配送テーブル2310と、割り込み送信装置2305を持っている。
割り込み配送テーブル2310は、割り込み制御装置2205に接続されたそれぞれのデバイスについて、どのプロセッサ、あるいは、プロセッサ群に割り込みを通知するかを示す値2311と、通知するときの割り込み番号2312を記録している。割り込み配送テーブル2302は、I/O命令により変更することができ、自由に設定可能である。
図23の例では、割り込み0と1はCPU0に、割り込み2はCPU1に配送するように設定されている。
割り込み送信装置2305は、選択装置2301からの信号を受けて、割り込み配送テーブル2310を参照して割り込み通知先と割り込み番号を決定する。
そして、通知先と割り込み番号を表わす信号を割り込みバス2211へ送信する。
計算機2200は、起動するとプロセッサ2201だけが動作を開始するように構成されており、プロセッサ2201が記憶装置2204に格納されている起動プログラムを実行する。起動プログラムは、第一の実施の形態の場合と同様に磁気ディスク装置2206に格納されているカーネルローダを主記憶2203に読み込み実行する。カーネルローダは、パラメータテーブル1100を作成する
。第5の実施の形態では、デバイスリストに計算機2200が何個のプロセッサを持っているかを示すデータが加えられる。
第一のOSのロード後、第一のOSの初期化処理を実行する。初期化の過程で、非ブートプロセッサ以外のプロセッサ用の初期化ルーチンのアドレスを予め定めた物理アドレスに格納し、プロセッサ2202に初期化割り込みを送る。プロセッサ2202は初期化割り込みを受けると、記憶装置2204に格納されているプログラムを実行し、非ブートプロセッサ初期化ルーチンに制御がわたる。非ブートプロセッサ初期化ルーチンは、ページテーブルレジスタや割り込みテーブルレジスタを設定して仮想アドレスモードに移行し、初期化処理を続ける。
本発明の第5の実施の形態では、図12のステップ1204の第二のOS用のデバイスの予約のときに、プロセッサも第二のOS専用であると予約する。ここでは、プロセッサ2202を予約するとして説明する。
マルチプロセッサ構成の場合、ステップ1201から始まる第一のOSの初期化手順のシステムデバイスの初期化で、非ブートプロセッサに初期化割り込みを送る。この場合、プロセッサ2201からプロセッサ2202に初期化割り込みが送られることになる。本発明では、予約されているプロセッサについては初期化割り込みを送らないことにする。したかって、カーネルの初期化がされてもプロセッサ2202はまだ動作していない。
また、ステップ1205のシステムデバイスの初期化では、割り込み制御装置2205の初期化も実施する。割り込み制御装置2205の初期化では、カーネル構成情報ファイル700の第二のOSの構成データ704を参照して、第二のOSが管理するデバイスの割り込みがプロセッサ2202に送られるように割り込み配送テーブル2310を設定する。
更に、図14のステップ1401から始まる第二のOSの初期化手順において
、初期化ルーチンを第二のOSの初期化ルーチンのアドレスに設定して、ステップ1407でプロセッサ2202に初期化割り込みを送る。これにより、プロセッサ2202上で、第二のOSが走行を開始する。
第1、ないし、第4の実施の形態と異なり、第二のOSの管理するデバイスの割り込みは、すべて割り込み制御装置2205により、第二のOSが動作しているプロセッサ2202へ送られる。このため、実行OSを切り替える必要はなくなる。第一のOSはプロセッサ2201で動作し、第二のOSはプロセッサ2202で動作することになる。したがって、ステップ1701から始まる割り込み処理も不要になる。
第二のOSは、独自の割り込みテーブルをプロセッサ2202の割り込みテーブルレジスタに設定し、独自の割り込みハンドラを持てる。第一のOSの割り込みテーブルを変更する必要はない。但し、第一のOSが割り込み制御装置2205の割り込みマスクレジスタ2302を変更する場合は、第二のOSのデバイスからの割り込みをマスクしてしまわないように変更を加える必要がある。
第5の実施の形態においては、第1ないし4の実施の形態よりも、性能の良い計算機システムの構築か可能である。第1ないし4の実施の形態では、第一のOSは第二のOSがアイドルしている間のみ動作可能であったが、第5の実施の形態においては、第一のOSは、プロセッサは奪われてはいるが常に動作することが可能であり、同時に第二のOSも動作可能である。
更に、第5の実施の形態によれば、第一のOSと第二のOSとで共有しなければならない領域を小さくできる。第1ないし4の実施の形態では、共通領域203に、割り込みテーブル、割り込みハンドラや割り込み処理に付随するデータ構造、および、OS切り替えコードを置かなければならなかった。第5の実施の形態では、これらはすべて必要なくなり、互いのOSが相手のOSを誤って破壊してしまう可能性を低くできる。
次に、本発明の第6の実施の形態について説明する。これまで説明した実施形態が2つのOSを同時実行する方式であるのに対し、第6の実施形態は2つ以上の複数のOSを同時実行する方式である。
第一の実施形態では、第二のOSが第一のOSよりも優先して実行するように制御するが、ここで説明する方式では、複数のOS間に実行優先度を設定可能である。例えば、割り込みについては、実行中のOSの優先度よりも低い優先度のOSが管理する割り込みの処理は延期される。実行中のOSの優先度よりも高い優先度のOSが管理する割り込みが発生した場合は、即座に実行OSを切替え割り込み処理を開始する。
また、実行中のOSが自分よりの優先度の高いOSのモジュールを呼び出す場合は即座に実行OSを切替えてモジュール呼び出しを実施する。その逆の場合、つまり、優先度の低いOSの側での処理が必要になる場合は、そのOSが実行権を得るまで要求された処理を延期するように制御する。
図24は、本発明の第6の実施形態の計算機構成を示した図である。計算機構成はこれまでの実施例と同じであるが、主記憶装置102に複数のOSがロードされている様子を示している。各オペレーティングシステムは、ステップ1401に示した第二のOSをロードする手順と同じ手順でロードできる。
図25は、複数のOSの関係を概念的に示した図である。第一の実施の形態では2つのOSであったのに対し、ここでは第一のOS以外に複数のOSが1つのプロセッサ上で動作していることを示している。
第一のOSの一部である共通領域が他の第2、第3、および、第NのOSの論理空間202、2503、および、2504にマップされ全OSから共通に利用できることを示している。各OSの論理空間への共通領域のマッピングは、ステップ1401に示した手順により実施する。
更に、各OSはそれぞれが管理する外部機器を持っていることを示している。
第二のOSは機器116と117、第三のOSは機器2505と2506、第NのOSは機器2507を管理することを示している。これらの機器を制御するためのI/Oアドレス範囲、および、割り込み番号は、図7に示すカーネル構成情報ファイル700に格納しておけば良い。図7では第二のOS用の構成情報のみを格納しているように記述したが、他に第三、第四のOSの構成情報を格納しておく。ステップ1201からの初期化手順では、第二のOSだけでなく第一のOS以外の全てのOSの資源を予約して、第一のOSが第一のOS以外のOSが管理するデバイスへアクセスすることを禁止する。
ステップ1201から始まる手順では、ステップ1202で第二のOS用の主記憶を確保している。これを、第一のOS以外の複数のOS用の主記憶を確保する処理とする。また、ステップ1204は第二のOSが管理するデバイスを予約する処理であるが、これを第一のOS以外のOSが管理するデバイス資源を予約する処理とする。
本実施形態における第一のOSの初期化手順を図26に示す。ステップ2602と2604がステップ1202と1204に対応している。ステップ2604は、カーネル構成情報ファイル700を参照して第一OS以外のOSのデバイス資源を予約する。
この時、同時に割り込み管理テーブル1520の処理OS1521も設定する
。また、各OSの構成情報には、デバイス資源の他にOSの優先度も記述する。
図27は、共通領域203に配置するデータ構造を示す図である。図15に示したデータ構造と比較して、割り込み識別テーブル1520、OS識別変数1530、および、遅延割り込み状態変数1540は同一のデータ構造である。OSコンテクストテーブル2710は、1510を拡張したデータ構造となっている
。
テーブル2710は、各OSの実行を切替える時に必要になるデータを保存している。ページテーブル設定値2701とスタックポインタ設定2702は、あるOSを実行中に他のOSのモジュールを呼び出す時に設定するページテーブルとスタックポインタのアドレスを示している。また、ページテーブル保存値2703とスタックポインタ保存値2704は、優先度の高いOSへの切替を実施した時の優先度が低い方のOSのページテーブル値、および、スタックポインタ値を保存している。
実行状態2705は、それぞれのOSについて稼働中であるか、および、処理待ち中であるかを示す値を格納する。ここで稼働中であるかとは、OSが起動されているかを示す。ある瞬間に実行中であることを示しているわけではない。各OSの起動処理は実行状態2705を設定する。
また処理待ち中であるとは、そのOSがアイドル状態でないことを示す。つまり、優先度の高いOSが実行中のため走行待ち状態にあることを示す。処理待ち中については、具体的にどの処理が待ちになっているかを記述してもよい。
優先度2706は、各OSの実行優先度を格納する。優先度は、第一OSの初期化処理手順のステップ2605で、構成ファイル700より読み出し設定する
。
実行OSの切替え手順について、第二のOSが実行中であるとして説明する。
また、OSの実行優先度が第一より第二、第二より第三の方が優先度が高く設定されているとする。第二のOSの処理により第三のOS上のプロセスが走行可能になったとする。この場合、第三のOS内部のプロセス起動モジュールを実行して第三のOS上のプロセスをスケジュールする。ここで、第三のOSは第二のOSよりも優先度が高いので、実行OSを即座に切替えて第三のOSのモジュールが実行される。切替え処理では現在のページテーブルアドレスとスタックポインタ値を、第二のOSのページテーブル保存値2703とスタックポインタ保存2704値に格納し、第三のOSのページテーブル設定値2701とスタックポインタ設定値2702をページテーブルレジスタとスタックポインタに設定して実行OSを切替える。
第二のOSが第一のOSのモジュールを呼び出す場合、第一のOSの優先度は第二のOSの優先度よりも低いため、呼び出しは延期する。この場合、呼び出し要因を実行状態2705記録しておき、第一のOSが実行権を得た時に、すなわち、第二、および、第三のOSが処理を終了した時に、モジュール呼び出しを実施する。
図28は、実行OSの切替え手順を示すフローチャートである。ステップ2801からの処理の大部分は図16に示したステップ1601からの処理と同じである。この手順は、OSの優先度については考慮していないが、この手順を呼び出す前に呼出先OSの優先度と実行中OSの優先度を比較して、実際に呼び出して良い場合はステップ2801からの処理を実施すれば良い。
ステップ2801から始まる処理は、切替先OSと呼び出しモジュールのアドレスを引数として受ける。ステップ2801では、現在のページテーブルアドレスとスタックポインタを、OSコンテクストテーブル2710の現在実行中のOSのページテーブル保存値2703と、スタックポインタ保存値2704に保存する。現在実行中のOSは、OS識別変数1530により判定できる。
次のステップ2802では、OSコンテクストテーブル2710より切替先OSのページテーブル設定値2701とスタックポインタ設定値2702を取得し
、ページテーブルとスタックの切替え処理を実施する。
ステップ2803では、遅延割り込み状態をクリアする。優先度が実行中のOS以上で、切替先未満のOSが管理するデバイスの遅延割り込み状態1540をクリアする。
例えば、第一のOSから第三のOSのモジュールを呼び出すとする。この場合
、ステップ2803では第一のOSと第二のOSが管理するデバイスの遅延割り込み状態1540をクリアする。
続くステップ2804では、OSコンテクストテーブル2710の現在実行中のOSの実行状態2705を処理待ち中に設定し、ステップ2805でOS識別変数を切替先OSに設定し、ステップ2806で引数として渡されたモジュールを呼び出す。
切替先のOSは実施すべき処理がなくなった時点で、ステップ2807へ制御を戻す。ステップ2807では、OSコンテクストテーブルの各OSの実行状態2705と優先度2706を参照して、最も優先度が高い処理待ち中のOSを見つける。
ステップ2808は、ステップ2807で選択したOSのコンテクストを、OSコンテクストテーブル2710のページテーブル保存値2703とスタックポインタ保存値2704より回復する。
次のステップ2809で、OS識別変数1530を選択したOSに設定する。
OSコンテクストテーブル2700の実行状態2705に延期されている処理があることが記録されている場合は、その延期されている処理を実行する(ステップ2810)。
続く処理では、遅延された割り込みを処理する。ステップ2812は、遅延割り込み状態1540を参照して、ステップ2807で選択されたOSが処理すべき割り込みが発生していないかを検査する。選択されたOSがどの割り込み番号の割り込みを管理しているかは、割り込み識別テーブル1520の処理OS1521を参照すれば分かる。
ステップ2812の検査の結果、処理待ちの割り込みが発生していると判定した場合はステップ2813へ進む。ステップ2813では、処理しなければならない割り込みが発生していることを選択されたOSが認識できるように選択されたOSのデータ構造を設定する。続くステップ2814は、割り込み識別テーブル1520を参照して、処理する割り込みの割り込みハンドラ1522を呼び出す。ハンドラの処理終了後、回復したコンテクストにしたがって、選択されたOSの実行を再開する。
処理待ち割り込みがなければ、そのまま回復したコンテクストにしたがって、選択されたOSの実行を再開する。
割り込み処理について説明する。図29は、割り込み処理手順を示すフローチャートである。図29に示す手順を実行するルーチンはプロセッサ103の割り込みハンドラとして割り込みテーブル400に登録される。また、全てのOSから参照可能な共通領域に配置される。
処理手順について説明する。まず、ステップ2901では、割り込み要因より割り込みを処理するOSを決定する。処理OSは、割り込み識別テーブル1520の処理OS1521に記録されており、これを参照して決定する。
割り込み発生時のOSと割り込み処理OSが同一ならば(ステップ2902)
、割り込み識別テーブル1520に登録されている割り込みハンドラ1522を実行する(ステップ2903)。ハンドラ処理終了時に割り込まれた処理を再開
する。
割り込み発生時のOSと割り込み処理OSが異なる場合は、2つのOSの優先度を比較する(ステップ2904)。実行中のOSの優先度の方が高い場合、ス
テップ2905へ進み、遅延割り込み状態変数1540を設定して、割り込まれた処理を再開する。
割り込み処理OSの優先度の方が実行中のOSよりも高い場合は、ステップ2906へ進み、割り込み処理を開始する。
ステップ2906では、割り込み識別テーブル1520より割り込みハンドラアドレス1522を取得する。続いて、割り込み発生時のコンテクストを保存し(ステップ2907)、割り込みハンドラを呼び出す(ステップ2908)。割
り込みハンドラの呼び出しは、図28のステップ2801から始まる手順により実施する。
その後、割り込まれたOSに制御が戻った時に、割り込み発生時のコンテクストを回復し(ステップ2910)、割り込まれた処理を再開する。
次に、共通領域203に配置する処理モジュールについて述べる。共通領域203には、ステップ2801からのOS切替えモジュールと2901から始まる割り込みハンドラを配置する。この他の全てのOSから呼び出されるモジュールも共通領域203に配置する。例えば、各OSの割り込みハンドラを割り込み識別テーブル1520に登録するモジュールや、OSコンテクストテーブル2710の実行状態2705を設定するモジュールである。
各OSは、それぞれの初期化処理で共通領域203の登録モジュールを呼び出して割り込みハンドラを登録することにより、外部割り込みの処理が可能になる
。また、何らかの処理により実行中のOSの優先度よりも低い優先度の他のOSの処理が可能になる場合、実行状態2705に処理待ち中であること、あるいは
、処理待ちの要因を示す値を設定しなければならない。この場合も、共通領域203内の実行状態設定モジュールを呼び出すことにより設定する。
本実施形態によれば、第一のOSの他に複数のOSを1つのプロセッサで実行可能となり、特別な機能に特化したOSを組み合わせることが可能となる。例えば、リアルタイム性に優れたOSと計算機の信頼性を補完するOSとを組み合わせて、第一のOSの機能を補うことができる。各OSは独立しているのでさまざまのOSを組み合わせることができ、用途に応じた第一のOSの機能拡張が可能になる。更に、これまで説明した実施形態により得られる効果も損なわれることはない。
更に、OS間に優先度を設定できるので、リアルタイムOSの優先度を最も高く設定するといった設定も可能である。これにより、各OSの優れている機能を有効に利用することが可能になる。
本発明の第7の実施の形態について説明する。本実施形態は、第6の実施の形態の拡張である。第7の実施の形態では、複数動作している内のあるOSが障害停止した場合に、他の残ったOSが実行継続可能な制御方法を示す。
各OSの障害処理モジュールは、OSの実行を停止する時に、OSコンテクストテーブル2710の実行状態2705を、停止中であると設定しなければならない。これは、前記実施形態の、共通領域203に配置した実行状態設定モジュールの呼び出しにより実施する。
また、各OSは、他のOSが実行を停止した時に呼び出されるOS停止通知ハンドラを持ち、割り込みハンドラと同様に共通領域203内のデータ構造に登録する。
次に、実行状態設定モジュールの処理について説明する。図30は、本モジュールの処理を示したフローチャートである。第三のOSが停止したとして説明する。
ステップ3001では、OSコンテクストテーブル2710の実行状態2705を設定する。
ステップ3002では、設定された実行状態を検査する。もし、OS実行停止に設定されたらならば、ステップ3003へ進む。そうでなければモジュールの処理は終了する。
ステップ3003では、停止したOSよりも優先度が高い稼働中のOSのOS停止通知ハンドラを呼び出す。呼び出しは、ステップ2801からのOS切替えにより呼び出す。優先度が低いOSについては、実行状態2706にOS停止ハンドラ実行待ちであることを記録する。また、各OSのOS停止通知ハンドラは、割り込みハンドラと同様に、各OSの初期化時に共通領域内に配置されたデータ領域に登録されるものとする。
実行OS切替え処理では、切替先のOSが実行を停止していないかを検査する処理が必要である。図28のフローチャートにしたがって説明する。
まず、切替え処理を始める前に、切替先が稼働中かを検査しなければならない。ステップ2801の前に、OSコンテクストテーブル2710の実行状態2705を検査して、稼働中でなければ切替え処理を終了させる。
更に、ステップ2807での次の実行OSの選択では、処理待ち中のOSの検索対象から稼働していないOSを除外するようにする。
選択したOSの実行を再開する前に、選択したOSの実行状態2705を検査し、OS停止通知ハンドラの実行待ちが記録されているならば、OS停止通知ハンドラを実行する。
次に、割り込み処理について説明する。図29のフローチャートにしたがって説明する。ステップ2901の割り込み処理OS決定の後、処理OSが稼働中か検査する。ここで稼働中でないと判定した場合、割り込みを解除して割り込まれた処理を再開させるようにする。
以上の処理により、第一のOS以外に複数のOSが1つのプロセッサ上で同時に動作している時にいくつかのOSが障害により停止しても、他の残りのOSは動作を継続することが可能になる。
また、各OSの障害停止が他のOSに通知されるので、OS間で連携して処理を実施している場合でも、その通知をもとに各OSで障害処理を実施することが可能であり、計算機全体としての信頼性を高めることができる。
これまで述べた実施の形態では、それぞれのOSは互いに異なるOSであっても、同一のOSが含まれていても良い。
100は計算機、101はプロセッサ、102は主記憶装置、103は演算装置、104は割り込みレジスタ、105はページテーブルレジスタ、106はアドレス変換装置、107は割り込みテーブル、108はページテーブル、109はバス、110は割込み信号線、111はクロック生成装置、112は割り込み制御装置、113ないし117は外部入出力装置、118は割り込みバスである。