(57)【特許請求の範囲】
【請求項１】
同一のデータの複数のファームウェアを、記憶素子上のそれぞれに割り当てられた領域に保存する情報記憶手段と、
前記情報記憶手段に保存されている前記ファームウェアのうち、いずれの前記ファームウェアを起動するかの情報を示す起動フラグと、起動を抑止する前記ファームウェアの情報を示す起動抑止フラグとを保存する起動フラグ保存手段と、
前記起動抑止フラグの設定されていない前記ファームウェアの中から、いずれか１つの前記ファームウェアに前記起動フラグを設定する手段と、前記起動フラグの情報に対応する前記ファームウェアを前記記憶素子から読み出して、読み出した前記ファームウェアに基づいて信号を出力する手段とを有する制御手段と
を備え、
前記情報記憶手段は、前記ファームウェアとして第１のファームウェア、第２のファームウェアおよび第３のファームウェアを保存し、
前記制御手段は、前記ファームウェアのデータを更新する手段をさらに有し、
前記制御手段は、前記第１のファームウェアおよび前記第２のファームウェアを更新した後に、更新後の前記第１のファームウェアが正常に起動した場合に、前記第３のファームウェアの更新を行うことを特徴とする記憶装置。
【請求項２】
前記制御手段は、更新後の前記第１のファームウェアの異常を検知した場合に、更新前の状態の前記第３のファームウェアのデータを前記第１のファームウェアにコピーすることを特徴とする請求項１に記載の記憶装置。
【請求項３】
前記制御手段は、前記第１のファームウェア、第２のファームウェアおよび第３のファームウェアのデータをブロックごとに比較して異常の有無を判断する手段と、
正常と判断した前記ブロックのデータを、異常と判断した他の前記ファームウェアの同一のブロックにコピーしてデータの修復を行う手段とをさらに有することを特徴とする請求項１または２いずれかに記載の記憶装置。
【請求項４】
前記制御手段は、前記ブロックごとに比較して異常の有無を判断する際に、前記ブロックを元のサイズよりも小さな単位に分割することを特徴とする請求項３に記載の記憶装置。
【請求項５】
前記制御手段は、外部から稼働中のファームウェアの情報の要求を受けたときに前記第３のファームウェアが稼働中であった場合に、前記第１のファームウェアまたは前記第２のファームウェアのいずれかを稼働中のファームウェアとして応答することを特徴とする請求項１から４いずれかに記載の記憶装置。
【請求項６】
同一のデータの複数のファームウェアを第１のファームウェア、第２のファームウェアおよび第３のファームウェアとして、記憶素子上のそれぞれに割り当てられた領域に保存し、
保存されている前記ファームウェアのうち、いずれの前記ファームウェアを起動するかの情報を示す起動フラグと、起動を抑止する前記ファームウェアの情報を示す起動抑止フラグとを保存し、
前記起動抑止フラグの設定されていない前記ファームウェアの中から、いずれか１つの前記ファームウェアに前記起動フラグを設定し、
前記起動フラグの情報に対応する前記ファームウェアを記憶素子から読み出して、読み出した前記ファームウェアに基づいて信号を出力し、
前記第１のファームウェアおよび前記第２のファームウェアを更新した後に、更新後の前記第１のファームウェアが正常に起動した場合に、前記第３のファームウェアの更新を行うことを特徴とする記憶装置の制御方法。
【請求項７】
更新後の前記第１のファームウェアの異常を検知した場合に、更新前の状態の前記第３のファームウェアのデータを前記第１のファームウェアにコピーすることを特徴とする請求項６に記載の記憶装置の制御方法。
【請求項８】
前記第１のファームウェア、前記第２のファームウェアおよび前記第３のファームウェアのデータをブロックごとに比較して異常の有無を判断し、
正常と判断した前記ブロックのデータを、異常と判断した他の前記ファームウェアの同一のブロックにコピーしてデータの修復を行うことを特徴とする請求項６または７いずれかに記載の記憶装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、記憶装置に関するものであり、特に冗長化されたファームウェアを保存している記憶装置に関するものである。
【背景技術】
【０００２】
組み込み系の制御装置は、記憶素子に保存されたファームウェアに基づいて制御装置が備えられた産業用機器や情報処理装置などの制御を行う。それらの制御装置は、高い信頼性が要求される。そのため、制御装置は、ファームウェアを二重化するなど冗長化した構成を備えている。
【０００３】
しかし、ファームウェアを二重化した構成であっても記憶素子の劣化等によりデータの破損が生じる恐れがある。記憶素子の劣化は、記憶素子にアクセスする回数が増えることにより素子が劣化し、データの読み書きを行う際の閾値が変動することによって生じる。
【０００４】
ＮＡＮＤ型フラッシュメモリの大容量化やｅＭＭＣ（embedded Multi Media Card）などのデバイスの広まりとともに、組み込み系の制御装置の記憶素子にＮＡＮＤ型フラッシュメモリが用いられることが増えている。しかし、ＮＡＮＤ型フラッシュメモリを記憶素子として用いた場合には、動作原理上、使用回数の増加とともに素子が劣化する。そのため、ＮＡＮＤ型フラッシュメモリを用いた場合には、リードディスターブ現象等によって、ファームウェアのデータに異常が生じる可能性が高くなる。
【０００５】
そのような背景からファームウェアを冗長化した構成において、より信頼性を向上させるための技術が盛んに開発されている。ファームウェアを冗長化した構成において、より信頼性を向上させるための技術としては、例えば、特許文献１のような技術が開示されている。
【０００６】
特許文献１は、情報処理システムを起動するためのプログラムが複数、備えられた情報処理システムに関するものである。特許文献１の情報処理システムでは、起動時に複数、備えられた起動用のプログラムすべてについてデータを互いに比較して異常の有無を確認する。特許文献１の情報処理システムでは、多数決によって正常と判断したプログラムによって情報処理システムを起動することで、エラーが生じたプログラムを読み込むことがなく起動時間を短縮することが出来るとしている。
【０００７】
また、特許文献２には、複数の制御プログラムを保存する機能を有する記憶装置が開示されている。特許文献２の記憶装置は、プログラムを格納する記憶領域を複数、備えている。特許文献２の記憶装置は、起動時に各記憶領域のすべてにおいてプログラムの異常の有無の確認を行う。特許文献２の記憶装置では、異常の有無を確認して異常が生じた際に、他のプログラムを用いて訂正することで信頼性を向上させることができるとしている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００９−１８７１９９号公報
【特許文献２】特開２００７−１２２６４０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、特許文献１の技術は次のような点で十分ではない。特許文献１では、起動用のプログラムすべてについてデータを互いに比較して異常の有無を確認している。そのため、起動ごとにすべてのプログラムにアクセスして互いに比較する必要があるため、冗長化されたプログラムの記憶領域へのアクセス回数を削減することができない。よって、特許文献１の技術では、記憶素子の劣化を十分に抑制することができない。
【００１０】
また、特許文献２においても同様に起動時に制御プログラムが格納されているすべての記憶領域について異常の有無のチェックを行う。よって、特許文献２も記憶素子の劣化を十分に抑制することができない。そのため、特許文献１および特許文献２ともに制御プログラム等のファームウェアが冗長化された構成において、記憶素子の劣化を抑制し信頼性を向上させるための技術としては十分ではない。
【００１１】
本発明は、上述した課題を解決するため、ファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる記憶装置を得ることを目的としている。
【課題を解決するための手段】
【００１２】
上記の課題を解決するため、本発明の記憶装置は、情報記憶手段と、起動フラグ保存手段と、制御手段を備えている。情報記憶手段は、同一のデータの複数のファームウェアを、記憶素子上のそれぞれに割り当てられた領域に保存する。起動フラグ保存手段は、情報記憶手段に保存されているファームウェアのうち、いずれのファームウェアを起動するかの情報を示す起動フラグと、起動を抑止するファームウェアの情報を示す起動抑止フラグとを保存する。制御手段は、起動抑止フラグの設定されていないファームウェアの中から、いずれか１つのファームウェアに起動フラグを設定する手段を有する。また、制御手段３は、起動フラグの情報に対応するファームウェアを記憶素子から読み出して、読み出したファームウェアに基づいて信号を出力する手段をさらに有する。
【００１３】
本発明の記憶装置の制御方法は、同一のデータの複数のファームウェアを、記憶素子上のそれぞれに割り当てられた領域に保存する。本発明の記憶装置の制御方法は、保存されているファームウェアのうち、いずれのファームウェアを起動するかの情報を示す起動フラグと、起動を抑止するファームウェアの情報を示す起動抑止フラグとを保存する。本発明の記憶装置の制御方法は、起動抑止フラグの設定されていないファームウェアの中から、いずれか１つのファームウェアに起動フラグを設定する。本発明の記憶装置の制御方法は、起動フラグの情報に対応するファームウェアを記憶素子から読み出して、読み出したファームウェアに基づいて信号を出力する。
【発明の効果】
【００１４】
本発明によると、ファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の第１の実施形態の構成の概要を示す図である。
【図２】本発明の第２の実施形態の構成の概要を示す図である。
【図３】本発明の第２の実施形態における各設定値の例を示した図である。
【図４】本発明の第２の実施形態におけるブートローダ初期化処理のフローを示した図である。
【図５】本発明の第２の実施形態におけるファームウェア起動準備処理のフローを示した図である。
【図６】本発明の第２の実施形態におけるファームウェア起動処理のフローを示した図である。
【図７】本発明の第２の実施形態におけるファームウェア起動完了処理のフローを示した図である。
【図８】本発明の第２の実施形態におけるファームウェア同期処理のフローの概要を示した図である。
【図９】本発明の第２の実施形態におけるファームウェア同期処理のフローの一部を示した図である。
【図１０】本発明の第２の実施形態におけるファームウェア同期処理のフローの一部を示した図である。
【図１１】本発明の第２の実施形態におけるファームウェア同期処理のフローの一部を示した図である。
【図１２】本発明の第２の実施形態におけるファームウェアアップデート処理のフローを示した図である。
【図１３】本発明の第２の実施形態においてファームウェアアップデート時に異常が生じた際のフローを示した図である。
【図１４】本発明の第３の実施形態におけるファームウェア復旧処理のフローを示した図である。
【図１５】ファームウェアのデータ構成の例を示した図である。
【図１６】ファームウェアのデータ構成の例を示した図である。
【図１７】ファームウェアのデータ構成の例を示した図である。
【図１８】本実施形態と対比した構成におけるファームウェアのデータ構成の例を示した図である。
【図１９】本発明の第４の実施形態における動作フローを示した図である。
【発明を実施するための形態】
【００１６】
（第１の実施形態）
本発明の第１の実施形態について図を参照して詳細に説明する。図１は、本実施形態の記憶装置の構成の概要を示したものである。本実施形態の記憶装置は、情報記憶手段１と、起動フラグ保存手段２と、制御手段３を備えている。
【００１７】
情報記憶手段１は、同一のデータの複数のファームウェアを、記憶素子上のそれぞれに割り当てられた領域に保存する。起動フラグ保存手段２は、情報記憶手段１に保存されているファームウェアのうち、いずれのファームウェアを起動するかの情報を示す起動フラグと、起動を抑止するファームウェアの情報を示す起動抑止フラグとを保存する。制御手段３は、起動抑止フラグの設定されていないファームウェアの中から、いずれか１つのファームウェアに起動フラグを設定する手段を有する。また、制御手段３は、起動フラグの情報に対応するファームウェアを記憶素子から読み出して、読み出したファームウェアに基づいて信号を出力する手段をさらに有する。
【００１８】
本実施形態の記憶装置は、同一のデータの複数のファームウェアを、それぞれに割り当てられた情報記憶手段１の記憶素子上の領域に保存することで冗長化されている。また、制御手段３は、起動フラグ保存手段２に保存している起動抑止フラグの情報を基に、起動を行うファームウェアを示す起動フラグを設定している。制御手段３は、起動フラグの情報に対応するファームウェアを記憶素子から読み出して信号の出力を行う。そのため、本実施形態の記憶装置では、起動が抑止されているファームウェア等にアクセスする回数を抑制することができる。本実施形態の記憶装置では、ファームウェアを読み出すために記憶素子の各領域にアクセスする回数を抑制することができるので、記憶素子の劣化を抑制することができる。その結果、本実施形態の記憶装置ではファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる。
【００１９】
（第２の実施形態）
本発明の第２の実施形態について図を参照して詳細に説明する。図２は、本実施形態の記憶装置１０の構成の概要を示したものである。本実施形態の記憶装置１０は、保存しているファームウェアを基に制御信号を生成し、記憶装置１０が組み込まれている情報処理装置等を制御するための装置である。
【００２０】
本実施形態の記憶装置１０は、制御部１１と、インターフェース部１２と、第１の情報記憶部１３と、第２の情報記憶部１４と、バックアップメモリ部１５と、タイマー部１６と、メモリ部１７を備えている。
【００２１】
制御部１１は、第２の情報記憶部１４に保存されたファームウェアに基づいて記憶装置１０が備えられている装置を制御する機能を有する。また、制御部１１は、記憶装置１０の各部位の動作を制御する機能を有する。
【００２２】
制御部１１は、第１の情報記憶部１３に保存されているブートローダを基に第２の情報記憶部１４に保存されているファームウェアを読み出す。制御部１１は、読み出したファームウェアを基に制御信号を生成し、記憶装置１０が備えられている装置の制御を行う。
【００２３】
また、制御部１１は、第２の情報記憶部１４に保存されているファームウェアの更新動作を制御する。本実施形態の制御部１１は、ＣＰＵ（Central Processing Unit）として構成されている。
【００２４】
制御部１１は、第１の実施形態の制御手段３に相当する。
【００２５】
インターフェース部１２は、制御部１１と、第１の情報記憶部１３および第２の情報記憶部１４をそれぞれ接続する機能を有する。インターフェース部１２は、制御部１１と、第１の情報記憶部１３および第２の情報記憶部１４の間で制御信号やデータを伝送するインターフェース回路として形成されている。
【００２６】
第１の情報記憶部１３は、ブートローダを保存する機能を有する。第１の情報記憶部１３は、制御部１１からの要求に応じて、保存しているブートローダを制御部１１に出力する。本実施形態の第１の情報記憶部１３は、ＮＯＲ型フラッシュメモリを用いて構成されている。ブートローダには、第２の情報記憶部１４にアクセスするデバイスドライバが含まれている。第１の情報記憶部１３は、ＮＯＲ型フラッシュメモリ以外の記憶素子によって構成されていてもよい。
【００２７】
第２の情報記憶部１４は、ファームウェアを保存する機能を有する。第２の情報記憶部１４は、第１のファームウェア４１、第２のファームウェア４２および第３のファームウェア４３をそれぞれに割り当てられた記憶領域に保存している。第１のファームウェア４１、第２のファームウェア４２および第３のファームウェア４３は、更新動作の際を除いて、同一のデータである。すなわち、本実施形態の記憶装置１０は、ファームウェアを三重化することによって冗長化されている。
【００２８】
第２の情報記憶部１４は、制御部１１の制御に基づいて、３つのファームウェアのうちいずれかのファームウェアを制御部１１に出力する。本実施形態の情報記憶部１４は、ＮＡＮＤ型フラッシュメモリを用いて構成されている。また、第２の情報記憶部１４は、制御部１１の制御に基づいて、各ファームウェアのデータの更新を行う。
【００２９】
第２の情報記憶部１４は、第１の実施形態の情報記憶手段１に相当する。
【００３０】
バックアップメモリ部１５は、各ファームウェアの状態に関する情報を保存する機能を有する。バックアップメモリ部１５は、ファームウェアの情報として、優先起動ファームウェアフラグ５１、ブート抑止ファームウェアフラグ５２およびファームウェアアップデートフラグ５３の情報を保存している。本実施形態のバックアップメモリ部１５は、バッテリによってデータが保持されるメモリ素子で構成されている。バックアップメモリ部１５は、記憶装置１０が組み込まれている装置からの電源供給によって記憶内容が保持される構成としてもよい。また、バックアップメモリ部１５は、ＮＯＲ型フラッシュメモリやＮＡＮＤ型フラッシュメモリ等の不揮発性メモリ素子で構成されていてもよい。
【００３１】
優先起動ファームウェアフラグ５１は、第１のファームウェア４１、第２のファームウェア４２または第３のファームウェア４３のいずれを優先的に起動するかの情報を保存している。図３は、本実施形態の記憶装置１０で設定されている各フラグの設定内容の例を示したものである。図３に示す通り、本実施形態の優先起動ファームウェアフラグ５１は、各ファームウェアに応じて「０ｘ００」、「０ｘ０１」および「０ｘ０２」のいずれかのデータが設定される。
【００３２】
「０ｘ００」は、第１のファームフェア４１が優先的にブートされる状態の際に、優先起動ファームウェアフラグ５１に設定される。優先的にブートされる状態のファームウェアとは、電源起動時等に初めに起動が行われるファームウェアのことをいう。「０ｘ０１」は、第２のファームフェア４２が優先的にブートされる状態の際に、優先起動ファームウェアフラグ５１に設定される。また、「０ｘ０２」は、第３のファームフェア４３が優先的にブートされる状態の際に、優先起動ファームウェアフラグ５１に設定される。優先起動ファームウェアフラグ５１において各ファームウェアに割り当てられる設定値は、他の形式であってもよい。
【００３３】
ブート抑止ファームウェアフラグ５２は、データの破損等でブートが不可能なファームウェアの情報を保存している。本実施形態のブート抑止ファームウェアフラグ５２は、図３に示す通り、「Ｂｉｔ０」、「Ｂｉｔ１」および「Ｂｉｔ２」の３ビットのデータで構成されている。「Ｂｉｔ０」は、第１のファームウェア４１に対応している。「Ｂｉｔ１」は、第２のファームウェア４２に対応している。また、「Ｂｉｔ２」は、第３のファームウェア４３に対応している。起動不可となりブートが抑止されているファームウェアは、対応するビットが立った状態として「１」に設定される。また、ブートが抑止されていないファームウェアに対応するビットは「０」として設定されている。ブート抑止ファームウェアフラグ５２において各ファームウェアのブートの可否を示すデータは他の形式であってもよい。
【００３４】
ファームウェアアップデートフラグ５３は、ファームウェアのアップデートの有無についての情報を保存している。本実施形態では、ファームウェアのアップグレードが完了すると、ファームウェアアップデートフラグ５３は、完了を示す「０ｘ０１」として設定される。また、アップデート後にファームウェアの再起動が完了すると、フラグはクリアされて「０ｘ００」として設定される。ファームウェアアップデートフラグ５３のデータの設定値は他の形式であってもよい。
【００３５】
バックアップメモリ部１５は、第１の実施形態の起動フラグ保存手段２に相当する。
【００３６】
タイマー部１６は、所定の時間を計測する機能を有する。本実施形態のタイマー部１６は、ウォッチドックタイマーとして構成されている。タイマー部１６は、内部にカウンタを備え、制御部１１から送られてくるカウンタ制御信号Ｓ６１に基づいてカウントダウンを行って時間を計測する。タイマー部１６は、カウンタの値が「０」になると、制御部１１にリセット信号Ｓ６２を送る。タイマー部１６のカウンタの初期値は、異常の有無を判断するために要する所定の時間に基づいてあらかじめ設定されている。
【００３７】
メモリ部１７は、制御部１１が読み出したブートローダやファームウェアなどを記憶する機能を有する。本実施形態のメモリ部１７は、揮発性のメモリ素子で構成されている。メモリ部１７に記憶されている情報は、電源の供給が断たれるとクリアされるが、リセット信号等ではクリアされない。メモリ部１７には、不揮発性のメモリ素子や、バッテリ等によってデータが保持されるメモリ素子を用いてもよい。
【００３８】
また、メモリ部１７は、ブート中ファームウェアフラグ７１と、稼働中ファームウェアフラグ７２の情報を保存している。
【００３９】
ブート中ファームウェアフラグ７１は、ブート中のファームウェアを識別するための情報を保存している。ブート中ファームウェアフラグ７１は、第１のファームウェア４１、第２のファームウェア４２または第３のファームウェア４３のいずれがブート中であるかの情報が設定されている。本実施形態では、図３に示す通り、第１のファームウェア４１がブート中の際は、ブート中ファームウェアフラグ７１は、「０ｘ０１」として設定されている。第２のファームウェア４２がブート中の際は、ブート中ファームウェアフラグ７１は、「０ｘ０２」として設定されている。また、第３のファームウェア４３がブート中の際は、ブート中ファームウェアフラグ７１は、「０ｘ０３」として設定されている。
【００４０】
ブート中のファームウェアが無い場合には、ブート中ファームウェアフラグ７１には、ブート中のファームウェアが無いことを示す情報が設定されている。本実施形態では、ブート中のファームウェアが無いことを示す情報は、図３に示す通り「０ｘ００」として設定されている。電源投入時のブート中ファームウェアフラグの設定値、すなわち、初期値は、ブート中のファームウェアが無い状態である「０ｘ００」として設定されている。
【００４１】
稼働中ファームウェアフラグ７２は、第１のファームウェア４１、第２のファームウェア４２または第３のファームウェア４３のいずれが正常に稼働しているかの情報を保存している。本実施形態では、正常に稼働しているファームウェアが無いときは、稼働中ファームウェアフラグ７２は、「０ｘ００」として設定されている。また、電源投入時の稼働中ファームウェアフラグ７２の設定値、すなわち、初期値は、正常に稼働しているファームウェアが無い状態である「０ｘ００」として設定されている。
【００４２】
本実施形態では、図３に示す通り、第１のファームウェア４１が正常稼働している際は、稼働中ファームウェアフラグ７２は、「０ｘ０１」として設定されている。第２のファームウェア４２が正常稼働している際は、稼働中ファームウェアフラグ７２は、「０ｘ０２」として設定されている。また、第３のファームウェア４３が正常稼働している際は、稼働中ファームウェアフラグ７２は、「０ｘ０３」として設定されている。
【００４３】
ブート中ファームウェアフラグ７１および稼働中ファームウェアフラグ７２において各ファームウェアに割り当てられる設定値は、それぞれ他の形式であってもよい。
【００４４】
本実施形態の記憶装置１０の動作について説明する。始めに、通常動作時、すわなわち、電源投入後にファームウェアが正常に起動する場合について説明する。
【００４５】
始めに、電源投入後にブートローダの初期化を行う際の動作について説明する。図４は、ブートローダ初期化処理、すなわち、ブートローダの初期化を行う際の動作フローの概要を示した図である。
【００４６】
電源の投入やリセットが行われると、制御部１１に起動を示す信号が入力される。起動を示す信号が入力されると、制御部１１は、ブートローダの初期化処理を開始する（ステップ１０１）。ブートローダの初期化処理を開始すると、制御部１１は、タイマー部１６にウォッチドッグタイマを停止するカウンタ制御信号Ｓ６１を送る。タイマー部１６は、停止を示すカウンタ制御信号Ｓ６１を受け取ると、カウントダウンを停止する（ステップ１０２）。
【００４７】
タイマー部１６を停止すると、制御部１１は、稼働中ファームウェアフラグ７２のデータをクリアする（ステップ１０３）。制御部１１は、稼働中ファームウェアフラグ７２に正常稼働中のファームウェアが無いことを示す「０ｘ００」のデータをセットしてデータをクリアする。稼働中ファームウェアフラグ７２のデータを「０ｘ００」にセットすると、制御部１１は、ブート中ファームウェアフラグ７１のデータを確認する。
【００４８】
ブート中ファームウェアフラグ７１が、ブート中ではないことを示す「０ｘ００」であるとき（ステップ１０４でＮｏ）、制御部１１は、ファームウェアの起動準備処理を開始する（ステップ１０５）。ブート中ファームウェアフラグ７１に、ブート中のファームウェアのデータが設定されているとき（ステップ１０４でＹｅｓ）、制御部１１は、対応するファームウェアのブート抑止ファームウェアフラグ５２を設定する（ステップ１０６）。ブート抑止ファームウェアフラグ５２を設定すると、制御部１１は、ステップ１０５の動作を行う。
【００４９】
次にファームウェアの起動準備処理の動作について説明する。ブートローダの初期化処理が終わると、ファームウェアの起動準備処理が行われる。図５は、ファームウェア起動準処理を行う際のフローの概要を示した図である。ファームウェア起動準備処理は、ブートローダ初期化処理の後に実行され、ファームウェアの起動の準備を行うための処理である。ファームウェア起動準備処理では、三重化されたファームウェアのうちどれを起動するのかについての選択が行われる。以下では、すべてのファームウェアが正常で、第１のファームウェア４１が起動される場合を例に説明する。
【００５０】
ファームウェアの起動準備処理を開始すると（ステップ１１０）、制御部１１は、バックアップメモリ部１５の異常の有無をチェックする（ステップ１１１）。バックアップメモリ部１５に異常がなく正常である場合（ステップ１１２でＹｅｓ）、制御部１１は、ブート抑止ファームウェアフラグ５２と、優先起動ファームウェアフラグ５１のデータの読み込みを行う（ステップ１１３）。
【００５１】
ブート抑止ファームウェアフラグ５２および優先起動ファームウェアフラグ５１のデータを読み込むと、制御部１１は、優先起動ファームウェアフラグ５１で示されているファームウェアの起動が抑止状態でないかを確認する。制御部１１は、ブート抑止ファームウェアフラグ５２の第１のファームウェア４１を示すビットが「０」、すなわち、抑止状態となっていないことを確認する。第1のファームウェア４１を示すビットが「０」ではなく、抑止状態でないとき（ステップ１１４でＮｏ）、制御部１１は、ブート中ファームウェアフラグ７１に優先起動ファームウェアフラグ５１のデータを設定する（ステップ１１５）。
【００５２】
制御部１１は、ブート中ファームウェアフラグ７１を、優先起動ファームウェアフラグ５１のデータに基づいて第１のファームウェア４１がブート中であることを示す「０ｘ０１」に設定する。制御部１１は、ブート中ファームウェアフラグ７１を「０ｘ０１」に設定すると、ファームウェア起動処理を開始する（ステップ１１６）。
【００５３】
バックアップメモリ部１５に異常ある場合（ステップ１１２でＮｏ）、制御部１１は、ブート抑止ファームウェアフラグ５２を参照し、抑止状態でないファームウェアをブート中ファームウェアフラグ７１に設定する（ステップ１１７）。ブート中ファームウェアフラグ７１を設定すると、制御部１１は、ファームウェア起動処理を開始する（ステップ１１６）。
【００５４】
また、優先起動ファームウェアフラグ５１のファームウェアが抑止状態のとき（ステップ１１４でＮｏ）、制御部１１は他のファームウェアがブート抑止ファームウェアフラグ５２を参照し抑止状態かを確認する。全てのファームウェアが抑止状態のとき（ステップ１１８でＹｅｓ）、制御部１１はファームウェア復旧処理を開始する（ステップ１２０）。ファームウェア復旧処理については、後で説明する。
【００５５】
全てのファームウェアが抑止状態ではないとき（ステップ１１８でＮｏ）、制御部１１は抑止状態ではないファームウェアをブート中ファームウェアフラグ７１に設定する（ステップ１１９）。ブート中ファームウェアフラグ７１を設定すると、制御部１１は、ファームウェア起動処理を開始する（ステップ１１６）。
【００５６】
次にファームウェア起動処理について説明する。ファームウェア起動準備処理が終わると、ファームウェア起動処理が行われる。図６は、ファームウェア起動処理を行う際の動作フローの概要を示した図である。ファームウェア起動処理は、ファームウェアをメモリ部１７にロードし、起動を行うための処理である。ファームウェア起動処理では、ファームウェアの異常の有無のチェックも行われる。
【００５７】
ファームウェア起動処理を開始すると（ステップ１２１）、制御部１１は、ブート中ファームウェアフラグ７１を確認する。ブート中ファームウェアフラグ７１を確認すると、制御部１１は、ブート中ファームウェアフラグ７１で示されているファームウェアをメモリ部１７にロードする（ステップ１２２）。ブート中ファームウェアフラグ７１に第１のファームウェア４１を示す「０ｘ０１」が設定されているとき、制御部１１は、第１のファームウェア４１を第２の情報記憶部１４からメモリ部１７にロードする。
【００５８】
ファームウェアをメモリ部１７にロードすると、制御部１１はロードしたファームウェアのチェックサムを計算する（ステップ１２３）。チェックサムを計算すると、制御部１１は、計算したチェックサムの値とファームウェアの末尾に付いているチェックサムの値を比較する（ステップ１２４）。
【００５９】
計算したチェックサムの値とファームウェアの末尾に付いているチェックサムの値が一致した場合には（ステップ１２５でＹｅｓ）、制御部１１はロードしたファームウェアのデータが正常であると判断する。ファームウェアが正常であると判断ると、制御部１１はタイマー部１６にウォッチドッグタイマを作動させるカウンタ制御信号Ｓ６１を送る。
【００６０】
タイマー部１６は、ウォッチドッグタイマを作動させるカウンタ制御信号Ｓ６１を受け取るとカウントダウンを開始する（ステップ１２６）。タイマー部１６を作動させると、制御部１１は、メモリ部１７にロードしたファームウェアを実行する（ステップ１２７）。
【００６１】
ステップ１２４でチェックサムの値が一致していなかったとき（ステップ１２５でＮｏ）、制御部１１は、ブート抑止ファームウェアフラグ５２のブート中のファームウェアに該当するビットを抑止状態に設定する（ステップ１２８）。ブート抑止ファームウェアフラグ５２の設定を行うと、制御部１１は、図５のステップ１１０以降に示すファームウェア起動準備処理を再度、実行する（ステップ１２９）。
【００６２】
ファームウェアが起動すると、まずは各種初期化処理が行われる。初期化処理とは、ファームウェアが本来の動作を行う前の準備や、デバイスドライバの読み込み、デバイスの初期化などを含む。ファームウェアの初期化処理を行うと、制御部１１は、ファームウェア起動完了処理を行う。
【００６３】
次にファームウェアの起動完了処理について説明する。初期化処理が終わると、ファームウェア起動完了処理が行われる。図７は、ファームウェア起動完了処理が行われる際の動作フローの概要を示した図である。ファームウェア起動完了処理は、ファームウェアが起動した際に、起動の過程で設定したフラグのクリア等を行う処理である。
【００６４】
ファームウェア起動完了処理を開始すると（ステップ１３０）、制御部１１は、タイマー部１６にカウンタ制御信号Ｓ６１を送ってウォッチドックタイマーを停止する（ステップ１３１）。タイマー部１６のウォッチドックタイマーを停止すると、制御部１１は、ブート抑止ファームウェアフラグ５２を参照して、抑止状態のファームウェアがあるかを確認する。抑止状態のファームウェアが無いとき（ステップ１３２でＮｏ）、制御部１１はファームウェアアップデートフラグ５３を参照して、アップデートをしているファームウェアがないかを確認する。ファームウェアアップデートフラグ５３にアップデートフラグが立っていないとき（ステップ１３３でＮｏ）、制御部１１は、ブート抑止ファームウェアフラグ５２のデータをクリアする（ステップ１３４）。
【００６５】
ブート抑止ファームウェアフラグ５２のデータをクリアすると、制御部１１は、ブート中ファームウェアフラグ７１のデータを稼働中ファームウェアフラグ７２にコピーする（ステップ１３５）。データのコピーを行うと、制御部１１は、ブート中ファームウェアフラグ７１のデータをクリアする（ステップ１３６）。
【００６６】
ブート中ファームウェアフラグ７１のデータをクリアすると、制御部１１は、ファームウェアアップデートフラグ５３のデータをクリアにする（ステップ１３７）。ファームウェアアップデートフラグ５３のデータをクリアにすると、ファームウェア起動完了処理は終了である。ファームウェア起動完了処理が終了すると、ファームウェアの全ての起動プロセスが完了し、ファームウェアのメインの処理が動作を開始する。
【００６７】
ブート抑止ファームウェアフラグ５２に抑止状態を示すファームウェアがあるとき（ステップ１３２でＹｅｓ）、制御部１１はファームウェア同期処理を実行する（ステップ１３８）。ファームウェア同期処理は、後で説明する。ファームウェア同期処理を終えると、制御部１１はステップ１３４以降の処理を行う。
【００６８】
ファームウェアアップデートフラグ５３にアップデートフラグが立っているとき（ステップ１３３でＹｅｓ）、制御部１１はファームウェア同期処理を実行する（ステップ１３８）。ファームウェア同期処理を終えると、制御部１１はステップ１３４以降の処理を行う。
【００６９】
本実施形態の記憶装置１０は、同一のデータからなるファームウェアを第１のファームウェア４１、第２のファームウェア４２および第３のファームウェア４３として冗長化しＮＡＮＤ型フラッシュメモリ等で構成されるメモリ素子に保存している。また、本実施形態の記憶装置１０では、バックアップメモリ部１５に保存された各フラグに基づいて、ファームウェアのメモリ部１７へのロードが行われている。バックアップメモリ部１５に保存された各フラグで指定されていないファームウェアにはアクセスしないので、メモリ素子へのアクセスの回数を抑制することができる。そのため、本実施形態の記憶装置１０では、メモリ素子の劣化を抑制することで信頼性を向上することができる。
【００７０】
次に、ファームウェア同期処理について説明する、ファームウェア同期処理は、ファームウェア間でデータの同期を行う処理である。例えば、三重化によって冗長化されたファームウェアに異常が生じている場合に、ファームウェア間でデータの同期を行ってデータの修復が行われる。図８、図９、図１０および図１１は、ファームウェア同期処理の動作フローの概要を示した図である。また、以下の説明では通常時の動作フローを示す図４、図５、図６および図７も参照して説明を行う。
【００７１】
始めに三重化されたファームウェアのうち１つのファームウェアのデータが破損していた場合に行われるファームウェア同期処理の例について説明する。以下では、電源投入後の起動時に第１のファームウェア４１のデータが破損していた場合を例に説明する。また、そのとき、第２のファームウェア４２および第３のファームウェア４３は正常なデータであるとして説明を行う。
【００７２】
以下の説明では、電源投入後の動作開始時において、優先起動ファームウェアフラグ５１は、第１のファームウェア４１を優先的にブートする「０ｘ００」に設定されているとする。ブート抑止ファームウェアフラグ５２は、ブートを抑止するファームウェアが無いことを示す「０ｘ００」として設定されているとする。また、ファームウェアアップデートフラグ５３は、ファームウェアのアップデートは行われていないことを示す「０ｘ００」として設定されているとする。
【００７３】
電源投入後、制御部１１は図４のステップ１０１以降に示すブートローダの初期化処理を行う。ブートローダの初期化処理を行うと、制御部１１は、図５のステップ１１０以降に示すファームウェアの起動準備処理を行う。ファームウェアの起動準備処理を終えると、制御部１１は図６に示すステップ１２１以降のファームウェア起動処理を行う。
【００７４】
図６のステップ１２５において第１のファームウェア４１のデータに異常があると判断すると、制御部１１は、ブート抑止ファームウェアフラグ５２の第1のファームウェア４１に対応するビットをブートの抑止を示す「１」に設定する（ステップ１２８）。
【００７５】
ブート抑止ファームウェアフラグ５２を設定して異常があるファームウェアの起動を抑止すると、制御部１１は、再度、図５のステップ１１０以降に示すファームウェアの起動準備処理を行う。ファームウェアの起動準備処理を行う（ステップ１２９）。
【００７６】
再度、ファームウェアの起動準備処理を行う際、優先起動ファームウェアフラグ５１には、第１のファームウェア４１を優先的にブートする「０ｘ００」が設定されている。一方で、ブート抑止ファームウェアフラグ５２は第１のファームウェア４１のブートを抑止する設定になっている。そのため、第１のファームウェア４１はブートの対象とはならない。
【００７７】
第１のファームウェア４１のブートが抑止されているので、制御部１１は、他のファームウェアの起動を行う。制御部１１は、ブートが抑止されていない第３のファームウェア４３を選択したとする。第２のファームウェア４２と第３のファームウェア４３のどちらを選択するかの方法は、あらかじめ優先順位が設定されている方法でもよく、また、ブートが抑止されていないファームウェアの中から任意に選択される方法でもよい。
【００７８】
第３のファームウェア４３には異常がないので、図６のステップ１２１からのファームウェア起動処理および図７のステップ１３０からの起動完了処理が順次、行われる。図７に示すファームウェア起動完了処理のステップ１３２において第１のファームウェア４１が抑止状態であるので、ステップ１３８においてファームウェア同期処理が開始される。
【００７９】
ファームウェア同期処理が開始されると、図８のステップ１４１において制御部１１は、ブート中ファームウェアフラグ７１およびブート抑止ファームウェアフラグ５２を読み込む。ブート中ファームウェアフラグ７１等を読み込むと、制御部１１はブート中のファームウェアを確認する。ブート中のファームウェアは第３のファームウェア４３なので（ステップ１４２でＹｅｓ）、制御部１１はステップ１４４の判断に移行する。ステップ１４４においてブート中のファームウェアは第１のファームウェア４１ではないので（ステップ１４４でＮｏ）、制御部１１は第１のファームウェア４１の同期処理を実施する（ステップ１４５）。
【００８０】
第１のファームウェア４１の同期処理は図１０を参照して説明する。第１のファームウェア４１の同期処理を開始すると（ステップ１６０）、制御部１１は第１のファームウェア４１および第３のファームウェア４３のチェックサムを計算する（ステップ１６１）。
【００８１】
チェックサムの計算を行うと制御部１１は、第１のファームウェア４１の計算したチェックサムの値とデータの末尾に添付されたチェックサムの値を比較する。計算した値と添付されている値が異なり第１のファームウェア４１のチェックサムの値が正常でなかったとき（ステップ１６２でＮｏ）、制御部１１は第３のファームウェア４３のデータで第１のファームウェア４１のデータを上書きする（ステップ１６６）。第１のファームウェア４１のデータが上書きされると、第１のファームウェア４１の同期処理は終了となる（ステップ１６５）。
【００８２】
計算した値と添付されている値が一致し第１のファームウェア４１のチェックサムの値が正常であったとき（ステップ１６２でＹｅｓ）、制御部１１は、第１のファームウェア４１と第３のファームウェア４３のチェックサムの計算値を比較する。第１のファームウェア４１と第３のファームウェア４３のチェックサムの計算値が異なるとき（ステップ１６３でＮｏ）、制御部１１は第３のファームウェア４３のデータで第１のファームウェア４１のデータを上書きする（ステップ１６６）。第１のファームウェア４１のデータが上書きされると、第１のファームウェア４１の同期処理は終了となる（ステップ１６５）。
【００８３】
第１のファームウェア４１と第３のファームウェア４３のチェックサムの計算値が一致するとき（ステップ１６３でＹｅｓ）、制御部１１は第１のファームウェア４１のブート抑止ファームフラグ５２を確認する。第１のファームウェア４１のブート抑止ファームフラグ５２が抑止状態のとき（ステップ１６４でＹｅｓ）、制御部１１は第３のファームウェア４３のデータで第１のファームウェア４１のデータを上書きする（ステップ１６６）。第１のファームウェア４１のデータが上書きされると、第１のファームウェア４１の同期処理は終了となる（ステップ１６５）。
【００８４】
第１のファームウェア４１のブート抑止ファームフラグ５２が抑止状態ではないとき（ステップ１６４でＮｏ）、制御部１１は処理を行わずに第１のファームウェア４１の同期処理を終了する（ステップ１６５）。
【００８５】
上記の例では、第１のファームウェア４１のチェックサムの計算値と添付されたデータが異なるか、第１のファームウェア４１および第３のファームウェア４３のチェックサムの値が互いに異なる。よって、ステップ１６６において、異常が生じている第１のファームウェア４１のデータが、正常な第３のファームウェア４３のデータで上書きされる。正常な第３のファームウェア４３のデータで上書きされることで、第１のファームウェア４１は正常に稼働可能な状態に戻る。
【００８６】
第１のファームウェア４１の同期処理が終わると、図８のステップ１４５の処理が終わるので、制御部１１はステップ１４６の動作を行う。制御部１１は、ブート中ファームウェアフラグ７１を参照し第２のファームウェア４２がブート中かを確認する。第２のファームウェア４２は、ブート中ではないので（ステップ１４６でＮｏ）、制御部１１は第２のファームウェア４２の同期処理の工程を実施する（ステップ１４７）。
【００８７】
第２のファームウェア４２の同期処理の工程は図１１を参照して説明する。第２のファームウェア４２の同期処理を開始すると（ステップ１７０）、制御部１１は第２のファームウェア４２と第３のファームウェア４３のチェックサムを計算する（ステップ１７１）。
【００８８】
チェックサムの計算を行うと制御部１１は、第２のファームウェア４２の計算したチェックサムの値とデータの末尾に添付されたチェックサムの値を比較する。計算した値と添付されている値が異なり第１のファームウェア４１のチェックサムの値が正常でなかったとき（ステップ１７２でＮｏ）、制御部１１は第３のファームウェア４３のデータで第２のファームウェア４２のデータを上書きする（ステップ１７６）。第２のファームウェア４２のデータが上書きされると、第２のファームウェア４２の同期処理は終了となる（ステップ１７５）。
【００８９】
計算した値と添付されている値が一致し第２のファームウェア４２のチェックサムの値が正常であったとき（ステップ１７２でＹｅｓ）、制御部１１は、第２のファームウェア４２と第３のファームウェア４３のチェックサムの計算値を比較する。第２のファームウェア４２と第３のファームウェア４３のチェックサムの計算値が異なるとき（ステップ１７３でＮｏ）、制御部１１は第３のファームウェア４３のデータで第２のファームウェア４２のデータを上書きする（ステップ１７６）。第２のファームウェア４２のデータが上書きされると、第２のファームウェア４２の同期処理は終了となる（ステップ１７５）。
【００９０】
第２のファームウェア４２と第３のファームウェア４３のチェックサムの計算値が一致するとき（ステップ１７３でＹｅｓ）、制御部１１は第２のファームウェア４２のブート抑止ファームフラグ５２を確認する。第２のファームウェア４２のブート抑止ファームフラグ５２が抑止状態のとき（ステップ１７４でＹｅｓ）、制御部１１は第３のファームウェア４３のデータで第２のファームウェア４２のデータを上書きする（ステップ１７６）。第２のファームウェア４２のデータが上書きされると、第２のファームウェア４２の同期処理は終了となる（ステップ１７５）。
【００９１】
第２のファームウェア４２のブート抑止ファームフラグ５２が抑止状態ではないとき（ステップ１７４でＮｏ）、制御部１１は処理を行わずに第２のファームウェア４２の同期処理を終了する（ステップ１７５）。
【００９２】
上記の例では、第２のファームウェア４２は正常なのでステップ１７２およびステップ１７３はともにＹｅｓとなる。また、第２のファームウェア４２のブートは抑止されていないので、ステップ１７４はＮｏとなる。よって、制御部１１は第２のファームウェア４２のデータは更新せずに、第２のファームウェ４２の同期処理の工程を終了する。
【００９３】
第２のファームウェア４２の同期処理の工程が終わると、図８のステップ１４７の処理が終わるので、ファームウェアの同期処理は終了となる（ステップ１４８）。
【００９４】
次に、電源投入後に起動しようとしたファームウェアの他にさらに異常のファームウェアがあった場合について説明する。以下の説明では、第１のファームウェア４１および第３のファームウェア４３のデータが破損し、第２のファームウェア４２のデータが正常であるとして説明を行う。
【００９５】
電源投入後、制御部１１は図４のステップ１０１以降に示すブートローダの初期化処理を行う。ブートローダの初期化処理を行うと、制御部１１は、図５のステップ１１０以降に示すファームウェアの起動準備処理を行う。ファームウェアの起動準備処理を終えると、制御部１１は図６に示すステップ１２１以降のファームウェア起動処理を行う。
【００９６】
制御部１１は、異常が１つのみであった場合と同様に第１のファームウェア４１および第３のファームウェア４３の起動を順次試みるが、２つとも異常であるために第２のファームウェア４２を起動する。このとき、第１のファームウェア４１および第３のファームウェア４３のブート抑止ファームウェアフラグ５２は、ともにブートの抑止を示す「１」に設定されている。そのため、制御部１１は、ブートが抑止されていない第２のファームウェア４２をメモリ部１７にロードし、実行する。
【００９７】
第２のファームウェア４２が起動すると、各種初期化処理の後に、図７のステップ１３０以降に示すファームウェア起動完了処理を行う。図７のステップ１３０およびステップ１３１は、通常と同じように処理が行われる。図７のステップ１３２において抑止状態のファームウェアが存在するので（ステップ１３２でＹｅｓ）、制御部１１はファームウェアの同期処理を実行する（ステップ１３８）。
【００９８】
ファームウェアの同期処理を開始すると、図８のステップ１４１で、制御部１１は、ブート中ファームウェアフラグ７１とブート抑止ファームウェアフラグ５２のデータを読み込む。ブート中ファームウェアフラグ７１等を読み込むと、制御部１１はブート中のファームウェアを確認する。ブート中のファームウェアは第２のファームウェア４２なので（ステップ１４２でＮｏ）、制御部１１は第３のファームウェア４３の同期処理を実施する（ステップ１４３）。
【００９９】
第３のファームウェア４３の同期処理について図９を参照して説明する。第３のファームウェア４３の同期処理を開始すると（ステップ１５０）、制御部１１は第３のファームウェア４３のチェックサムを計算する。第３のファームウェア４３にデータに異常があるので、チェックサムの計算値はデータに添付されたチェックサムとは一致しない。チェックサムの値は正常ではないので（ステップ１５２でＮｏ）、制御部１１は起動中の第２のファームウェア４２のデータで第３のファームウェア４３のデータを上書きする。第３のファームウェア４３のデータを上書きすると、制御部１１は第３のファームウェアの同期処理を終了する（ステップ１５４）。正常なデータである第２のファームウェア４２のデータで第３のファームウェア４３のデータの上書きが行われたので、第３のファームウェア４３は正常に稼働可能な状態に戻る。
【０１００】
誤ったデータの書き込み等のエラーでチェックサムの値が正常であった場合にも、第３のファームウェアが抑止状態のため（ステップ１５３でＹｅｓ）、ステップ１５５で第３のファームウェア４３のデータの上書きが行われる。第３のファームウェアの同期処理が終わると図８のステップ１４４に進む。
【０１０１】
図８のステップ１４４において、ブート中のファームウェアは第１のファームウェア４１ではないので（ステップ１４４でＮｏ）、制御部１１は第１のファームウェア４１の同期処理を実施する（ステップ１４５）。
【０１０２】
第１のファームウェア４１の同期処理は図１０を参照して説明する。第１のファームウェア４１の同期処理を開始すると（ステップ１６０）、制御部１１は第１のファームウェア４１および第２のファームウェア４２のチェックサムを計算する（ステップ１６１）。
【０１０３】
チェックサムの計算を行うと制御部１１は、第１のファームウェア４１の計算したチェックサムの値とデータの末尾に添付されたチェックサムの値を比較する。計算した値と添付されている値が異なり第１のファームウェア４１のチェックサムの値は正常ではないので（ステップ１６２でＮｏ）、制御部１１は第２のファームウェア４２のデータで第１のファームウェア４１のデータを上書きする（ステップ１６６）。第１のファームウェア４１のデータが上書きされると、第１のファームウェア４１の同期処理は終了となる（ステップ１６５）。正常なデータである第２のファームウェア４２のデータで第１のファームウェア４１のデータの上書きが行われたので、第１のファームウェア４１は正常に稼働可能な状態に戻る。
【０１０４】
第１のファームウェア４１の同期処理が終わると図８のステップ１４６に進む。ステップ１４６において第２のファームウェア４２が起動中なので（ステップ１４６でＹｅｓ）、ファームウェアの同期処理は終了となる（ステップ１４８）。ファームウェアの同期処理が終わると、制御部１１は図７のステップ１３４からステップ１３７の起動完了処理を実施する。起動完了処理の実行が全て終わると、ファームウェアの全ての起動プロセスが完了しファームウェアのメインの処理が動作を開始する。
【０１０５】
本実施形態の記憶装置１０では、２つのファームウェアに異常が生じた場合にも、もう１つのファームウェアのデータを上書きすることで異常が生じたファームウェアのデータを正常な状態に戻すことができる。よって、本実施形態の記憶装置１０は、三重化によって冗長化されたファームウェアを備えることで高い信頼性を有する。
【０１０６】
次にファームウェアのアップデート処理が行われる際の動作について説明する。図１２はファームウェアのデータ更新、すなわち、アップデートを行う際の動作フローの概要を示した図である。
【０１０７】
以下の説明では、第１のファームウェア４１が稼働中であるとして説明を行う。このとき、優先起動ファームウェアフラグ５１は、第１のファームウェア４１を優先的にブートすることを示す「０ｘ００」に設定されているとする。ブート抑止ファームウェアフラグ５２は、ブート抑止するファームウェア無し、ファームウェアアップデートフラグ５３は、ファームウェアアップデートは行われていない状態に設定されているとする。また、ブート中ファームウェアフラグ７１は、ブート中ではない状態、稼働中ファームウェアフラグ７２は、第１のファームウェア４１が正常稼働中である状態に設定されているとする。また、全てのファームウェアのデータは正常であるとする。
【０１０８】
外部のアップデートツール等からファームウェアのアップデートの要求を受け取ると、制御部１１は、ファームウェアのアップデート処理を開始する。アップデート処理を開始すると、制御部１１は、ファームウェアイメージを取得しメモリ部１７に保存する（ステップ１８１）。ファームウェアイメージは、外部サーバからダウンロードされるような構成としてもよい。
【０１０９】
ファームウェアイメージをメモリ部１７に保存すると、制御部１１は、稼働中ファームウェアフラグ７２を確認する。このとき、稼働中ファームウェアフラグ７２は、第１のファームウェア４１が稼働中であることを示している。稼働中ファームウェアフラグ７２を確認すると、制御部１１は、ブート抑止ファームウェアフラグ５２のビット１に「１」をセットし、アップデートを行う第２のファームウェア４２のブートを抑止状態にする（ステップ１８２）。これは、第２のファームウェア４２の更新中に、ファームウェア再起動や電源断が発生した場合に、書き換え中の第２のファームウェア４２が起動してしまうことを防ぐためである。
【０１１０】
ファームウェアのアップデートは第３のファームウェア４３を先に行ってもよい。稼働をしていない２つのファームウェアのどちらを先にアップデートするかについては、あらかじめ設定されていてもよく、また、制御部１１が任意に選択してもよい。
【０１１１】
第２のファームウェア４２のブートを抑止状態にすると、制御部１１は、ファームウェアイメージのデータを第２のファームウェア４２に上書きして書き込む（ステップ１８３）。ファームウェアイメージのデータを第２のファームウェア４２に上書きすると、制御部１１は、ブート抑止ファームウェアフラグ５２のビット１を「０」にすることでクリアを行い、第２のファームウェア４２のブートの抑止状態を解除する（ステップ１８４）。
【０１１２】
第２のファームウェア４２のブートの抑止状態を解除すると、制御部１１は、ブート抑止ファームウェアフラグ５２のビット２に「１」をセットし、第３のファームウェア４３のブートを抑止状態にする（ステップ１８５）。
【０１１３】
第３のファームウェア４３のブートを抑止状態にすると、制御部１１は、ファームウェアイメージのデータを第３のファームウェア４３に上書きして書き込む（ステップ１８６）。ファームウェアイメージのデータを第３のファームウェア４３に上書きすると、制御部１１は、ブート抑止ファームウェアフラグ５２のビット２を「０」にすることでクリアを行い、第３のファームウェア４３のブートの抑止状態を解除する（ステップ１８７）。
【０１１４】
第３のファームウェア４３のブートの抑止状態を解除すると、制御部１１は、優先起動ファームウェアフラグ５１を、第２のファームウェア４２を優先的に起動することを示す「０ｘ０１」に設定する（ステップ１８８）。優先起動ファームウェアフラグ５１に設定するファームウェアは、例えば、先に上書き処理をした方のファームウェアとして設定されている。
【０１１５】
優先起動ファームウェアフラグ５１の設定を行うと、制御部１１は、ファームウェアアップデートフラグ５３にアップデートが行われたことを示す「０ｘ０１」設定する（ステップ１８９）。ファームウェアアップデートフラグ５３を設定すると、制御部１１は、ファームウェアの再起動を行う（ステップ１９０）。
【０１１６】
制御部１１は、再起動によって優先起動ファームウェアフラグ５１が設定された第２のファームウェア４２を立ち上げる処理を行う。再起動が行われると、制御部１１は、図５のステップ１１０からのファームウェア起動準備処理を実行する。ファームウェア起動準備処理が終わると、制御部１１は、図６のステップ１２１からのファームウェア起動処理を実行する。ファームウェア起動処理が終わると、第２のファームウェア４２が立ち上がり、図７のステップ１３０からのファームウェア起動完了処理が実行される。図７に示す起動完了処理のステップ１３３において、ファームウェアアップデートフラグ５３が設定されたファームウェアが検知されるので、ステップ１３８のファームウェアの同期処理が行われる。ファームウェアの同期処理を開始すると、制御部１１は、図８のステップ１４１から処理を行う。図８のステップ１４１から処理を行う中で、ステップ１４５において第１のファームウェア４１の同期処理が行われる。
【０１１７】
図１０に示す第１のファームウェア４１の同期処理において、ファームアップデート処理前の第１のファームウェア４１と、アップデート処理後の第３のファームウェア４３では、チェックサムの値は異なる（ステップ１６３でＮｏ）。このとき、制御部１１は第１のファームウェア４１の更新が必要と判断し、第３のファームウェア４３のデータを第１のファームウェア４１に上書きする（ステップ１６６）。以上の動作によりすべてのファームウェアがアップデート後のデータとなる。同期処理によって第１のファームウェア４１のアップデートが完了すると、制御部１１は、図７のステップ１３４からステップ１３７の起動完了処理を行いファームウェアのブートの抑止状態等を解除する。
【０１１８】
本実施形態の記憶装置１０では、ファームウェアの更新、すなわち、アップデートを行う際に、取得したアップデート用のファームウェアイメージを元に２つのファームウェアのデータの更新を行っている。本実施形態の記憶装置１０は、更新を行った２つのファームウェアのうちいずれか一方が正常に起動することを確認している。本実施形態の記憶装置１０は、更新を行ったファームウェアのデータが正常に起動することを確認した後に、更新を行っていない残り１つのファームウェアのデータを更新後のデータで上書きしている。本実施形態の記憶装置１０では、このような方法でファームウェアのアップデートを行うことで、データの更新中に電源断のような異常が生じた場合にデータが破損してすべてのファームウェアが起動不可になる状態を避けることができる。よって、本実施形態の記憶装置１０は、起動不可になる状態を避けてファームウェアのアップデートが可能なので高い信頼性を有する。
【０１１９】
次にファームウェアのアップデート時に異常が生じた場合の動作について説明する。図１３は、ファームウェアのアップデート時に異常が生じた場合の動作フローの概要を示したものである。以下の説明では、第１のファームウェア４１か稼働中であるとして説明を行う。このとき、優先起動ファームウェアフラグ５１は、第１のファームウェア４１を優先的にブートすることを示す「０ｘ００」に設定されているとする。ブート抑止ファームウェアフラグ５２は、ブート抑止するファームウェア無し、ファームウェアアップデートフラグ５３は、ファームウェアアップデートは行われていない状態に設定されているとする。また、ブート中ファームウェアフラグ７１は、ブート中ではない状態、稼働中ファームウェアフラグ７２は、第１のファームウェア４１が正常稼働中である状態に設定されているとする。また、全てのファームウェアは正常であるとする。
【０１２０】
外部のアップデートツール等からファームウェアのアップデートの要求を受け取ると、制御部１１は、ファームウェアのアップデート処理を開始する（ステップ１９１）。アップデート処理を開始すると、制御部１１は、ファームウェアイメージを受け取りメモリ部１７に保存する。このとき、受け取ったファームウェアイメージが正常なデータでなかったものとして説明を行う。
【０１２１】
制御部１１はアップデート用のファームウェアのデータとしてファームウェアイメージを取得すると、第２のファームウェア４２にファームウェアイメージを書き込む（ステップ１９２）。ファームウェアイメージの書き込みを行うと、制御部１１は、第２のファームウェア４２のチェックサムの計算等のベリファイを実施する（ステップ１９３）。次に、制御部１１は、第３のファームウェア４３にアファームウェアイメージの書き込みを行う（ステップ１９４）。ファームウェアイメージの書き込みを行うと、制御部１１は、第３のファームウェア４３のチェックサムの計算等のベリファイを実施する（ステップ１９５）。
【０１２２】
第２のファームウェア４２と第３のファームウェア４３にファームウェアイメージの書き込みを行うと、制御部１１はファームウェアの再起動を行って、第２のファームウェア４２を起動する（ステップ１９６）。
【０１２３】
再起動を行った際に第２のファームウェア４２が正常に起動しなかった場合は（ステップ１９７でＮｏ）、第３のファームウェア４３の起動の確認が行われる。第３のファームウェア４３が正常に起動した場合には（ステップ２００でＹｅｓ）、制御部１１は、第３のファームウェア４３のデータを第１のファームウェア４１および第２のファームウェア４２にコピーする（ステップ２０１）。第３のファームウェア４３のデータをコピーすることで、すべてのファームウェアのデータがアップデートされたものとなる。第３のファームウェア４３のデータがコピーされると、ファームウェアのアップデートの処理は終了となる（ステップ１９９）。
【０１２４】
第３のファームウェア４３が正常に起動しなかった場合には（ステップ２００でＮｏ）、制御部１１は第１のファームウェア４１のデータを第２のファームウェア４２および第３のファームウェア４３にコピーする（ステップ２０２）。アップデート前の第１のファームウェア４１のデータを他のファームウェアにコピーすることでロールバックの処理が完了する。アップデート前の第１のファームウェア４１のデータが他のファームウェアにコピーされると、ファームウェアのアップデートの処理は、実際のアップデートは未了な状態で終了となる（ステップ１９９）。
【０１２５】
再起動を行った際に第２のファームウェア４２が正常に起動した場合は（ステップ１９７でＹｅｓ）、制御部１１は第２のファームウェア４２のデータを第１のファームウェア４１にコピーする（ステップ１９８）。第２のファームウェア４２のデータをコピーすることで、すべてのファームウェアのデータがアップデートされたものとなる。第２のファームウェア４２のデータがコピーされると、ファームウェアのアップデートの処理は終了となる（ステップ１９９）。
【０１２６】
上記のような方法で、ファームウェアのアップデートおよびロールバック処理を行うことで、アップデートを行ったファームウェアに異常が生じた場合にも、更新前のファームウェアのデータを上書きすることで、データを正常な状態に戻すことができる。そのため、本実施形態の記憶装置１０は起動可能なファームウェアが無くなる状態を避けることができる。
【０１２７】
本実施形態の記憶装置１０は、同一のデータからなるファームウェアを第１のファームウェア４１、第２のファームウェア４２および第３のファームウェア４３として冗長化しＮＡＮＤ型フラッシュメモリ等で構成されるメモリ素子に保存している。また、本実施形態の記憶装置１０では、バックアップメモリ部１５に保存された各フラグに基づいて、ファームウェアのメモリ部１７へのロードが行われている。バックアップメモリ部１５に保存された各フラグで指定されていないファームウェアにはアクセスしないので、メモリ素子へのアクセスの回数を抑制することができる。そのため、本実施形態の記憶装置１０ではメモリ素子の劣化を抑制することができる。
【０１２８】
本実施形態の記憶装置１０は、ファームウェアのアップデートを行う際に、三重化されたファームウェアのうち２つのファームウェアのアップデートを行い、その後に残りのファームウェアにデータをコピーしている。そのため、アップデート中に電源が切れるような障害が生じた場合にも冗長性が確保されているので、ファームウェアを起動できなくなる状態を避けることができる。また、本実施形態の記憶装置１０は、アップデートに失敗した場合にも、更新前の残り１つのファームウェアのデータを用いて、ロールバック処理を行っている。そのため、アップデート処理において起動可能なファームウェアが無くなる状態をより避けることができる。
【０１２９】
以上より、本実施形態の記憶装置１０ではファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる。また、アップデート処理を行う際に、稼働可能なファームウェアが無くなる状態を避けることができる。その結果、本実施形態の記憶装置１０では、ファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる。
【０１３０】
（第３の実施形態）
本発明の第３の実施形態について詳細に説明する。第２の実施形態ではファームウェアのデータに異常が生じた際に、ファームウェア単位での修正を行った。本実施形態では、そのような構成に代えて、すべてのファームウェアに異常が生じたときに、正常なブロックのデータを他のファームウェアの異常が生じたブロックにコピーすることでファームウェアのデータを復元することを特徴とする。
【０１３１】
本実施形態の記憶装置の構成は、第２の実施形態と同様である。よって、以下の説明において、記憶装置の構成については図２の記憶装置１０を参照して説明を行う。また、本実施形態の記憶装置１０の通常時の動作およびファームウェアのアップデート等に関する動作は第２の実施形態の同様である。よって、以下では、本実施形態の記憶装置１０において、ブロックごとのデータのコピーにより正常なデータのファームウェアを復元する際の動作の説明のみを図１４を参照して行う。図１４は、ファームウェア復旧処理、すなわち、ブロックごとにデータの同期を行い正常なデータのファームウェアを復元する処理を行う際の動作フローの概要を示した図である。
【０１３２】
全てのファームウェアに異常が生じていると、ファームウェア起動準備処理において、ブート抑止ファームウェアフラグ５２のすべてのビットがセットされた状態になる。ブート抑止ファームウェアフラグ５２のすべてのビットがセットされた状態になると、制御部１１はファームウェア復旧処理を開始する（ステップ２１１）。
【０１３３】
ファームウェア復旧処理を開始すると、制御部１１は、ファームウェアのサイズ（Firmware Size）とブロックのサイズ（Block Size）の初期値をそれぞれ設定する（ステップ２１２）。ブロックとは、第２の情報記憶部１４を一定の記憶容量の単位ごとに分割した領域のことをいう。例えば、ブロックサイズの初期値は６４ｋバイト、ファームウェアサイズの初期値は１６Ｍバイトとして、ファームウェアのサイズとブロックのサイズがそれぞれ設定される。ファームウェアのサイズとブロックのサイズの初期値は、他の設定値であってもよい。
【０１３４】
制御部１１は、ファームウェアのサイズとブロックのサイズの初期値を設定すると、ブロック数（Number of Blocks）を算出する（ステップ２１３）。ブロック数は、（ファームウェアサイズ）／（ブロックサイズ）で算出される。
【０１３５】
制御部１１は、ブロックを先頭の記憶領域から処理するためブロック番号（Index）を「１」に設定して初期化する（ステップ２１４）。ブロック番号を初期化すると、制御部１１は、ブロック番号に対応する第１のファームウェア４１、第２のファームウェア４２および第３のファームウェア４３のデータを比較する（ステップ２１５）。
【０１３６】
３つのファームウェアにそれぞれ対応するブロックのデータがすべて異なるとき（ステップ２１６でＹｅｓ）、制御部１１は、ブロックのサイズを小さくしてデータの復元を行う動作を開始する。ブロックのサイズを小さくしてデータの復元を行う動作を開始すると、制御部１１はブロックサイズの確認を行う。ブロックサイズが最小単位以下、例えば１バイト以下であった場合には（ステップ２２３でＹｅｓ）、制御部１１は、復旧処理を行うことができないと判断し処理を終了する（ステップ２２４）。
【０１３７】
ブロックのサイズが最小単位よりも大きいと判断すると、制御部１１はブロックサイズを小さなサイズに設定する（ステップ２２５）。例えば、制御部１１は、ブロックの記憶容量値を８で割った値をブロックサイズとして設定する。ブロックサイズを小さくする方法は、他の計算に基づいて行ってもよい。新たなブロックサイズを設定すると、制御部１１は新たなサイズが最小単位よりも大きいことを確認する。新たなブロックサイズが最小単位未満であるときは、制御部１１は新たなブロックサイズを最小単位、例えば１バイトとして設定する。
【０１３８】
新たなブロックサイズを設定すると、制御部１１は、ステップ２１３に戻ってブロック数を再計算する。ブロック数を再計算すると、制御部１１はブロック番号を初期値の「１」に設定してステップ２１４以降の処理を行う。ブロックサイズを小さくすることで、同一ブックが破損している可能性が低くなるのでデータの修復率が向上する。
【０１３９】
３つのファームウェアにそれぞれ対応するブロックのデータに同じものがあるとき（ステップ２１６でＮｏ）、制御部１１は、すべてのブロックのデータが一致するか確認する。３つのファームウェアのブロックのうち、２つのデータが同一でいずれか１つのみが他と異なる場合には（ステップ２１７でＮｏ）、制御部１１は２つが同一であった方のデータで異なっていたファームウェアのブロックのデータを上書きする（ステップ２２２）。このような多数決処理を行うことで、ブロックのデータは修復され得る。データの上書きを行うと、制御部１１は、ブロック番号の値を１増加させる（ステップ２１８）。
【０１４０】
ブロック番号の値を増加させると、制御部１１は、ブロック番号の値とブロック数の値を比較する。ブロック番号がブロック数の値よりも大きいとき（ステップ２１９でＮｏ）、制御部１１はすべてのブロックについて復旧処理が完了したと判断する。
【０１４１】
復旧処理が完了したと判断すると、制御部１１は、ブート抑止ファームウェアフラグ５２をクリアする（ステップ２２０）。ブート抑止ファームウェアフラグ５２をクリアすると、制御部１１は、ファームウェアの再起動を行い正常に起動するかの確認を行う（ステップ２２１）。制御部１１は、再起動後は通常の方法で、ファームウェアの起動を行いファームウェアの内容に基づいた処理を行う。
【０１４２】
ステップ２１７ですべてのブロックのデータが一致したとき（ステップ２１７でＹｅｓ）、制御部１１はステップ２１８でブロック番号を１増加させてステップ２１９以降の処理を行う。
【０１４３】
本実施形態の記憶装置において、ブロックごとの同期処理によってファームウェアのデータを復元する場合の、各ブロックの構成の概要について説明する。図１５は、ファームウェアをブロックで分割した場合の各記憶領域を模式的に示したものである。
【０１４４】
図１５の例では各ファームウェアはＮ個のブロックで構成されている。図１５の例では、ブロック１のデータは、第１のファームウェア４１および第２のファームウェア４２で一致し、第３のファームウェア４３では異なっている。また、ブロック２のデータは、第２のファームウェア４２および第３のファームウェア４３で一致し、第１のファームウェア４１では異なっている。同様に、ブロック３のデータは、第１のファームウェア４１および第３のファームウェア４３で一致し、第２のファームウェア４２では異なっている。
【０１４５】
本実施形態では、制御部１１はブロックごとに各ファームウェアのデータを比較し２つ以上一致した場合に正しいと判断する。図１５の例では、ブロック１、ブロック２およびブロック３についてそれぞれ２つのファームウェアでデータが一致している。よって、制御部１１は、２つ以上のファームウェアで一致しているデータを残り１つにコピーすることで、ファームウェアのデータを復元することができる。
【０１４６】
図１６は、図１５と同様にファームウェアをブロックで分割した場合の各記憶領域を模式的に示したものである。図１６の例では、ブロック３においてファームウェア間で一致するデータはない。よって、図１６の例では、制御部１１はファームウェアの復元を行うことはできない。
【０１４７】
図１７は、ブロックサイズを変更してブロックごとの同期を行った場合の例を示したものである。図１６の例では、ブロック３において各ファームウェアのデータが異なっていたため、ファームウェアを復元することができなかった。図１７の例では、本実施形態の方法を用いてブロックサイズを図１６の場合の半分にしている。そのため、ファームウェア間でデータが一致する可能性が高くなる。
【０１４８】
図１８は、本実施形態と対比した構成においてブロックを小さくした場合の例を示したものである。図１８は、ブロックのデータの異常の有無をファームウェアごとにチェックサムを計算して判断する場合の例を示している。ファームウェアごと判断を行う場合には、ブロックごとにチェックサムを付加し、付加したデータと計算したチェックサムの比較を行う必要がある。ブロックサイズを小さくしてもチェックサムのサイズは小さくならないので、ブロック数が２倍になるとチェックサムも２倍の記憶容量を必要とする。
【０１４９】
一方で、本実施形態の記憶装置１０では、ファームウェア間で同じブロック番号のデータを比較して異常の有無を判断しているので、チェックサムが無い場合でも異常の有無の判断が可能である。そのため、本実施形態の記憶装置１０では、ブロックサイズを小さくした場合においてもチェックサムの記憶容量を増やさずにファームウェアの復元が可能となる。
【０１５０】
本実施形態の記憶装置１０では、三重化されたファームウェア間でブロックごとにデータの比較を行い、２つ以上のファームウェアでデータが一致したときにデータが正常であると判断している。そのため、ブロックごとにチェックサム等を備えていなくても異常の有無を判断することができる。
【０１５１】
また、本実施形態の記憶装置１０の制御部１１は、異常が生じたと判断したときに、ブロックごとに同期を行ってファームウェアのデータの修復を行っている。その際に、制御部１１は、３つのファームウェアのデータが全て異なるときに、ブロックのサイズを小さくして、データの修復を行っている。ブロックサイズを小さくすることで、３つのファームウェアでデータが互いに異なる可能性を小さくすることができる。そのため、データを修復できる可能性が高くなる。また、異常の有無の判断にチェックサムを必要としないので、ブロックを分割しても必要な記憶量は増加しない。
【０１５２】
以上より、本実施形態の記憶装置１０は、必要な記憶容量の増加を抑制しつつ異常が生じたファームウェアのデータを、ブロック単位のデータの同期で修復することができる。そのため、本実施形態の記憶装置１０では、ファームウェアに異常が生じた場合に、起動できなくなる可能性を抑制することができるので信頼性が向上する。
（第４の実施形態）
本発明の第３の実施形態について詳細に説明する。第２の実施形態および第３の実施形態では、３つのファームウェアがすべて対等に扱われていた。本実施形態では、そのような構成に代えて、稼働中のファームウェアの情報を要求する外部からのアクセスに対しては２つのファームウェアのみが稼働しているように応答することを特徴とする。すなわち、本実施形態の記憶装置を用いることで、３つ以上のファームウェアを備える記憶装置に対応していない装置にも適用することが可能となる。
【０１５３】
本実施形態の記憶装置の構成は、第２の実施形態と同様である。よって、以下の説明において、記憶装置の構成については図２の記憶装置１０を参照して説明を行う。また、本実施形態の記憶装置１０の通常時の動作、ファームウェアのアップデート等に関する動作およびファームウェアの復旧に関する動作は、第２の実施形態または第３の実施形態の記憶装置１０と同様である。よって、以下では、本実施形態の記憶装置１０において、稼働中のファームウェアの情報を要求する外部からのアクセスに対して応答する動作についての説明のみ図１９を参照して行う。図１９は、稼働中のファームウェアの情報を要求する外部からのアクセスに対して応答する際の動作フローの概要を示した図である。
【０１５４】
本実施形態の記憶装置１０では、通常時は第１のファームウェア４１または第２のファームウェア４２のいずれかが優先的に使用される。すなわち、起動可能なファームウェアが複数あるとき、制御部１１は、優先起動ファームウェアフラグ５２に第１のファームウェア４１または第２のファームウェア４２のいずれかを優先的に設定する。第１のファームウェア４１または第２のファームウェア４２のどちらを優先するかはあらかじめ設定されている。第１のファームウェア４１または第２のファームウェア４２のどちらを優先するかは、起動された回数に基づいて起動回数が少ない方が優先的に用いられるようにしてもよい。
【０１５５】
外部の装置から稼働中のファームウェアの情報を要求する信号が、記憶装置１０に入力される。稼働中のファームウェアの情報を要求する信号が入力されると、制御部１１は、稼働中ファームウェアフラグ７２と優先起動ファームウェアフラグ５１のデータを読みこむ（ステップ２１１）。稼働中ファームウェアフラグ７２のデータを読み込むと、制御部１１は、稼働中のファームウェアを確認する。
【０１５６】
稼働中のファームウェアが第３のファームウェア４３以外のとき（ステップ２１２でＮｏ）、制御部１１は、稼働中ファームウェアフラグ７２に設定されているファームウェアを稼働中のファームウェアとして応答する。稼働中ファームウェアフラグ７２に設定されているファームウェアが第１のファームウェア４１のとき（ステップ２１３でＮｏ）、制御部１１は、第１のファームウェア４１が稼働中のファームウェアであると応答する。稼働中ファームウェアフラグ７２に設定されているファームウェアが第２のファームウェア４２のとき（ステップ２１３でＹｅｓ）、制御部１１は、第２のファームウェア４２が稼働中のファームウェアであると応答する。
【０１５７】
稼働中のファームウェアが第３のファームウェア４３であるとき（ステップ２１２でＹｅｓ）、制御部１１は優先起動ファームウェアフラグ５１の内容を確認する。優先起動ファームウェアフラグ５１が第１のファームウェア４１を示しているとき（ステップ２１６でＮｏ）、制御部１１は第１のファームウェア４１が稼働中と応答する（ステップ２１７。優先起動ファームウェアフラグ５１が第２のファームウェア４２を示しているとき（ステップ２１６でＹｅｓ）、制御部１１は第２のファームウェア４２が稼働中と応答する（ステップ２１５）。
【０１５８】
本実施形態の記憶装置１０は、起動中のファームウェアの情報についての外部からの要求に対して第１のファームウェア４１または第２のファームウェア４２を稼働中として応答している。第３のファームウェア４４の稼働中であっても第１のファームウェア４１または第２のファームウェア４２のどちらかを応答として返すことで、ファームウェアの三重化に対応していない装置にも本実施形態の記憶装置１０を用いることができる。このような構成とすることで、ｅＭＭＣのように記憶装置が組み込まれている装置側のコントローラが所定の制御を行うような装置にも、本実施形態の記憶装置１０を適用することができる。
【０１５９】
第２乃至第４の実施形態では、記憶装置１０の制御部１１がファームウェアに基づいて制御信号を生成して出力している。そのような構成に代えて、記憶装置１０は、要求に応じてファームウェアのデータを出力するのみで、記憶装置１０が組み込まれている装置側のコントローラ等がファームウェアに基づいた制御を行うようにしてもよい。
【０１６０】
第２乃至第４の実施形態では、ファームウェアを３つ備えることで冗長化されている記憶装置について説明した。そのような構成に代えて、ファームウェアを４つ以上備える構成としてもよい。ファームウェアを４つ以上備える場合には、アップデート後の２つ以上のファームウェアが正常に起動したときに、残りのファームウェアのアップデートが行われる。また、異常の有無を判断する際には、各ファームウェア間のデータを比較し多数決処理によって判断することができる。
【符号の説明】
【０１６１】
１    情報記憶手段
２    起動フラグ保存手段
３    制御手段
１０    記憶装置
１１    制御部
１２    インターフェース部
１３    第１の情報記憶部
１４    第２の情報記憶部
１５    バックアップメモリ部
１６    タイマー部
１７    メモリ部
４１    第１のファームウェア
４２    第２のファームウェア
４３    第３のファームウェア
５１    優先起動ファームウェアフラグ
５２    ブート抑止ファームウェアフラグ
５３    ファームウェアアップデートフラグ
７１    ブート中ファームウェアフラグ
７２    稼働中ファームウェアフラグ
Ｓ６１    カウンタ制御信号
Ｓ６２    リセット信号
【要約】
【課題】ファームウェアが冗長化された構成において、記憶素子へのアクセス回数を抑制して信頼性を向上することができる記憶装置を得る。
【解決手段】記憶装置を、情報記憶手段１と、起動フラグ保存手段２と、制御手段３を備える構成とする。情報記憶手段１は、同一のデータの複数のファームウェアを、記憶素子のそれぞれに割り当てられた領域に保存する。起動フラグ保存手段２は、保存されているファームウェアのうち、いずれのファームウェアを起動するかを示す起動フラグと、起動を抑止するファームウェアの情報を示す起動抑止フラグとを保存する。制御手段３は、起動抑止フラグが設定されていない中から、いずれか１つのファームウェアに起動フラグを設定する手段を有する。また、制御手段３は、起動フラグに対応するファームウェアを記憶素子から読み出して、読み出したファームウェアに基づいて信号を出力する手段をさらに有する。
【選択図】      図１【図１】
0006011687.tif 000002
【図２】
0006011687.tif 000003
【図３】
0006011687.tif 000004
【図４】
0006011687.tif 000005
【図５】
0006011687.tif 000006
【図６】
0006011687.tif 000007
【図７】
0006011687.tif 000008
【図８】
0006011687.tif 000009
【図９】
0006011687.tif 000010
【図１０】
0006011687.tif 000011
【図１１】
0006011687.tif 000012
【図１２】
0006011687.tif 000013
【図１３】
0006011687.tif 000014
【図１４】
0006011687.tif 000015
【図１５】
0006011687.tif 000016
【図１６】
0006011687.tif 000017
【図１７】
0006011687.tif 000018
【図１８】
0006011687.tif 000019
【図１９】
0006011687.tif 000020