説明

ファームウェア保護装置、そのプログラム

【課題】二重化したファームウェアの両方が破損してしまった場合でもリカバリすることができる。
【解決手段】二重化したファームウェアそれぞれについて、そのプログラム本体であるプログラム部50を、複数のプログラムブロック1〜n(51)に分割して記憶する。また、ヘッダ部40には各プログラムブロック51毎に対応するSUM45を記憶し、このSUM45を用いて各プログラムブロック51毎に破損したか否かをチェックする。二重化したファームウェアの両方が破損してしまった場合でも、一方において破損したプログラムブロック51が、他方においては破損していない場合には、他方のプログラムブロック51を用いてリカバリすることができる。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、組込み機器に搭載するファームウェアを保護する技術に関する。
【背景技術】
【0002】
従来、組込み機器に搭載するファームウェアの保護方法として、ファームウェアを記憶する領域を二重化する方法が広く行われている。これは、不揮発性メモリの経年劣化やダウンロード中の電源断等により、一方のプログラム(ファームウェア)が破損してしまった場合でも、必ず機器を起動できるようにするためのものである。
【0003】
特許文献1に記載の発明では、ファームウェアを記憶する領域を二重化して、一方の領域はダウンロード時に書換え、もう一方の領域は起動したファームウェアが自分自身を書換えることで、二重化を行っている。また、記憶したファームウェアの一方が破損した場合は、上記と同様に、起動したファームウェアが自分自身を複製して、ファームウェアを常に二重化した状態にしている。
【0004】
また、特許文献2には、データ数の増減に関わらずチェックサムデータ量を減少させることができるデータ保護装置が提案されている。すなわち、従来では二重化されたメモリに記憶される各データ毎に、そのデータに対するチェックサムデータを生成・記憶しており、このチェックサムデータを用いて各データ毎の異常の有無をチェックしていた。この為、データ数の増大に伴って多量のチェックサムデータが必要となるという問題があった。
【0005】
この問題を解決する為、特許文献2の発明では、各データが1つのブロックにまとめられた実データ群と、この実データ群について、個々の実データの総和をとった1つのチェックサムデータとから構成されるようにしている。これによりチェックサムデータ量を大幅に削減することができる。また、チェックサムデータを用いたチェック処理によって異常が検出された場合には、ブロック内の実データ群全てについて修正を行う。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】特開平4−336642号公報
【特許文献2】特開2000−148601号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
従来、不揮発性メモリに記憶したファームウェアが破損しているかどうかの判定は、ファームウェアに付加したSUM(チェックサム)等を用いて行われている。しかし、SUMはプログラム全体に対して計算したものであり、プログラムの全体ではなく一部が破損した場合においても不整合となってしまう。そのため、二重化したファームウェアの両方が同時に破損した場合、従来の方法では、ファームウェアの破損状態に関わらず、装置を起動することができなかった。但し、人手を介して、ファームウェアを再度ダウンロードすれば、装置を起動(リカバリ)することは可能である。しかしながら、この様な人手を介在する方法は、組込み機器としては望ましくなく、また人間に余計な手間を掛けさせることになる。
【0008】
上記特許文献1の発明では、ファームウェアを常に二重化する方法が提案されているが、二重化したファームウェアが同時に破損するケースに関しては何等言及していない。
また、記憶したファームウェアの一方が破損した場合、ファームウェアの破損状態に関わらず(一部のみが破損した場合でも)、起動したファームウェアの全領域を複製しているため、装置の起動時間が大幅に遅くなるという課題がある。
【0009】
本発明の課題は、二重化したファームウェアの一部が破損した場合に、破損した部分のみをリカバリすることでリカバリに要する時間を短縮でき、以って装置の起動時間が大幅に遅くなる問題を解消でき、更に二重化したファームウェアの両方が破損してしまった場合でもファームウェアをリカバリすることができ、装置を起動することを可能とするファームウェア保護装置、そのプログラム等を提供することである。
【課題を解決するための手段】
【0010】
本発明のファームウェア保護装置は、ファームウェアを二重化して記憶して、該ファームウェアの何れか一方を起動して実行させる装置であって、前記二重化された各ファームウェアを、それぞれ、固定長ブロックに分割して成る分割プログラム群として記憶するプログラム記憶手段と、前記各分割プログラム毎に対応して、その分割プログラムのチェックサムを記憶するチェックサム記憶手段と、前記各分割プログラム毎に対応して破損しているか否かを示す管理情報を記憶する管理情報記憶手段と、前記各ファームウェア毎に、それが破損しているか否かをその各分割プログラム毎に前記チェックサムを用いてチェックして、該チェック結果により前記管理情報を更新するチェック手段と、前記ファームウェアが破損した場合、該破損したファームウェアに対応する前記管理情報を参照して破損した分割プログラムを認識し、他方のファームウェアにおける該破損した分割プログラムに対応する分割プログラムを用いて、該破損した分割プログラムをリカバリするリカバリ手段とを有する。
【0011】
上記ファームウェア保護装置では、ファームウェアを分割記憶し、各分割プログラム毎にチェックサムを保持している。これより、各分割プログラム毎に、それが破損しているか否かをチェックできる。ファームウェアの全体が破損しているのではなく、その一部のみが破損している場合には、破損している分割プログラムのみをリカバリすればよく、リカバリ処理に掛かる時間を短縮でき、以って装置の起動時間が大幅に遅くなる問題を解消できる。
【0012】
上記ファームウェア保護装置において、例えば、前記二重化されたファームウェアが両方とも破損した場合、前記リカバリ手段は、まず一方のファームウェアをリカバリ対象として、該リカバリ対象のファームウェアに関する前記管理情報を参照して破損した分割プログラムを認識し、他方のファームウェアにおける該破損した分割プログラムに対応する分割プログラムが、破損しているか否かをチェックし、他方のファームウェアにおいても破損している場合にはリカバリ不能とするが、破損していない場合には該他方のファームウェアにおける分割プログラムを用いて前記破損した分割プログラムをリカバリする。
【0013】
本発明のファームウェア保護装置では、上記の通り、分割プログラム単位で破損の有無のチェック、リカバリを行えるので、たとえ二重化されたファームウェアが両方とも破損した場合でも、両方で同じ分割プログラムが破損していない限りは、リカバリを行える。
【発明の効果】
【0014】
本発明のファームウェア保護装置、そのプログラム等によれば、二重化したファームウェアの一部が破損した場合に、破損した部分のみをリカバリすることでリカバリに要する時間を短縮でき、以って装置の起動時間が大幅に遅くなる問題を解消できる。更に二重化したファームウェアの両方が破損してしまった場合でもファームウェアをリカバリするこ
とができ、装置を起動することを可能とする。
【図面の簡単な説明】
【0015】
【図1】本例のファームウェア保護装置の一例である組込み機器の構成例である。
【図2】(a)、(b)、(c)は、外部フラッシュROMのデータブロック構成例を示す図である。
【図3】SDRAMのデータ構成図である。
【図4】ブートファームウェアによるメイン処理のフローチャート図である。
【図5】ブートファームウェアの起動処理のフローチャート図である。
【図6】ブートファームウェアのリカバリ処理のフローチャート図(その1)である。
【図7】ブートファームウェアのリカバリ処理のフローチャート図(その2)である。
【図8】オペレーションファームウェアの処理フローチャート図(その1)である。
【図9】オペレーションファームウェアの処理フローチャート図(その2)である。
【図10】ダウンロード処理のフローチャート図である。
【発明を実施するための形態】
【0016】
以下、図面を参照して本発明の実施の形態について説明する。
図1は、本例のファームウェア保護装置の一例である組込み機器の構成例である。尚、本例のファームウェア保護装置は、組込み機器に限らない。但し、特に組込み機器である場合には、上述した装置の起動ができない(もしくは起動が大幅に遅くなる)ことは、重大な問題となり、避けなければならないものである。
【0017】
図示の例の組込み機器10は、CPU11、外部フラッシュROM14、SDRAM15を有し、CPU11は、RAM12、内蔵フラッシュROM13を有する。また、組込み機器10は、上位機1に接続している。
【0018】
上位機1は、オペレーションファームウェアを組込み機器10内のSDRAM15に転送して記憶する処理機能と、このSDRAM15に記憶されたオペレーションファームウェアを外部フラッシュROM14にダウンロードさせるための指示を組込み機器10に対して行う処理機能等を備える、PC(パソコン)等の上位装置である。尚、このダウンロード指示を受けた組込み機器10側では、後述する図10に示すダウンロード処理を実行する。
【0019】
内蔵フラッシュROM13は、ブートファームウェアを記憶する。
外部フラッシュROM14は、オペレーションファームウェアを記憶する。これは、オペレーションファームウェアを二重化して記憶・管理している。そして、本手法では、後に図2で説明するように、オペレーションファームウェアを複数ブロックに分割して管理している。
【0020】
SDRAM15は、外部フラッシュROM14に記憶したオペレーションファームウェ
アの実行領域を有する(ワークメモリである)。
尚、上記オペレーションファームウェアが、組込み機器に搭載させて何らかの処理を実行させる為のファームウェアであり、二重化により保護する対象となるファームウェアである。一方、上記ブートファームウェアは、ブート処理(詳しくは後述する)を実行するファームウェアである。
【0021】
図2に、外部フラッシュROM14のデータブロック構成を示す。
図2(a)に示すように、外部フラッシュROM14の記憶領域は、管理情報格納領域21と、複数のFW格納領域22(図示の例では、FW格納領域a、b等;FWはファームウェアの略号とする)等から成る。
【0022】
各FW格納領域22は、それぞれオペレーションファームウェアを記憶する領域である。そして、上記の通り、オペレーションファームウェアは二重化されて記憶されており、例えばFW格納領域aとbには基本的には同じオペレーションファームウェアが記憶されている。但し、上位機1から新バージョンのオペレーションファームウェアが転送されて、これをダウンロードした際には、一時的に、FW格納領域a、bのどちらか一方には新バージョン、他方には旧バージョンが格納された状態になる場合もある。また、何かの間違いで別のプログラムが格納される可能性もある。
【0023】
管理情報格納領域21は、上記FW格納領域22に格納されているオペレーションファームウェアに関する各種管理情報が記憶される。これは詳細には図2(b)に示すように、管理情報格納領域21には、動作ステータス31、バックアップステータス32、カレントFW格納領域番号33、破損ブロック番号34等の各種管理情報が記憶される。
【0024】
尚、本説明では、管理情報格納領域21には、FW格納領域aとbとに二重化されて格納される1つのオペレーションファームウェアに関する管理情報が記憶されるものとする。尚、オペレーションファームウェアが複数種類ある場合には、各オペレーションファームウェア毎に対応付けて上記管理情報が記憶される。
【0025】
また尚、特に図示しないが、管理情報格納領域21には、対応するオペレーションファームウェアの各格納領域(上記の例ではFW格納領域aとFW格納領域b)のアドレス等の情報も格納されている。例えば、後述する格納領域番号(1,2)にそれぞれ対応付けて、そのオペレーションファームウェアの各格納領域のアドレス等の情報も格納される。このアドレス等は、例えば、ヘッダ部40の各種情報のアドレスや、プログラム部50の各プログラムブロック51のアドレス等である。また、ヘッダ部40における各プログラムブロックSUM45が、プログラム部50におけるどのプログラムブロック51に対応するものであるのかを示す情報等も、例えば管理情報格納領域21に格納されていてもよい。
【0026】
動作ステータス31は、上記オペレーションファームウェアの動作状態を示すものであり、その値と意味は本例では下記の通りとする。
・0 :運用中
・1 :リカバリ中
・2 :停止中(リカバリが不可能なため、再ダウンロードが必要な状態)
バックアップステータス32は、オペレーションファームウェアがバックアップされているか否かを示すものであり、その値と意味は本例では下記の通りとする。
・0 :バックアップなし
・1 :バックアップあり
尚、“バックアップあり”とは、オペレーションファームウェアが正常に二重化されている状態であることを示す。よって、例えば、FW格納領域aとbとに格納されているオ
ペレーションファームウェアが、バージョンが同じではない場合や、破損が生じている場合には、“バックアップなし(0)”となる。
【0027】
カレントFW格納領域番号33は、ブートファームウェアがブートするオペレーションファームウェアの格納領域番号であり、その値と意味は本例では下記の通りとする。
・1 :FW格納領域a
・2 :FW格納領域b
つまり、カレントFW格納領域番号33=‘1’の場合には、FW格納領域aがカレント側であり、FW格納領域bはカレント側ではない(非カレント側というものとする)ことを意味する。同様に、カレントFW格納領域番号33=‘2’の場合にはFW格納領域bがカレント側であり、FW格納領域aは非カレント側であることを意味する。
【0028】
ブートファームウェアは、オペレーションファームウェアの処理を実行させる際には、カレント側のオペレーションファームウェアを、SDRAM15に転送して起動する。但し、カレント側のオペレーションファームウェアが正常に動作しない場合(破損がある等)には、非カレント側のオペレーションファームウェアをカレント側として、SDRAM15に転送して起動する。つまり、非カレント側とは、通常、バックアップ側を意味する。
【0029】
破損ブロック番号34は、カレントFW格納領域番号33が示す領域(上記カレント側の領域)における破損したプログラムブロックのブロック番号を、ビットに割当てて記憶するものであり、その意味は本例では以下の通りとする。
【0030】
・ビットON :破損あり
・ビットOFF:破損なし
尚、上記ブロック番号とは、後述する各プログラムブロック51に割り当てられた識別番号である。例えばブロック番号が‘1’〜‘8’であったとしたならば、破損ブロック番号34は8ビットから成り、ブロック番号‘1’は1ビット目に割り当て、ブロック番号‘8’は8ビット目に割り当てる。
【0031】
各FW格納領域22のデータ構成は同一であり、その一例を図2(c)に示す。
図2(c)に示す例では、FW格納領域22に格納されるオペレーションファームウェアは、ヘッダ部40とプログラム部50とから成る。
【0032】
プログラム部50がオペレーションファームウェア本体である。プログラム部50には、図示の通り、オペレーションファームウェア本体(プログラム本体)が、固定長ブロック(各プログラムブロック51)に分割されて格納されている。
【0033】
また、ヘッダ部40には、名称41、バージョン42、ヘッダサイズ43、プログラムサイズ44、プログラムブロックSUM45、ヘッダSUM46等の、上記プログラム部50のプログラム本体に関する各種データが格納される。
【0034】
名称41は、プログラム部50に格納されているオペレーションファームウェアの名称等である。バージョン42は、このオペレーションファームウェアのバージョンである。ヘッダサイズ43は上記ヘッダ部40のデータサイズである。
【0035】
プログラムサイズ44は、上記オペレーションファームウェアのプログラム部50の実サイズである。尚、これは、各プログラムブロック51の合計サイズを意味するものではない(プログラムブロック51は固定長なので、プログラムサイズがこのブロックサイズで割り切れない場合には一致しない;最終ブロックの一部は空白等となる)。
【0036】
各プログラムブロックSUM45は、上記各プログラムブロック51毎に対応したそのプログラムブロックのSUM(チェックサム)である。つまり、上記各プログラムブロック51は、上記各プログラムブロックSUM45と1対1で対応する。
【0037】
ヘッダSUM46は、ヘッダ部40のSUM(チェックサム)である。これは、上記名称41、バージョン42、ヘッダサイズ43、プログラムサイズ44、のSUMを計算したものに、プログラムブロックSUM45の各SUM値を加算した値(合計)である。
【0038】
尚、よく知られているように、チェックサムは、データの信頼性を検査する為に、予め検査対象のデータに基づいて所定の計算方法により算出しておくものである。この所定の計算方法は、様々な方法があってよく、簡単な方法としては、全データをバイト単位で(桁あふれは無視して)加算する計算方法等がよく知られているが、この例に限るものではない。尚、ハッシュ値等もチェックサムの一例として扱われることがある。
【0039】
この様に、本例では、オペレーションファームウェアを固定長ブロックに分割して格納すると共に、各プログラムブロック毎にSUMを生成・格納している。つまり、各プログラムブロック毎にSUMによる異常チェック(破損の有無のチェック)を行えるようにしている。上記の通り、二重化されたオペレーションファームウェアの両方とも、この様なデータ構成となっている。
【0040】
この様な構成を用いることで、本手法では、(詳しくは後にフローチャート図を参照して説明するが)、ファームウェア保護装置(組込み機器等)において例えば以下の1)、2)の処理機能を提供することができる。
【0041】
1)二重化したオペレーションファームウェアが両方とも破損した場合でも、リカバリ可能となる。つまり、当然、どちらか一方でもプログラム全体が破損した場合にはリカバリ不能であるが、両方とも一部のみが破損した状態であれば、リカバリできる場合がある。リカバリできる場合とは、どちらか一方において破損したプログラムブロックが、他方においては破損していない場合である。
【0042】
二重化したオペレーションファームウェアが両方とも破損した場合のリカバリの為の処理に関しては、その具体的な一例については詳しくは後にフローチャート図を参照して説明するが、概略的には以下の通りである(但し、これは具体的な処理の一例を示すものであり、この例に限るものではない)。
【0043】
まず、オペレーションファームウェアを起動するファームウェア(上記ブートファームウェア)による起動処理において、オペレーションファームウェアに破損があった場合には、破損したプログラムブロック51の情報を管理情報格納領域21の破損ブロック番号34に記憶する。尚、上記の通り、破損ブロック番号34には、カレント側に関する破損情報が記憶され、非カレント側に関しては記憶されないが、これは一例であり、非カレント側に関してもその破損したプログラムブロック51の情報を記憶するようにしてもよい。
【0044】
後述する図5に示す処理例では、二重化したオペレーションファームウェアが両方とも破損している場合には、上記起動処理後、自動でリブートする。この場合には、これによって、ブートファームウェアによるリカバリ処理が実行されることになる。このリカバリ処理において、ヘッダ部40と管理情報格納領域21を参照して、破損したオペレーションファームウェアの該当ブロック(破損したプログラムブロック51)のみを、二重化したもう一方のオペレーションファームウェアから複製してリカバリする。
【0045】
但し、上記の通り、もう一方のオペレーションファームウェアにおいても同じプログラムブロック51が破損していた場合には、リカバリ不能となる。この場合には、再度、オペレーションファームウェアをダウンロードすることになる(但し、従来では人手を介したが、本手法では自動的にダウンロードする)。
【0046】
この様に、二重化したファームウェアが両方とも破損した場合でも、破損状態によっては、ファームウェアをリカバリすることができる。
尚、後述する処理例では、リカバリ処理においてはカレント側のオペレーションファームウェアのみをリカバリする。非カレント側のオペレーションファームウェアに関しては、その後にカレント側のオペレーションファームウェアを実行することで(後述する図8、図9に示す“オペレーション”処理)、リカバリされる。但し、これは一例であり、この例に限らず、リカバリ処理においてカレント側、非カレント側(バックアップ側)の両方ともリカバリしてもよい。
【0047】
2)二重化したオペレーションファームウェアの一部が破損した場合、破損した部分のみを(プログラムブロック単位で)リカバリすることで、オペレーションファームウェアのリカバリに要する時間を大幅に減少させることができる。これより、装置の起動時間が大幅に遅くなる問題を解消できる。尚、本例では二重化したオペレーションファームウェアのどちらか一方のみが破損した場合を主に想定しているが、両方とも異なった箇所が破損した場合でも同様にして得られる効果である。
【0048】
これに関しても、その具体的な一例については詳しくは後にフローチャート図を参照して説明するが、概略的には以下の通りである(但し、これは具体的な処理の一例を示すものであり、この例に限るものではない)。
【0049】
まず、上記ブートファームウェアの起動処理において、どちらか一方のオペレーションファームウェアに破損があった場合には、破損したプログラムブロック51の情報を管理情報格納領域21の破損ブロック番号34に記憶する。そして、他方の(破損していない)オペレーションファームウェアを起動する。
【0050】
これより、起動したオペレーションファームウェアの処理において、ヘッダ部40と管理情報格納領域21を参照して、破損したオペレーションファームウェアの該当ブロック(破損したプログラムブロック51)のみを、当該起動したオペレーションファームウェアにおける該当ブロック(上記破損したプログラムブロック51と同じプログラムブロック51)を用いてリカバリする。
【0051】
これにより、上記従来のように起動したファームウェアの全領域を複製する手法に比べて、複製するデータ量が少なくて済むので、ファームウェアのバックアップに要する時間が大幅に減少させることができ、以って装置の起動時間への影響を微小にすることができる。
【0052】
図3に、SDRAM15のデータ構成図を示す。
図示の例では、SDRAM15は、FWブート領域61、FWダウンロード領域62の各記憶領域を有する。
【0053】
FWブート領域61は、上記オペレーションファームウェアを外部フラッシュROM14から転送して、実行する領域である。
FWダウンロード領域62は、新たなオペレーションファームウェアをダウンロードする際に、これを一時的に記憶する領域である。これは、上位機1から新たなオペレーショ
ンファームウェアが転送されてFWダウンロード領域62に記憶される。新たなオペレーションファームウェアは、FWダウンロード領域62に一時的に記憶された後、外部フラッシュROM14にダウンロードして格納される(図10に処理の一例を示す)。その後、オペレーションファームウェアを実行する際には、上記FWブート領域61に転送・格納して実行することになる。
【0054】
図4は、ブートファームウェアによるメイン処理のフローチャート図である。
ブートファームウェアは、予め内蔵フラッシュROM13に記憶されているプログラムであり、CPU11がこのブートファームウェアを内蔵フラッシュROM13から読出・実行することで、図4の処理が実現される。
【0055】
ブートファームウェアは、様々な処理を行うが、基本的には図4に示すメイン処理を経て、図示のブート本体処理、起動処理、リカバリ処理の何れかを実行するものである。ブート本体処理とは、ここではダウンロード処理であり、例えば後述する図10の処理を実行する。
【0056】
尚、ブート本体処理は、無限ループでイベントを待ち、イベント発生したら、発生したイベントに応じた処理を行うものであり、例えばデータ収集や通信等の処理や、ダウンロード処理を行うものである。
【0057】
ブート本体処理の一例であるダウンロード処理は、以下の(a)、(b)の何れかの場合に実行される。
(a)一度もオペレーションファームウェアをダウンロードしていない場合において、上記上位機1からのダウンロード指示を受けた場合
(b)二重化したオペレーションファームウェアが両方とも壊れている場合
ここで、図4に示す“ブート本体処理”は図示のステップS12がYESの場合に実行されるものであり、これは上記(b)の場合に相当するものであり、よって上記の通り図4に示す“ブート本体処理”はダウンロード処理を意味することになる。尚、同様の理由により、図7に示すステップS60の後の“ブート本体処理”も、ダウンロード処理を意味することになる。そして、上記の通り、本例におけるダウンロード処理は例えば後述する図10に示す処理となる。
【0058】
また、起動処理とは、基本的にはカレント側のオペレーションファームウェアを起動して処理実行させるものである。これは、外部フラッシュROM14に記憶したオペレーションファームウェアを、SDRAM15に転送した後、処理実行させるものである。起動したオペレーションファームウェアの処理については、図8、図9に示し、後に説明する。
【0059】
但し、カレント側のオペレーションファームウェアに破損等がある場合には、破損情報を破損ブロック番号34に記憶すると共に、カレント側ではない(上記の通り非カレント側と呼ぶ)オペレーションファームウェアをカレント側に切り替えて処理実行させる。また、オペレーションファームウェアが両方とも破損している場合には、破損情報を破損ブロック番号34に記憶すると共に、リブートして、上記リカバリ処理を実行して、破損箇所のリカバリを行う。上記起動処理の詳細は図5、リカバリ処理の詳細は図6、図7に示し、後に説明する。
【0060】
以下、まず、図4のメイン処理について説明する。
図4の処理では、まず、ハードウェア及びブートファームウェアの各種初期化を行う(ステップS11)。
【0061】
そして、動作ステータス31を参照して、その内容に応じて、上記ブート本体処理、起動処理、リカバリ処理の何れかを実行する。
すなわち、動作ステータス31が“停止中(2)”の場合は(ステップS12,YES)、二重化したオペレーションファームウェアが共に破損し、且つ、リカバリ不可能な状態であることを示しているため、オペレーションファームウェアの起動は行わず、ブート本体処理に遷移する。
【0062】
尚、既に述べた通り、ブート本体処理とは、ダウンロード処理を含むブートファームウェアが本来行う処理であるが、本説明ではダウンロード処理のみ規定するものとする。上記の通り、ダウンロード処理については詳細は図10に示し、後に説明する。
【0063】
また、動作ステータス31が“リカバリ中(1)”の場合は(ステップS13,YES)、リカバリ処理へ遷移する。このリカバリ処理の詳細は図6、図7に示し、後に説明する。
【0064】
また、動作ステータス31が“運用中(0)”の場合は(ステップS14,YES)、起動処理へ遷移する。この起動処理の詳細は図5に示し、後に説明する。
動作ステータス31が“0〜2以外”の場合は(ステップS12,S13,S14が何れもNO)、管理情報格納領域21が破損していると見なして、管理情報格納領域21をゼロクリア(対象領域のビット値を“0”で全て埋めることを意味し、後述の説明の“ビットOFF”と“0”とは同値を指す)すると共に(ステップS15)、各FW格納領域22それぞれのヘッダ部40を参照することで、二重化したオペレーションファームウェアのうち、バージョン42が新しい方をカレント(ブート対象)として、その格納領域番号をFW格納領域番号33に設定して(上記の通り本例では1:FW格納領域a、2:FW格納領域bであり、‘1’‘2’のどちらかを設定する)(ステップS16)、起動処理へ遷移する。
【0065】
図5に、ブートファームウェアの上記起動処理のフローチャート図を示す。
図示の例では、まず、管理情報格納領域21におけるカレントFW格納領域番号33を参照して現在のカレント側のオペレーションファームウェアを認識し、このカレント側のオペレーションファームウェアのFW格納領域22のヘッダ部40が破損しているか否かをチェックする。これは、このヘッダ部40のSUMを計算し、算出したSUMがヘッダSUM46と一致するかをチェックする(ステップS21)。
【0066】
上記SUMが一致する場合は(ステップS22,YES)、ヘッダ部40は破損等していないことになり(正常であり)、ステップS23以降の処理に遷移する。一方、上記SUMが一致しない場合には(ステップS22,NO)、ヘッダ部40が破損していることを示しているため、ステップS29以降の処理に遷移する。
【0067】
ステップS23〜S27の処理は、概略的には、オペレーションファームウェア本体(プログラム部50)をブロック単位で、SDRAM15のFWブート領域61に順次転送し、転送する毎に対応するプログラムブロックSUM45を用いた破損(異常)チェックを行う処理である。上記転送とSUMチェックを全ブロックについて完了するまで繰り返し行う。
【0068】
すなわち、まず、プログラム部50における1つのプログラムブロック51をFWブート領域61に転送し、このプログラムブロック51のSUMを計算する(ステップS23)。そして、算出したSUMがこのプログラムブロック51に対応するプログラムブロックSUM45と一致するか否かを判定し、一致する場合には(ステップS24,YES)このプログラムブロック51は破損していないことになるので、そのままステップS27
の処理へ移行する。そして、未だ全てのプログラムブロック51について処理完了していなければ(ステップS27,NO)、ステップS23に戻り、次のプログラムブロック51について同様の処理を実行する。
【0069】
一方、算出したSUMと対応するプログラムブロックSUM45とが不一致の場合には(ステップS24,NO)、つまりこのプログラムブロック51が破損している場合には、処理対象がカレント側の場合のみ(ステップS25,YES)、当該破損したプログラムブロック51の番号を内部変数Aのビットに割当てて記憶する(ステップS26)。
【0070】
尚、上記ステップS25の判定を行うのは、本説明で用いる一例では破損ブロック番号34はカレント側にのみ対応する情報だからである。非カレント側についてはその一部に破損があっても破損ブロック情報は残さない。カレント側については破損ブロック番号34に基づいて、破損したプログラムブロック51のみリカバリを行う。よって、プログラム全体をリカバリする場合に比べて、リカバリ処理時間が短くて済む。一方、非カレント側に破損があった場合、後に説明する“オペレーション”の処理により(このときカレント側は破損があっても既にリカバリ済み)、カレント側のプログラム本体全体を非カレント側にコピーすることで、非カレント側もリカバリできる。
【0071】
但し、既に述べた通り、これは一例であり、この例に限らない。例えば、破損ブロック番号34を、カレント側対応と非カレント側対応との2種類用意し、これに応じて内部変数に関しても上記内部変数Aに加えて更に非カレント側に対応する内部変数(仮に、内部変数Bとする)も用意するようにしてもよい。この例では、上記ステップS25の判定がNOの場合には、内部変数Bを用いてステップS26と同様の処理を行うことになる。また、後述するステップS32、S35の処理では、内部変数A,Bの値をそれぞれ上記2種類の破損ブロック番号34のどちらかにコピーすることになる。また、この例の場合、後述する各種処理のうち破損ブロック番号34を用いる処理が、本例とは多少異なることになるが、これについては特に説明しない。
【0072】
尚、内部変数A、Bとは、破損ブロック番号34と同じデータ構造の内部変数であり、上記の通り、“ビットON:破損あり”、“ビットOFF:破損なし”を意味しており、全てのビットは領域確保時に初期化(ビットOFF)しておく。そして、ステップS26において、破損したプログラムブロック51に対応するビットをビットONする。尚、後述するように後にこの内部変数Aにより破損ブロック番号34を更新する。勿論、この例に限らず、例えば内部変数を用いることなく直接、破損ブロック番号34を更新するようにしてもよい。
【0073】
そして、上記ステップS27の処理を行う。
全てのプログラムブロック51について上記の処理を行ったら(ステップS27,YES)、プログラムブロックSUM45が全て正常であったか(破損していないか)否かを判定し(ステップS28)、全て正常であった場合には、すなわち破損しているプログラムブロック51が1つも無い場合には(ステップS28,YES)、ステップS32〜S34の処理を実行し、FWブート領域61に転送済みのオペレーションファームウェアを起動する。
【0074】
一方、破損しているプログラムブロック51が1つでもある場合(ステップS28,NO)、またはヘッダ部40が破損している場合には(ステップS22,NO)、二重化したオペレーションファームウェアの内、少なくとも1つが破損していること(バックアップなし)を示しているため、管理情報格納領域21のバックアップステータス32をバックアップなし(0)に設定する(ステップS29)。
【0075】
次に、非カレント(バックアップ)領域のチェックも実施済みか否かを判定し(ステップS30)、未実施の場合には(ステップS30,NO)、非カレント側のオペレーションファームウェアに関して、上記カレント側と同様のチェック処理を行う。すなわち、非カレント側(バックアップ側)のオペレーションファームウェアのFW格納領域22のヘッダ部40、プログラム部50が破損しているか否かを、上記ステップS22〜S28の処理によりチェックする。尚、ステップS31の処理の前に、SDRAM15(そのFWブート領域61)に転送したプログラムブロック51は全て削除する。
【0076】
ステップS31以降の処理では、非カレント側のオペレーションファームウェアのFW格納領域22を参照して、そのヘッダ部40、プログラム本体(各プログラムブロック51)に関するチェックを行うことになる。この際、チェック実行の有無を、例えばビット値で記憶しておき、ステップ3S0の処理では、この値に基いてチェックの有無を判定する。
【0077】
すなわち、まず、上記非カレント側のオペレーションファームウェアのFW格納領域22におけるヘッダ部40のSUMを計算する(ステップS31)。そして、ステップS22の処理に戻り、まず、上記ステップS31で算出したSUMがヘッダSUM46と一致するか否かによりヘッダ部40が破損しているか否かを判定する(ステップS22)。そして、ヘッダ部40が破損していない場合には(ステップS22,YES)、今度はプログラム50について上記カレント側の場合と同様にして各プログラムブロック51毎に破損しているか否かを判定する(ステップS23〜S27)。尚、既に述べた通り、もし破損しているプログラムブロック51が存在しても、今度は上記ステップS25の判定はNOとなるので、ステップS26の処理(内部変数Aに反映させる処理)は行われない。
【0078】
そして、非カレント側のオペレーションファームウェアに関して、ヘッダ部40及びプログラム部50に破損が無かった場合には(ステップS28,YES)、ステップS32〜S34の処理を行う。
【0079】
一方、非カレント側のオペレーションファームウェアに関しても、ヘッダ部40またはプログラム部50に破損がある場合には(ステップS22,NO;またはステップS28,NO)、再び上記ステップS30の判定を行うことになり、今度は判定YESとなり、ステップS35,S36の処理を実行し、その後リブートを行う。つまり二重化されたオペレーションファームウェアの両方とも破損がある場合には、ステップS35,S36の処理を実行し、その後、後述するリカバリ処理を実行することになる。
【0080】
上記ステップS32〜S34の処理について説明する。
これらの処理は、カレント側についてステップS28の判定がYESの場合、またはカレント側に破損があり且つ非カレント側についてステップS28の判定がYESの場合に、実行させることになる。また、これらの処理が実行される場合には、二重化したオペレーションファームウェアのうち、少なくともどちらか一方は正常な状態(破損していない)であり、正常なものがSDRAM15(そのFWブート領域61)に転送されている状態である。
【0081】
この状態において、まず、上記内部変数Aを破損ブロック番号34にコピーすることで、破損ブロック番号34を更新する(ステップS32)。カレント側についてステップS28の判定がYESの場合については、内部変数Aは初期状態のまま(全てのビットがOFF)であるので、更新後の破損ブロック番号34の内容も、全てのビットがOFFとなる。つまり、カレント側のプログラム本体については破損無しを示す内容となる。
【0082】
一方、非カレント側についてステップS28の判定がYESの場合については、もしカ
レント側の破損がヘッダ部40の破損では無かったならば、更新後の破損ブロック番号34の内容は、カレント側における破損したプログラムブロックを示すものとなる。
【0083】
次に、カレントFW格納領域番号33に、上記SDRAM15(そのFWブート領域61)に正常転送されたオペレーションファームウェアの番号を設定する(ステップS33)。カレント側についてステップS28の判定がYESの場合には、カレント側のオペレーションファームウェアの番号が設定されることになる。一方、非カレント側についてステップS28の判定がYESの場合には、非カレント側のオペレーションファームウェアの番号が設定されることになる。これは、非カレント側がカレント側(ブート対象)に切り替わることを意味する。
【0084】
そして、SDRAM15(そのFWブート領域61)に転送済みのオペレーションファームウェアを起動する(ステップS34)。これによって“オペレーション”が実行される。“オペレーション”の処理内容については、後に図8、図9を参照して説明する。
【0085】
次に、上記ステップS35〜S36の処理について説明する。
この場合、二重化したオペレーションファームウェアの両方が破損しているため、破損ブロック番号34と動作ステータス31を設定して、装置をリブートする。
【0086】
すなわち、まず、上記ステップS32と同様の処理を行う。すなわち上記内部変数Aの内容を破損ブロック番号34にコピーすることで、破損ブロック番号34を更新する(ステップS35)。次に、動作ステータス31をリカバリ中(1)に設定する。そして、リブートする。これにより、上記ブートファームウェアのメイン処理に遷移する。動作ステータス31をリカバリ中(1)に設定してあることから、このメイン処理において上記ステップS13の判定がYESとなるので、リカバリ処理を実行することになる。
【0087】
図6、図7は、ブートファームウェアのリカバリ処理のフローチャート図である。
尚、これは、リカバリ処理を2つの図面に渡って示しているものである。
上記の通り、本処理は、二重化したオペレーションファームウェアが両方共破損している状態で行われる。但し、オペレーションファームウェア全体が破損しているとは限らず、むしろ一部のみ破損している可能性が高い。
【0088】
まず、上記ステップS21,22と同様の処理を、二重化したオペレーションファームウェア両方に対して行う(ステップS41)。すなわち、二重化したオペレーションファームウェア各々のヘッダ部40に関して、そのヘッダSUM46を用いたチェックをそれぞれ行い、ヘッダ部40の整合性を確認する。すなわち、ヘッダ部40のSUMを算出し、算出したSUM値がヘッダSUM46と一致するか否かにより、ヘッダ部40の正常/異常を判定する。
【0089】
そして、二重化したオペレーションファームウェアの両方でヘッダ部40が正常(破損なし)の場合には(ステップS42,YES)、プログラムブロック51に異常(破損)があることになるので、ステップS47の処理へ移行する。
【0090】
また、どちらか一方は正常であるが他方は異常である場合には(ステップS42,NO且つステップS43,YES)、ステップS44の処理へ移行する。
両方ともヘッダ部40が異常な場合は(ステップS42,NO且つステップS43,NO)、リカバリするための情報が得られないため、リカバリ不能とする。すなわち、動作ステータス31を停止中(2)に設定し(ステップS60)、本処理を終了する。そして、ブート本体処理(図10のダウンロード指示を待つ状態)に遷移する。
【0091】
尚、既に述べた通り、ブート本体処理は、ダウンロード処理を含むブートファームウェアが本来行う処理であるが、本説明では、ダウンロード処理のみ規定する。
以下、まず、ステップS44以降の処理について説明する。
【0092】
すなわち、上記のチェック処理により何れか一方のヘッダ部40が正常(破損していない)で他方が異常(破損している)と判定された場合は、二重化したオペレーションファームウェアのプログラム部50同士を比較する(ステップS44)。その結果、同一のプログラムであることが確認された場合は(ステップS45,YES)、破損していないヘッダ部40を用いて破損しているヘッダ部40をリカバリする。すなわち、破損していない領域のヘッダ部40の情報を、破損しているヘッダ部40の領域にコピーする(ステップS46)。そして、ステップS53の処理へ移行する。
【0093】
一方、上記ステップS44の比較の結果、プログラム部50が不一致の場合には(ステップS45,NO)、相互に異なるオペレーションファームウェアが記憶されていることを示している。例えば一方が新バージョンで他方が旧バージョンの場合等である。よって、この場合、ヘッダ部40の情報も異なるものであり、破損していないヘッダ部40を用いて破損しているヘッダ部40をリカバリすることは出来ないので、リカバリ不能とする。つまり、上記ステップS60の処理を実行し、本処理は終了する。
【0094】
尚、上記ステップS45や後述するステップS48の処理の主旨は、相互に異なるオペレーションファームウェアが記憶されているか否かを判定するものであるので、例えば「名称41及びバージョン42が一致するか?」という判定処理に置き換えてもよい。
【0095】
また、本例ではステップS46の処理からステップS53の処理に移行したが、これは一例であり、例えばステップS46の処理からステップS47の処理に移行するようにしてもよい。あるいは、ステップS46の処理後に例えば「破損ブロック番号34有り?(破損しているプログラムブロック51があるか否かを判定するもの)」を追加し、この判定がNOの場合にはステップS53の処理に移行し、判定YESの場合にはステップS47の処理に移行するようにしてもよい。何れにしても、図示のフローチャートは一つの例を示しているのであり、この例に限るものではない。
【0096】
次に、以下、ステップS47以降の処理について説明する。
上記の通り、二重化したオペレーションファームウェアの両方ともヘッダ部40が正常な場合(破損していない)、ステップS47へ移行し、ステップS47〜S52の処理を実行する。
【0097】
まず、二重化したオペレーションファームウェアのヘッダ部40同士を比較して(ステップS47)、一致するか否かを判定する(ステップS48)。
ヘッダ部40が不一致の場合は(ステップS48,NO)、相互に異なるオペレーションファームウェアが記憶されていることを示している。この場合、リカバリに必要なプログラムブロック51が存在しないため、リカバリ不能とする。すなわち、上記ステップS60の処理を実行し、本処理は終了する。
【0098】
一方、ヘッダ部40が同じ場合には(ステップS48,YES)、まず、カレントFW格納領域番号33と破損ブロック番号34を参照する。これより、二重化したオペレーションファームウェアのどちらがカレント側でどちらが非カレント側であるかを認識でき、またカレント側においてどのプログラムブロック51が破損しているかを認識できる。尚、破損ブロック番号34は、上記図5の処理(起動処理)のステップS35で設定した内容となっている。
【0099】
そして、上記カレント側のリカバリを試みる。つまり、カレント側において破損しているプログラムブロック51について、1つずつ、ステップS49〜S51の処理を実行し、全ての破損プログラムブロック51についてリカバリ処理完了したら(ステップS52,YES)、ステップS53以降の処理に移る。但し、1つでもリカバリ不能な破損プログラムブロック51があった場合(ステップS50,NO)、上記ステップS60の処理を実行することになる。
【0100】
ステップS49〜S51の処理では、まず、処理対象の破損プログラムブロック51について、非カレント側において同じプログラムブロック51が破損していないか否かをチェックする(ステップS49、S50)。すなわち、非カレント側における上記処理対象の破損プログラムブロック51と同じプログラムブロック51のSUMを計算し(ステップS49)、このプログラムブロック51に対応するプログラムブロックSUM45と計算したSUMとが一致するか否かを判定する(ステップS50)。
【0101】
そして、SUM不一致の場合、すなわち処理対象のプログラムブロック51に関しては二重化したオペレーションファームウェアの両方とも破損している場合には(ステップS50,NO)、リカバリ不能となる。よって、上記ステップS60の処理を実行し、本処理は終了する(ダウンロード処理を行うことになる)。
【0102】
一方、SUM一致の場合、すなわち処理対象のプログラムブロック51に関して非カレント側のオペレーションファームウェアでは破損していない場合には(ステップS50,YES)、非カレント側のオペレーションファームウェアの当該プログラムブロック51を、カレント側のプログラムブロック51の領域にコピーすることで、カレント側のプログラムブロック51をリカバリする(ステップS51)。
【0103】
例えば、図2(c)の例において、カレント側のプログラムブロックnが破損しており、非カレント側のプログラムブロックnは破損していない場合には、非カレント側のプログラムブロックnを、カレント側のプログラムブロックnの領域にコピーすることになる。
【0104】
そして、カレント領域において破損している全てのプログラムブロック51について上記処理を実行したか否かを判定し(ステップS52)、未だ未処理のものがある場合には(ステップS52,NO)、上記ステップS49に戻り、次の処理対象の破損プログラムブロックについて、上記と同様の処理を行う。
【0105】
そして、カレント領域において破損している全てのプログラムブロック51について上記処理を実行した場合(ステップS52,YES)、これは途中でステップS50の判定がNOとなることなく全ての破損プログラムブロック51のリカバリを行えたことになり、ステップS53の処理へ移行する。
【0106】
以上の処理により、ステップS53以降の処理を行う場合には、少なくともカレント側のオペレーションファームウェアに関してはリカバリ完了していることになる。
以下、ステップS53以降の処理について説明する。
【0107】
ステップS53以降の処理は、上記リカバリが成功した場合の処理であり、よって基本的には、カレント領域のオペレーションファームウェアをSDRAM15のFWブート領域61に転送して起動し、オペレーション実行開始させるものであるが、念の為に再度SUMチェックを行っている。
【0108】
まず、カレント側のオペレーションファームウェアのプログラム部50をブロック単位
でSDRAM15のFWブート領域61に転送する毎に、そのSUMチェックを行う。すなわち、カレント側のオペレーションファームウェアのプログラム部50の任意のプログラムブロック51を、SDRAM15のFWブート領域61に転送し、この転送したプログラムブロック51のSUMを算出する(ステップS53)。そして、この転送したプログラムブロック51に対応するプログラムブロックSUM45が、ステップS53で算出したSUMと一致するか否か、すなわちこの転送したプログラムブロック51が破損していないかをチェックする(ステップS54)。これを、プログラム部50の全てのプログラムブロック51について実行し、全ブロックが処理完了したら(ステップS55,YES)、ステップS56の処理に移行する。一方、未だ全てのプログラムブロック51について処理完了していなければ(ステップS55,NO)、ステップS53に戻り、次のプログラムブロック51について同様の処理を実行する。
【0109】
但し、(通常起こりえないが)もし1つでも破損しているプログラムブロック51があった場合には(ステップS54,NO)、リカバリ不能とする。すなわち、上記ステップS60の処理を実行し、本処理は終了する。
【0110】
また、ステップS56でも、最後に確認的に、全てのプログラムブロック51が正常であったかを確認し(ステップS56)、もし1つでも破損しているプログラムブロック51があった場合には(ステップS56,NO)、リカバリ不能とする。すなわち、上記ステップS60の処理を実行し、本処理は終了する。
【0111】
ステップS56の判定がYESであれば、バックアップステータス32をバックアップあり(1)に設定すると共に(ステップS57)、動作ステータス31を運用中(0)に設定する(ステップS58)。そして、FWブート領域61に転送済みの(正常な)オペレーションファームウェアを起動する(ステップS59)。
【0112】
図8、図9に、“オペレーション”の処理、すなわち起動されたオペレーションファームウェアの処理フローチャートを示す。
尚、これは、オペレーションファームウェアの処理を2つの図面に分けて示しているものである。
【0113】
また、上記の通り、この処理が実行されるのは、ステップS34で起動されるケースと、ステップS59で起動されるケースとがある。
図示の処理では、まず、必要に応じて、ハードウェア及びオペレーションファームウェアの各種初期化を行う(ステップS71)。
【0114】
そして、バックアップステータス32を参照して、“バックアップあり(1)”の場合には(ステップS72、NO)、ステップS73以降の処理を行うことなく、オペレーション本体処理(オペレーションファームウェアの本来の処理)へ移行する。すなわち、この場合には、非カレント側も正常な状態となっているはずであるので、非カレント側のリカバリ処理は必要ないので、そのまま本来の処理を実行開始すればよい。
【0115】
ここで、上記オペレーション本体処理とは、組込み機器として必要な機能を実行するものであり、通常、無限ループでイベントを待ち、発生したイベントに応じた処理を行うものである。具体的には、例えば、データ収集処理、通信処理、制御対象機器の制御処理(例えばファンの速度を制御する等)であり、更にダウンロード処理等も含まれる。ダウンロード処理は、上記イベントとして上述した上位機1からのダウンロード指示があった場合に実行されるものであり、本例では図10に示すダウンロード処理を実行するものである。上記オペレーション本体処理の1つとして実行されるダウンロード処理は、オペレーションファームウェアを更新する場合に実行するものである。
【0116】
一方、“バックアップなし(0)”の場合は(ステップS72,YES)、本来の処理を行う前に、ステップS73以降の処理を実行するものとし、まず、カレントFW格納領域番号33を参照して非カレント側を認識し、非カレント側のオペレーションファームウェアのヘッダ部40のSUMを計算し(ステップS73)、そのヘッダSUM46によりヘッダ部40の正常/異常(破損有無)チェックする(ステップS74)。つまり、算出したSUMがヘッダSUM46と一致するか否かをチェックする。
【0117】
一致する場合には(ステップS74,YES)ステップS78の処理へ移行する。
一方、算出したSUMがヘッダSUM46と不一致の場合には、非カレント側のヘッダ部40が破損していることを示しており(ステップS74,NO)、リカバリを試みる。但し、その前に、ヘッダ部40のみが破損しているかどうかを調べるために、二重化したオペレーションファームウェアのプログラム部50同士を比較し(ステップS75)、プログラム部50が一致するか否かをチェックする(ステップS76)。一致する場合には(ステップS76,YES)、カレント領域のヘッダ部40を、非カレント側のヘッダ部40の領域にコピーすることで(ステップS77)、非カレント領域のヘッダ部40をリカバリする。
【0118】
これによって、非カレント側のリカバリは完了するので、ステップS83、S84の処理を実行して、上記オペレーションファームウェア本来の処理を開始する。
ステップS83では、バックアップステータス32を“バックアップあり(1)”に設定する。ステップS84では破損ブロック番号34をゼロクリアする。
【0119】
一方、一致しない場合には(ステップS76,NO)、カレント領域のオペレーションファームウェア全体を、非カレント側の領域にコピーする(ステップS82)。これによって、非カレント側のリカバリは完了するので、上記と同様、ステップS83、S84の処理を実行して、上記オペレーションファームウェア本来の処理を開始する。
【0120】
また、上記ステップS74の判定がYESの場合には、まず、二重化したオペレーションファームウェアのヘッダ部40同士を比較して(ステップS78)、ヘッダ部40が一致するか否かを判定する(ステップS79)。ヘッダ部不一致の場合には(ステップS79,NO)、非カレント領域に、カレント側とは異なるファームウェア(例えば旧バージョン等)が記憶されていることになるので、オペレーションファームウェア全体をバックアップする。すなわち、上記ステップS82の処理を実行する。
【0121】
一方、ヘッダ部一致の場合は(ステップS79,YES)、二重化したオペレーションファームウェアは同一(同じバージョン等)であり、破損ブロック番号34が記憶されている場合には(ステップS80,YES)、破損ブロック番号34を参照して、非カレント側において破損しているプログラムブロック51のみを、カレント側の該当するプログラムブロック51を用いてリカバリする。
【0122】
すなわち、破損ブロック番号34を参照することで、非カレント領域において破損しているプログラムブロック51の番号を認識し、カレント領域における当該番号のプログラムブロック51を、非カレント側における同じ番号のプログラムブロック51の領域にコピーする(ステップS81)。
【0123】
尚、上記ステップS80の“破損ブロック番号34が記憶されている場合”とは、破損ブロック番号34において全てのビットがOFFとなっている状態以外の場合、すなわち1つでもビットがONになっている場合を意味する。これは、例えば、図5においてステップS26の処理が実行され(よってそのときのカレント側についてはステップS28の
判定はNOとなる)、且つそのときの非カレント側についてはステップS28の判定がYESとなった場合等である。
【0124】
尚、“そのときの”と言っているのは、この場合、ステップS33の処理によって、“そのときの”非カレント側がカレント側に設定されているからである。つまり、例えば仮に図5の処理の際にはFW格納領域aがカレント側、FW格納領域bが非カレント側であったとした場合、上記のケースではステップS33によりFW格納領域bがカレント側に設定されるので、本処理においては上記ステップS73においてFW格納領域aが非カレント側として認識されることになる。よって、この場合には、破損ブロック番号34は、“そのときの”カレント側であるFW格納領域aに関する破損情報であるが、本処理においてはFW格納領域aは非カレント側と認識されることになる。よって、この例では上記ステップS81の処理は、FW格納領域bのプログラムブロック51を用いて、FW格納領域aの破損プログラムブロック51をリカバリすることになる。
【0125】
上記ステップS81の処理により、非カレント側のリカバリは完了するので、上記と同様、ステップS83、S84の処理を実行して、上記オペレーションファームウェア本来の処理を開始する。
【0126】
一方、破損ブロック番号34が記憶されていない場合には(ステップS80,NO)、上記ヘッダ部不一致の場合と同様に、ステップS82の処理を実行し、オペレーションファームウェア全体をバックアップする。尚、ステップS80がNOとなる場合とは、例えば上記ステップS26の処理が行われなかった場合等であり、すなわち破損ブロック番号34において全てのビットがOFFとなっている状態(初期状態)である。
【0127】
図10に、ダウンロード処理のフローチャート図を示す。
ダウンロード処理は、例えばブートファームウェアやオペレーションファームウェアの本体処理中に含まれる処理であり(本体処理としての様々な処理のうちの1つであり;既に説明済みであるので、ここでの説明は省略する)、上位機1からダウンロード指示を受けると処理を開始する。尚、上位機1はFWダウンロード領域62にオペレーションファームウェアを転送・格納した後、上記ダウンロード指示を出す。本手法では、再度のダウンロードが必要な状況において(二重化されたオペレーションファームウェアの両方が破損し且つリカバリ不能の場合)、従来のように人手を介することなく自動的に、ダウンロードが行われる。
【0128】
尚、ステップS12がYESの場合またはステップS60の後における“ブート本体処理”としてのダウンロード処理は、上位機1からのダウンロード指示が無くても直ちに、当該図10のダウンロード処理を実行するようにしてもよい。
【0129】
あるいは、ステップS12がYESの場合またはステップS60の後における“ブート本体処理”としてのダウンロード処理は、まず最初に、上位機1に対してFWダウンロード領域62にオペレーションファームウェアを転送・格納する処理を要求するようにしてもよい。この場合、上位機1は、オペレーションファームウェアを転送後、上記ダウンロード指示を出すことになり、これによって図10のダウンロード処理を開始することになる。
【0130】
図10の処理は、概略的には、SDRAM15のFWダウンロード領域62に転送・格納されたオペレーションファームウェアについて、所定のチェック処理を実行し、チェックOKであれば、このオペレーションファームウェアを外部フラッシュROM14にダウンロードすると共に、これを新たなカレント側のオペレーションファームウェアとするものである。
【0131】
図10の処理では、SDRAM15のFWダウンロード領域62に格納されたオペレーションファームウェアについて、ステップS91〜S95の所定のチェック処理を行う。このステップS91,S92,S93,S94,S95の処理におけるチェックに関する処理自体は、上記ステップS21,S22,S23,S24,S27と略同様の処理である。
【0132】
すなわち、まず、SDRAM15のFWダウンロード領域62に格納されたオペレーションファームウェアのヘッダ部40が正常か否か(破損していないか)を判定する為、このヘッダ部40のSUMを算出し(ステップS91)、算出したSUMが当該ヘッダ部40のヘッダSUM46と一致するか否かを判定する(ステップS92)。不一致の場合には(ステップS92,NO)、転送・格納されたオペレーションファームウェアを外部フラッシュROM14に書込むことはなく(ダウンロードすることなく)、そのヘッダ部40が破損している旨を、上位機1へ通知する(ステップS100)。
【0133】
一方、一致する場合、すなわちヘッダ部40に異常がない場合には(ステップS92,YES)、続いて、プログラム部50についても正常か否か(破損していないか)を判定する。これは、プログラム部50の各プログラムブロック51毎に行う。すなわち、各プログラムブロック51毎に、そのプログラムブロック51のSUMを算出し(ステップS93)、算出したSUM値がそのプログラムブロック51に対応するプログラムブロックSUM45の値と一致するか否かを判定する(ステップS94)。一致する場合はそのプログラムブロック51は正常である(破損していない)ことになる(ステップS94,YES)。そして、全てのプログラムブロック51について上記チェックを完了したら(ステップS95,YES)、ステップS96の処理へ移行する。
【0134】
もし、1つでも破損しているプログラムブロック51があった場合には(ステップS94,NO)、ダウンロードされたオペレーションファームウェアを外部フラッシュROM14に書込むことはなく、そのプログラム部50が破損している旨を、上位機1へ通知する(ステップS100)。
【0135】
一方、未だ全てのプログラムブロック51について処理完了していなければ(ステップS95,NO)、ステップS93に戻り、次のプログラムブロック51について同様の処理を実行する。
【0136】
ステップS96以降の処理では、まずバックアップステータス32を“バックアップなし(0)”に設定してから(ステップS96)、カレントFW格納領域番号33を参照して上記外部フラッシュROM14における非カレント領域を認識し、この非カレント領域に、SDRAM15のFWダウンロード領域62に格納されているオペレーションファームウェア全体をダウンロードする(ステップS97)。
【0137】
ダウンロード完了したら、カレントFW格納領域番号33にダウンロードした領域の番号を設定する(ステップS98)。つまり、上記非カレント領域をカレント領域とする。そして、動作ステータス31を“運用中(0)”に設定する(ステップS99)。
【0138】
そして、ダウンロード処理の結果を上位機1に通知する(ステップS100)。
その後、図4の処理が実行されると、上記起動処理が実行され、上記ダウンロードされたオペレーションファームウェアがカレント側としてチェック処理を受けて、正常であれば(上記の通り、ダウンロード時にチェックを行っているので正常のはずであるが)、非カレント側が異常であるか否かに関わらず、非カレント領域にも上記ダウンロードされたオペレーションファームウェアが記憶されることになり、バックアップステータス32を“バックアップあり(1)”の状態になることになる。
【0139】
なお、ブートファームウェアでオペレーションファームウェアをバックアップ(二重化)しない理由は、正当なSUMを持っているものの、起動後、直ちにシステムダウンしてしまうような誤ったプログラムがダウンロードされた場合を考慮しているからである。つまり、この様な場合、ブートファームウェアが上記ダウンロード処理の際にオペレーションファームウェアをバックアップ(二重化)すると、上記誤ったプログラムが二重化されることになり、機器が起動しなくなってしまうからである。
【0140】
本手法では、この様な事態を回避するために、ダウンロードされ正常動作したオペレーションファームウェアが、自身の二重化の為の処理を行うようにしている(特許文献1の作用等に記載あり)。もし、これが上記誤ったプログラムであった場合には、正常動作しないので、二重化が行われないことになり、機器が起動しなくなる事態を回避できる。
【0141】
以上説明したように、本手法によれば、以下の効果が得られる。
不揮発性メモリに二重化して記憶したファームウェアが両方とも破損した場合、従来の方法では、ファームウェアの破損状態に関わらず、装置を起動できない事態が発生してしまっていたが、本手法によりこの様な状態に陥る可能性を大幅に低減すことができる。
【0142】
組込み機器は必ず装置を起動することが重要であるが、リソースとの兼ね合いもあり、二重化を三重化にするといった対策は現実的には難しいため、二重化において、装置が起動しない状態になる可能性を低減する効果は大きい。
【0143】
また、従来、二重化したファームウェアの一部が破損した場合でも、起動したファームウェアの全領域を複製するようにしていたが、本発明は、必要な領域(破損ブロック)のみを複製するため、リカバリに要する時間を短縮することができ、装置の起動時間への影響を微小にすることができる。
【0144】
尚、本手法と上記特許文献2の発明とを比較すると、両者は発想が全く逆である。つまり、まず、本手法ではプログラム(ファームウェア)を対象にしているのに対して、上記特許文献2ではデータを対象にしているという違いがあるが、ここでは特許文献2の実データは本手法のプログラム(ファームウェア)に相当するものと考えてもよいものとする。この場合、特許文献2における図7のメモリ構成は、本手法における従来技術のメモリ構成と似ていると考えることもできる。つまり、特許文献2における図7に示す例えばデータ11A1dが、本手法のプログラム(ファームウェア)に相当することになる。特許文献2における図7ではデータ11A1d〜データ11Andのn個のデータが格納されているので、これはn個のプログラム(ファームウェア)が格納されていることに相当することになる。
【0145】
そして、特許文献2における図7に示すメモリ構成では、各データ毎にチェックサムデータが格納されており(例えばデータ11A1dに対してチェックサムデータ11A1c)、チェックサムデータを用いてデータの異常チェックを行うが、この点も本手法における従来技術と似ている。
【0146】
しかしながら、特許文献2においてはデータは数バイト程度である為、データの一部に破損が生じた場合でも、そのデータ全体についてリカバリを行うことに特に問題はない(処理時間が掛かるものではない)。むしろ、上記従来技術で説明した通り、特許文献2の発明は、1つのブロックに複数のデータをまとめて、一部のデータに異常が生じた場合でもブロック内の全データについて修正を行うようにしている。これは、上記の通り各データのデータ量が非常に少ないので、この様にしても特に問題はない(処理時間が掛かるものではない)ものと考えられる。
【0147】
一方、本手法では、プログラム(ファームウェア)が対象であり、そのデータ量が大きい為、例えば上記数バイトから成るデータを例えば1バイト単位で分割・管理すること(1バイト単位で異常の有無の判定やリカバリを行うこと)に相当する事を行っている。この様な発想は特許文献2には無い(上記の通り、むしろ逆の発想となっている)。よって、当然、特許文献2に基づいて本手法を想到することはできないし、特許文献2の発明やその従来技術では本手法の効果は得られない。
【符号の説明】
【0148】
1 上位機
10 組込み機器
11 CPU
12 RAM
13 内蔵フラッシュROM
14 外部フラッシュROM
15 SDRAM
21 管理情報格納領域
22 FW格納領域
31 動作ステータス
32 バックアップステータス
33 カレントFW格納領域番号
34 破損ブロック番号
40 ヘッダ部
41 名称
42 バージョン
43 ヘッダサイズ
44 プログラムサイズ
45 プログラムブロックSUM
46 ヘッダSUM
50 プログラム部
51 プログラムブロック
61 FWブート領域
62 FWダウンロード領域

