(57)【特許請求の範囲】
【請求項１】
所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスを制御する装置が実行する方法であって、
書込対象となる実データを取得し、取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む段階と、
前記実データについての前記ヘッダ領域を前記最後の書込単位から逆順に参照し、前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記１又は複数の書込単位分のデータ領域に既に書き込まれているすべての実データを無効データとして扱う段階とを有し、
前記装置は、前記無効データが書き込まれているデータ領域および前記ヘッダ領域の書込状態を保持したまま、書込対象となる新たな実データを取得し、取得した新たな実データのサイズを書き込むための前記データ領域を新たに確保する、
メモリアクセス制御方法。
【請求項２】
前記第１フラグ情報は、確保した書込単位の数を最大値とするシーケンス番号を含んでおり、
前記装置は、前記実データの前記データ領域への正常な書込が進む度に、最初の書込単位を起点とし、最後の書込単位であることを表す数値を終点として、前記シーケンス番号を逐次小さい値に更新し、更新したシーケンス番号を当該書込単位の第１フラグ情報として前記ヘッダ領域に書き込む、
請求項１記載のメモリアクセス制御方法。
【請求項３】
前記第２フラグ情報は、書込単位毎に、その直前の書込単位を識別するための識別情報と、前記実データが書き込まれた位置を表す論理アドレスとを含んでおり、
前記装置は、前記第１フラグ情報の前記ヘッダ領域への書込と、前記実データの前記データ領域への書込とがいずれも正常に実行されたときに前記第２フラグ情報を生成し、この第２フラグ情報を当該第１フラグ情報とペアで参照される領域に書き込む、
請求項２記載のメモリアクセス制御方法。
【請求項４】
前記装置は、前記保持してあるデータ領域および前記ヘッダ領域の書込状態を、一定の消去条件を満たしたときに、一括して消去する、
請求項１記載のメモリアクセス制御方法。
【請求項５】
所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスを制御するメモリ制御装置であって、
書込対象となる実データを取得する実データ取得手段と、
取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む書込手段と、
前記実データについての前記ヘッダ領域を、前記最後の書込単位から逆順に参照し、前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記１又は複数の書込単位分のデータ領域に既に書き込まれているすべての実データを無効なデータとして扱う読込手段とを有し、
前記書込手段は、前記無効データが書き込まれているデータ領域および前記ヘッダ領域の書込状態を保持したまま、書込対象となる新たな実データを取得し、取得した新たな実データのサイズを書き込むための前記データ領域を新たに確保する、
メモリ制御装置。
【請求項６】
所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスが可能なコンピュータを、書込対象となる実データを取得する実データ取得手段、
取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む書込手段、および、
前記実データについての前記ヘッダ領域を、前記最後の書込単位から逆順に参照し、前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記最後の書込単位のヘッダ領域に前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記１又は複数の書込単位分のデータ領域に既に書き込まれているすべての実データを無効なデータとして扱う読込手段として機能させ、
更に、前記書込手段を、前記無効データが書き込まれているデータ領域および前記ヘッダ領域の書込状態を保持したまま、書込対象となる新たな実データを取得し、取得した新たな実データのサイズを書き込むための前記データ領域を新たに確保するよう機能させる、
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えばＥＥＰＲＯＭ（Electrically Erasable and Programmable Read Only Memory ）のような不揮発性メモリへの複数バイトの書込をアトミックに操作するためのメモリアクセス制御技術に関する。
【背景技術】
【０００２】
ＥＥＰＲＯＭのように、書込回数に制限のある不揮発性メモリの書込可能回数を実質的に増やしたり、ＥＥＰＲＯＭをそれよりも安価なフラッシュメモリで代用する「ＥＥＰＲＯＭエミュレーション」と呼ばれる技術（非特許文献１）が提案されている。これらの技術では、書込領域を多数のブロック（データ書込領域）に分割するなどの工夫が施されているのが一般的である。このように書込領域を分割した場合において、書込途中で不意の電源切断等の不具合が発生すると、復帰時にどのデータまでが正しく書き込まれているのかを判断することが難しくなる。
【０００３】
この点の改善が可能な従来技術として、ブロック毎に書込開始状態を示す第１参照データと、書込完了状態を示す第２参照データとをそれぞれを記憶しておき、書込開始時は第１参照データを更新し、書込完了時には第２参照データを更新することにより、上記の不具合の発生直前までのデータを最新データとして認識する技術がある（特許文献１）。
また、不具合発生後、回復時に、書込完了を示す情報を参照することにより、書込完了していたブロックの再書込を行うことにより、適正にデータの回復処理を行うという技術もある（特許文献２）。
【０００４】
【非特許文献１】「アプリケーションノート Ｕ17057ＪＪ3Ｖ0ＡＮ00」、第3版、ＮＥＣエレクトロニクス株式会社、2004年11月、ｐ．25−27
【特許文献１】特開平８−２８７６９７号公報
【特許文献２】特開２００４−２０６３８１号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示されている技術は、電源切断等の不具合によって書込が中断して終了した場合でも、復帰後に各参照データを参照することにより、不具合の発生直前に最後に正しく書き込まれたブロックのデータを利用できるという利点がある。しかし、この技術では、書込対象となるデータが分断して書き込まれている場合には、その整合性をとるための付随的な処理が発生する。不揮発性メモリへのデータの書込はブロック単位の追記（その前に消去を伴う）になるので、整合性チェックを正確に行わないと、書込可能な領域を無駄に消費してしまうためである。このような問題は、特許文献２に開示されている技術についても同様に生じる。また、分割されるブロックが一定サイズであるのに対し、書込対象となるデータのサイズは不定なので、この付随的な処理を正しく行うことも困難となる。
【０００６】
本発明は、このような問題を解消するために、不定サイズのデータの書込をアトミックに操作することを保証するメモリアクセス技術を提供することを目的とするものである。
【課題を解決するための手段】
【０００７】
本発明は、メモリアクセス制御方法、この方法の実施に適したメモリ制御装置およびコンピュータプログラムを提供する。
本発明のメモリアクセス制御方法は、所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスを制御する装置が実行する方法であって、書込対象となる実データを取得し、取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む段階と、前記実データについての前記ヘッダ領域を参照し、当該ヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記データ領域に既に書き込まれているすべての実データを無効データとして扱う段階とを有する方法である。
【０００８】
ある実施の態様では、前記第１フラグ情報は、確保した書込単位の数を最大値とするシーケンス番号を含んでおり、前記装置は、前記実データの前記データ領域への正常な書込が進む度に、最初の書込単位を起点とし、最後の書込単位であることを表す数値を終点として、前記シーケンス番号を逐次小さい値に更新し、更新したシーケンス番号を当該書込単位の第１フラグ情報として前記ヘッダ領域に書き込む。
【０００９】
また、他の実施の態様では、前記第２フラグ情報は、書込単位毎に、その直前の書込単位を識別するための識別情報と、前記実データが書き込まれた位置を表す論理アドレスとを含んでおり、前記装置は、前記第１フラグ情報の前記ヘッダ領域への書込と、前記実データの前記データ領域への書込とがいずれも正常に実行されたときに前記第２フラグ情報を生成し、この第２フラグ情報を当該第１フラグ情報とペアで参照される領域に書き込む。
【００１０】
また、他の実施の態様では、前記装置は、前記無効データが書き込まれているデータ領域および前記ヘッダ領域の書込状態を保持したまま、書込対象となる新たな実データを取得し、取得した新たな実データのサイズを書き込むための前記データ領域を新たに確保する。この場合、前記装置は、前記保持してあるデータ領域および前記ヘッダ領域の書込状態を、一定の消去条件を満たしたときに、一括して消去することにより、書込のための消去回数を減らすことができる。
【００１１】
本発明のメモリ制御装置は、所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスを制御するメモリ制御装置であって、書込対象となる実データを取得する実データ取得手段と、取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む書込手段と、前記実データについての前記ヘッダ領域を参照し、当該ヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記データ領域に既に書き込まれているすべての実データを無効なデータとして扱う読込手段とを有する装置である。
【００１２】
本発明のコンピュータプログラムは、所定のデータサイズを１回の書込単位とするデータ領域と、このデータ領域からのデータ読込時に参照されるヘッダ領域とを有するメモリへのアクセスが可能なコンピュータを、  書込対象となる実データを取得する実データ取得手段、取得した実データのサイズに応じて１又は複数の書込単位分のデータ領域を前記メモリにおいて確保するとともに、確保した書込単位分のデータ領域を前記実データの最初のものから最後のものまでシーケンシャルに関連付け、当該実データについて何番目の書込単位かを表す第１フラグ情報を前記ヘッダ領域に書き込んだ後、前記データ領域に対して当該書込単位の実データの書込を行い、該実データの書込が正常に終了したことを検知したときは、書込終了を表す第２フラグ情報を前記第１フラグ情報と関連付けて前記ヘッダ領域に書き込む書込手段、および、前記実データについての前記ヘッダ領域を参照し、当該ヘッダ領域に前記第２フラグ情報が書き込まれておらず、あるいは前記第２フラグ情報が書き込まれていても前記第１フラグ情報が最後の書込単位のものでない場合は、前記データ領域に既に書き込まれているすべての実データを無効なデータとして扱う読込手段として機能させるものである。
【発明の効果】
【００１３】
本発明によれば、書込対象となるデータに関して、データ領域およびヘッダ領域への書込がすべて正常に完了しない限り、読込時に、それまで書き込まれたのすべてを無効データとして扱われるため、従来技術のように、不具合発生の前後におけるデータの整合性をとるための付随的な処理がまったく不要になる。これにより、不具合発生を考慮した不揮発性メモリへの書込のためのコスト上昇を効果的に抑えることができる。
【発明を実施するための最良の形態】
【００１４】
図１は、本発明の実施の形態例となるメモリ制御装置の構成例を示す図である。このメモリ制御装置１は、プロセッサ２と、本発明のコンピュータ・プログラムを格納したプログラムメモリ３と、揮発性メモリであるワーキングメモリ４とを含み、プロセッサ２が、コンピュータ・プログラムをワーキングメモリ４に展開し、これを実行することにより、データバス６を介して接続された不揮発性メモリ５に対して特徴的なメモリアクセス制御を行う機能、すなわち、実データ取得手段、書込手段および読込手段を実現する。ワーキングメモリ５には、一時的なデータの保持を行うバッファも形成される。不揮発性メモリ５は、ＥＥＰＲＯＭ、フラッシュメモリなど、不揮発のメモリ領域を確保できるメモリ媒体であり、アドレス体系を持ち、レジストリのようなＩＤ又はラベル（ともに識別情報の一種）で管理可能なものである。
【００１５】
なお、以後の説明では、書込対象となるデータを、アプリケーションやライブラリ等の上位側から論理アドレスのアドレス体系と共に取得し、このデータを物理アドレスを持った不揮発性メモリ６に書き込むことを前提として説明するが、物理アドレスを、ＩＤ又はラベルに置き換えることも可能である。
【００１６】
また、以後の説明では、書込単位となる複数の書込領域のグループのうち、最小単位のグループをエントリ、複数のエントリのグループをブロックと呼ぶ。複数のエントリは、連続するアドレスによりシーケンシャルに関連付けられている。
【００１７】
エントリにおけるシーケンシャルの関連付けは、例えば、確保したエントリの数を最大値とするシーケンス番号を割り当て、エントリへの正常な書込が進む度に、最初のエントリを起点とし、最後のエントリであることを表す数値を終点として、シーケンス番号を逐次小さい値に更新し、更新したシーケンス番号を当該エントリのフラグ情報としてヘッダブロック（エントリ）に書き込むことにより行う。複数のブロック間についても同様の手順で関連付けを行う。
【００１８】
メモリ制御装置１は、データを保存する際に、常に、不揮発性メモリ５にデータが正しく書き込めたか、書き込めなかったかのどちらかになることを保証する。つまり、不揮発性メモリ５に中途半端に書き込めた状態に見えないようにする。従来、アトミックに書き込める単位が例えば１〜４バイト単位であるなら、４バイトまでのデータについては、上記の保証は可能であったが、１６バイト、３２バイト、あるいはそれ以上のデータについては、上記の保証はできなかった。
【００１９】
＜不揮発性メモリの構造＞
不揮発性メモリ５の構造例を図２に示す。
不揮発性メモリ５は、複数のブロックで構成される。すなわち、初期データ用の初期データブロック５１、管理領域ブロック５２及びデータ書込用の実データブロック５３を有している。これらのブロック５１〜５３は、例えばメモリ初期化時、あるいは、再構築時に、メモリ制御装置１により形成される。
【００２０】
初期データブロック５１は、不揮発性メモリ５に初期に書き込む初期データのサイズに応じて、例えば２ブロック分（例えば、３２ブロックの場合、０〜３１の番号で識別される個々のブロックのうち、０，１の２つのブロック）を確保する。初期データは、原則として１度だけ書き込まれるデータであり、既に書き込まれているデータを読み込むプログラムによってダイレクトに参照されるデータである。
【００２１】
管理領域ブロック５２には、交互に使用する２ブロック（例えば、２，３の２つのブロック）を割り当てる。この管理領域ブロック５２は、実データブロック５３が、現在、どのようなブロック構成になっているかを示す管理情報を書き込むためのブロックである。
【００２２】
実データブロック５３は、ヘッダブロックとデータブロックのいずれかを任意に選択することができる。
ヘッダブロックは、どのデータブロックのどのアドレスにどのデータが存在し、その書込状態がどのようになっているかを示すヘッダ情報を書き込むためのブロックである。データブロックは、メモリ制御装置１が外部（アプリケーション等）より取得し、装置内で実際に扱うデータ（実データという）を書き込むためのブロックである。
【００２３】
なお、管理領域ブロック５２及び実データブロック５３は、それぞれ複数のエントリを有する。エントリは、実データブロック５３の場合、所定のデータサイズを１回の書込単位とする領域である。エントリおよび他のブロックがシーケンシャルに関連付けられていることは、上述の通りである。図２の例では、管理領域ブロック５２についてのエントリ５２１と、実データブロック５３についてのエントリ５３１とが示されている。
【００２４】
実データブロック５３におけるデータブロック、ヘッダブロック及び管理領域ブロックの割当例を図３に示す。データブロックは、図上段に示すように、本例では、１６バイト固定長とする。ヘッダブロックは、図中段に示すように８バイト固定長とする。ヘッダ情報は、４バイトのスタートマーク領域（StartMark：ＳＭと略する）と、４バイトのエンドマーク領域（EndMark：ＥＭと略する）とに書き込む。書込は、ＳＭ、実データ、ＥＭの順に行う。ＳＭに書き込む情報が第１フラグ情報、ＥＭに書き込む情報が第２フラグ情報となる。このような順番で書込を行うことにより、実際に実データがデータブロックに書き込まれたか書き込まれないかは、ＳＭおよびＥＭへのヘッダ情報の書込が正常に行われたどうかによって、容易に判別することができる。
【００２５】
ＳＭは、フラグ（１バイト）、シーケンス番号（１バイト）、物理アドレスのブロック番号（１バイト）、エントリ位置（１バイト）の４バイトで構成される。フラグとシーケンス番号は、あるアドレスへの複数回にわたるデータの書込があったときに、これらがシーケンシャルにすべて行われたことを保証するために使用する情報である。従えば２５６バイトの書込があったときは、個々のデータブロックが１６バイト固定長であるために１６回に分けて書込を行うことになる。このとき、１６回の書込がシーケンシャルにすべて行われたことを保証するためにフラグとシーケンス番号が使用される。
【００２６】
各回の書込単位が分割されたシーケンスの何番目なのかを表すのがシーケンス番号である。シーケンシャル番号は、最初のエントリが最大値で、最後のエントリが０にされる。フラグには、シーケンス番号が有効であることを示す「ＳＥＱ（フラグ「Ｓ」と表記する場合がある）」と、最初のシーケンス番号を示す「ＴＯＰ_ＳＥＱ（フラグ「ＴＳ」と表記する場合がある）」とが設定される。
書き込まれているデータの検索（読込）は、最新エントリ、つまり最後のエントリから開始される。シーケンス番号は、書込が進むにつれて小さい値となり、最後は０となる。従って、検索時に、フラグに「ＳＥＱ」があり、且つ、シーケンス番号が最後を示す「０」であれば、それ以降に続くフラグ「ＴＯＰ_ＳＥＱ」までの実データは、正しくデータブロックに書き込まれて、有効な書込状態であることを示す。逆に、検索（読込）時に、フラグに「ＳＥＱ」があり、且つ、シーケンス番号が「０」以外であれば、それ以降に続くフラグ「ＴＯＰ_ＳＥＱ」までの実データは無効、つまり無いものとして扱う。
【００２７】
但し、アプリケーションからの要求によって無効として扱うだけで、これをログとして別途読み出すことは可能である。そのため、メモリ制御装置１は、無効データが書き込まれているデータブロックおよびヘッダブロックの書込状態を保持したまま、書込対象となる新たな実データを取得し、取得した新たな実データのサイズを書き込むためのデータブロックおよびヘッダブロックのエントリを新たに確保し、保持してあるデータブロックおよびヘッダブロックの書込状態を、一定の消去条件を満たしたとき、例えば、各ブロックの再構築の条件を満たすとき、あるいはアプリケーションからの指示を受け付けたときに、一括して消去するようにしている。これにより、何らの機能を新たに設けなくとも、不具合解析用のログとして利用することができる。
【００２８】
物理アドレスのブロック番号は、対象となるデータブロックが何番目のブロックかを識別するための番号であり、エントリ位置は、そのブロックのエントリが何番目のものかを示している。ブロック番号は、２５６ブロックの場合、例えば「0」〜「255」のいずれかとなる。エントリ位置は、データ長が１６バイト固定で１ブロックが２ｋＢとして、「0」〜「127」のいずれかである。このブロック番号とエントリ位置が、実際にデータを書き込む物理アドレスに対応したものとなる。
【００２９】
ＥＭは、同一論理アドレスの直前のエントリ位置（２バイト）、論理アドレス（２バイト）の４バイトで構成される。直前のエントリ位置は、最新に書き込まれたデータを特定するための情報である。論理アドレスは、１６バイトアライメント（固定長）であるが、ある論理アドレスにデータの書込を行うときに、その論理アドレスのデータを読み込み、新しいデータで書き込む。これにより、その論理アドレスの最新データは、最後に書き込まれたデータだけを読み込めば良いことになる。この最後に書き込まれたデータのエントリ位置が、次にその論理アドレスに書き込まれるときの「直前のエントリ位置」となる。
【００３０】
ＳＭ及びＥＭをこのように構成することにより、読込時に、そこに書き込まれている情報を参照するだけで、実データブロックへのデータの書込が正常に行われているかどうかを容易かつ迅速に判別することができる。
【００３１】
管理領域ブロック５２において、「ブロック番号」は、使用している実データブロックがどれかを識別するためのブロック番号である。ブロック番号は、シーケンシャルに関連付けられている。また、そのブロックが現在どのような状態かを示すのがフラグである。フラグは、ヘッダブロックとして使用されていることを示す「ヘッダ」、データブロックとして使用されていることを示す「データ」である。ブロック番号は、空きブロックの中から選択される。空きブロックは、消去済みであったときに空きブロックと判定される公知の機能を利用して判定する。
【００３２】
＜動作＞
次に、メモリ制御装置１の動作を具体的に説明する。
１．書込処理（概要）
まず、書込処理の概要を説明する。メモリ制御装置１は、書込処理を、空き領域を有するデータブロックの探索、そのデータブロックの書込領域を管理するヘッダブロックへのＳＭの情報書込、そのデータブロックへの実データの書込、並びに、ヘッダブロックへのＥＭの情報書込の順に行う。
【００３３】
例えば、あるデータブロックの３００２Ｈのアドレスに、３バイトの実データ（１１Ｈ、１２Ｈ、１３Ｈ）が書き込まれた状態を図４に示す。メモリ内の数値は、便宜上、Ｂｉｇ  ｅｎｄｉａｎで記述されている（以下、同様とする）。これらの実データを「Ｄ１」とする。ヘッダブロックにＥＭがあることから、これらのデータＤ１は、正常に書き込まれていることを示す。図４の例では、ＳＭの欄には、Ｄ１についてフラグ設定無し（分割する必要がない）を表す「０」およびシーケンシャル番号「０」が示されている（物理アドレスについては省略）。ＥＭについては、同一論理アドレスの直前のエントリ位置は「なし」であり、書き込まれている論理アドレスは「0X3000」（３０００Ｈの意）となる。なお、図４では、データブロックとヘッダブロックとの関係だけを示し、管理領域ブロック５２の内容については省略してある（以下、同様とする）。
【００３４】
図４の状態で、同じデータブロックの３００９Ｈのアドレスに１バイトの実データ（５５Ｈ）を書き込んだ状態を図５に示す。不揮発性メモリへの書込なので、１６バイト長毎の追記となる。すなわち、データブロックには、もう一つの１６バイト分の領域に上記の３バイトの実データと今回の１バイトの実データとが書き込まれる。これらの実データを「Ｄ２」とする。ヘッダブロックにＥＭがあることから、この実データＤ２も、正常に書き込まれていることを示す。ＥＭのうち、同一論理アドレスの直前のエントリ位置はＤ１の状態での論理アドレスとなり、書き込まれている論理アドレスは「0X3000」となる。
【００３５】
上記の実データＤ１，Ｄ２の書込後、同じデータブロックの３０２０Ｈに１バイトの実データ（７７Ｈ）を書き込んだ状態を図６に示す。このときは、アライメントアドレスが３０２０Ｈの１６バイト分の先頭領域に今回の１バイトのデータが書き込まれる。この実データを「Ｄ３」とする。ヘッダブロックにＥＭがあることから、この実データＤ３も、正常に書き込まれていることを示す。ＥＭのうち、同一論理アドレスの直前のエントリ位置は「なし」であり、書き込まれている論理アドレスは「0X3020」となる。
【００３６】
２．読込処理
書込処理に際しては、既にデータが書き込まれているデータおよび情報の読込処理が先行する。本実施形態による読込処理では、既に書き込まれているデータ、情報が有効かものか無効なものかの判定を伴うことを特徴の一つとしている。
以下、この読込処理を、図７の手順説明図を参照して説明する。
【００３７】
メモリ制御装置１は、データの読み込み要求を行うプログラムが指定する読み込むデータのアドレスの入力（ステップＳ１０１）をもとに、ブロック情報を計算する（ステップＳ１０２）。ここにいうブロック情報は、管理領域（２）及びヘッダブロック（４）のエントリから特定される情報（どのブロックが何に使われているか等）である。
【００３８】
その後、アドレスのアライメント（a_addr）、オフセット（offset）を計算する（ステップＳ１０３）。アドレスのアライメント（a_addr）は、アドレス（addr）の１６バイトアライメントである。例えば、読み込むデータの最初のアドレス（addr）が［0X3612］のとき、アドレスのアライメント（a_addr）は［0X3610］であり、差分である「２」がオフセット（offset）となる。このステップＳ１０３により計算されたアドレスのデータを読み込む（ステップＳ１０４）。必要なデータ分をワーキングメモリ３のバッファ（buf）に保存し（ステップＳ１０５）、残りサイズを計算する（ステップＳ１０６）。ここにいう必要なデータ分は、「１６−offset」かサイズ（size）のうち小さい方の値である。残りサイズは、サイズ（size）から必要なデータ分を差し引いた値となる。これを新たなサイズ（size）としてバッファ（buf）に記憶する。残りサイズがあるときは、次のアライメントアドレスを計算し、オフセット（offset）を「０」にして、ステップＳ１０４の処理に戻る（ステップＳ１０７：Yes、Ｓ１０８）。残りサイズが無いときは、処理結果である読み出しデータを要求元に返し、終了する（ステップＳ１０７：No、Ｓ１０９）。
【００３９】
上記ステップＳ１０４の内容を、図８を参照して、より詳細に説明する。
メモリ制御装置１は、該当のアライメントアドレスのデータを読み込み、フラグに関する変数fragsを「０」にセットする（ステップＳ２０１，Ｓ２０２）。その後、ヘッダブロックの最新エントリを検索する（ステップＳ２０３）。この処理は、具体的には、ヘッダブロックの最後のエントリから、逆順に検索し、初めてＳＭ又はＥＭが書かれているエントリを見つけ出す処理である。
メモリ制御装置１は、このエントリにおけるＥＭの論理アドレスが正しく書かれているかどうかを判定する（ステップＳ２０４）。正しく書き込まれていない場合であって、調べるエントリがまだある場合は、１つ前のエントリに移動する（ステップＳ２０４：No、Ｓ２０５：Yes、Ｓ２０６）。正しく書き込まれておらず、調べるエントリもない場合は、必要なデータ分をすべて有効データが存在しないことを示す「ＦＦＨ」とし（ステップＳ２０４：No、Ｓ２０５：No、Ｓ２０７）、元の処理に戻る（ステップＳ２０８）。
【００４０】
他方、ステップＳ２０４の判定処理において、ＥＭの論理アドレスが正しく書かれている場合は、書き込んだデータが有効なデータか無効データかを検知する処理を行う（ステップＳ２０４：Yes）。
【００４１】
すなわち、メモリ制御装置１は、ＳＭにフラグＳが設定されているかどうかを判定し、設定されていない場合は、アドレスのアライメント（a_addr）と論理アドレスとが一致し、かつフラグ領域の変数flagsにフラグＳだけがセットされていないかどうかを判定する（ステップＳ２１０）。セットされていない場合は、必要なデータ分を結果とし、ステップＳ２０８の処理に移る（ステップＳ２１０：Yes、Ｓ２１１）。セットされている場合は、ＳＭにフラグＴＳが設定されているかどうかを判定する（ステップＳ２１２）。セットされている場合は、変数flagsを「０」にしてステップＳ２０５の処理に移る（ステップＳ２１２：Yes、Ｓ２１３）。設定されていない場合は、直ちにステップＳ２０５の処理に移る。
【００４２】
ステップＳ２０９の判定処理において、フラグＳが設定されている場合は、ＳＭのシーケンス番号を調べ、「０」であれば有効処理（ステップＳ２１４：Yes）、「０」でない場合は無効処理（ステップＳ２１４：No）と判定する。無効処理の場合は、変数flagsにフラグＳを追加し、ステップＳ２１０の処理に移る（ステップＳ２１５）。他方、有効処理の場合は、変数flagsにフラグＳとフラグＴＳとを追加し、ステップＳ２１０の処理に移る。ここで「追加する」とは両者の論理和をとることをいう。
【００４３】
３．効用
以上の処理により、実データの書込が正常に終了しているかどうかは、ＳＭおよびＥＭのヘッダ情報が正常に書き込まれたかどうかで判定することができる（ステップＳ２０４参照）。すなわち、ＥＭの論理アドレスの書込は、ヘッダブロックへのＳＭの書込、データブロックへの実データの書込の後に行われるので、ＳＭの書込途中、ＳＭだけが書き込まれた状態、実データの書込途中、ＳＭおよび実データが書き込まれた状態、ＥＭの書込途中、つまり、ＥＭの論理アドレスが正しく書き込まれていない状態は、いずれも書込が未完了の状態とみなすことができる。
また、エントリは１６バイトアライメントなので、論理アドレスは必ず「XXX0H」の形で表される。従って、ＥＭの論理アドレスが「XXX0H」以外、例えば「XXXFH」の形で書き込まれている場合、書込は何らかの不具合で異常終了したことになる。
従って、ＳＭおよびＥＭの情報、特にＥＭの論理情報を参照することにより、ある複数バイトのデータが正常に書き込めたか、書き込めなかったかのどちらかを必ず保証することができる。書き込むデータのサイズも、１バイト、４バイトのような固定的なものである必要がない。任意のサイズとすることができる。
【００４４】
例えば、データブロックの５０００Ｈのアドレスに、下記のデータを書き込もうとする際に、書込途中で電源切断があったとする。
「www.test1.aaa.co.jp/test123456.html」
従来技術の場合は、中途半端なサイズでの書込状態があり得るが、本実施形態のメモリ制御装置１では、このような事態が発生しない。このことを、具体的に説明する。
図９は、上記データが正常に書かれた状態を示す。このデータを「Ｄａ」とする。Ｄａは３３バイトのデータなので、１６バイトアライメントの下では３回の書込（１６バイト、１６バイト、１バイトの順）が行われることになる。正常であれば、図９のようにＳＭとＥＭとのペアは３つ存在し、かつ、最初のエントリのＳＭのフラグ（ＴＳ、Ｓ）およびシーケンス番号（２）とそれ以外のエントリのＳＭのそれらとの間には、必ず違いがある。特にシーケンス番号は、「２」，「１」，「０」のように連続して減少しなければならず、シーケンス番号が「０」のときのフラグは「Ｓ」でなければならない。
【００４５】
一例として、データブロックに、３３バイト中の２８バイトだけ書き込んだ直後に電源切断があったときの状態を図１０に示す。
図７のステップＳ２０３の処理によれば、この状態での最新エントリは、２番目のエントリ（図１０の（２）部分）である。しかし、このエントリ（２）のＥＭの論理アドレスは正しくないので、書かれていないエントリとみなされる（ステップＳ２０４〜Ｓ２０６参照）。１つ前のエントリ（図１０の（１）の部分）に戻ると、ＥＭの論理アドレスは正しいが、フラグが「Ｓ」でシーケンス番号が「０」という条件を満たさないので、このエントリに対応するデータブロックのデータは無効データであるとして、無効処理に移る（図７のステップＳ２１５参照）。無効データは、ＳＭにフラグＴＳが表れるエントリまでである。図１０の例では、エントリ（１）自身までということになる。つまり、これまで書かれた実データは、読込時にすべて無いものとみなされる。
【００４６】
もう一つの例として、データブロックに３３バイトのすべてを書き込んだ後、ヘッダブロックにＥＭを書き込もうとした時点で電源切断があった状態の例を図１１に示す。最新エントリは、３番目のエントリ（図１１のエントリ（３）部分）である。このエントリ（３）はＥＭの論理アドレスが正しくないので、書かれていないエントリとみなされることは上述の場合と同じである。１つ前のエントリ（図１１のエントリ（２）部分）に戻ると、このエントリ（２）は、ＥＭの論理アドレスは正しいが、ＳＭのシーケンス番号が「０」ではないので、無効処理に移る。無効データは、ＳＭにフラグＴＳが現れるエントリである最初のエントリ（図１１のエントリ（１）部分）である。つまり、これまで書かれた実データは、読込時にすべて無いものとみなされる。
【００４７】
このように、書込対象となる実データのサイズに関わらず、そのすべてがデータブロックに書き込まれ、かつ、ヘッダブロックのＥＭの論理アドレスも正しく書き込まれない限り、有効なデータとして扱われないので、書込前後のデータの整合性を確実にとることができる。
【００４８】
ここで、既に不揮発性メモリ５に書き込まれたデータについて、無効（無いもの）とみなされたデータおよびヘッダ情報が書き込まれた後の書込処理について触れておく。メモリ制御装置１では、このようなデータおよびヘッダ情報が書き込まれた領域は、所定の条件が満たされたとき、例えばブロックの再構築、ないし初期化がなされるまで、そのままの状態とし、新たなデータの書込が発生したときは、残りの空いている領域にそれを書き込むようにする。
【００４９】
例えば、５０００ＨのアドレスへのデータＤａの書込に失敗したためにメモリ構造を図１０の状態にしたまま、５００２Ｈのアドレスに、上述したＤ１、すなわち３バイトのデータ（１１Ｈ、１２Ｈ、１３Ｈ）を新たに書き込む場合の例を説明する。
図１２は、Ｄ１をデータブロックおよびヘッダブロックに正常に書き込んだ状態を示す図である。５０００Ｈのアドレスから１６バイトのデータは、図４に示したものと同じようになり、ＳＭには、実データＤ１についてフラグ設定無しを表す「０」およびシーケンシャル番号「０」、ＥＭについては、同一論理アドレスの直前のエントリ位置は「なし」で、書き込まれている論理アドレスは「0X5000」となる。
【００５０】
このように、本実施形態のメモリ制御装置１では、書込時には、取得した実データのサイズに応じて１又は複数のエントリを不揮発性メモリ５において確保するとともに、確保したエントリを、実データの最初のものから最後のものまでシーケンシャルに関連付け、その実データについて何番目のエントリかを表す情報をＳＭに書き込んだ後、データブロックへの実データの書込を行い、実データの書込が正常に終了したことを検知したときは、書込終了を表すフラグ情報をヘッダブロックのＥＭに書き込み、読込時は、実データについてのヘッダ情報（ＳＭ／ＥＭに書き込まれている情報）を参照し、ＥＭが書き込まれておらず、あるいはＥＭが書き込まれていてもＳＭが最後のエントリのものでない場合は、既に書き込まれているすべての実データを無効データとして扱うようにしたので、実データのサイズが不定であっても、ヘッダ情報を含むすべての書込が正常に完了しない限り、読込時に、実データが無効データとして扱われるため、不具合発生の前後における実データの整合性をとるための付随的な処理がまったく不要になる。つまり、不定サイズの実データの書込をアトミックに操作することができる。
【００５１】
不揮発性メモリ５には、データブロックおよびヘッダブロックの書込状態が、一定の消去条件を満たして一括して消去されるまで保持されているので、例えば、既存のファイルシステムにおけるジャーナリングのように、データの書込において、別途ログを残すことなく、また、一般的なデータベース管理システムが有するロールバックやロールフォワードのような仕組みを必要とするまでもなく、実データがすべて正常に書き込まれたのか、あるいは、すべて書き込まれなかったのか、書き込まれなかったときはどの時点で書込に失敗したのかという情報を知ることができる。
【００５２】
なお、本実施形態では、エントリとブロックの２階層のグループで実データおよびヘッダ情報の書込を行う場合の例を説明したが、３階層であっても良い。あるいは、エントリ単位であっても良い。
【産業上の利用可能性】
【００５３】
本発明は、不揮発性メモリをデータ記録媒体として使用する簡易タイプの情報処理装置、例えばパーソナルコンピュータ、ディジタルカメラ、携帯電話端末等において、広く利用することができる。
【図面の簡単な説明】
【００５４】
【図１】本発明の実施の一形態となるメモリ制御装置の全体構成図。
【図２】本実施形態によるメモリ構造例を示す図。
【図３】実データブロックにおけるヘッダブロック及び管理領域ブロックの割当例を示す図。
【図４】あるデータブロックに、３バイトの実データが書き込まれた状態を示す図。
【図５】図４の状態で、同じデータブロックの他のアドレスに１バイトの実データを書き込んだ状態を示す図。
【図６】図５の状態後、同じデータブロックの他のアドレスに１バイトの実データを書き込んだ状態を示す図。
【図７】読込処理の手順説明図。
【図８】図７のステップＳ１０４の内容の詳細手順説明図。
【図９】実データＤａが正常に書かれた状態を示す図。
【図１０】データブロックに３３バイト中の２８バイトだけ書き込んだ直後に電源切断があったときの状態を示す図。
【図１１】データブロックに３３バイトのすべてを書き込んだ後、ヘッダブロックにＥＭを書き込もうとした時点で電源切断があった状態を示す図。
【図１２】無効データについて書き込まれている状態で、実データＤ１をデータブロックに正常に書き込んだ状態を示す図。
【符号の説明】
【００５５】
１・・・メモリ制御装置、２・・・プロセッサ、３・・・プログラムメモリ、４・・・ワーキングメモリ、５・・・不揮発性メモリ、６・・・データバス、５１・・・初期データブロック、５２・・・管理領域ブロック、５３・・・実データブロック、５２１，５３１・・・エントリ
【図１】
0005273780.tif 000002
【図２】
0005273780.tif 000003
【図３】
0005273780.tif 000004
【図４】
0005273780.tif 000005
【図５】
0005273780.tif 000006
【図６】
0005273780.tif 000007
【図７】
0005273780.tif 000008
【図８】
0005273780.tif 000009
【図９】
0005273780.tif 000010
【図１０】
0005273780.tif 000011
【図１１】
0005273780.tif 000012
【図１２】
0005273780.tif 000013