以下、実施の形態について図面を参照して説明する。
図1は、実施形態に係る情報処理装置のシステム構成を示す図である。本実施形態の情報処理装置は、パーソナルコンピュータ10として実現されている。
図1に示すように、本情報処理装置10は、CPU(Central processing unit)11、MCH(Memory controller hub)12、メインメモリ13、ICH(I/o controller hub)14、GPU(Graphics processing unit)15、ビデオメモリ(VRAM)15A、サウンドコントローラ16、BIOS−ROM(Read only memory)17、第1の記憶装置としてのハードディスクドライブ(HDD)18、ODD(Optical disc drive)19、各種周辺機器21、EEPROM(Electrically erasable programmable ROM)22、EC/KBC(Embedded controller/keyboard controller)23等を備えている。
CPU11は、本情報処理装置の動作を制御するプロセッサであり、HDD18やODD19からメインメモリ13にロードされる各種プログラムを実行する。このCPU11によって実行される各種プログラムの中には、リソース管理を司るオペレーティングシステム(OS)110や、当該OS110の配下で動作する、キャッシュドライバ120および各種アプリケーションプログラム130等が存在する。
また、CPU11は、BIOS−ROM17に格納されたBIOSも実行する。BIOSは、ハードウェア制御のためのプログラムである。以下では、BIOS−ROM17の格納物であるBIOS自体についてもBIOS17と表記することがある。
MCH12は、CPU11とICH14との間を接続するブリッジとして動作すると共に、メインメモリ13をアクセス制御するメモリコントローラとして動作する。また、MCH12は、GPU15との通信を実行する機能を有している。
GPU15は、本情報処理装置に組み込まれ、または、外部接続される表示装置を制御する表示コントローラである。GPU15は、VRAM15Aを有し、また、各種プログラムが表示しようとする画像をCPU11に代わって描画するアクセラレータを搭載している。
ICH14は、HDD18、およびODD19を制御するためのIDE(Integrated device electronics)コントローラを内蔵する。ICH14は、PCI(Peripheral component interconnect)バスに接続された各種周辺機器21の制御も行う。また、ICH14は、サウンドコントローラ16との通信機能も有している。
また、ICH14は、コンピュータ本体から取り外し可能な、第2の記憶装置としてのSSD(Solid State Drive)31と通信を行うUSBコントローラ14Aを内蔵する。なお、SSD31は、HDD18よりもランダムアクセス速度が高速で、取り外し可能な不揮発メモリである。
キャッシュドライバ120は、HDD18とSSD31とを制御するプログラムである。本情報処理装置は、SSD31の一部または全部をHDD18のキャッシュとして利用することで、SSD31に対するアクセスの高速化を図る。キャッシュドライバ120は、そのための仕組みを備えたものである。
サウンドコントローラ16は音源デバイスであり、各種プログラムが再生対象とするオーディオデータを、本情報処理装置に組み込まれ、または、外部接続されるスピーカ等に出力する。
EEPROM22は、例えば本情報処理装置の個体情報や環境設定情報などを格納するためのメモリデバイスである。そして、EC/KBC23は、電力管理を行うためのエンベデッドコントローラと、キーボードやポインティングデバイス等の操作によるデータ入力を制御するためのキーボードコントローラとが集積された1チップMPU(Micro processing unit)である。
HDDに一般的に格納されるデータの構成について図2を参照して説明する。HDD18の先頭は、ブートセクタ200と言われる。一般にHDD18は複数の領域パーティション(またはボリューム)に分割して管理されている。図2に示す例では、第1パーティション210および第2パーティション220が設定されている。HDD18の各パーティションを管理するための管理情報はブートセクタ200内にレイアウト情報(パーティションテーブル)202として格納されている。管理可能なパーティションの数は有限である。各々のパーティションはファイルシステムによってさらに細かい単位で管理される。
また、ブートセクタ200には、BIOSによって実行が開始される、第1の起動コードとしての起動コード201が格納されている。起動コード201は、第1パーティション210の先頭ブロックに格納されている、オペレーティングシステム起動コードとしてのカーネル起動コード211を実行させる。カーネル起動コード211は、オペレーティングシステム110のカーネルを実行させる機能を有する。
一般的なオペレーティングシステム110の起動について説明する。電源をオンした後、またはリセットされた場合、CPU11によってBIOSが実行される。BIOSはPower On Self Test(POST)処理を実行することによって、オペレーティングシステム110の起動に必要な機器が正常に動作するかをチェックする。また、同時にそれら周辺機器の初期化も行う。次にBIOSは、ブート可能なデバイスを探す。BIOSがブート可能デバイス(HDD18)を検出すると、BIOSは検出されたデバイス(HDD18)のブートセクタに格納されている起動コード201をメモリ13にロードし、起動コード201をCPU11に実行させる。起動コード201はレイアウト情報202からHDD18内のアクティブなパーティション(第1パーティション210)を検出する。アクティブなパーティションを検出すると、起動コード201は、アクティブなパーティション(第1パーティション210)の先頭に格納されている、オペレーティングシステム110のカーネルを実行させるためのカーネル起動コード211をメモリ13にロードし、ロードされたカーネル起動コード211をCPU11に実行させる。
ところで、本装置は、SSD31をキャッシュメモリとして利用する。SSD31は、取り外し可能なメディアであるので、オペレーティングシステムの起動時に取り外されている場合がある。上述した一般的な起動プロセスでは、SSD31の有無を検出するようなことを行っていない。
以下では、オペレーティングシステムの起動時にSSD31が取り外されている場合に、SSD31が取り外されていることが記述されているログを記録することが可能なように、HDD18に格納されている起動コード201を変更する例について説明する。
ログを記録するために、CPU11によって実行される起動プロセス変更プログラムによって、HDD18内の起動コード201の書き替え、およびログの記録を行うログ起動用ブートローダの書き込み、SSD31へのキャッシュ有り用ブートローダの書き込み等が行われる。
図3を参照して、起動プロセス変更プログラムの構成を説明する。
起動プロセス変更プログラム300は、第1連続領域確保部301、第2連続領域確保部302、および起動コード/ブートローダ変更部303等を備えている。
第1連続領域確保部301は、HDD18にログ起動用ブートローダを書き込むための第1連続領域を確保する処理を行う。第2連続領域確保部302は、SSD31内にキャッシュ有り用ブートローダを書き込まれると共に、キャッシュデータが格納される第2連続領域を確保する処理を行う。起動コード/ブートローダ変更部303は、第1連続領域および第2連続領域の確保後、第1連続領域にログ記録用ブートローダ731を格納する処理と、第2連続領域にキャッシュ有り用ブートローダを格納する処理と、起動コード201を別の起動コードによって書き替える処理とを行う。
先ず、起動プロセス変更プログラム300が、カーネル起動コード211を実行させるまでのプロセスを変更するための手順を図4を参照して説明する。
先ず、起動プロセス変更プログラム300の第1連続領域確保部301は、HDD18内に第1連続領域を確保する(ステップ401)。図5を参照して、起動プロセス変更プログラムが、第1連続領域を確保する処理の手順を説明する。
第1連続領域確保部301は、HDD18のブートセクタ200からレイアウト情報202を読み出す。第1連続領域確保部301は、読み出されたレイアウト情報202に基づいてHDD18に設定されているパーティションの数が最大数未満であるかを判定する(ステップ501)。
設定されているパーティションの数が最大数未満であると判定した場合(ステップ501のYes)、第1連続領域確保部301は、HDD18に第1連続領域を生成するために必要な容量より大きく、パーティションが割り当てられていない領域があるかを判定する(ステップ502)。HDD18に第1連続領域を生成するために必要な容量より大きく、パーティションが割り当てられていない領域がないと判定した場合(ステップ502のNo)、第1連続領域確保部301は、オペレーティングシステム110にサイズを縮小することが可能なパーティションがあるかを問い合わせる。第1連続領域確保部301は、問い合わせに対するオペレーティングシステムからの応答に応じて、サイズを縮小することが可能なパーティションがあるかを判定する(ステップ503)。
例えば、HDD18の状態が図6に示す状態であり、第2パーティション220のサイズが縮小可能であり、第2パーティション220のサイズを縮小することが可能であると判定した場合(ステップ503のYes)、第1連続領域確保部301は、第2パーティション220を選択する(ステップ504)。サイズを縮小することが可能なパーティションが複数ある場合、最もサイズを縮小することが可能なパーティションを選択する。
第1連続領域確保部301は、選択したパーティション(第2パーティション220)のサイズを縮小するための縮小処理を行う(ステップ505)。例えば、図7に示すように、第1連続領域確保部301は、第2パーティション220のサイズを縮小し、パーティションが設定されていない未管理領域230を生成する。この縮小処理は、オペレーティングシステムが提供している機能を使用しても良いし、第1連続領域確保部301が縮小処理を行う機能を有していても良い。
縮小処理後、第1連続領域確保部301は、未管理領域230が第1連続領域を生成するために必要な容量を有するかを判定する(ステップ506)。未管理領域230が第1連続領域を生成するために必要な容量を有すると判定した場合(ステップ506のYes)、またはステップ502においてHDD18が図7に示す状態であり、HDD18に第1連続領域を生成するために必要な容量より大きい、パーティションが割り当てられていない未管理領域230があると判定した場合(ステップ502のYes)、第1連続領域確保部301は、図8に示すように、第1連続領域を確保するために必要な容量を有するパーティション(第3パーティション231)を作成する(ステップ507)。第3パーティション231の作成後、第1連続領域確保部301は、第3パーティション231に固定データを書き込むことによって、第3パーティション231を初期化する(ステップ508)。初期化後、第1連続領域確保部301は、初期化されているかを確認する。
ステップ501において設定されているパーティションの数が最大数未満ではないと判定した場合(ステップ501のNo)、ステップ503においてパーティションのサイズを縮小することができないと判定した場合(ステップ503のNo)、または第1連続領域を確保するために必要な容量を有する、パーティションが設定されていない領域がないと判定した場合(ステップ506のNo)、第1連続領域確保部301は、HDD18内に既知のファイルシステムによって管理され、第1連続領域を確保するために必要な容量を有する空き領域を作成可能であるかを判定する(ステップ509)。
空き領域を作成可能であると判定した場合(ステップ509のYes)、第1連続領域確保部301は、HDD18内のデータを移動させることによって、図9に示すように、アドレスが連続する空き領域212を作成する(ステップ510)。空き領域212作成後、第1連続領域確保部301は、作成された空き領域212の容量が第1連続領域を確保するために必要な容量より大きいかを判定する(ステップ511)。空き領域212の容量が第1連続領域を確保するために必要な容量より大きくないと判定した場合(ステップ511のNo)、第1連続領域確保部301は、第1連続領域の確保処理を終了する。空き領域212の容量が第1連続領域を確保するために必要な容量より大きいと判定した場合(ステップ511のYes)、第1連続領域確保部301は、空き領域212に固定データを書き込むことによって、空き領域212を初期化する(ステップ508)。以上でHDD18での連続領域の確保処理の説明を終了する。
HDD18内での第1連続領域の確保処理が終了した後、第2連続領域確保部302は、SSD31のレイアウト情報内に起動フラグの値が起動可を示しているパーティションがあるかを判定する(ステップ402)。起動フラグの値が起動可を示しているパーティションがあると判定した場合(ステップ402のYes)、起動可を示している起動フラグの値を起動フラグの値を起動不可を示す値に書き換える(ステップ403)。この書き換え処理は、ユーザの承諾後に行われる。
起動フラグの値が起動可を示しているパーティションがないと判定した場合(ステップ402のNo)、または起動フラグを起動フラグの値を起動不可を示す値に書き換えた後(ステップ403)、第2連続領域確保部302はSSD31に第2連続領域を確保する確保処理を行う(ステップ404)。SSD31に第2連続領域を確保する確保処理について図10のフローチャートを参照して説明する。
第2連続領域確保部302は、SSD31のブートセクタ200からレイアウト情報202を読み出す。ブートローダ設定プログラムは、読み出されたレイアウト情報202に基づいてSSD31に設定されているパーティションの数が最大数未満であるかを判定する(ステップ601)。
最大数未満であると判定した場合(ステップ601のYes)、第2連続領域確保部302は、SSD31に第2連続領域を確保するために必要な容量より大きい、パーティションが割り当てられていない領域があるかを判定する(ステップ602)。SSD31に第2連続領域を確保するために必要な容量より大きい、パーティションが割り当てられていない未管理領域がないと判定した場合(ステップ602のNo)、第2連続領域確保部302は、オペレーティングシステム110に対してSSD31にサイズを縮小することが可能なパーティションがあるかを問い合わせる。第2連続領域確保部302は、問い合わせに対するオペレーティングシステムからの応答に応じて、SSD31内にサイズを縮小することが可能なパーティションがあるかを判定する(ステップ603)。
サイズを縮小することが可能であると判定した場合(ステップ603のYes)、第2連続領域確保部302は、SSD31から最もサイズを縮小することが可能なパーティションを選択する(ステップ604)。第2連続領域確保部302は、選択したパーティションのサイズを縮小するための縮小処理を行う(ステップ605)。この縮小処理は、オペレーティングシステムが提供している機能を使用しても良いし、第2連続領域確保部302が縮小処理を行う機能を有していても良い。縮小処理後、第2連続領域確保部302は、SSD31に第2連続領域を生成するために必要な容量を有する、パーティションが割り当てられていない未管理領域があるかを判定する(ステップ606)。第1連続領域を確保するために必要な容量を有する未管理領域があると判定した場合(ステップ606のYes)、または第2連続領域を確保するために必要な容量より大きい、パーティションが割り当てられていない未管理領域があると判定した場合(ステップ602のYes)、第2連続領域確保部302は、図11に示すように、第2連続領域を確保するために必要な容量を有する第1パーティション710をSSD31に作成する(ステップ607)。図11に示すように、SSDの先頭のブートセクタ700内には、第1パーティション710を管理するためのレイアウト情報702が格納されている。
第1パーティション710作成後、第2連続領域確保部302は、第1パーティション710に固定データを書き込むことによって、第1パーティション710を初期化する(ステップ608)。以上の処理によって、第2連続領域として第1パーティション710が生成される。
ステップ601においてSSD31に設定されているパーティションの数が最大数未満ではないと判定した場合(ステップ601のNo)、ステップ603においてパーティションサイズを縮小することができないと判定した場合(ステップ603のNo)、または第2連続領域を確保するために必要な容量を有する未管理領域がないと判定した場合(ステップ606のNo)、第2連続領域確保部302は、第2連続領域の確保処理を終了する。以上でSSD31での連続領域の確保処理の説明を終了する。
なお、以下では、図8に示すようにHDD18に第3パーティション231が第1連続領域として確保され、図11に示すようにSSD31に第1パーティション710が第2連続領域として確保された場合を説明する。
SSD31内に第2連続領域を確保することができた場合(ステップ405のYes)、起動コード/ブートローダ変更部303は、HDD18の個体識別番号とHDD18が接続されたコンピュータ本体の個体識別番号を取得する(ステップ406)。また、起動コード/ブートローダ変更部303は、カーネル起動コードの位置を取得する。次いで、起動コード/ブートローダ変更部303は、起動コード/ブートローダ変更部303が有するキャッシュ有り用ブートローダのマスターコードを取得された個体識別番号およびカーネル起動コードの位置に基づいてカスタマイズする(ステップ407)。起動コード/ブートローダ変更部303は、図12に示すように、カスタマイズされたマスターコード712を有するブートローダ(以下、キャッシュ有り用ブートローダ)711をSSD31の第1パーティション710の先頭ブロックから書き込む(ステップ408)。キャッシュ有り用ブートローダ711は、連続する領域に書き込まれる。カスタマイズされたマスターコード712には、キャッシュ有り用ブートローダ711が後述するカーネル起動コードを起動して良いかを判別するための情報として、HDD18の個体識別番号、コンピュータの個体識別番号、カーネル起動コードの位置が記録されている。
起動コード/ブートローダ変更部303は、図12示すように、キャッシュ有り用ブートローダ711が格納されている最後の領域の次の領域に、後にHDD18のブートセクタ200に書き込まれるデータ(以下、ブートセクタデータ)700Aを書き込む。ブートセクタデータ710Aは、書き替え起動コード701A、およびレイアウト情報702Aを有する。なお、この時点で、レイアウト情報702Aは有効な情報を有していない。
そして、起動コード/ブートローダ変更部303は、HDD18内のブートセクタ200からデータを読み出し(ステップ409)、読み出されたブートセクタ200に格納されていたブートセクタデータ200Aをブートセクタデータ700Aが書き込まれている領域の次の領域から書き込む(ステップ410)。図12に示すように、SSD31に書き込まれたブートセクタデータ200Aは、起動コード201およびレイアウト情報202Aのコピーである起動コード201Aおよびレイアウト情報202Aを有する。
HDD18内に第1連続領域(第3パーティション231)が正常に確保された場合(ステップ411のYes)、起動コード/ブートローダ変更部303は、図13に示すように、第3パーティション231の先頭ブロックからログ記録用ブートローダ731を書き込む(ステップ412)。起動コード/ブートローダ変更部303は、HDD18またはSSD31からブートセクタに格納されているデータを読み出し、ログ記録用ブートローダ731が書き込まれている最後のブロックの次のブロックから、読み出されたブートセクタデータ200Bを書き込む(図13)。ブートセクタデータ200Bは、起動コード201およびレイアウト情報202Aのコピーである起動コード201Bおよびレイアウト情報202Bを有する。
第1連続領域内のログ記録用ブートローダ731およびブートセクタデータ200Bが書き込まれていない領域の少なくとも一部はログ記録用ブートローダがログ情報を書き込むログ記録領域232となる。
起動コード/ブートローダ変更部303は、HDD18のブートセクタ200に書き込まれているレイアウト情報202を読み出し、読み出されたレイアウト情報202によってHDD18内のブートセクタデータ700Aのレイアウト情報をSSD31内のレイアウト情報702Aを上書きし、ブートセクタデータ700Aにレイアウト情報202Bを生成する(ステップ413、図14)。また、SSD31内のブートセクタデータ700A内に、HDD18の第3パーティション231内のログ記録用ブートローダ731の位置情報(先頭アドレスおよび大きさ)、およびログ記録領域232の位置情報(先頭アドレスおよび大きさ)を含む位置情報703Aを書き込む。
さらに、ブートローダ書換プログラムは、HDD18のブートセクタ200に、SSD31内のブートセクタデータ700Aを書き込むことによって、起動コード201およびレイアウト情報を書き換え起動コード701Aおよび書き替えレイアウト情報202Bによって上書きすると共に、位置情報703Bを書き込む(ステップ414、図15)。ブートローダ書換プログラムは、後述する管理アプリケーションプログラムをインストールする(ステップ415)。
もし、HDD18内に第1連続領域を確保することができなかった場合(ステップ411のNo)、起動コード/ブートローダ変更部303は、HDD18のブートセクタ200に書き込まれているレイアウト情報202を読み出し、読み出されたレイアウト情報202によってHDD18内のブートセクタデータ700Aのレイアウト情報をSSD31内のレイアウト情報702Aを上書きする(ステップ416)。そして、SSD31内のブートセクタデータ700A内に、HDD18の第3パーティション231内のログ記録用ブートローダ731の位置情報(先頭アドレスおよび大きさ)、およびログ記録領域232の位置情報(先頭アドレスおよび大きさ)を含む位置情報を書き込む。なお、起動コード/ブートローダ変更部303は、ログ記録用ブートローダ731の位置情報として0や1などの明らかに異常とわかる値を設定することでログ取得機能が無効にする。さらに、起動コード/ブートローダ変更部303は、HDD18のブートセクタに、SSD31内の連続領域の先頭ブロックアドレスが埋め込まれている新たな書き換え起動コードを有するブロックを書き込むことによって、オリジナル起動コードを書き換え起動コードによって上書きする(ステップ416)。
以上で、ブートセクタの書き替えする処理、およびログ記録用ブートローダ731を書き込む処理の説明を終了する。
次に、上述したブートセクタの書き替えする処理、およびログ記録用ブートローダ731を書き込む処理が終了した後の本装置の起動シーケンスについて説明する。
電源オン直後、ないしリセット後、CPU11は、BIOSを実行する。BIOSはPower On Self Test(POST)処理を実行し、必要な機器が正常に動作するかをチェックする。また、同時にそれら周辺機器の初期化も実行する。次に初期プログラムは、ブート可能なデバイスを検索する。初期プログラムがブート可能なデバイス(HDD18)を検出すると、検出されたデバイスのブートセクタに格納されている起動コード701Aをメモリ13にロードし、ロードされた起動コード701AがCPU11によって実行される。
起動コード701Aによって行われる処理の手順を図16のフローチャートを参照して説明する。
起動コード701Aは、レイアウト情報202Bに基づいてSSD31を検索する(ステップ401)。SSD31を検出した場合(ステップ802のYes)、起動コード701Aは、SSD31からキャッシュ有り用ブートローダ711の読み出しを試みる(ステップ803)。読み出しに成功した場合(ステップ804のYes)、起動コード701Aは、キャッシュ有り用ブートローダ711をメモリ13にロードし、CPU11にキャッシュ有り用ブートローダ711を実行させる(ステップ805)。
SSD31を検出しなかった場合(ステップ802のNo)、またはSSD31からキャッシュ有り用ブートローダ711を読み出せなかった場合(ステップ804のNo)、起動コード701Aは、HDD18のブートセクタ200内の位置情報703B内のログ記録用ブートローダ731の位置情報に基づいてログ取得機能が有効になっているかを判定する(ステップ806)。有効になっていると判定した場合(ステップ806のYes)、起動コード701Aは、HDD18からログ記録用ブートローダ731をメモリ13にロードすることを試みる(ステップ807)。ログ記録用ブートローダ731が正常にロードされた場合(ステップ807のYes)、起動コード701Aは、ロードされたログ記録用ブートローダ731をCPU11に実行させる(ステップ809)。
ログ取得機能が有効になっていないと判定した場合(ステップ806のNo)、またはログ記録用ブートローダ731が正常に読み出されなかった場合(ステップ808のNo)、書き替えブートローダは、レイアウト情報202Bを参照することによってオペレーティングシステムのカーネルを起動するためのカーネル起動コード211をメモリ13にロードし(ステップ811)、読み出されたカーネル起動コード211をCPU11に実行させる(ステップ812)。
次に、キャッシュ有り用ブートローダ711によって実行される処理を図17のフローチャートを参照して説明する。
キャッシュ有り用ブートローダ711は、SSD31からマスターコード712の読み出しを試みる(ステップ901)。マスターコード712の読み出しに成功すると(ステップ902のYes)、キャッシュ有り用ブートローダ711は、コンピュータに接続されている全てのHDDから個体識別情報をそれぞれ読み出し、読み出された個体識別情報を有する個体識別番号テーブルを作成する(ステップ903)。キャッシュ有り用ブートローダ711は、個体識別番号テーブル内にマスターコード712に登録されている個体識別情報と一致する個体識別番号があるかを判定する(ステップ904)。
一致する個体識別番号があると判定した場合(ステップ904のYes)、キャッシュ有り用ブートローダ711は、マスターコード712内のコンピュータの識別番号、およびカーネル起動コード211の先頭位置アドレスが有効であるかを判定する(ステップ905)。有効であると判定した場合(ステップ905のYes)、キャッシュ有り用ブートローダ711は、リクエスト監視ルーチンを実行する(ステップ906)。リクエスト監視ルーチンについては後述する。キャッシュ有り用ブートローダ711は、カーネル起動コードをメモリ13にロードする(ステップ907)。次ステップのカーネル起動コードがロードされたら、キャッシュ有り用ブートローダ711は、CPU11にカーネル起動コードを実行させる(ステップ908)。
構成情報の読み出しに失敗した場合(ステップ902のNo)、一致する個体識別番号がないと判定した場合(ステップ904のNo)、または構成情報が有効ではなかった場合(ステップ905のNo)、キャッシュ有り用ブートローダ711は、位置情報703Bのログ記録用ブートローダ731の位置情報に基づいてログ取得機能が有効になっているかを判定する(ステップ909)。有効になっていると判定した場合(ステップ909のYes)、キャッシュ有り用ブートローダは、HDD18からログ記録用ブートローダ731をメモリ13にロードすることを試みる(ステップ910)。ログ記録用ブートローダ731が正常に読み出された場合(ステップ911のYes)、キャッシュ有り用ブートローダは、ロードされたログ記録用ブートローダ731をCPU11に実行させる(ステップ912)。
ログ取得機能が有効になっていないと判定した場合(ステップ911のNo)、またはログ記録用ブートローダ731が正常に読み出されなかった場合(ステップ909のNo)、キャッシュ有り用ブートローダ711は、レイアウト情報202Aを参照することによってオペレーティングシステムのカーネルを起動するためのカーネル起動コード211をメモリ13にロードし(ステップ913)、ロードされたカーネル起動コード211をCPU11に実行させる(ステップ914)。
次に、ステップ906におけるリクエスト監視ルーチンについて図18のフローチャートを参照して説明する。
キャッシュ有り用ブートローダ711は、I/Oリクエストの対象が監視対象ドライブであるHDD18であるかを判定する(ステップ1001)。HDD18であると判定した場合(ステップ1001のYes)、キャッシュ有り用ブートローダ711は、I/OリクエストされたデータがSSD31にキャッシュされているかを判定する(ステップ1002)。キャッシュされていると判定した場合(ステップ1002のYes)、キャッシュ有り用ブートローダ711は、I/Oリクエストがデータの書き込みであるかを判定する(ステップ1003)。書き込みではないと判定した場合(ステップ1003のNo)、キャッシュ有り用ブートローダ711は、I/Oリクエストを発行先に転送する(ステップ1005)。I/Oリクエストの発行先がデータを転送したら、キャッシュ有り用ブートローダ711は、転送されたデータおよびデータの位置情報をSSD31内に格納し、データをキャッシュする(ステップ1010)。
ステップ1003において書き込みであると判定した場合(ステップ1003のYes)、キャッシュ有り用ブートローダ711は、SSD31にキャッシュされているデータを無効にする(ステップ1006)。そして、キャッシュ有り用ブートローダ711は、元のI/Oリクエスト処理を実行する(ステップ1007)。
対象のデータがキャッシュされていないと判定した場合(ステップ1002のNo)、キャッシュ有り用ブートローダ711は、I/Oリクエストがデータの書き込みであるかを判定する(ステップ1008)。書き込みであると判定した場合(ステップ1008のYes)、キャッシュ有り用ブートローダ711は、通常のデータ書き込み処理を行う(ステップ1007)。書き込みではない判定した場合(ステップ1008のNo)、キャッシュ有り用ブートローダ711は、I/OリクエストされたデータをHDD18から読み出し、読み出されたデータおよびアドレスをSSD31に書き込む(ステップ1009)。そして、キャッシュ有り用ブートローダ711は、元のI/Oリクエスト処理を実行する(ステップ1007)。
このような処理をおこなうことで、HDD18のランダムリードアクセスのシークタイムを隠蔽することが可能となる。
HDD18内にキャッシュ有り用ブートローダ711を配置すると余計なヘッドシークが複数発生するが、SSD31をキャッシュ有り用ブートローダ711に格納することで、起動時間を短くすることが可能である。
次に、ログ記録用ブートローダ731による処理について図19のフローチャートを参照して説明する。
なお、起動コード701Aから、ログ記録用ブートローダ731が読み出されるまでに発生した異常系への分岐の履歴がエラー情報としてメモリ13内に記録されている。
ログ記録用ブートローダ731は、エラー情報をメモリ13内から収集する(ステップ1101)。ログ記録用ブートローダ731は、キャッシュメモリとして用いられるSSD31が接続されていないことを示す未装着情報および記録日時を有するエラーログをHDD18内のログ記録領域に記録する(ステップ1102)。なお、メモリ13内のエラー情報はログ記録用ブートローダ731から読み出されると消去される。
ログ記録用ブートローダ731は、カーネル起動コード211をメモリ13にロードし(ステップ1103)、ロードされたカーネル起動コード211をCPU11に実行させる(ステップ1104)。
カーネル起動コード211は、先ずオペレーティングシステムのカーネルを起動し、順次オペレーティングシステム110が実行される。
オペレーティングシステムの起動中に実行される処理を図20を参照して説明する。
図20に示すように、オペレーティングシステムの起動中、レガシーモードで動作するプログラムによって、カーネルモードで動作するオペレーティングシステムカーネル1201と、カーネルI/O監視アプリケーションプログラム1202と、ディスクドライバ1203とが起動される。ここで、レガシーモードとは、BIOSによって起動コードが起動されてからカーネルが起動する前までの状態である。また、カーネルモードとは、カーネル起動後の状態である。カーネルI/O監視アプリケーションプログラム1202は、オペレーティングシステムカーネル1201からディスクドライバ1203に対するリクエストをフックする。
次に、オペレーティングシステム起動後の実行される処理を図21を参照して説明する。オペレーティングシステムの起動後、図21に示すように、ユーザモードで動作する管理アプリケーションプログラム1211や各種アプリケーションプログラム1212が起動される。カーネルI/O監視アプリケーションプログラム1202は、ファイルシステム1204からディスクドライバ1203に対するリクエストをフックする。
なお、管理アプリケーションプログラム1211は、図21に示すように、カーネルI/O監視プログラム1202が取得したログ情報をオペレーティングシステムカーネル1201に格納する処理を行う。
カーネルモードI/O監視アプリケーションプログラムの構成を図22を参照して説明する。
カーネルモードI/O監視アプリケーションプログラム1200は、OS起動停止部1301および保護領域保護部1302等を備えている。
OS起動停止部1301は、ログ記録領域232内のログ情報を参照し、そのまま起動すると致命的なエラー情報が含まれている(例えばSSD31に最新のデータが含まれており、HDD18には含まれていない場合)ことを検出したとき、OSの起動を停止する。致命的ではない場合は、そのままOSの起動を継続する。
保護領域保護部1302は、ログ記録用ブートローダ731、ログ記録領域232、およびキャッシュ有り用ブートローダ711(以下、ログ記録用ブートローダ731、ログ記録領域232、およびキャッシュ有り用ブートローダ711が格納されている領域を保護領域と記す)が別なデータで改変されないようにする。保護領域保護部1302は、保護領域内のデータが改変されないようにI/Oリクエストを監視する処理を実行する。
OS起動停止部1301によって実行される処理の手順の一例を図23のフローチャートを参照して説明する。
OS起動停止部1301は、起動コード701A内の位置情報703Bを参照することで、ログ記録領域232内のログ情報を読み出す(ステップ1401)。OS起動停止部1301は、ログ情報に基づいてログ情報が起動時にSSD31が装着されていないことが致命的かどうか判定する(ステップ1402)。SSD31が装着されていないことが致命的な場合(ステップ1402のYes)、OS起動停止部1401はOSの起動を停止させるため、Panicを発生させたり、システムを再起動をさせたりする。
SSD31が装着されていないことが致命的ではない場合(ステップ1402のYes)、そのままオペレーティングシステム110の起動を継続される。
以上の処理で、オペレーティングシステムの起動中に実行されるカーネルI/O監視アプリケーションプログラム1202は、ログ記録用ブートローダ731によって生成されたログ情報に基づいて、SSD31が装着されていないことを検出することが可能になる。また、カーネルモードI/O監視プログラムの起動停止部によって、自動的に起動停止することで、SSD31が使用できないことによって生じる致命的なデータ破壊を抑制することが可能になる。
オペレーティングシステム起動後に実行される管理プログラムが実行される。管理プログラム1300は、ログ管理部および保護領域保護部1302等を有する。
保護領域保護部1302によって実行されるI/Oリクエストを監視する処理の手順の一例を図24のフローチャートを参照して説明する。
保護領域保護部1302は、ファイルシステム等からHDD18に対して発行されたI/Oリクエストをフックする(ステップ1501)。保護領域保護部1302は、I/Oリクエストが書き込み要求であるかを判定する(ステップ1502)。書き込み要求であると判定した場合(ステップ1502のYes)、保護領域保護部1302は、リクエストによってデータが書き込まれるのが保護領域を含んでいるかを判定する(ステップ1503)。保護領域を含んでいると判定した場合、保護領域保護部1302は、書き込み要求を失敗させる(ステップ1504)。保護領域保護部1302は、保護領域を含んでいないと判定した場合、I/Oリクエストを発行元に渡す(ステップ1505)。
以上の処理で保護領域に格納されているデータの改変を防止することができる。
上記実施形態では、SSD31がHDD18のキャッシュメモリとして用いられる例を説明したが、通常のデータを記録するのではなく、システムの実行に関連するデータを格納するので有れば、本実施形態を適用することが可能である。
また、上記実施形態では、第2の記憶装置が、USBバスによって接続されたSSD31である例を説明したが、SATA(Serial Advanced Technology Attachment)の外付け用の規格であるeSATAによって接続されたSSDであっても良い。また、第2の記憶装置は、取り外し可能な記憶メディアであれば、SSD以外であっても良い。例えば、第2の記憶装置がUSBメモリであっても良い。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。