(57)【特許請求の範囲】
【請求項１】
更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、
前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換える書換部と、
前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する制御部と、
期間であるガードタイムを設定する停止処理部と、
を備え、
前記制御部は、前記停止処理部が設定した前記ガードタイムの期間、前記書換部による前記第１参照先アドレスを前記第２参照先アドレスに書き換える処理以外の処理、又は前記書き換える処理より優先度が高い処理以外処理を停止させる、
通信処理装置。
【請求項２】
更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、
前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換える書換部と、
前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する制御部と、
を備え、
前記書換部は、前記メモリに前記更新後のファームウェアに関する別のデータである第３データがさらに記憶される場合、前記第１参照先アドレスの少なくとも一部の、前記第２参照先アドレス、または前記第３データの参照先の記憶領域を示す第３参照先アドレスへの書き換え、もしくは、前記第２参照先アドレスの少なくとも一部の、前記第３参照先アドレスへの前記書き換えを行う、
通信処理装置。
【請求項３】
更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、
前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換える書換部と、
前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する制御部と、
を備え、
前記書換部は、前記第１データの記憶領域とは異なる領域に記憶され、前記第２データに含まれる変数のうち少なくとも一部の第１の変数の記憶領域を示す参照先アドレスを保持する第２の変数の値を、前記第１データにおける前記第１の変数の記憶領域を示す第１変数参照先アドレスに書き換え、
前記制御部は、前記第２の変数が保持する前記第１変数参照先アドレスに基づいて前記第１の変数を参照する、
通信処理装置。
【請求項４】
前記書換部は、書き換え指示に応じて、前記メモリに記憶された前記第１参照先アドレスを、前記第２参照先アドレスに書き換える、
請求項１から３のいずれか一項に記載の通信処理装置。
【請求項５】
前記書換部は、前記メモリに記憶された前記第１参照先アドレスに所定のオフセット値を加算した前記第２参照先アドレスに書き換える、
請求項１から３のいずれか一項に記載の通信処理装置。
【請求項６】
前記メモリは、プラットフォームファームウェアに関するデータを更に記憶し、
前記制御部は、参照した前記プラットフォームファームウェアを介して前記第１データの前記参照先を参照する際に、前記メモリに記憶されている前記第２参照先アドレスに基づいて前記第２データを参照する、
請求項１から５のいずれか一項に記載の通信処理装置。
【請求項７】
前記メモリが、前記第２データを書き込む空き記憶領域を有する場合に、前記空き記憶領域に前記第２データを書き込む書込部をさらに備える、
請求項１から３のいずれか一項に記載の通信処理装置。
【請求項８】
前記書換部は、書き換え対象の前記第１参照先アドレスの数、及び、前記書き換える処理によって制約を受ける機能の制約時間の少なくともいずれかが閾値以上であるか否かを判定し、
前記停止処理部は、前記書き換え数、及び、前記制約時間の少なくともいずれかが前記閾値以上であると判定された場合に、前記書き換え数及び前記制約時間のいずれか一方に基づいて、前記ガードタイムを設定する、
請求項１に記載の通信処理装置。
【請求項９】
前記書換部は、前記第１データ及び前記第２データに共通に含まれる前記第１の変数について、前記書き換えを行う、
請求項３に記載の通信処理装置。
【請求項１０】
前記書換部は、前記メモリに前記更新後のファームウェアに関する別のデータである第３データがさらに記憶される場合、前記第１、第２データの記憶領域とは異なる領域に記憶され、少なくとも一部の前記第１の変数の記憶領域を示す参照先アドレスを保持する第３の変数の値を、前記第１変数参照先アドレス、または、前記第２の変数が保持する参照先アドレスに書き換える、
請求項３に記載の通信処理装置。
【請求項１１】
前記制御部に参照された前記第２データに基づいて通信する通信部と、
をさらに備える請求項１から３のいずれか一項に記載の通信処理装置。
【請求項１２】
更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、
前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換え、前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する制御部と、を有し、
前記制御部は、前記第１データの記憶領域とは異なる領域に記憶され、前記第２データに含まれる変数のうち少なくとも一部の第１の変数の記憶領域を示す参照先アドレスを保持する第２の変数の値を、前記第１データにおける前記第１の変数の記憶領域を示す第１変数参照先アドレスに書き換え、前記第２の変数が保持する前記第１変数参照先アドレスに基づいて前記第１の変数を参照する、
情報処理装置。
【請求項１３】
更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶し、
少なくとも一部の第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換え、
前記第１データの前記参照先を参照する際に、記憶された前記第２参照先アドレスに基づいて前記第２データを参照する、
前記書き換えは、前記第１データの記憶領域とは異なる領域に記憶され、前記第２データに含まれる変数のうち少なくとも一部の第１の変数の記憶領域を示す参照先アドレスを保持する第２の変数の値を、前記第１データにおける前記第１の変数の記憶領域を示す第１変数参照先アドレスに書き換え、
前記参照は、前記第２の変数が保持する前記第１変数参照先アドレスに基づいて前記第１の変数を参照する、
通信処理装置の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、通信処理装置、情報処理装置、及び、通信処理装置の制御方法に関する。
本願は、２０１７年２月２８日に日本に出願された特願２０１７−０３６９２９号、２０１７年７月１９日に日本に出願された特願２０１７−１４０２６５号、及び、２０１７年８月２５日に日本に出願された特願２０１７−１６２７０３号に基づき優先権を主張し、その内容をここに援用する。
【背景技術】
【０００２】
通信サービスを提供する通信装置に対して、新規機能の追加又は機能のバグ修正を行う場合、通信装置に実装されるファームウェアを更新する必要がある。ファームウェアの更新では、揮発性メモリ内のデータを安全に更新するために、揮発性メモリ内で実行されるプログラムを全て停止させて、データを書き換える必要がある。したがって、通信装置を再起動させなければならない場合があった。【０００３】
通信装置を再起動させると、再び通信装置が起動してプログラムが実行可能となるまでの時間は、通信サービスの中断を伴う。通信サービスの中断では、通信サービスを利用するユーザがネットワークを利用できないという影響がある。したがって、現状では、サービス運用中のファームウェアの更新は困難である。【０００４】
光アクセスネットワークで使用される局舎側の通信装置であるＯＬＴ（Optical Line Network）においても同様の問題が生じる。特に光アクセスネットワークでは経済性の観点から通信装置の冗長化が難しく、通信サービスの中断を伴わないファームウェアの更新は困難であった。そのため、ファームウェア更新時に運用系から冗長系へ一時的に切り替えてサービス断を避けるような手法を適用できない。したがって、現状ＯＬＴの装置構成ではサービス断を伴わないで、ファームウェアの更新を実現することは困難である。ここで、ＯＬＴは、光通信網を経由する光信号によって、加入者線端局装置(ONU: Optical Network Unit)等の他の通信装置との通信を実現する装置である。ＯＬＴが接続される光通信網は、例えば、ＰＯＮ（Passive Optical Network）等の受動光通信網である。ＯＮＵは、通信網を経由する光信号によって他の通信装置との通信を実現する装置である。ＯＮＵは、複数の機器を用いて構成されてもよい。ＯＮＵは、例えば通信サービスの提供を受けるユーザの宅内に設置される。
ファームウェアの更新に関して、ファームウェアは、通信装置の起動時に、ＲＯＭ(Read Only Memory)からメモリに展開されて使用されるが、ＲＯＭに記憶されている更新前のファームウェアを、更新後のファームウェアに書き換えて、次回の起動時に更新後のファームウェアをメモリに展開させて更新を完了させる技術が知られている（例えば、非特許文献１参照）。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】小谷  亮，清原  良三，攝津  敦，橘高  大造，“組み込みLinuxにおけるソフトウェア更新方式（１）”情報処理学会第66回全国大会．
【発明の概要】
【発明が解決しようとする課題】
【０００６】
前述したように、通信装置を再起動してファームウェアの更新を実施するには、通信装置の電源を落としてから再び使用可能になるまでの時間の間が通信断となるため、サービス断となる。
また、通信装置は、起動時に、ＲＯＭに書き込まれたファームウェアが、メモリに展開されることによって、通信可能となる。しかし、通信装置の稼働中に、メモリを直接書き換えてしまうと、その通信装置に、想定外の異常が発生することが懸念される。
ファームウェアの更新時間を短縮する手法に関して、新規機能等が追加された更新後のファームウェア（以下、「更新後ファームウェア」という）を、ＲＯＭの空き領域に事前に書き込むことによって、ＲＯＭに、新規事項等が追加されていない更新前のファームウェア（以下、「更新前ファームウェア」という）と更新後ファームウェアとを保持した状態で、通信装置を起動するときにいずれか一方のファームウェアを選択して起動させる方式が知られている。この場合、ファームウェアを、ＲＯＭに書き込む時間は短縮されるが、次回の起動のときに、起動させるファームウェアの選択しかできない。このため、ファームウェア更新を運用中のサービスに反映させるにはメモリ上のファームウェアを書き換える必要があるが、ＲＯＭに記憶された更新後ファームフェアを、メモリに反映させるためには、通信装置の再起動は免れることができない。【０００７】
また、ＰＯＮプロテクションを、ファームウェアの更新に適用することで、サービス断のないファームウェアの更新を実現する方法が提案されている。この方法では、更新後ファームウェアが書き込まれている更新用の通信装置を備え、更新前ファームウェアが書き込まれている通信装置から更新用の通信装置へ、物理的に経路を切り替える。ここで、ＰＯＮプロテクションとは、更新用の通信装置を備えて、物理的に経路を切り替えることで、障害が発生したときに通信断となる時間を短縮する手法である。
しかし、ＯＬＴ等の光アクセス装置においては、一つの光アクセス装置に対して、複数のＯＮＵが光スプリッタを用いて接続されている場合がある。この場合、光アクセス装置の機能を更新するために、更新用の光アクセス装置に切り替えるには、物理的な装置構成や通信の経路を変更しなければならない。さらに、通常時に使用しない更新用の光アクセス装置を常に備えておくことや、更新用の光アクセス装置へ経路を切り替えるための光スイッチが必要である。
また、経済性の観点から、更新用の光アクセス装置が用意されていない構成も多く存在する。このため、ＰＯＮプロテクションをファームウェアの更新に適用することで、サービス断のないファームウェアの更新を実施することは経済性の観点から難しい。
上記事情に鑑み、本発明は、通信断を発生させずにファームウェアを更新することが可能である光アクセス装置を提供することを目的としている。
【課題を解決するための手段】
【０００８】
本発明の一態様の通信処理装置は、更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換える書換部と、前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する制御部と、を備える。【０００９】
本発明の一態様は、上記の通信処理装置において、前記書換部は、書き換え指示に応じて、前記メモリに記憶された前記第１参照先アドレスを、前記第２参照先アドレスに書き換える。【００１０】
本発明の一態様は、上記の通信処理装置において、前記書換部は、前記メモリに記憶された前記第１参照先アドレスに所定のオフセット値を加算した前記第２参照先アドレスに書き換える。【００１１】
本発明の一態様は、上記の通信処理装置であって、前記メモリは、プラットフォームファームウェアに関するデータを更に記憶し、前記制御部は、参照した前記プラットフォームファームウェアを介して前記第１データの前記参照先を参照する際に、前記メモリに記憶されている前記第２参照先アドレスに基づいて前記第２データを参照する。【００１２】
本発明の一態様は、上記の通信処理装置において、前記メモリが、前記第２データを書き込む空き記憶領域を有する場合に、前記空き記憶領域に前記第２データを書き込む書込部をさらに備える。【００１３】
本発明の一態様は、上記の通信処理装置において、前記通信処理装置は、期間であるガードタイムを設定する停止処理部、をさらに備え、前記制御部は、前記停止処理部が設定した前記ガードタイムの期間、前記書換部による前記第１参照先アドレスを前記第２参照先アドレスに書き換える処理以外の処理、又は前記書き換える処理より優先度が高い処理以外処理を停止させる。【００１４】
本発明の一態様は、上記の通信処理装置において、前記書換部は、書き換え対象の前記第１参照先アドレスの数、及び、前記書き換える処理によって制約を受ける機能の制約時間の少なくともいずれかが閾値以上であるか否かを判定し、前記停止処理部は、前記書き換え数、及び、前記制約時間の少なくともいずれかが前記閾値以上であると判定された場合に、前記書き換え数及び前記制約時間のいずれか一方に基づいて、前記ガードタイムを設定する。【００１５】
本発明の一態様は、上記の通信処理装置において、前記書換部は、前記メモリに前記更新後のファームウェアに関する別のデータである第３データがさらに記憶される場合、前記第１参照先アドレスの少なくとも一部を、前記第２参照先アドレス、または、前記第３データの参照先の記憶領域を示す第３参照先アドレスに書き換える、または、前記第２参照先アドレスの少なくとも一部を、前記第３参照先アドレスに書き換える。【００１６】
本発明の一態様は、上記の通信処理装置において、前記第１データの記憶領域とは異なる領域に記憶され、前記第２データに含まれる変数のうち少なくとも一部の第１の変数の記憶領域を示す参照先アドレスを保持する第２の変数の値を、前記第１データにおける前記第１の変数の記憶領域を示す第１変数参照先アドレスに書き換え、前記制御部は、前記第２の変数が保持する前記第１変数参照先アドレスに基づいて前記第１の変数を参照する。【００１７】
本発明の一態様は、上記の通信処理装置において、前記書換部は、前記第１データ及び前記第２データに共通に含まれる前記第１の変数について、前記書き換えを行う。【００１８】
本発明の一態様は、上記の通信処理装置において、前記書換部は、前記メモリに前記更新後のファームウェアに関する別のデータである第３データがさらに記憶される場合、前記第１、第２データの記憶領域とは異なる領域に記憶され、少なくとも一部の前記第１の変数の記憶領域を示す参照先アドレスを保持する第３の変数の値を、前記第１変数参照先アドレス、または、前記第２の変数が保持する参照先アドレスに書き換える。【００１９】
本発明の一態様は、上記の通信処理装置において、前記制御部に参照された前記第２データに基づいて通信する通信部と、をさらに備える。【００２０】
本発明の一態様の情報処理装置は、更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶するメモリと、前記メモリを参照する制御部と、を有し、前記制御部は、前記メモリに記憶されている少なくとも一部の前記第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換え、前記第１データの前記参照先を参照する際に、前記メモリに記憶された前記第２参照先アドレスに基づいて前記第２データを参照する。【００２１】
本発明の一態様の通信処理装置の制御方法は、更新前のファームウェアに関するデータである第１データ、及び、更新後のファームウェアに関するデータである第２データを記憶するとともに、前記第１データに含まれる参照先の記憶領域を示す第１参照先アドレスを前記参照先に関連付けて記憶し、少なくとも一部の第１参照先アドレスを、前記第２データの前記参照先の記憶領域を示す第２参照先アドレスに書き換え、前記第１データの前記参照先を参照する際に、記憶された前記第２参照先アドレスに基づいて前記第２データを参照する。
【発明の効果】
【００２２】
本発明により、通信断を発生させずにファームウェアを更新することが可能である。
【図面の簡単な説明】
【００２３】
【図１】第１の実施形態に係る光通信システムの一例を示す図である。
【図２】第１の実施形態に係る光アクセル装置における間接参照を示す図である。
【図３】第１の実施形態に係る光アクセスシステムの動作の一例を示すフローチャートである。
【図４】第２の実施形態における光アクセス装置の構成の例を示す構成図である。
【図５】第２の実施形態に係る更新後ファームウェアから更新前ファームウェアのデータ領域を間接参照する場合の概要図である。
【図６】第２の実施形態に係る更新前ファームウェアによる変数の値の参照に関する概要図である。
【図７】第２の実施形態に係る更新後ファームウェアによる変数の値の間接参照に関する概要図である。
【図８】第２の実施形態に係るファームウェア更新の流れを示すフローチャートである。
【図９】第１及び第２の実施形態における、光通信システムの構成の例を示す図である。
【図１０】第３の実施形態における、光通信システムの構成の例を示す図である。
【図１１】第４の実施形態における、光通信システムの構成の例を示す図である。
【発明を実施するための形態】
【００２４】
本発明を実施するための形態を、図面を参照しつつ説明する。以下で説明する実施形態は一例に過ぎず、本発明が適用される実施形態は、以下の実施形態に限られない。
なお、実施形態を説明するための全図において、同一の機能を有するものは同一符号を用い、繰り返しの説明は省略する。
【００２５】
（第１の実施形態）
図１は、第１の実施形態に係る光通信システムの一例を示す図である。光通信システム１は、光信号を用いて通信するシステムである。光通信システム１は、光アクセス装置２と、書込装置３とを備える。
光アクセス装置２は、ＯＬＴ等の通信装置である。光アクセス装置２は、ＲＯＭ（Read Only Memory）２０と、起動処理部２１と、メモリ２２と、ＣＰＵ（Central Processing Unit）２３と、通信部２４と、書込部２５と、登録部２６と、書換部２７と、停止処理部２８とを備える。光アクセス装置２は、磁気ハードディスク装置や半導体記憶装置等の不揮発性の記録媒体（非一時的な記録媒体）を更に備えてもよい。
【００２６】
書込装置３は、パーソナルコンピュータ等の情報処理装置である。書込装置３は、更新後ファームウェア２２２を記憶している。更新後ファームウェア２２２は、例えば、光アクセス装置２が光通信を実行するためのファームウェアである。
仮に、更新前ファームウェア２２１をＣＰＵ２３が使用している期間に、書込装置３が更新後ファームウェア２２２をメモリ２２の更新前ファームウェア２２１の上に書き込んだ場合、光アクセス装置２に、想定外の異常が発生してしまう場合がある。そこで、書込装置３は、メモリ２２に記憶されている更新前ファームウェア２２１を書き換えないように、メモリ２２の空き領域に更新後ファームウェア２２２を記憶させる。したがって、メモリ２２の空き領域に更新後ファームウェア２２２を記憶させる場合、更新前ファームウェア２２１をＣＰＵ２３が使用している期間であっても、書込装置３は、メモリ２２に更新後ファームウェア２２２を記憶させることができる。
メモリ２２の空き領域は、更新前ファームウェア２２１や使用中の情報が書き込まれていない領域である。したがって、空き領域は、過去の更新によって使用されなくなったファームウェアが書き込まれた領域であってもよい。
書込装置３は、更新後ファームウェア２２２の全部、または、更新前ファームウェア２２１と更新後ファームウェア２２２との差分をメモリ２２に書き込んでも良い。
また、第１の実施形態における光アクセス装置２は、間接参照によって、更新前ファームウェア２２１に含まれる関数データ等の代わりに、更新後ファームウェア２２２に含まれる関数データ等へ処理に切り替える。具体的に、第１の実施形態における光アクセス装置２は、更新前ファームウェア２２１に含まれる関数データ等のアドレスを、更新後ファームウェア２２２に含まれる関数データ等のアドレスへ書き換える。
ここで、間接参照は、呼び出し先の関数や変数値等のエントリポイントを保持する。このエントリポイントの値を書き換えることで、指定した関数や変数値等を呼び出すことができる。関数のエントリポイントは、ファームウェアのどのメモリ番地から関数が書き込まれているかを示す。
【００２７】
次に、光アクセス装置２の詳細を説明する。
ＣＰＵ２３は、ＲＯＭ２０等に記憶されるプログラムを実行することによって、起動処理部２１を実現する。この場合、起動処理部２１は、起動時に、ＲＯＭ２０に記憶されている更新前ファームウェア２００を、更新前ファームウェア２２１としてメモリ２２に書き込む。
起動処理部２１は、ＡＳＩＣ（Application Specific Integrated Circuit）等のＬＳＩ（Large Scale Integration）、ＦＰＧＡ（Field-Programmable Gate Array）、ＧＰＵ（Graphics Processing Unit）等のハードウェアを用いて実現されてもよい。以下、起動処理部２１が、ハードウェア等を用いて実現される場合を例示する。この場合、起動処理部２１は、光アクセス装置２の起動時であってＣＰＵ２３が起動する前に、ＲＯＭ２０に記憶されている更新前ファームウェア２００を、更新前ファームウェア２２１としてメモリ２２に書き込む。更新前ファームウェア２００は、例えば、光アクセス装置２が光通信を実行するためのファームウェアである。
また、起動処理部２１は、光アクセス装置２の起動時であってＣＰＵ２３が起動する前に、ＲＯＭ２０等の不揮発性の記録媒体に記憶されているプラットフォームファームウェア２２０をメモリ２２に書き込む。以下、不揮発性の記録媒体の一例として、ＲＯＭ２０を適用した場合について説明を続ける。プラットフォームファームウェア２２０は、例えば、オペレーティングシステム等のファームウェアである。プラットフォームファームウェア２２０は、更新前ファームウェア２２１及び更新後ファームウェア２２２の各関数データの呼び出し元である。
なお、更新前ファームウェア２００が記憶される記憶媒体は、ＲＯＭ２０に限定されるものではない。更新前ファームウェア２００が記憶される記憶媒体は、起動時に参照されるメモリ領域であれば、例えば、ＨＤＤや光ディスクや外部のメモリであってもよい。また、更新前ファームウェア２００が記憶される記憶媒体は、揮発性のメモリであっても、起動処理時に揮発しなければよい。また、更新前ファームウェア２００が記憶される記憶媒体は、光アクセス装置２、または光アクセス装置２が関連するＶＭ等に対して、サーバーやクラウド等によって提供されるメモリ等の記憶領域であってもよい。
【００２８】
ＲＯＭ２０は、読み出し専用の記録媒体である。ＲＯＭ２０は、書き換え可能なフラッシュＲＯＭであってもよい。ＲＯＭ２０は、更新前ファームウェア２００を記憶している。ＲＯＭ２０は、更新後ファームウェア２２２を記憶していない。更新前ファームウェア２００は、ＣＰＵ２３から参照された場合であってもＣＰＵ２３が動作可能な状態で、ＲＯＭ２０に記憶されている。すなわち、更新前ファームウェア２００のバイナリデータは、更新前ファームウェア２２１のバイナリデータと同じである。
【００２９】
メモリ２２は、ＲＡＭ（Random Access Memory）等の揮発性の記録媒体である。なお、メモリ２２は、書き換え可能であればよい。メモリ２２は、書き込み可能な不揮発性の記憶媒体や、レジスタやＦＰＧＡ等であってもよい。
メモリ２２は、起動処理部２１による書き込み操作によって、光アクセス装置２の起動時に、プラットフォームファームウェア２２０を記憶する。また、更新前ファームウェア２２１が、光アクセス装置２の起動時に、起動処理部２１による書き込み操作によってメモリ２２に記憶される。メモリ２２は、プラットフォームファームウェア２２０及び更新前ファームウェア２２１を記憶した場合でも、十分な容量の空き領域を備えている。十分な容量とは、少なくとも更新後ファームウェア２２２を記憶できる容量である。書込装置３が出力する更新後ファームウェア２２２は、メモリ２２の空き領域に記憶される。例えば、ＣＰＵ２３が起動した後に、空き領域に更新後ファームウェア２２２がメモリ２２に記憶される。
【００３０】
更新前ファームウェア２２１は、関数データや変数値等である参照先２２３を含む。関数データには、メモリ２２における、更新前ファームウェア２２１の関数データの記憶領域の先頭アドレス等が対応付けられている。変数値には、メモリ２２における、更新前ファームウェア２２１の変数の記憶領域の先頭アドレス等が対応付けられている。
更新後ファームウェア２２２は、関数データや変数値等である新たな参照先２２５を含む。関数データには、メモリ２２における、更新後ファームウェア２２２の関数データの記憶領域の先頭アドレス等が対応付けられている。変数値には、メモリ２２における、更新後ファームウェア２２２の変数の記憶領域の先頭アドレス等が対応付けられている。
メモリ２２は、間接参照テーブル２２４を更に記憶する。間接参照テーブル２２４は、関数データや変数値等と、その関数データや変数等の記憶領域の先頭アドレス等とを関連付けたテーブル形式のデータである。
【００３１】
ＣＰＵ２３は、演算装置である。ＣＰＵ２３は、光アクセス装置２の各部の動作を制御する。ＣＰＵ２３は、メモリ２２等に記憶されるプログラムを実行することによって、書込部２５、登録部２６、書換部２７、及び停止処理部２８等の機能を実現する。または、書込部２５、登録部２６、書換部２７、及び停止処理部２８等は、例えば、ＡＳＩＣ等のＬＳＩ、ＦＰＧＡ、ＧＰＵ等のハードウェアを用いて実現されてもよい。ＣＰＵ２３、及び、ＡＳＩＣ等のＬＳＩ、ＦＰＧＡ、ＧＰＵ等のハードウェアは、制御部に対応する。
ＣＰＵ２３は、揮発性メモリ２２に記憶されたプラットフォームファームウェア２２０、更新前ファームウェア２２１又は更新後ファームウェア２２２を読み込むことによって、各プログラムに基づく動作を実行する。
書込部２５は、更新後のファームウェアである更新後ファームウェア２２２を、通信部２４を介して取得してもよい。書込部２５は、更新後ファームウェア２２２をＣＤ−ＲＯＭ等の外部記憶媒体から取得してもよい。
【００３２】
書込部２５は、更新後ファームウェア２２２を揮発性メモリ２２に記憶させる。書込部２５は、書込装置３が出力した書込要求に基づいて、メモリ２２の空き領域に更新後ファームウェア２２２を書き込むことができるか否かを判定する。ここで、書込要求は、更新後ファームウェア２２２の容量を示す情報を含む。
具体的には、書込部２５は、書込要求に含まれる更新後ファームウェア２２２の容量に基づいて、メモリ２２の空き領域が、更新後ファームウェア２２２の容量以上であるか否かを判定する。書込部２５は、メモリ２２の空き領域が、更新後ファームウェア２２２の容量以上である場合には、更新後ファームウェア２２２を、メモリ２２に書き込む。書込部２５は、更新後ファームウェア２２２の全部、または、更新前ファームウェア２２１と更新後ファームウェア２２２との差分をメモリ２２に書き込んでも良い。
一方、書込部２５は、メモリ２２の空き領域が、更新後ファームウェア２２２の容量未満である場合には、更新後ファームウェア２２２を、メモリ２２に書き込まない。書込部２５は、メモリ２２の空き領域が、更新後ファームウェア２２２の容量未満である場合には、メモリ２２の空き領域が、更新後ファームウェア２２２の容量未満であることを通知するようにしてもよい。なお、更新後ファームウェア２２２が、メモリ２２への書き込みを行う前に、メモリ空き領域のサイズを判定してもよい。更新後ファームウェア２２２は、判定結果に応じて、メモリ２２への書き込みを行う。
【００３３】
登録部２６は、起動処理部２１が、ＲＯＭ２０に記憶されている更新前ファームウェア２００をメモリ２２に書き込んだ場合に、間接参照テーブル２２４へ、更新前ファームウェア２２１に含まれる参照先２２３と、その参照先２２３の記憶領域の先頭アドレス等である参照先アドレスとを登録する。具体的には、更新前ファームウェア２２１のデータ領域内に保持される関数のエントリポイントがメモリ２２に記憶される。登録部２６は、メモリ２２に記憶される関数のエントリポイントを参照先アドレスとして登録する。換言すると、登録部２６は、更新前ファームウェア２２１の関数のポインタと、当該関数の参照先アドレスとの対応を登録する。すなわち、登録部２６は、関数ポインタへの参照先アドレスの代入を行う。
なお、間接参照テーブル２２４への登録は、必ずしも、更新前ファームウェア２００のメモリ２２への書き込み時に、登録部２６によって行われる必要はない。間接参照テーブル２２４への登録は、更新前ファームウェア２２１のコンパイル時等に、リンカ等によって行われてもよい。
【００３４】
書換部２７は、書込部２５が更新後ファームウェア２２２をメモリ２２へ書き込んだ場合に、間接参照テーブル２２４へ、更新後ファームウェア２２２に含まれる新たな参照先２２５と、その新たな参照先２２５の記憶領域の先頭アドレス等である新たな参照先アドレスとを登録する。また、書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けて記憶された参照先アドレスを、新たな参照先アドレスに書き換える。
更新後ファームウェア２２２がメモリ２２に記憶されているだけでは、ＣＰＵ２３は、更新前ファームウェア２２１に関するデータしか参照することができない。このため、書換部２７は、ＣＰＵ２３が参照する間接参照テーブル２２４に記憶されている参照先アドレスが新たな参照先２２５の記憶領域のアドレスを指すように、参照先アドレスを書き換える。これにより、ＣＰＵ２３は、新たな参照先２２５を参照する。
具体的には、書換部２７は、更新後ファームウェア２２２がコンパイルされるときに書き込まれる関数ポインタの値を、新たな参照先アドレスとして、新たな参照先２２５と関連付けて、間接参照テーブル２２４へ書き込む（登録する）。また、書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けられている参照先アドレスを、更新後ファームウェア２２２がコンパイルされるときに書き込まれる関数ポインタの値に書き換える。更新後ファームウェア２２２は、関数ポインタ等を用いてプログラミングされている。このため、更新後ファームウェア２２２がコンパイルされるときに、更新後ファームウェア２２２に、関数のデータが記憶されるエントリポイントの領域が確保される。
なお、新たな参照先アドレスは、更新後ファームウェア２２２がコンパイルされるときに作成される。この作成された新たな参照先は、更新後ファームウェア２２２で指定されたメモリ番地を示すため、動的に変化しない。
このようにすることによって、更新後ファームウェア２２２の新たな参照先アドレスを予め把握できる。また、書換部２７は、更新前ファームウェア２２１に含まれる参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先アドレスに書き換える。これによって、更新後ファームウェア２２２に含まれる新たな参照先２２５を呼び出すことができる。
書換部２７は、例えば、書き換え指示に応じて、間接参照テーブル２２４を書き換える。書き換え指示は、例えば、オペレーションシステムを介して、コマンドラインが入力されることによって入力される。書き換え指示は、プログラムやユーザによって入力される。書き換え指示は、参照先アドレスの書き換え対象の関数の識別情報を含む。書き換え指示は、さらに、参照先アドレスの書き換え対象の関数の新たな参照先アドレスを含んでいてもよい。
また、書換部２７は、書き換える参照先アドレスの数が閾値以上であるか否かを判定してもよい。書換部２７は、書き換える参照先アドレスの数が閾値未満である場合には、前述した更新前ファームウェア２２１に含まれる参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先アドレスに書き換える処理を行う。
一方、書換部２７は、書き換える参照先アドレスの数が閾値以上である場合には、書き換える参照先アドレスの数が閾値以上であることを示す情報を、停止処理部２８へ出力する。なお、書換部２７は、書き換える参照先アドレスの数を判定することなく、更新前ファームウェア２２１に含まれる参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先アドレスに書き換えてもよい。
書換部２７は、例えば、オペレーティングシステムが備えるシステムコールを呼び出すことによって、間接参照テーブル２２４の書き換え処理を行う。書換部２７は、例えば、割り込みハンドラを利用してシステムコールを呼び出し、間接参照テーブル２２４の書き換え処理を実行してもよい。なお、書換部２７の処理は、メモリ２２内のデータの書込み又はデータの書換えが行えるならばどのようなものであってもよい。
【００３５】
書換部２７は、オフセット値を用いて、新たな参照先アドレスを取得してもよい。書換部２７は、例えば、間接参照テーブル２２４が記憶している参照先アドレスに、所定のオフセット値を加算して、新たな参照先アドレスを取得する。書換部２７は、間接参照テーブル２２４の参照先アドレスを、取得した新たな参照先のアドレスに書き換える。これにより、書換部２７は、ＣＰＵ２３が参照を要求した更新前ファームウェア２００の関数データの参照先アドレスを、更新後ファームウェア２２２の関数データの参照先アドレスに書き換える。オフセット値は、例えば、更新前ファームウェア２２１の記憶領域の先頭アドレス値と、更新後ファームウェア２２２の記憶領域の先頭アドレス値との差を示す値である。
書換部２７は、例えば、オフセット値を用いるか否かを示す、フラグを有してもよい。書換部２７は、オフセット値が値「１」である場合には、間接参照テーブル２２４が記憶している参照先アドレスにオフセット値を加算する。一方、オフセット値が値「０」である場合には、書換部２７は、間接参照テーブル２２４が記憶している参照先アドレスを参照する。また、フラグは関数ごとに設けられてもよい。
【００３６】
図２は、第１の実施形態に係る光アクセス装置における間接参照を示す図である。図２に示される例では、間接参照テーブル２２４に、更新前ファームウェア２２１に含まれる参照先２２３と、その参照先２２３の参照先アドレスとが登録されている状態で、更新後ファームウェア２２２がメモリ２２に書き込まれた場合の処理が示される。
更新後ファームウェア２２２がメモリ２２に書き込まれた場合、書換部２７は、更新後ファームウェア２２２に含まれる新たな参照先２２５と、その新たな参照先２２５の新たな参照先アドレスとを登録する。また、書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先２２５の新たな参照先アドレスに書き換える。
図２によれば、間接参照テーブル２２４には、更新前ファームウェア２２１に含まれる「ｆｕｎｃｔｉｏｎ＿１」と、「ｆｕｎｃｔｉｏｎ＿１」の参照先アドレス「０ｘ００００１１１１」とが関連付けて記憶されている。さらに、間接参照テーブル２２４には、更新前ファームウェア２２１に含まれる「ｆｕｎｃｔｉｏｎ＿２」と、「ｆｕｎｃｔｉｏｎ＿２」の参照先アドレス「０ｘ００００１２２２」とが関連付けて記憶されている。
この状態で、更新後ファームウェア２２２が、メモリ２２に書き込まれた場合、書換部２７は、更新後ファームウェア２２２に含まれる「ｆｕｎｃｔｉｏｎ＿１ａ」と、「ｆｕｎｃｔｉｏｎ＿１ａ」の参照先アドレス「０ｘ００００１５００」とを関連付けて記憶する。
そして、書換部２７は、間接参照テーブル２２４内の「ｆｕｎｃｔｉｏｎ＿１」に関連付けて記憶されている「０ｘ００００１１１１」を、「ｆｕｎｃｔｉｏｎ＿１ａ」に関連付けて記憶されている「０ｘ００００１５００」に書き換える。
【００３７】
図１に戻り、説明を続ける。
停止処理部２８は、書込部２５が出力した書き換える参照先アドレスの数の総和、又は参照に伴う処理時間の総和が閾値以上であることを示す情報を取得した場合に、その書き換える参照先アドレスの数等に基づいて、ガードタイムを設定する。ガードタイムは、書き換え処理以外の処理を停止させる期間である。
ここで停止対象は、書き換え処理よりも優先度が高い処理を含んでもよいし、書き換え処理と優先度が同等又は下位、或いは同等及び下位の処理に限定されてもよい。書き換え処理よりも優先度の高い処理は、書込による不具合が生じ難い。また、優先度の高い処理の時間を別途見積もらないため、閾値をより大きい値に決定できる効果がある。一方、書き換え処理と優先度が同等又は下位、或いは同等および下位の処理に限定するは、優先度の高い処理の時間による影響を別途見積もる必要があり、優先度の高い処理の時間の分だけ閾値を小さくする必要がある。ただし、優先度を順守できるという効果がある。
以下は、書き換えるプロセス以外のプロセスを停止する場合で説明するが、書き込み処理と優先度が同等又は下位、或いは同等及び下位の処理に限定した場合も同様である。書き込み処理は、前述したとおり、間接参照テーブル２２４内の参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先に書き換える処理である。このように、ＣＰＵ２３は、例えば、停止処理部２８が決定したガードタイムに基づいて、ガードタイムの期間、書き換え処理以外の処理、又は書き換え処理より優先度が高い処理以外処理を停止させる。
そして、停止処理部２８は、書換処理以外の処理を停止させる命令である停止命令を、プラットフォームファームウェア２２０やＯＳ（Operating System）等に出力する。ここで、停止命令は、ガードタイムを示す情報を含む。具体的には、停止処理部２８は、書き換える参照先アドレスの数と、ガードタイムとを関連付けたテーブル形式の情報を記憶する。停止処理部２８は、そのテーブル形式の情報に基づいて、ガードタイムを選択し、選択したガードタイムを設定する。
【００３８】
ＣＰＵ２３は、メモリ２２に記憶されているプラットフォームファームウェア２２０に基づく動作を実行する。また、ＣＰＵ２３は、間接参照テーブル２２４に基づいて、参照先２２３と参照先アドレスとの関連付けに基づいて、更新前ファームウェア２２１又は更新後ファームウェア２２２に基づく動作を実行する。
具体的には、ＣＰＵ２３は、間接参照テーブル２２４において、更新前ファームウェア２２１に含まれる参照先２２３に更新後ファームウェア２２２の新たな参照先アドレスが関連付けられている場合には、新たな参照先アドレスを取得する。そして、ＣＰＵ２３は、取得した新たな参照先アドレスに記憶されている新たな参照先２２５を取得する。ＣＰＵ２３は、更新後ファームウェア２２２の新たな参照先アドレスに記憶されている新たな参照先２２５を取得した後、参照元に戻る。
ＣＰＵ２３は、間接参照テーブル２２４において、更新前ファームウェア２２１に含まれる参照先２２３に更新前ファームウェア２２１の参照先アドレスが記憶されている場合には、更新前ファームウェア２２１の参照先２２３を取得する。ＣＰＵ２３は、予め定められた新たな参照先２２５以外の参照先等については、更新前ファームウェア２２１の参照先等を参照する。このように、ＣＰＵ２３は、間接参照テーブル２２４に記憶されている参照先アドレスに応じて、更新前ファームウェア２２１又は更新後ファームウェア２２２に関するデータを取得する。
通信部２４は、更新前ファームウェア２２１又は更新後ファームウェア２２２に基づく動作を実行するＣＰＵ２３による制御に応じて、光信号を用いて他の通信装置と通信する。他の通信装置は、例えば、ＯＮＵであってもよい。
【００３９】
（光アクセス装置の動作）
図３は、第１の実施形態に係る光アクセスシステムの動作の一例を示すフローチャートである。
光アクセス装置２に、不具合が発生し、異常停止して再起動が必要となることがある。光アクセス装置２は、ＲＯＭ２０に記憶されている更新前ファームウェア２００を、メモリ２２に展開して実行する。光アクセス装置２は、更新後ファームウェア２２２を、メモリ２２に書き込む。光アクセス装置２は、メモリ２２に書き込んだ更新後ファームウェア２２２の正常性を確認する。
（ステップＳ１０１）  更新後ファームウェア２２２を書き込む光アクセス装置２と同様の光アクセス装置を使用して、更新後ファームウェア２２２に不具合があるか否かが検証される。更新後ファームウェア２２２に、不具合があると判定された場合には、処理がステップＳ１０２へ移行する。一方、不具合がないと判定された場合には、処理がステップＳ１０３へ移行する。
（ステップＳ１０２）  更新後ファームウェアに不具合があると判定した場合には、更新後ファームウェアの実行結果を元に戻す処理や、光アクセス装置の再起動が行われる。
（ステップＳ１０３）  更新後ファームウェアに不具合がないと判定した場合には、書込装置３が、光アクセス装置２へ接続される。書込装置３は、光アクセス装置２へ、書込要求を出力する。光アクセス装置２の書込部２５は、書込装置３が出力した書込要求に応じて、メモリ２２に、更新後ファームウェア２２２を書き込む容量が空いているか否かを判定する。更新後ファームウェア２２２を書き込む容量が空いていないと判定した場合にはステップＳ１０２へ移行し、容量が空いていると判定した場合にはステップＳ１０４へ移行する。
実行中である更新前ファームウェアに対して更新後ファームウェアで上書きした場合、更新前ファームウェアが破損される。これにより、光アクセス装置２が停止してしまう場合がある。更新前ファームウェアの破損を防ぐためには、空き領域のサイズが十分足りていることを事前に確認してから書き込む必要がある。
例えば、書込部２５は、更新後ファームウェア２２２のコンパイル時に出力されるメモリマップを参照して、更新後ファームウェア２２２のサイズを取得する。書込部２５は、更新前ファームウェア２２１のメモリ情報をダンプして、更新前ファームウェア２２１のサイズを取得してもよい。
（ステップＳ１０４）  書込装置３は、更新後ファームウェア２２２を、光アクセス装置２へ転送する。
【００４０】
（ステップＳ１０５）  光アクセス装置２の書込部２５は、書込装置３が転送した更新後ファームウェア２２２を、メモリ２２へ書き込む。ここで、書込部２５が更新後ファームウェア２２２を書き込む容量が空いていると判定したにも関わらず、実行中のプログラムを書き換えてしまった場合は、実行結果を元に戻すか光アクセス装置２を強制的に再起動させる。光アクセス装置２が再起動した後、通常のファームウェアの更新と同様の手法で、ファームウェアの更新を行うようにしてもよい。
（ステップＳ１０６）  ＣＰＵ２３は、書込部２５がメモリ２２に書き込んだ更新後ファームウェア２２２を実行し、正しいファームウェアが書き込まれたか否かを判定する。書込部２５は、光アクセス装置２に転送された更新後ファームウェア２２２と、メモリ２２上に展開された更新後ファームウェア２２２のデータとが一致するか否かを確認して判定してもよい。
ＣＰＵ２３は、正しいファームウェアが書き込まれていると判定した場合に、さらに、実行結果に不具合がないか否かを判定する。正しいファームウェアが書き込まれていない場合及び実行結果に不具合がある場合のいずれか一方又は両方の場合にはステップＳ１０７へ移行し、正しいファームウェアが書き込まれている場合及び実行結果に不具合がない場合にはステップＳ１０８へ移行する。
（ステップＳ１０７）  正しいファームウェアが書き込まれていない場合及び実行結果に不具合がある場合のいずれか一方又は両方の場合には、ＣＰＵ２３は、実行結果を元に戻す。
（ステップＳ１０８）  正しいファームウェアが書き込まれている場合及び実行結果に不具合がない場合には、光アクセス装置２の書換部２７は、次の判定を行ってもよい。書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けられ、且つ書き換える参照先アドレスの数が閾値以上であるか否かを判定する。書き換える参照先アドレスの数が閾値以上である場合にはステップＳ１０９へ移行し、閾値未満である場合にはステップＳ１１０へ移行する。ステップＳ１０８の判定処理は省略されてもよい。この場合、書換部２７は、ステップＳ１１０に遷移する。
ここで、書き換える参照先アドレスの数が一つである場合は、間接参照テーブル２２４内の更新前ファームウェア２２１の参照先２２３に関連付けられる参照先アドレスを、更新後ファームウェア２２２の新たな参照先２２５に関連付けられる新たな参照先アドレスへ書き換えても、問題が生じ難いと想定される。しかし、書き換える参照先アドレスの数が、複数である場合は、更新前ファームウェア２２１と、更新後ファームウェア２２２との間で、参照先２２３と新たな参照先２２５とが混同してしまうことが懸念される。特に、書き換える参照先アドレスに関連付けられる参照先２２３によっては、更新時間が、機能の制約時間以上となることが想定される。このため、光アクセス装置２は、書き換えるプロセスを実行するときに、他のプロセスが割り込まないように、実行中のプログラムを含めて、書き換えるプロセス以外のプロセスを一時的に停止させる。
【００４１】
（ステップＳ１０９）  書き換える参照先アドレスの数が閾値以上である場合には、光アクセス装置２の停止処理部２８は、書き換える参照先アドレスの数に基づいて、ガードタイムを計算する。停止処理部２８は、計算することによって得られたガードタイムの期間、当該書き換える処理以外の処理を停止させる停止命令を、プラットフォームファームウェア２２０等に出力する。
なお、停止処理部２８は、書き換える処理の優先度を最上位する制御指示をプラットフォームファームウェア２２０等に出力してもよい。例えば、停止処理部２８は、システムコール等を用いて、停止命令や優先度の制御指示をプラットフォームファームウェア２２０等に出力する。ＣＰＵ２３は、停止処理部２８が出力した停止命令にしたがって、ガードタイムの期間、書き換える処理以外の処理を停止させる。ＣＰＵ２３が書き換える処理以外の処理の停止を開始した後、ステップＳ１１０へ移行する。
（ステップＳ１１０）  光アクセス装置２の書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けて記憶されている参照先アドレスを、新たな参照先アドレスに書き換える。具体的には、書換部２７は、更新前ファームウェア２２１に含まれる更新対象の関数の参照先２２３に関係付けられている関数ポインタの参照先アドレスを確認する。そして、書換部２７は、その参照先アドレスを、更新後ファームウェア２２２に含まれる更新対象の関数の新たな参照先２２５の新たな参照先アドレスに書き換える。このようにすることによって、不具合が無く正確にファームウェアの更新を実行できる。
ここで、書込部２５が実行中のプログラムを書き換えてしまった場合は、実行結果を元に戻す処理や、光アクセス装置２の強制的な再起動が行われる。光アクセス装置２が再起動された後、ファームウェアの更新処理が再度行われてもよい。
書換部２７は、書き換えが成功したか否かを判定する。書き換えが成功したと判定した場合にはステップＳ１１１へ移行し、書き換えが失敗したと判定した場合にはステップＳ１１２へ移行する。
（ステップＳ１１１）  書き換えが成功したと判定した場合には、光アクセス装置２の書換部２７は、書き換えの結果を確認する。具体的には、書換部２７は、書き換えた新たな参照先アドレスが正しいか否かを確認することによって、更新後ファームウェア２２２へ処理が移行するか否かを確認する。書換部２７は、異常やエラーが無いことによって、更新後ファームウェア２２２へ処理が移行すると判定した場合、更新シーケンスを終了する。
（ステップＳ１１２）  書き換えが失敗したと判定した場合には、光アクセス装置２の書換部２７は、実行結果を元に戻す。なお、書き換えが失敗し、光アクセス装置２の動作が停止した場合に、光アクセス装置２が再起動されてもよい。光アクセス装置２の動作が停止した場合についても、実行結果が元に戻される。なお、動作が停止した場合は、例えば、所定の期間（ミリ秒）処理が停止した場合や、ウォッチドッグタイマー(watchdog timer)等のタイマーに対する応答がない場合等を示す。
【００４２】
前述した実施形態では、ＲＯＭ２０に更新後ファームウェア２２２が記憶されていない場合について説明したが、この例に限られない。例えば、ＲＯＭ２０に更新後ファームウェア２２２が記憶されてもよい。この場合、ＲＯＭ２０に記憶された更新後ファームウェア２２２が、メモリ２２の空き領域に書き込まれる。
また、前述した実施形態において、間接参照テーブル２２４が、更新前ファームウェア２２１に含まれてもよい。
前述した実施形態では、書込部２５が、書込装置３が出力した書込要求に基づいて、メモリ２２の空き領域に更新後ファームウェア２２２を書き込む場合について説明したが、この例に限られない。例えば、書込部２５は、更新後ファームウェア２２２の全てを書き込んでもよいし、更新前ファームウェア２２１と更新前ファームウェア２２１との差分を書き込んでもよい。
前述した実施形態では、停止処理部２８が、書き換える参照先アドレスの数に基づいて、ガードタイムを設定する場合について説明したが、この例に限られない。例えば、停止処理部２８が、参照先アドレスを書き換えることによって制約を受ける機能の制約時間に基づいて、ガードタイムを設定してもよい。また、停止処理部２８は、設定したガードタイムが、参照先アドレスを書き換えることによって制約を受ける機能の制約時間よりも長い場合には、複数のガードタイムを設定してもよい。
このように、書換部２７は、書き換え対象の参照先アドレスの数、及び、書き換える処理によって制約を受ける機能の制約時間の少なくともいずれかが閾値以上であるか否かを判定する。停止処理部２８は、書き換え数、及び、制約時間の少なくともいずれかが閾値以上であると判定された場合に、書き換え数及び制約時間のいずれか一方に基づいて、前記ガードタイムを設定する。
【００４３】
以上説明した少なくとも一つの実施形態によれば、光アクセス装置２は、メモリ２２、書換部２７、及びＣＰＵ２３を有する。メモリ２２は、更新前ファームウェア２２１に関するデータである参照先２２３と、参照先の記憶領域を示すアドレスである参照先アドレスとを関連付けて記憶する。書換部２７は、メモリ２２に記憶されている参照先アドレスのうち、少なくとも一部の参照先アドレスを、更新後ファームウェア２２２に関するデータである参照先２２５の記憶領域を示す新たな参照先アドレスに書き換える。ＣＰＵ２３は、書き換えられた新たな参照先アドレスに基づいて、新たな参照先２２５を参照する。
このように構成することによって、光アクセス装置２のファームウェアを更新する場合に、ネットワークのサービス断を防ぐとともに、提供中のサービスを継続したままファームウェアの更新が可能となる。
また、少なくとも一つの実施形態によれば、書込部をさらに備える。書込部は、更新後ファームウェア２２２を書き込む記憶領域が空いている場合に、空いている記憶領域に更新後ファームウェア２２２を書き込む。このように構成することによって、実行中のプログラムを書き換えてしまうことによって生じる不具合の発生を防ぐことができる。仮に、実行中のプログラムを書き換えてしまうことによって、不具合が発生した場合でも、実行結果を元に戻すか光アクセス装置２を強制的に再起動させることによって、迅速にサービスを再開できる。
また、少なくとも一つの実施形態によれば、書換部２７は、書き換える参照先アドレスの数が閾値以上であるか否かを判定する。光アクセス装置２は、書き換える参照先アドレスの数が閾値以上と判定された場合に、書き換え処理以外の処理を停止させるガードタイムを設定する停止処理部を備える。ＣＰＵ２３は、停止処理部が設定したガードタイムにしたがって、参照先アドレスを新たな参照先アドレスに書き換える処理以外の処理を停止させる。
このように構成することによって、更新の対象となる参照先アドレスの数が多くなった場合に懸念される事象を抑制できる。つまり、更新前ファームウェア２２１と、更新後ファームウェア２２２との間で、参照先２２３と新たな参照先２２５とが混同する事象の発生を抑制できる。
また、少なくとも一つの実施形態によれば、停止処理部２８は、参照先アドレスの数、及び参照先アドレスを書き換えることによって制約を受ける機能の制約時間のいずれか一方又は両方に基づいて、ガードタイムを設定する。このように構成することによって、書き換える処理以外の処理を停止させるガードタイムを設定できる。
【００４４】
（第２の実施形態）
更新前のファームウェア２２１及び更新後のファームウェア２２２それぞれについて、メモリ２２上にテキスト領域とデータ領域とが保持される。データ領域には、変数の値が記憶される。更新後ファームウェア２２２は、更新前ファームウェア２２１のデータ領域に保存されている変数の値を参照できない。このように、ファームウェアの更新前後で、変数の値又は状態の引継ぎが考慮されない場合、ファームウェア更新後に変数の値や状態が初期化される。これにより、ファームウェアの更新後に変数の値の再計算や状態の再取得が必要となる。
例えば、加入者側端末であるＯＮＵの登録、認証情報又はＯＬＴが、ＯＮＵの上り通信帯域を制御するＤＢＡ（Dynamic Bandwidth Allocation）の計算の状態を更新前後で引き継げない場合、通信の遅延、再接続又は認証情報の再登録が必要となる。
第２の実施形態では、ファームウェアの更新前後で、変数の値を引継ぐ処理を説明する。すなわち、第２の実施形態では、サービス中断を伴わないファームウェアの更新前後で変数の値や状態を継続して利用できる技術を提供する。第２の実施形態について、図面を参照して詳細に説明する。
【００４５】
図４は、第２の実施形態における光アクセス装置２の構成の例を示す構成図である。
【００４６】
第１の実施形態で説明したとおり、書換部２７は、間接参照テーブル２２４に記憶されている参照先２２３に関連付けて記憶された参照先アドレスを、新たな参照先アドレスに書き換える。第２の実施形態における書換部２７は、第１の実施形態に対して、代入部２９をさらに備える。
【００４７】
代入部２９は、更新前ファームウェア２２１に含まれる変数のアドレスを、更新後ファームウェア２２２に含まれる当該変数のアドレスを保持するポインタ変数に代入する。すなわち、代入部２９は、メモリ２２における更新後ファームウェア２２２の指定箇所に、更新前ファームウェア２２１に含まれる変数のアドレスを書き込むことによって、代入を行う。代入部２９は、別の変数については、更新後ファームウェア２２２に含まれるアドレスを書き込む。具体的に、代入部２９は、例えば、オペレーティングシステムが備えるシステムコールを呼び出すことによってアドレスを書き込むことで、代入する。
【００４８】
以下、具体的に説明する。更新前ファームウェア２２１は、テキスト領域とデータ領域とから構成されるプログラムである。テキスト領域には、光アクセス装置２で実行される関数データが記憶される。関数データは、光アクセス装置２による光通信を実現する一連の処理を実現する。各関数の関数データは、それぞれ異なる処理を実現する。データ領域には、関数データによって参照される変数の値が記憶される。具体的には、関数データは、変数の値の記憶領域を示すアドレス（先頭アドレス）を参照する。関数データは、先頭アドレスを参照することで、データ領域内の変数の値を取得する。更新前ファームウェア２２１は、更新前のファームウェアを示す第１データの一態様である。
【００４９】
更新後ファームウェア２２２は、テキスト領域とデータ領域とから構成されるプログラムである。テキスト領域には、光アクセス装置２で実行される関数データが記憶される。データ領域には、関数データによって参照される変数の値が記憶される。具体的には、関数データは、変数の値の記憶領域を示すアドレス（先頭アドレス）を参照する。関数データは、先頭アドレスを参照することで、データ領域内の変数の値を参照する。更新後ファームウェア２２２は、更新前のファームウェアを示す第２データの一態様である。
【００５０】
ＣＰＵ２３は、更新後ファームウェア２２２がメモリ２２に記憶されただけでは、更新後ファームウェア２２２から、更新前ファームウェア２２１のデータ領域を参照することができない。ＣＰＵ２３が、動作に応じて、更新後ファームウェア２２２の関数データの実行時に、更新前ファームウェア２２１のデータ領域内の変数の値を参照するには、変数のアドレスが書き換えられる必要がある。すなわち、更新後ファームウェア２２２の関数データが参照するアドレスが、更新前ファームウェア２２１のデータ領域のアドレスを指すように、アドレスが書き換えられなければならない。このように、ＣＰＵ２３が更新後ファームウェア２２２の関数データの実行時に、更新前ファームウェア２２１のデータ領域を参照することを間接参照という。
【００５１】
第１の実施形態で説明したとおり、メモリ２２は、間接参照テーブル２２４を備える。間接参照テーブル２２４は、関数データや変数値等と、その関数データや変数等の記憶領域の先頭アドレス等とを関連付けたテーブル形式のデータである。以下、間接参照テーブル２２４が有する情報のうち、変数と変数の値が記憶される記憶領域の先頭アドレスとを関連付けたテーブルを変数テーブルと称する。
間接参照テーブル２２４を書き換えることによって、テキスト領域及びデータ領域内の参照先アドレス（先頭アドレス等）が、更新前ファームウェア２２１の記憶領域のアドレスと、更新後ファームウェア２２２の記憶領域のアドレスとの間で切り替えられる。なお、書換部２７は、例えば、ＣＰＵ２３のコアのペリフェラル回路としてＣＰＵ２３に備えられてもよい。
第１の実施形態で説明したとおり、ＣＰＵ２３は、更新前ファームウェア２２１内の間接参照を用いて関数データを参照する。この際に、例えば、関数データの参照先のアドレスが、更新前ファームウェア２２１内の関数ではなく、更新後ファームウェア２２２内の関数の先頭アドレスに書き換えられる。これにより、ＣＰＵ２３は、更新後ファームウェア２２２内の関数を実行する。このように間接参照先を書き換えることで、ファームウェアの更新を実現する。
【００５２】
第２の実施形態において、代入部２９は、変数テーブル内の更新後のファームウェア２２２の変数の記憶領域を示す先頭アドレスに、更新前のファームウェア２２１の変数の記憶領域を示す先頭アドレスを代入する。これにより、ＣＰＵ２３が参照する変数のアドレスが、更新前ファームウェア２２１の記憶領域のアドレスと更新後ファームウェア２２２の記憶領域のアドレスに書き換えられる。
【００５３】
ＣＰＵ２３は、更新後ファームウェア２２２の実行時に、更新後ファームウェア２２２の変数テーブルを参照する。ＣＰＵ２３は、変数テーブルに保持される参照先アドレスが示す更新前ファームウェア２２１のデータ領域に記憶されている、変数の値を参照する。これによって、ＣＰＵ２３は、更新後ファームウェア２２２で実行されるプログラムから、更新前ファームウェア２２１で使用されていた変数をそのまま継続して使用することができる。
【００５４】
図５は、第２の実施形態に係る、更新後ファームウェアから更新前ファームウェアのデータ領域を間接参照する場合の概要図である。同図に示すように、メモリ２２は、更新前ファームウェア２２１と更新後ファームウェア２２２とを記憶する。更新前ファームウェア２２１は、メモリ２２内の記憶域にテキスト領域ver1とデータ領域ver1と保持する。テキスト領域ver1は、複数の関数データを保持する。ＣＰＵ２３の動作に応じて、各関数データは、データ領域ver1から変数の値を参照する。
【００５５】
更新後ファームウェア２２２は、メモリ２２内の記憶域にテキスト領域ver2とデータ領域ver2と保持する。テキスト領域ver2は、複数の関数データを保持する。テキスト領域ver2は、複数の関数データを保持する。更新後ファームウェア２２２のテキスト領域ver2の各関数データがメモリ２２に記憶された場合に、更新前ファームウェア２２１のデータ領域ver1の先頭アドレスを参照するように、代入部２９によって変数テーブルが書き換えられる。したがって、更新後ファームウェア２２２の各関数データは、更新前ファームウェア２２１のデータ領域ver1を参照する。これにより、更新前ファームウェア２２１で使用されていた変数の値を継続して使用する事が可能になる。
【００５６】
図６は、第２の実施形態に係る、更新前ファームウェアによる変数の値の参照に関する概要図である。プログラム３２０は、更新前ファームウェア２２１のプログラムコードの一例である。プログラム３２０では、変数としてＶａｌ＿Ａ、Ｖａｌ＿Ｂの２変数が定義される。テーブル３２１によると、Ｖａｌ＿Ａの先頭アドレスは、“０ｘ０００１０１０”であり、値は“１００”である。Ｖａｌ＿Ｂの先頭アドレスは、“０ｘ０００１０５０”であり、値は“２００”である。ＣＰＵ２３は、更新前ファームウェア２２１を実行し、２つの変数を直接参照することで、変数の値を参照することができる。
【００５７】
プログラム３２０には、変数ポインタとして、Ｐｏ＿Ｘ、Ｐｏ＿Ｙの２つの変数が定義される。第２の実施形態において、変数ポインタは、代入部２９によって代入される変数の先頭アドレスを、参照先アドレスとして保持する。変数ポインタは、例えばＣ言語等で使われる、変数のアドレスを記憶する変数である。プログラム３２０では、Ｐｏ＿Ｘには、変数Ｖａｌ＿Ａの先頭アドレスが代入される。Ｐｏ＿Ｙには、変数Ｖａｌ＿Ｂの先頭アドレスが代入される。定義された変数ポインタは、変数テーブル３２２に保持される。
【００５８】
変数テーブル３２２は、各変数ポインタの変数ポインタレコードを有する。変数ポインタレコードは、変数ポインタ、変数ポインタのアドレス、及び参照先アドレスの各値を有する。変数ポインタは、プログラム３２０で定義される変数名を示す。変数ポインタのアドレスは、変数ポインタが記憶されるデータ領域上の先頭アドレスを示す。参照先アドレスは、変数ポインタが保持する値であって、引き継ぎ対象の変数が記憶されるデータ領域上の先頭アドレスを示す。
【００５９】
変数テーブル３２２に示される例では、変数テーブル３２２の最上段のレコードは、変数ポインタの値が“Ｐｏ＿Ｘ”、変数ポインタの保持される先頭アドレスの値が“０ｘ０００２０１０”、参照先アドレスの値が”０ｘ０００１０１０”である。従って、変数テーブル３２２の最上段のレコードによると、プログラム３２０によって定義された変数ポインタは、“Ｐｏ＿Ｘ”であり、変数ポインタは、データ領域の”０ｘ０００２０１０”というアドレスに記憶される。変数ポインタは、参照先アドレスとして“０ｘ０００１０１０”の値を保持する。
【００６０】
プログラム３２０では、「＊Ｐｏ＿Ｘ」、「＊Ｐｏ＿Ｙ」の処理が実行されることによって、ポインタ変数の値が間接参照される。具体的には、「＊Ｐｏ＿Ｘ」が実行されると、変数テーブル３２２に保持される変数ポインタＰｏ＿Ｘが保持するアドレスが参照される。変数ポインタが保持するアドレスには、参照先アドレスとして、“０ｘ０００１０１０”の値が保持される。したがって、参照先アドレス“０ｘ０００１０１０”に保持される変数Ｖａｌ＿Ａの値である、“１００”が参照される。
【００６１】
図７は、第２の実施形態に係る、更新後ファームウェアによる変数の値の間接参照に関する概要図である。プログラム３２０は、更新前ファームウェア２２１のプログラムコードの一例である。更新前ファームウェア２２１で定義された各変数は、テーブル３２１に示される通り、変数の値と、更新前ファームウェア２２１のデータ領域内の先頭アドレスが紐づけられた状態で記憶される。
【００６２】
プログラム３３０は、更新後ファームウェア２２２のプログラムコードの一例である。プログラム３３０では、変数としてＶａｌ＿Ａ、Ｖａｌ＿Ｂ、Ｖａｌ＿Ｃの３つの変数が定義される。テーブル３３１によると、変数Ｖａｌ＿Ａの先頭アドレスは、“０ｘ１００１０１０”であり、値は“１００”である。変数Ｖａｌ＿Ｂの先頭アドレスは、“０ｘ１００１０５０”であり、値は“２００”である。変数Ｖａｌ＿Ｃの先頭アドレスは、“０ｘ１００１０７０”であり、値は“３００”である。
【００６３】
プログラム３３０は、変数ポインタとして、Ｐｏ＿Ｘ、Ｐｏ＿Ｙ、Ｐｏ＿Ｚの３つのポインタ変数が定義される。変数ポインタは、変数の先頭アドレスを、参照先アドレスとして保持する変数である。プログラム３３０では、ポインタ変数Ｐｏ＿Ｘには、変数Ｖａｌ＿Ａの先頭アドレスが代入される。ポインタ変数Ｐｏ＿Ｙには、変数Ｖａｌ＿Ｂの先頭アドレスが代入される。ポインタ変数Ｐｏ＿Ｚには、変数Ｖａｌ＿Ｃの先頭アドレスが代入される。定義された各変数ポインタは、変数テーブル３３２に保持される。
なお、変数テーブル３３２に保持される変数の例としては、ＤＢＡ（Dynamic Bandwidth Allocation）の計算アルゴリズムで使用される変数や、ＯＬＴに登録されているＯＮＵの認証情報を保持する変数、及び、ＶＬＡＮ（Virtual Local Area Network）の設定情報を保持する変数等が挙げられる。または、変数テーブル３３２に保持される変数の例として、ＯＬＴに割り当てられる通信帯域の最大値や最大値等を保持する変数が挙げられる。
【００６４】
更新後ファームウェア２２２をメモリ２２に書き込んだ状態における変数テーブル３３２において、変数ポインタのそれぞれの参照先アドレスは、更新後ファームウェア２２２の変数の先頭アドレスである。すなわち、変数ポインタのそれぞれの参照先アドレスは、更新後ファームウェア２２２のデータ領域を指す。具体的には、変数テーブル３３２の最上段のレコードによると、変数ポインタＰｏ＿Ｘのアドレスの値が“０ｘ１０００２０１０”、参照先アドレスの値が”０ｘ１００１０１０”である。したがって、更新後ファームウェア２２２から更新前ファームウェア２２１のデータ領域を参照するためには、変数テーブル３３２内の、更新後ファームウェア２２２で使用される変数ポインタの参照先として、更新前ファームウェア２２１のデータ領域を示すアドレスが記憶される必要がある。
【００６５】
更新前ファームウェア２２１のデータ領域を示すアドレスを変数テーブル３３２に記憶させる方法について、変数Ｖａｌ＿Ａを用いて詳述する。書換部２７の代入部２９は、更新前ファームウェア２２１と更新後ファームウェア２２２とで使用される変数名を特定する。Ｖａｌ＿Ａは、更新前ファームウェア２２１と更新後ファームウェア２２２とで使用される変数名である。代入部２０２は、更新前ファームウェア２２１に記憶される変数Ｖａｌ＿Ａの先頭アドレス“０ｘ０００１０１０”を取得する。プログラム３３０によると、変数Ｖａｌ＿Ａの先頭アドレス“０ｘ１００１０１０”は、変数ポインタＰｏ＿Ｘに代入される。代入部２０２は、変数テーブル３３２から変数ポインタＰｏ＿Ｘに関する変数ポインタレコードを取得する。代入部２０２は、取得した変数ポインタレコードの参照先アドレスの値として、更新前ファームウェア２２１に記憶される変数の先頭アドレス“０ｘ０００１０１０”を代入する。
【００６６】
プログラム３３０では、「＊Ｐｏ＿Ｘ」によって、変数Ｖａｌ＿Ａの値が間接参照される。具体的には、「＊Ｐｏ＿Ｘ」が実行されると、変数テーブル３３２に保持される変数ポインタＰｏ＿Ｘに関する、変数ポインタのアドレスが参照される。変数ポインタのアドレスには、参照先アドレスとして、更新前ファームウェア２２１のデータ領域を示す“０ｘ０００１０１０”の値が保持される。したがって、更新後ファームウェア２２２から間接参照によって、更新前ファームウェア２２１の参照先アドレス“０ｘ０００１０１０”の値である、“１００”が参照できる。
【００６７】
書換部２７の代入部２９は、更新前ファームウェア２２１と更新後ファームウェア２２２との両方で使用される変数について、変数テーブル３３２の参照先アドレスに、更新前ファームウェア２２１における先頭アドレスを代入する。また、第１の実施形態で説明したとおり、書換部２７は、間接参照テーブル２２４の更新前ファームウェア２２１の関数のアドレスを、更新後ファームウェア２２２を示すアドレスに書き換える。
【００６８】
図８は、第２の実施形態に係る、ファームウェア更新の流れを示すフローチャートである。ユーザは、ファームウェア更新にあたり、事前確認としてＲＯＭ２０へ書き込まれる更新後ファームウェア２２２や、メモリ２２の事前確認が行われてもよい。事前確認には、予め光アクセス装置２と同じ光アクセス装置を用いた検証が必要となる。
【００６９】
ＣＰＵ２３は、ＲＯＭ２０に記憶されるファームウェア更新プログラムを実行する（ステップＳ２０１）。なお、本実施例では光アクセス装置２の再起動は実施されないため、稼働中の更新前ファームウェア２２１のプログラムの書き換えが行われない。ＣＰＵ２３が、ファームウェア更新プログラムを実行すると、書換部２７は、更新後ファームウェア２２２をメモリ２２に記憶させる（ステップＳ２０２）。
【００７０】
ＣＰＵ２３は、更新後ファームウェア２２２がメモリ２２に正常に記憶されたか否か判定する（ステップＳ２０３）。具体的には、ＣＰＵ２３は、更新後ファームウェア２２２が記憶されたことで、予め他のプログラムのために確保しておいたアドレス領域が侵害されていない場合、更新後ファームウェア２２２が正常に記憶されたと判定してもよい。または、ＣＰＵ２３は、書換部２７から、正常に更新後ファームウェア２２２の記憶が完了した旨を示す信号を受け付けた場合に、更新後ファームウェア２２２が正常に記憶されたと判定してもよい。他のプログラムは、例えば、プラットフォームファームウェア２２０や更新前ファームウェア２２１等であってもよい。
【００７１】
更新後ファームウェア２２２が正常にメモリ２２に正常に記憶されなかった場合（ステップＳ２０３：ＮＯ）、ステップＳ２１２に遷移する。更新後ファームウェア２２２が正常にメモリ２２に正常に記憶された場合（ステップＳ２０３：ＹＥＳ）、ＣＰＵ２３は、実行結果を確認する（ステップＳ２０４）。ＣＰＵ２３は、実行結果が正常であったか否かを判定する（ステップＳ２０５）。実行結果が正常ではなかった場合（ステップＳ２０５：ＮＯ）、ステップＳ２１２に遷移する。
【００７２】
実行結果が正常であった場合（ステップＳ２０５：ＹＥＳ）、ＣＰＵ２３は、書換え対象となる関数または変数の数が閾値よりも大きいか否か判定してもよい（ステップＳ２０６）。書換え対象となる関数とは、ＣＰＵ２３が実行する関数であってもよい。書換え対象となる変数とは、例えば、更新前ファームウェア２２１及び更新後ファームウェア２２２のいずれでも使われる変数であってもよい。閾値よりも小さい場合（ステップＳ２０６：ＮＯ）、ＣＰＵ２３はステップＳ２１０へ遷移する。ステップＳ２０６の判定処理は省略されてもよい。この場合、ＣＰＵ２３は、ステップＳ２１０に遷移する。
【００７３】
閾値よりも大きい場合（ステップＳ２０６：ＹＥＳ）、ＣＰＵ２３は、切替ガードタイムを算出する（ステップＳ２０７）。切替ガードタイムとは、アドレスを書き換える際に、光アクセス装置２の動作に異常が生じないように、アドレスを書き換える処理以外の光アクセス装置２の動作を停止させる時間である。ＣＰＵ２３は、切替ガードタイムの計数を開始する（ステップＳ２０８）。ＣＰＵ２３は、光アクセス装置２の、アドレスを書き換える処理以外の動作を停止させる（ステップＳ２０９）。
【００７４】
ＣＰＵ２３は、切替対象となる関数に関して、間接参照テーブル２２４に記憶されている、更新前ファームウェア２２１の参照先アドレスを、更新後ファームウェア２２２の参照先アドレスに書き換える。また、ＣＰＵ２３は、切替対象となる関数で参照される変数に関して、更新前ファームウェア２２１の当該変数の先頭アドレスを、更新後ファームウェア２２２の参照先アドレスとして記憶させる（ステップＳ２１０）。ＣＰＵ２３は、参照先アドレスを正常に記憶させることができたか否か判定する（ステップＳ２１１）。正常に記憶させることができた場合（ステップＳ２１１：ＹＥＳ）、処理を終了する。正常に記憶させることができなかった場合（ステップＳ２１１：ＮＯ）、ＣＰＵ２３は、更新後ファームウェア２２２をメモリ２２から削除することで、光アクセス装置２を更新後ファームウェア２２２記憶される前の状態に戻す（ステップＳ２１２）。ＣＰＵ２３は、光アクセス装置２を再起動させてもよい。
【００７５】
以上のように、書換部２７は、更新前ファームウェア２２１の記憶領域とは異なる領域に記憶され、更新後ファームウェア２２２に含まれる変数のうち少なくとも一部の対象変数の記憶領域を示す参照先アドレスを保持するポインタ変数の値を、更新前ファームウェア２２１における対象変数の記憶領域を示す参照先アドレス（第１変数参照先アドレス）に書き換える。また、ＣＰＵ２３は、ポインタ変数が保持する参照先アドレスに基づいて対象変数の値を参照する。
このように構成された光アクセス装置２では、メモリ２２に更新前ファームウェア２２１及び更新後ファームウェア２２２が記憶される。ＣＰＵ２３が、更新後ファームウェア２２２を介して更新前ファームウェア２２１のデータ領域を参照する。したがって、ファームウェアの更新前に使用されていた変数の値を、更新後ファームウェアのテキスト領域で実行されるプログラムからそのまま使用できる。すなわち、ファームウェアの更新前後で、変数の値又は状態を継続して利用することが可能になる。
そのため、ＯＮＵの認証情報や値の計算状態の引継ぎが可能となり、サービス品質に影響なく、サービス中断を伴わないファームウェアの更新手法が実現される。さらに、メモリ２２内の更新前ファームウェア２２１のデータ領域を更新後ファームウェア２２２から参照することによって、ファームウェア更新後に、ＯＮＵの認証情報や値の計算状態等の光アクセス装置２が初期化されることを防ぐことが可能となる。
【００７６】
また、ＣＰＵ２３又は代入部２９は、更新後ファームウェア２２２において使用する変数値の記憶領域に、更新前ファームウェア２２１において使用した変数値や関数データ等をコピーしてもよい。これによって、ＣＰＵ２３又は代入部２９は、更新前ファームウェア２２１を使用しない場合には、メモリ２２における空き領域を増やすことができる。
【００７７】
更新前ファームウェア２２１において使用した変数値を更新後ファームウェア２２２において使用する変数値に引き継ぐ場合、更新前ファームウェア２２１及び更新後ファームウェア２２２が共用する記憶領域（以下「共用領域」という。）が、メモリ２２に定められていてもよい。これによって、ＣＰＵ２３は、更新後ファームウェア２２２の記憶領域を変数テーブルが記憶している場合でも、更新前ファームウェア２２１において使用した変数値を、共用領域から取得することができる。すなわち、ＣＰＵ２３は、更新後ファームウェア２２２に基づく動作をＣＰＵ２３が実行している期間でも、更新前ファームウェア２２１において使用した変数値を、共用領域を参照して引き継ぐことができる。
【００７８】
（変形例１）
更新後ファームウェア２２２において、新しい変数が追加された場合、更新後ファームウェア２２２のデータ領域が利用されてもよい。例えば、図７では、新しい変数として変数Ｖａｌ＿Ｃが追加されている。変数Ｖａｌ＿Ｃは、更新後ファームウェア２２２内の関数から参照される。新しい変数Ｖａｌ＿Ｃは、先頭アドレスが“０ｘ１００１０７０”である。図７では、変数ポインタＰｏ＿Ｚが変数Ｖａｌ＿Ｃの参照先アドレスを保持する。変数テーブル３３２によると、変数ポインタＰｏ＿Ｚは、参照先アドレスとして、更新後ファームウェア２２２のデータ領域を示す“０ｘ１００１０７０”を記憶する。したがって、更新後ファームウェア２２２内のデータ領域に変数の値を保持した場合でも，更新後ファームウェア２２２内での計算に影響を与えることなく、光アクセス装置２は、光通信を行うことができる。
【００７９】
（変形例２）
第１、第２の実施の形態における更新処理を複数回実行した場合、メモリ２２は、複数の異なる更新後ファームウェア２２２を記憶する。具体的には、メモリ２２に、更新後ファームウェア２２２に加えて、さらに更新後ファームウェア２２２ａが記憶される場合がある。更新後ファームウェア２２２ａが記憶される場合、ＣＰＵ２３は、更新前ファームウェア２２１の状態に基づいて、新しく追加された更新後ファームウェア２２２ａに記憶される関数を、それぞれの更新後ファームウェア２２２から実行する。
具体的には、書換部２７は、更新前ファームウェア２２１の関数の参照先を、又は更新後ファームウェア２２２、または、新しく追加された更新後ファームウェア２２２ａの新たな参照先に書き換える。または、書換部２７は、更新後ファームウェア２２２の関数の参照先を、新しく追加された更新後ファームウェア２２２ａの新たな参照先に書き換える。
このように、書換部２７は、更新後ファームウェア２２２ａがさらに記憶される場合、次の処理を行う。すなわち、書換部２７は、更新前ファームウェア２２１における対象関数の参照先アドレス（第１参照先アドレス）の少なくとも一部を、更新後ファームウェア２２２の新たな参照先アドレス（第２参照先アドレス）、または、更新後ファームウェア２２２ａの新たな参照先（第３参照先アドレス）に書き換える。または、書換部２７は、更新後ファームウェア２２２の対象関数の参照先アドレス（第２参照先アドレス）の少なくとも一部を、更新後ファームウェア２２２ａの新たな参照先（第３参照先アドレス）に書き換える。
また、代入部２９は、更新前ファームウェア２２１又は更新後ファームウェア２２２の変数のアドレスを、新しく追加された更新後ファームウェア２２２ａの変数ポインタに代入する。
このように、書換部２７は、更新後ファームウェア２２２ａがさらに記憶される場合、次の処理を行う。すなわち、書換部２７は、更新前ファームウェア２２１及び更新後ファームウェア２２２の記憶領域とは異なる領域に記憶され、少なくとも一部の対象変数の記憶領域を示す参照先アドレスを保持するポインタ変数の値を書き換える。書換部２７は、当該ポインタ変数の値を、更新前ファームウェア２２１における対象変数の記憶領域を示す参照先アドレス（第１変数参照先アドレス）、または、更新後ファームウェア２２２のポインタ変数が保持する参照先アドレスに書き換える。
このように構成されることで、メモリ２２が、複数の更新後ファームウェアを記憶した場合であっても、光アクセス装置２は、光通信の処理を継続して行うことができる。
【００８０】
（変形例３）
第１、第２の実施形態を適用することで、実行されるプログラムの処理時間に、変数の更新前ファームウェア２２１におけるアドレスを取得する分のオーバーヘッドの時間が加わる。オーバーヘッドの時間は、プログラムの処理時間と比較してごく僅かな影響である。しかし、本発明が適用されるＯＬＴのハードウェアスペックによっては，プログラム内で変数のアドレス取得される回数が増加した場合、プログラムの異常停止が発生する可能性がある。したがって，本発明は、適用先のＯＬＴのハードウェアスペックと適用先のプログラムに要求される処理時間と適用先のプログラムと、変数のアドレス取得が実行される回数等と、を考慮して適用されることが望ましい。
【００８１】
（変形例４）
なお、以上説明してきた書換部２７は、光アクセス装置２に接続されたパーソナルコンピュータ、スマートデバイス等の情報処理装置によって実現されてもよい。例えば、光アクセス装置２に接続された情報処理装置のプロセッサが上記プログラムを実行することによって、書換部２７として機能してもよい。
【００８２】
（第３の実施形態）
以上、第３の実施形態を説明する前に、第１、第２の実施形態における光通信システム１の構成の例を説明する。
図９は、第１、第２の実施形態で説明した光通信システム１の構成の例を示す図である。
【００８３】
図９に示すように、メモリ２２上の更新前ファームウェア２２１は、参照元２２６を有する。第１の実施形態で説明したとおり、書換部２７は、関数参照テーブル２２４における更新前ファームウェア２２１の記憶領域を示すアドレス（参照先２２３）を、更新後ファームウェア２２２の記憶領域を示すアドレス（新たな参照先２２５）に書き換える。これによって、ＣＰＵ２３は、更新前ファームウェア２２１の関数データ等を呼び出した場合に、更新前ファームウェア２２１の関数データ等を参照する代わりに、更新後ファームウェア２２２の関数データ等を参照することができる。
【００８４】
ＣＰＵ２３は、参照元２２６の処理を実行する際に、間接参照テーブル２２４を参照し、参照先アドレス（新たな参照先２２５）に記憶されている更新後ファームウェア２２２の関数データを参照する。この時、ＣＰＵ２３は、戻り先アドレスを記憶するレジスタ（以下「戻り先レジスタ」という。）に、参照元２２６である更新前ファームウェア２２１の戻り先アドレスを記憶する。戻り先アドレスは、ＣＰＵ２３が実行する処理の戻り先のアドレスである。
【００８５】
ＣＰＵ２３は、更新後ファームウェア２２２の関数データを参照した後、戻り先レジスタ値が示すアドレスに記憶されている更新前ファームウェア２２１に関するデータを参照する。これによって、ＣＰＵ２３は、予め定められた関数データ以外の関数データ等については、更新前ファームウェア２２１の関数データ等を参照することができる。
【００８６】
このように、光アクセス装置２は、通信断を発生させずにファームウェアを更新することが可能である。光アクセス装置２は、通信断を発生させずに特定の機能をユーザに提供することが可能である。すなわち、光アクセス装置２は、動的にファームウェアを更新するというライブアップデートが可能である。
【００８７】
（第３の実施形態）
第３の実施形態では、プラットフォームファームウェア２２０が参照元を有する点が図９と相違する。第３の実施形態では、第１の実施形態との相違点についてのみ説明する。
【００８８】
図１０は、第３の実施形態光通信システム１の構成の例を示す図である。図９に対して、メモリ２２上のプラットフォームファームウェア２２０は、参照元２２７を有える。
【００８９】
書換部２７の処理は図９と同様である。図１０に示すように、プラットフォームファームウェア２２０は、参照元２２７を有する。第１の実施形態で説明したとおり、書換部２７は、関数参照テーブル２２４を参照し、更新前ファームウェア２２１の記憶領域を示す参照先アドレス（参照先２２３）を、更新後ファームウェア２２２の記憶領域を示す参照先アドレス（新たな参照先２２５）に書き換える。これによって、ＣＰＵ２３は、プラットフォームファームウェア２２０の関数データ等を呼び出した場合に、更新前ファームウェア２２１の関数データ等を参照する代わりに、更新後ファームウェア２２２の関数データ等を参照することができる。
【００９０】
以上のように、メモリ２２は、予め定められたプラットフォームファームウェア２２０に関するデータをさらに記憶する。書換２７は、プラットフォームファームウェア２２０から参照される第１データの記憶領域を示す参照先アドレスを、第２データの記憶領域を示す参照先アドレスに書き換える。これによって、プラットフォームファームウェア２２０を介してＣＰＵ２３に参照されるデータを第１データから第２データに書き換える。通信部２４は、ＣＰＵ２３に参照された第２データに基づいて通信する。
【００９１】
これによって、第３の実施形態の光アクセス装置２は、第１の実施形態と比較してオーバーヘッドを削減して、通信断を発生させずにファームウェアを更新することが可能である。すなわち、第２実施形態の光アクセス装置２は、更新後ファームウェア２２２に関するデータを、更新前ファームウェア２２１を介して参照する場合と比較して、オーバーヘッドを削減して、通信断を発生させずにファームウェアを更新することが可能である。
【００９２】
（第４の実施形態）
第４の実施形態は、第１の実施形態及び第３の実施形態の組み合わせである。
【００９３】
図１１は、第４の実施形態に係る光通信システム１の構成の例を示す図である。
図１１によると、更新前ファームウェア２２１は参照元２２６を有する。これにより、ＣＰＵ２３が更新前ファームウェア２２１の関数データ等を呼び出した場合に、参照先アドレスを更新前ファームウェア２２１の記憶領域のアドレスと更新後ファームウェア２２２の記憶領域のアドレスとの間で切り替える。
【００９４】
図１１によると、プラットフォームファームウェア２２０は、参照元２２７を有する。これにより、ＣＰＵ２３がプラットフォームファームウェア２２０の関数データ等を呼び出した場合に、参照先アドレスを更新前ファームウェア２２１の記憶領域のアドレスと更新後ファームウェア２２２の記憶領域のアドレスとの間で切り替える。
【００９５】
以上のように、第４の実施形態の光アクセス装置２の各機能部は、第１の実施形態の光アクセス装置２の各機能部と、第３の実施形態の光アクセス装置２の各機能部との組み合わせである。これによって、第４の実施形態の光アクセス装置２は、参照の回数が増えることによってオーバーヘッドが増大したとしても、柔軟な切替動作によって、通信断を発生させずにファームウェアを更新することが可能である。
【００９６】
以上、複数の実施形態、及び変形例を説明したが、いずれか複数の実施形態、及び、いずれかの実施形態と変形例が組み合わせて適用されてもよい。この場合、それぞれの実施形態または変形例の効果を組み合わせた効果を奏する。
【００９７】
上述した実施の形態では、関数ポインタや構造体を用いて、実行されるプログラムに対して間接参照の処理を追加する。これにより、関数が呼び出された際に、関数ポインタが保持する参照先の関数のアドレスが読み取られ、そのアドレスに処理が移行される。このように、上述した実施形態では、関数ポインタで保持されているアドレスを、書き換える場合を例示した。つまり、書換部２７が、間接参照テーブル２２４における更新前の値を、所定の値、または所定のオフセット値が加算／減算された値に、書き換える場合を例示した。
ただし、間接参照テーブル２２４は、実効的に、書き換え処理が行われてもよい。例えば、更新前の値を採用するか、または、更新後の値を採用するかを示すフラグが設けられてもよい。書換部２７は、フラグの値を参照し、フラグの値に応じて、書き換えを行うか否かを判定する。例えば、書換部２７は、フラグの値が「０」の場合に、間接参照テーブル２２４から更新前のアドレスを取得する。書換部２７は、フラグの値が「１」の場合に、間接参照テーブル２２４の参照先のアドレスを取得し、実効的に書き換える。
オフセット値を用いる場合についても同様である。書換部２７は、フラグの値が「０」の場合に、間接参照テーブル２２４から、更新前のアドレス(例えば、値「Ａ」）を取得する。書換部２７は、フラグの値が「１」の場合に、更新前のアドレス(例えば、値「Ａ」）の代わりに、オフセット値(例えば値「Ｂ」）が加算／減算されたアドレス(加算の場合、値「Ａ＋Ｂ」）を取得し、間接参照テーブル２２４を取得し、実効的に書き換える。
フラグは、例えば、ファームウェアごと、または、関数ごとに設けられてもよい。または、フラグはサブルーチンごとに設けられてもよいし、値が動的に更新されてもよい。フラグを用いた書き換え処理は、変数テーブルの書換え処理にも適用可能である。
【００９８】
上述した実施形態に係る光アクセス装置２、書込装置３の少なくとも一部をコンピュータで実現するようにしてもよい。この場合、この機能を実現するためのプログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラムをコンピュータシステムに読み込ませ、実行することによって実現してもよい。なお、ここでいう「コンピュータシステム」とは、ＯＳや周辺機器等のハードウェアを含むものとする。また、「コンピュータ読み取り可能な記録媒体」とは、フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。さらに「コンピュータ読み取り可能な記録媒体」とは、インターネット等のネットワークや電話回線等の通信回線を介してプログラムを送信する場合の通信線のように、短時間の間、動的にプログラムを保持するもの、その場合のサーバやクライアントとなるコンピュータシステム内部の揮発性メモリのように、一定時間プログラムを保持しているものも含んでもよい。また上記プログラムは、前述した機能の一部を実現するためのものであってもよく、さらに前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるものであってもよく、ＦＰＧＡ（Field Programmable Gate Array）等のプログラマブルロジックデバイスを用いて実現されるものであってもよい。
前述した実施形態において、参照先２２３は第１データの一例であり、参照先アドレスは第１参照先アドレスの一例であり、書込装置３は他装置の一例であり、新たな参照先２２５は第２データの一例であり、新たな参照先アドレスは第２参照先アドレスの一例であり、ＣＰＵ２３はプロセッサの一例である。
以上、この発明の実施形態について図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【産業上の利用可能性】
【００９９】
本発明は、局側通信端末等の光アクセス装置に適用可能である。
【符号の説明】
【０１００】
１…光通信システム，  ２…光アクセス装置，  ３…書込装置，  ２０…ＲＯＭ，  ２１…起動処理部，  ２２…メモリ，  ２３…ＣＰＵ，  ２４…通信部，  ２５…書込部，  ２６…登録部，  ２７…書換部，  ２９…代入部，  ２００、２２１…更新前ファームウェア，  ２２０…プラットフォームファームウェア，  ２２２…更新後ファームウェア，  ２２３…参照先，  ２２４…間接参照テーブル，  ２２５…新たな参照先
【図１】
0006751197.tif 000002
【図２】
0006751197.tif 000003
【図３】
0006751197.tif 000004
【図４】
0006751197.tif 000005
【図５】
0006751197.tif 000006
【図６】
0006751197.tif 000007
【図７】
0006751197.tif 000008
【図８】
0006751197.tif 000009
【図９】
0006751197.tif 000010
【図１０】
0006751197.tif 000011
【図１１】
0006751197.tif 000012