【特許請求の範囲】
【請求項1】
ファームウェアを二重化して記憶して、該ファームウェアの何れか一方を起動して実行させる装置であって、
前記二重化された各ファームウェアを、それぞれ、固定長ブロックに分割して成る分割プログラム群として記憶するプログラム記憶手段と、
前記各分割プログラム毎に対応して、その分割プログラムのチェックサムを記憶するチェックサム記憶手段と、
前記各分割プログラム毎に対応して破損しているか否かを示す管理情報を記憶する管理情報記憶手段と、
前記各ファームウェア毎に、それが破損しているか否かをその各分割プログラム毎に前記チェックサムを用いてチェックして、該チェック結果により前記管理情報を更新するチェック手段と、
前記ファームウェアが破損した場合、該破損したファームウェアに対応する前記管理情報を参照して破損した分割プログラムを認識し、他方のファームウェアにおける該破損した分割プログラムに対応する分割プログラムを用いて、該破損した分割プログラムをリカバリするリカバリ手段と、
を有することを特徴とするファームウェア保護装置。
【請求項2】
前記二重化されたファームウェアが両方とも破損した場合、
前記リカバリ手段は、一方のファームウェアをリカバリ対象として、該リカバリ対象のファームウェアに関する前記管理情報を参照して破損した分割プログラムを認識し、他方のファームウェアにおける該破損した分割プログラムに対応する分割プログラムが、破損しているか否かをチェックし、他方のファームウェアにおいても破損している場合にはリカバリ不能とし、破損していない場合には該他方のファームウェアにおける分割プログラムを用いて前記破損した分割プログラムをリカバリすることを特徴とする請求項1記載のファームウェア保護装置。
【請求項3】
ファームウェアを二重化して記憶して、該ファームウェアの何れか一方を起動して実行させる装置のコンピュータを、
前記二重化された各ファームウェアを、それぞれ、固定長ブロックに分割して成る分割プログラム群として記憶するプログラム記憶手段と、
前記各分割プログラム毎に対応して、その分割プログラムのチェックサムを記憶するチェックサム記憶手段と、
前記各分割プログラム毎に対応して破損しているか否かを示す管理情報を記憶する管理情報記憶手段と、
前記各ファームウェア毎に、それが破損しているか否かをその各分割プログラム毎に前記チェックサムを用いてチェックして、該チェック結果により前記管理情報を更新するチェック手段と、
前記ファームウェアが破損した場合、該破損したファームウェアに対応する前記管理情報を参照して破損した分割プログラムを認識し、他方のファームウェアにおける該破損した分割プログラムに対応する分割プログラムを用いて、該破損した分割プログラムをリカバリするリカバリ手段、
として機能させる為のプログラム。


【図1】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図2】
image rotate