説明

フラッシュ消去可能なプログラマブル・リードオンリメモリを用いてファイルシステムをマネージする方法及びシステム

【課題】1以上の論理ブロックを有する一回書込み多数回読取りメモリデバイスを備えたコンピュータシステム内でエラーを回復する方法を提供する。
【解決手段】(a)各ブロックにデータ領域を画成し(データ領域はデータ領域エリアに論
理的に分割)、(b)各ブロックにブロック構造体を画成し(ブロック構造体はヘッダと割
当てテーブルを有し、ヘッダはブロックに特定情報を含み、割当てテーブルは、データ領域エリアに対応するエントリと、対応するデータ領域エリアに関連した情報を含む)、(c)割当てテーブルエントリを割当て、(d)データ領域エリアを割当て、(e)割当てられたデ
ータ領域エリアに関連したデータを、割当てられた割当てテーブルエントリに書込み、(f)割当てられたデータ領域エリアにデータを書込み、(g)書込む間にエラーを検出し、(h)
エラー検出時に割当てテーブルエントリを割当て解除状態にセットし、エラーが検出されなくなるまで上記段階(c)、(d)、(e)、(f)を繰り返す方法。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、一般に、ファイルをマネージするためのコンピュータシステムに係り、より詳細には、フラッシュ消去可能なプログラマブル・リードオンリメモリ(FEProm)に記憶されたファイルをマネージするための方法及びシステムに係る。
【背景技術】
【0002】
コンピュータシステムは、一般に、揮発性及び不揮発性の両方の記憶装置における情報の記憶をサポートする。揮発性記憶装置と不揮発性記憶装置の相違は、揮発性記憶装置から電源が切断されたときに情報が失われることである。これに対して、不揮発性記憶装置から電源が切断されたときには、情報が失われない。従って、不揮発性記憶装置に情報を記憶した場合には、たとえコンピュータシステムの電源が切られていても、ユーザはあるときに情報を入力しそしてその後に情報を検索することができる。又、ユーザは、不揮発性記憶装置をコンピュータから切断しそしてその記憶装置を別のコンピュータに接続して、その別のコンピュータが情報をアクセスするようにすることができる。
【0003】
不揮発性記憶装置に記憶された情報は、一般に、ファイルに編成される。ファイルとは、関連情報を収集したものである。時間の経過と共に、コンピュータシステムは、記憶装置の容量にもよるが、記憶装置に何百、何千のファイルを記憶することができる。情報を記憶することに加えて、コンピュータシステムは、典型的に、ファイルの情報を読み取ったり、修正したり、削除したりすることができる。コンピュータシステムは、記憶、読み取り、修正及び削除を効率的に行えるように記憶装置にファイルを編成することが重要である。
【0004】
一般にコンピュータのオペレーティングシステムの一部分であるファイルシステムは、記憶装置上のファイルを管理する助けをするために開発されたものである。1つのこのようなファイルシステムが、マイクロソフト・コーポレーションによりそのディスクオペレーティングシステム(MS−DOS)として開発されている。このファイルシステムは、ファイルを記憶するためにハイアラーキ解決策を使用している。図1は、記憶装置のディレクトリ構造体を示している。これらのディレクトリはファイルの論理グループを含む。これらのディレクトリは、引出しの折り畳み器が引き出し内にペーパを編成していくのと同様にファイルを編成する。DOS、WORD、DAVID及びMARYと示されたブロックは、ディレクトリを表しており、そしてAUTOEXEC.BAT、COMMAND.COM、FORMAT.EXE、LETTER2.DOC、LETTER.DOCと示されたブロック及びLETTER1.DOCと示された2つのファイルは、ファイルを表している。このディレクトリ構造では、ユーザが関連ファイルをそれら自身のディレクトリに入れることによりファイルを編成することができる。この例において、WORDというディレクトリは、ワードプロセッシングプログラムWORDによって発生された全てのファイルを含む。このディレクトリWORDの中には2つのサブディレクトリDAVID及びMARYがあり、これらは、WORDファイルを、Davidにより開発されたもの及びMaryにより開発されたものへと更に編成する上で助けとなるものである。
【0005】
従来のファイルシステムは、不揮発性記憶装置の多数回書き込み機能の利点を取り入れている。多数回書き込み機能は、記憶装置上のいかなる情報ビットでも実質上無限の回数で1から0へそして0から1へ変更することができる。この機能では、ファイルを記憶装置に書き込みそしてファイルの幾つかのビットを変更することによりファイルを選択的に修正することができる。
【0006】
ディスクのような多数回書き込み能力を有する従来の記憶装置の欠点は、その速度が内部のコンピュータメモリの速度に比して遅いことである。これに対し、そのコンピュータメモリに勝るこれら記憶装置の利点は、不揮発性であること、コストが低いこと、容量が大きいことである。
【0007】
フラッシュEProm(FEProm)として知られている記憶装置は、内部コンピュータメモリの速度と、コンピュータディスクの不揮発性とが結合されたものである。この装置はEProm型(消去可能なプログラマブル・リードオンリメモリ)のデバイスである。FEPromの内容は、典型的なEPromと同様にデバイスに紫外線を照射するのではなく、入力にある電圧を印加することによって消去することができる。消去は、デバイス内の各ビットを同じ値にセットする。他のEPromと同様に、FEPromは不揮発性メモリである。FEPromは、その速度がコンピュータの内部メモリに匹敵する。最初と、消去後とに、FEPromの各ビットは1にセットされる。FEPromの特徴は、他のEPromと同様に、ビット値1を0に変更できるが、ビット値0は1に変更できないというものである。従って、データは、1から0へのビットの変更を行うようにEPromに書き込むことができる。しかしながら、いったんビットが0に変更されると、1に変更し直すことはできず、即ち全FEPromを全て1に消去しない限り1に戻すことができない。実際には、FEPromの各ビットは一度しか書き込むことができないが、次々の消去の間に何回も読み取ることができる。更に、FEPromの各ビットを消去して0にセットできるのは、ある限定された回数だけである。この限定された回数がFEPromの実効寿命を定める。
【0008】
FEPromをアクセスする典型的な時間は、アクセスの形式と多数の他のファクタとによって異なる。読み取りアクセス時間は数百ナノ秒の範囲であり、バイトを読み取る回数については制限がない。書き込みアクセス時間は、典型的に数十マイクロ秒の範囲である。書き込みアクセス時間は、バイトを消去した回数と、デバイスの温度と、FEPromのバイト密度とによって左右される。バイトを書き込む回数に理論的な制限はないが、消去の制限が実際上の書き込みの制限となる。FEPromの消去時間は数秒の範囲である。消去時間は、FEPromを消去した回数、デバイスの温度、及びFEPromのバイト密度とによって左右される。
【発明の概要】
【発明が解決しようとする課題】
【0009】
従来のファイルシステムは、記憶装置が多数回書き込み能力を有するものと仮定していたので、これらのファイルシステムは、実際上一回の書き込み能力しか持たないFEPromには不適である。従って、FEPromをベースとする記憶装置をサポートするファイルシステムをもつことが望ましい。このようなファイルシステムは、コンピュータシステムの速度と、コンピュータディスクの不揮発性とを有するものである。
【0010】
コンピュータディスクのような従来の記憶装置は、バイトでアドレスできるのではなくブロックでアドレスすることができる。バイトは、コンピュータの内部メモリのアドレス能力の単位であり、即ちコンピュータは一度に1バイト(典型的に8ビット)で書き込み又は読み取りすることができるのであって、それ未満ではできない。コンピュータがディスクに書き込んだりディスクから読み取ったりするときには、ブロックと称するバイトのグループで行わねばならない。ブロックのサイズは変えられるが、典型的には2の累乗である(128、256、512等)。例えば、ディスク上の1バイトだけを変更しようとする場合に、そのブロックサイズ内の全バイト数の書き込みを行わねばならない。これには、ディスクからコンピュータメモリへブロック全体を読み取り、1バイトを変更し(内部メモリはバイトでアドレス可能である)そしてそのブロック全体をディスクに書き込む
ことが含まれる。
【0011】
従来のファイルシステムは、ブロックに未使用の部分を残す状態でデータを記憶する。このファイルシステムは、一度に1つのファイルのみからのデータを所与のブロック内に記憶する。例えば、このファイルシステムは、1つのファイルからのデータをブロックの最初の50バイトには記憶せず、そして別のファイルからのデータを128バイトブロックの最後の78バイトには記憶しない。しかしながら、ファイルの長さがブロックサイズの偶数倍でない場合には、ブロック端のスペースが未使用となる。上記例において、ブロックの最後の78バイトは未使用となる。ディスクが4096といった大きなブロックサイズを使用するときには、4095バイトまでのデータが使用できないことになる。多数回書き込み能力を有していて数百万バイトを記憶できるようなディスクドライブではこのような未使用スペースが無視できる量であるが、多数回書き込み能力をもたず、しかも数百万バイトのデータを記憶する容量をもたない記憶装置では相当の量である。
【0012】
FEPromは、典型的な記憶装置に比して、ブロックアドレス式ではなくてバイトアドレス式である。従って、FEPromのバイトアドレス能力をサポートするファイルシステムをもつことが望まれる。
【0013】
又、FEPromは、ブロックで消去可能なフォーマットで編成することができる。ブロックで消去可能なFEPromは、個々に消去できる多数のブロック(典型的に16)を含んでいる。例えば、図6は、0から15まで番号が付けられた16個のブロックを有するブロック消去可能なFEProm301の概略図である。ブロックの各々は、他のブロックの内容に影響を及ぼすことなく個々に消去することができる。ブロック番号14のブロック302は、他のブロックのデータに影響を及ぼすことなく消去することができる。ブロック消去可能なFEPromをサポートするファイルシステムをもつことが所望される。
【0014】
そこで、本発明の目的は、ファイル記憶装置、特に、ブロック消去可能で且つフラッシュ消去可能なプログラマブル・リードオンリメモリにデータを記憶する方法を提供することである。
【0015】
本発明の別の目的は、ブロック消去可能なFEPromにおいてメモリを割り当てたり割り当て解除したりするコンピュータメモリマネージャを提供することである。
本発明の別の目的は、ブロック消去可能なFEPromにおいてブロックを消去した回数を追跡する方法を提供することである。
【0016】
本発明の更に別の目的は、メモリの割り当てを容易にするデータ構造体を備えたブロック消去可能なFEPromを提供することである。
本発明の更に別の目的は、データを記憶するためのブロックを割り当てる方法を提供することである。
【0017】
本発明の更に別の目的は、ブロック消去可能なFEPromにおいて割り当て解除されたスペースをリクレイミングする方法を提供することである。
本発明の更に別の目的は、ブロック消去可能なFEPromのためのファイルシステムを提供することである。
【課題を解決するための手段】
【0018】
本発明の上記及び他の目的は、以下の説明から明らかとなるように、ブロック消去可能で且つフラッシュ消去可能なプログラマブル・リードオンリメモリにおいてメモリをマネージするための方法及びシステムを提供することにより達成される。このシステムは、好
ましい実施例において、ブロックヘッダと、ブロック割り当てテーブルと、データ記憶エリアと、データを記憶すべきブロックを選択するためのブロック割り当てルーチンと、ブロック割り当てテーブルのエントリ及びデータ記憶エリアの一部分を選択するためのデータエリア割り当てルーチンと、データを記憶するための記憶ルーチンとを有したブロック消去可能なFEPromを具備している。又、このシステムは、好ましい実施例において、ブロック消去可能なFEPromのためのファイルシステムを実施するファイルマネージャを備えている。
【0019】
好ましい実施例において、本発明は、ブロック消去可能なFEPromのメモリをマネージする方法及びシステムを提供する。このシステムは、FEPromマネージャ及びファイルシステムとして説明する。FEPromマネージャは、FEPromのメモリの割り当てと割り当て解除とを管理する。ファイルシステムは、ハイアラーキ式のディレクトリシステムであり、FEPromマネージャを用いてメモリの割り当て及び割り当て解除を行う。或いは又、FEPromマネージャ及びファイルシステムは、ある最適化を達成するように一体化することができる。しかしながら、個別のFEPromマネージャを使用することによりFEPromは異なるファイルシステムからのデータや非ファイルシステムデータも記憶することができる。
【図面の簡単な説明】
【0020】
【図1】ディレクトリ及びファイルのサンプルハイアラーキ構造もしくはツリー構造の編成を示す図である。
【図2】図1の同じディレクトリ構造を示すリンクされたリスト構造体の図である。
【図3】図1の同じディレクトリ構造を表す別のリンクされたリスト構造体を示した図である。
【図4】ファイル名”\A\d.DAT”のファイルに対するリンクされたリストの構造を示す図である。
【図5】ファイル名”\A\d.DAT”のファイルに対する別のリンクされたリストの構造を示す図である。
【図6】本発明の好ましい実施例によるブロック消去可能なFEPromのレイアウトを示す図である。
【図7】本発明の好ましい実施例によるAdd Directoryルーチンを示す流れ線図である。
【図8】本発明の好ましい実施例によりディレクトリ構造に新たにディレクトリが追加される前後の図である。
【図9】本発明の好ましい実施例によりディレクトリ構造に新たにディレクトリが追加される前後の図である。
【図10】本発明の好ましい実施例によるAdd Fileルーチンを示す流れ線図である。
【図11】本発明の好ましい実施例によるExtend Fileルーチンを示す流れ線図である。
【図12】本発明の好ましい実施例によるExtend Fileルーチンを示す流れ線図である。
【図13】本発明の好ましい実施例を用いたサンプルディレクトリ及びファイルレイアウトを示す図である。
【図14】本発明の好ましい実施例によるUpdate Fileルーチンを示す流れ線図である。
【図15】本発明の好ましい実施例によるUpdate Fileルーチンを示す流れ線図である。
【図16】本発明の好ましい実施例により更新される前後のファイルのサンプル部分を示す図である。
【図17】本発明の好ましい実施例により更新される前後のファイルのサンプル部分を示す図である。
【図18】本発明の好ましい実施例によりファイルが更新された後のファイルのサンプル部分を示す図である。
【図19】本発明の好ましい実施例によりファイルが更新された後のファイルのサンプル部分を示す図である。
【図20】本発明の好ましい実施例によりファイルが更新された後のファイルのサンプル部分を示す図である。
【図21】本発明の好ましい実施例によるDel Directoryルーチンを示す流れ線図である。
【図22】本発明の好ましい実施例によるChange File Nameルーチンを示す流れ線図である。
【図23】名前を変化したファイルに対するディレクトリ構造の前後を表す図である。
【図24】本発明の好ましい実施例によるChange Attribute Dataルーチンを示す流れ線図である。
【図25】本発明の好ましい実施例によるChange Attribute Dataルーチンを示す流れ線図である。
【図26】本発明の好ましい実施例におけるブロックのレイアウトを示す図である。
【図27】好ましい実施例においてリクレイミングを行った後の図26のブロックのレイアウトを示す図である。
【図28】図30のサンプルに対するサンプルブロック割り当て構造及び領域を示す図である。
【図29】ハンドルの参照解除を示す図である。
【図30】図2のディレクトリハイアラーキの一部分に対するサンプルブロック割り当てを示す図である。
【図31】好ましい実施例における初期化プロセスを示す流れ線図である。
【図32】好ましい実施例におけるブロック割り当てルーチンを示す流れ線図である。
【図33】好ましい実施例における領域割り当てルーチンを示す流れ線図である。
【図34】好ましい実施例におけるブロックリクレイミングルーチンを示す流れ線図である。
【図35】Allocエントリのステータスを示す状態図である。
【図36】ブロックのステータスを示す状態図である。
【発明を実施するための形態】
【0021】
本発明のFEPromマネージャは、ブロック消去可能なFEPromにおいて自由スペースの割り当て、割り当てられたスペースの割り当て解除、及び割り当て解除されたスペースのリクレイミングを行う。図26に示す好ましい実施例では、FEPromの各ブロックが、ブロック割り当て構造体2302と、データ領域2303と、自由スペース2304とを含んでいる。ブロック割り当て構造体2302は、ヘッダ及び割り当てアレイを含んでいる。ヘッダは、ブロックの状態情報を含む固定長さの構造体である。割り当てアレイは可変長さであり、割り当てアレイのエントリはデータ領域を記述する。テーブルAは、ブロック割り当て構造体のデータ構造を示している。この構造体は、構造体変数の記述と共にCプログラミング言語フォーマットで示されている。アレイのAllocは、割り当てアレイであり、他の変数がヘッダを構成する。データ領域は、FEPromに記憶されたデータを保持する可変長さの領域である。自由スペース2304は、ブロック割り当て構造体又はデータ領域に割り当てられないスペースである。ブロック割り当て構造体2302及びデータ領域2303はブロックの両端に割り当てられる。領域が追加されるときには、ブロック割り当て構造体2302及びデータ領域が矢印2305及び230
6によって示されたように互いに向かって成長する。ブロック割り当て構造体のAllocエントリは、ブロックの対応領域に対するオフセット2310−2315を含んでいる。好ましい実施例においては、ブロック割り当て構造体が、その領域に記憶されたデータに対して特定のデータを含んでいる。
【0022】
テーブルA
データ構造体
struct BlockAllocation

struct

byte Status;
byte Offset[3];
word Len;
} Alloc [ ];
dword BootRecordPtr
dword EraseCount;
word BlockSeq;
word BlockSeqChecksum;
word Status;

定義
Alloc ブロック内の領域を定める可変長さアレイ構造体
Status 領域の状態
ビット#
5-2 1111 未使用
1011 中間状態
0111 自由
0011 割り当てられた
0001 割り当て解除された
0010 取って代わられた
0000 ゼロ
7-6 11 未使用エントリ
10 最終エントリ
00 非最終エントリ
Offset この領域のブロックの開始に対するオフセット
Len 領域の長さ( 単位バイト)
BootRecordPtr FEPromがファイル記憶装置として使用されるとき
に記録をブートするための処理
EraseCount ブロックを消去した回数
Blockseq FEProm内のブロックの論理シーケンス
BlockSeqChecksum ブロックシーケンス番号のチェック和
Status
ビット#
1-0 11 ブロックにないブート記録(FEProm がファイルシステム
データを含むとき)
10 ブロックのブート記録
00 取って代わられたブート記録
15-10 110000 レディ
0XXXXX QueuedForErasure
111111 消去された
111110 UpdateInProcess
111100 スペアブロック
111000 ReclaimationInProcess
000000 リアタイアされた
FEPromマネージャは、Allocエントリを追加し、自由スペース内の第1位置を指すように可変オフセットをセットし、変数Lenを領域の長さにセットし、そして割り当てられたことを指示するように変数Statusをセットすることによりブロック内のデータ領域を割り当てる。FEPromマネージャは、対応するAllocエントリにおける変数Statusを割り当て解除された状態にセットすることにより領域の割り当て解除を行う。割り当て解除されたスペースは一般に再割り当てには使用できない。というのは、非FNULL値にセットされているからである。割り当て解除されたスペースは、再割り当てされる前にFNULLにセットされる。割り当て解除されたスペースをFNULLにセットしそして割り当てに使用できるようにするプロセスは、ブロックリクレイミングである。割り当て解除されたスペースは、割り当てられた領域を第2のブロックにコピーしそして第2のブロックのAllocエントリを新たなオフセットを指すようにセットすることによりリクレイミングされる。ブロックのリクレイミングプロセスは、第2ブロックのAllocエントリがブロックヘッダに対しコピー元ブロックにあったのと同じ位置になるように確保する。FEPromマネージャは、論理ブロックシーケンス番号であるヘッダの変数BlockSeqを使用して、データの特定の論理ブロックを識別する。リクレイミング中に、ブロックがコピーされるときには、物理的なブロック番号が変化するが、論理的なブロックシーケンス番号は変化しない。
【0023】
FEPromマネージャは、領域のスタートアドレスではなくて割り当てられた領域に対するハンドルを与える。このハンドルは、2つの部分、即ち(1)物理的なブロックを間接的に参照する論理ブロックシーケンス番号と、(2)物理的なブロック内の領域を間接的に参照するAllocエントリに対するインデックスとを含んでいる。ハンドルは、論理的なブロックシーケンス番号に対応する物理的なブロックを決定しそしてハンドルのインデックス部分によって指示されたAllocエントリの変数Offsetをアクセスしてその変数Offsetを物理的なブロックのスタートアドレスに加えることにより参照解除される。この参照解除により領域のアドレスが形成される。ハンドルを使用すると、FEPromマネージャは、存在するかもしれないデータ領域へのリンクを調整せずにブロックをリクレイミングすることができる。更新しなければならないものは、メモリ内にあって論理ブロックシーケンス番号を物理的なブロックに対してマップする変換キャッシュ(以下で説明する)と、Allocアレイのオフセットだけである。ハンドルが参照解除されるときには、新たなオフセットを用いて正しいアドレスが形成される。図29は、9の論理ブロックシーケンス番号2502と、3のAllocインデックス2503とを有するハンドル2501の参照解除を示している。ブロック変換キャッシュ2504は、論理的なブロック番号を物理的なブロック番号に対してマップする。FEPromマネージャはキャッシュを維持する。ある物理的なブロックがブロックのリクレイミング中に別の物理的なブロックへ移動されるときには、FEPromマネージャは、論理ブロックシーケンス番号を新たな物理的ブロックにマップするように変換キャッシュを調整する。図29の例においては、論理ブロックシーケンス番号9が物理的ブロック14 2505へとマップされる。物理的なブロック番号14に対するAllocアレイは、ハンドル2501のAllocインデックス2503によって指示される。Alloc〔3〕エントリの変数Offsetは、物理的なブロック番号14 2505に領域3 2506のオフセットを含んでいる。領域3 2506のアドレスは、物理的なブロック2505のアドレスにオフセットを追加することによって決定される。
【0024】
図33は、ブロック内に新たな領域を割り当てる領域割り当てルーチンの流れ線図であ
る。このルーチンに対する入力パラメータは、その領域に記憶すべきデータと、データの長さである。このルーチンは、割り当てられた領域にハンドルを返送する。或いは又、このルーチンはデータを書き込まず、単にスペースを割り当てる。このルーチンは、ブロックが領域に対して充分な自由スペースと、追加のAllocエントリとを有すると仮定する。図35は、Allocエントリのステータスに対する状態図である。Allocエントリは、次のステータスのうちの1つである。即ち、未使用、割り当てられた状態、割り当て解除された状態、取って代わられた状態、自由、又はゼロである。又、エントリは、割り当てが処理中である間は移行状態にある。エントリが未使用である場合には、Allocアレイの最後のエントリを通過しており、即ちアレイの一部分ではない。エントリが割り当てられた場合には、それに対応する領域が現在割り当てられる。エントリが割り当て解除される場合には、それに対応する領域が不要であるが、その領域はまだリクレイミングされていない。エントリが取って代わられる場合には、別のAllocエントリ(単数又は複数)がその同じデータ領域に対応する。リクレイミング中、取って代わられたエントリにあるデータは無視される。というのは、別のエントリ(単数又は複数)がデータ領域を指すからである。エントリが自由の場合には、それに対応する領域がリクレイミングされており、新たな領域がブロックに追加されたときにAllocエントリを再使用することが出来る。エントリがゼロの場合には、エントリへの書き込み中に問題が生じており、消去されるまで使用されない。エントリが割り当てにおいてプロセス移行状態にある場合には、エントリにおけるデータの若干は有効であるが必ずしも全部ではない。
【0025】
図35を参照すれば、全てのエントリは最初は未使用状態3101にあり、ブロックが消去されたときに未使用状態3101へ移行する。エントリは、未使用状態3101から割り当て進行状態3104を経て割り当て状態3103へ移行する。自由状態3102にあるエントリは割り当て状態3103へ移行する。未使用状態3101にあるエントリは、そのエントリが割り当て解除されるか又は取って代わられて、リクレイミングされるべきブロック内の最後に割り当てられたエントリの後に探索されないときに、ブロックリクレイミングによって自由状態3102へ移行する。割り当てられた状態3103にあるエントリは、対応する領域が割り当て解除されたときに割り当て解除状態3105に移行する。割り当てられた状態3105にあるエントリは、同じ領域に対応する別の1つ又は複数のエントリが割り当てられたときに、取って代わられた状態3106へ移行する。最後に、いかなる状態にあるエントリも、そのエントリに対する書き込みエラーの際にはゼロ状態3107へ移行する。
【0026】
図33を参照すれば、ブロック2901において、システムはAllocエントリが自由の状態にあるかどうかを判断する。このようなエントリが見つかった場合には、システムはそのエントリを再使用し、ブロック2902へ続くが、さもなくば、ブロック2903へ続く。ブロック2902において、システムは自由のAllocエントリを選択し、ブロック2905へ続く。ブロック2903において、システムは新たなAllocエントリを選択し、ブロック2904へ続く。新たなAllocエントリは、最終とマークされたエントリの直後のエントリである。ブロック2904において、システムは、選択されたAllocエントリに対して変数Statusをセットし、割り当てが進行中であることを指示する。割り当て進行中状態は、データが一貫した状態にないかもしれないことを指示する移行状態である。ブロック2905において、システムは変数Offset及びLenをセットし、自由スペースの第1位置から始まってデータ領域にデータを書き込む。ブロック2906において、Allocエントリが新規であった場合には、システムはブロック2907へ続くが、さもなくば、システムはブロック2908へ続く。ブロック2907において、システムは手前の最終Allocエントリのステータスをリセットし、もはやAlloc構造体の最終エントリでないことを指示する。ブロック2908において、システムは、選択されたAllocエントリに対する変数Statusを割り当てられた状態にセットし、データが今や一貫した状態にあることを指示する。次いで、シ
ステムは割り当てを終了する。
【0027】
上記したように、FEPromのブロックの性能は、消去カウントが増加するにつれて低下する。各ブロックの消去カウントをほぼ等しく(均等化したと称する)維持することが好ましい。通常の動作においては、消去カウントが均等化されない。例えば、実行可能なファイルがブロックに書き込まれた場合には、そのブロックを消去する必要は決して生じない。従って、そのブロックの消去カウントは、他のブロックの消去カウントが増加しても一定のままである。好ましい実施例ではブロックの消去カウントを均等化するために多数の解決策を使用する。まず、ブートアップ中又はFEPromがロードされるときに(初期化)、FEPromマネージャはブロックを走査して、FEPromをマネージするデータを得る。好ましい実施例では、このデータが各ブロックの消去カウントを含んでいる。消去カウントの均等化を助けるために、FEPromマネージャは、消去カウントの大きいブロックのデータと、消去カウントの低いブロックのデータをスワッピングする。このスワッピングは時間がかかるので、初期化中に生じるスワッピングの回数を最小にすることが望ましい。更に、スワッピングは、消去カウントの差がスレッシュホールド値又は比を越えたときだけ実行すればよい。第2に、FEPromマネージャがブロックに対してリクレイミングを実行するときには、消去カウントの小さい使用可能なブロックを選択するのが好ましい。第3に、FEPromマネージャが領域を割り当てるときには、消去カウントの低いブロックの領域を割り当てる。第4に、FEPromマネージャはブロックの消去回数を追跡する。消去の回数がスレッシュホールド値を越えた場合には、FEPromマネージャは、2つのブロックに対する消去カウントの差がスレッシュホールド値又は比を越えたかどうかを決定する。そのスレッシュホールド値を越えた場合には、マネージャはそれらブロックのデータをスワッピングする。
【0028】
FEPromマネージャは、各物理的なブロックのヘッダに消去カウントを維持するのが好ましい。ブロックが消去されたときには、FEPromマネージャは、増加された消去カウントをブロックヘッダに書き込んで戻す。ブロックがコピーされたときには、消去カウントが転送されない。各ブロックはそれ自身の消去カウントを保持する。或いは又、消去カウントは単一のブロックに記憶することができる。しかしながら、この別の方法は、好ましい方法以上に幾つかの欠点がある。第1に、単一のブロックに欠陥が生じると、全ての消去カウントが失われる。第2に、ブロックが消去されると、消去カウントブロックを更新しなければならない。最終的に、消去カウントブロックは消去され、再書き込みされねばならない。
【0029】
図32は、ブロック消去可能なFEPromのどのブロックを使用して領域を割り当てるかを選択するブロック割り当てルーチンの流れ線図である。FEPromマネージャは、多数のファクタに基づいてどのブロックを割り当てるかを決定する。まず、FEPromマネージャは、消去カウントが最も低い充分な自由スペースを有するブロックを割り当てる。消去カウントの低いブロックを割り当てることは、ブロックの均等化を確保する上で助けとなる。第2に、FEPromマネージャは、充分な自由スペースをもつブロックがない場合には多数のブロックを割り当てる。データは、異なるブロックに各々記憶された多数の領域に分割される。第3に、FEPromマネージャは、あまりに多数の部分が生じるときには割り当てを許さない。このルーチンに対する入力パラメータは、割り当てられるべき領域の長さと、領域を多数のブロックに記憶できるかどうかである。ブロック2801において、システムは、データを記憶するに充分な自由スペースを有する全てのブロックを選択する。好ましい実施例において、システムは、自由スペースの開始位置とAllocエントリの数とに基づいて自由スペースの長さを決定する。このデータは、初期化中及び必要に応じて更新される間にFEPromマネージャバッファに記憶されるのが好ましい。又、システムは、もし必要ならば、新たなAllocエントリを追加するに充分なスペースが存在するよう確保する。1つの実施例において、システムは、ブロック
が充分な自由スペースを有しているかどうかを決定する前に、リクレイミング基準に合致するブロックに対してブロックリクレイミングを実行する。別の実施例においては、充分な自由スペースがないと決定されるまでリクレイミングは行われない。ブロック2802においては、少なくとも1つのブロックが選択された場合に、領域を保持するに充分な自由スペースが単一ブロックにあり、システムはブロック2803に続き、さもなくば、システムはブロック2804に続く。ブロック2803において、システムは、選択されたブロックのどれが最も低い消去カウントを有するかを決定し、そのブロックを割り当てると共に、システムはブロックの割り当てを終了する。ブロック2804においては、システムは、領域データを保持するに充分な自由スペースを有する1組のブロックを選択する。ブロック2805においては、全自由スペースと割り当て解除されたスペースがデータを保持するに充分でないか或いはあまりに多数の部分がある場合に、システムはブロック2807へ続き、さもなくば、システムはブロック2806へ続く。領域データを単一ブロックに記憶しなければならない場合には、2つのブロックを選択すると、部分が多数になり過ぎる。又、データを多数のブロックに記憶すべき場合には、リクレイミングが適当である。ブロック2806において、システムは選択されたブロックを割り当て、ブロックの割り当てが終了する。ブロック2807において、全てのブロックがリクレイミングされた場合には、FEPromにはデータを記憶するに充分な余裕がなく、ブロックの割り当てが終了するか、さもなくば、システムはブロック2808へ続く。ブロック2808において、システムはブロックをリクレイミングし、ブロック2801へ進んで、新たな充分な自由スペースがあるかどうかを決定する。
【0030】
図34は、ブロック内の割り当て解除された領域をリクレイミングするブロックリクレイミングルーチンの流れ線図である。入力パラメータは、リクレイミングされるべきブロックの数と、スペアブロックの物理的な番号とである。ブロックは、多数の種々の時間にリクレイミングされる。第1に、割り当て要求を満たす充分な自由スペースがないときには、ブロックがリクレイミングされる(上記したように)。第2に、FEPromマネージャは、FEPromへの書き込みアクセスの回数を追跡することができる。書き込み回数がスレッシュホールド数を越えた場合には、マネージャがいずれかのブロックをリクレイミングすべきかどうかを決定する。割り当て解除されたスペースとブロックサイズとの比がスレッシュホールド値を越えたときにはブロックをリクレイミングしなければならない。当業者に明らかなように、例えば、FEPromが最初にロードされるときのような別の時間にブロックリクレイミングを行うこともできる。FEPromマネージャは、割り当てられた領域をスペアブロック、即ち消去されたブロックへコピーすることによりブロックをリクレイミングする。割り当てられた領域のみをコピーすることにより、割り当て解除された領域がリクレイミングされる。或いは又、FEPromマネージャは、割り当てられた領域を非FEPromメモリへコピーし、次いで、ブロックを消去し、そして領域をブロックへコピーして戻す。しかしながら、この方法は、割り当てられた領域を記憶するに充分な非FEPromメモリを必要とし、消去の後であって且つブロックが再書き込みされる前に停電が生じたとすれば、データを失うおそれがある。好ましい方法においては、FEPromマネージャは、リクレイミングされるべきブロック内の割り当てられた領域をスペアブロックへコピーすると共に、そのスペアブロック内の新たな領域位置を表す変数Offsetを調整するブロック割り当て構造体をコピーする。図27は、領域1及び5をリクレイミングした後の図26のブロックレイアウトの例を示している。割り当てられた領域は隣接するようにコピーされている。対応するAllocエントリは、新たな領域位置を指すように更新される。たとえ領域1がリクレイミングされていてもAlloc〔1〕エントリは依然として必要とされる。ハンドルを使用するために、全てのAllocエントリはブロック割り当て構造体においてそれらの同じ位置を維持しなければならない。しかしながら、Alloc〔1〕エントリに対する変数Statusは自由状態にセットされ、これを用いて、リクレイミングされたブロックに追加される次の位置を指すことができる。Alloc〔5〕エントリの後にはAlloc入力はないので、ハ
ンドルに対するプレースホルダーとして必要とされず、除去されている。Alloc〔4〕エントリの位置状態は、それがAllocアレイにおける最終エントリであることを指示する。
【0031】
図36はブロックの状態を示す状態図である。ブロックの状態は変数Statusのヘッダに記憶される。ブロックの状態は、消去3201、更新進行中3202、スペア3203、リクレイミング進行中3204、レディ3205、消去のための待ち行列3206、及びリタイア3207である。新たに消去されたブロックは消去状態3201である。消去されたブロックは、通常、更新進行状態3202へ移行され、次いで、スペア状態3203へ移行される。更新進行状態3202は、ヘッダ内のあるデータ、例えば消去カウントが更新されていることを指示する。この更新が完了すると、ブロックはスペアの状態3203へ移行する。更新が失敗すると、ブロックは消去のための待ち行列状態3206へ移行する。スペア状態3203のブロックは、そのブロックがリクレイミングされているブロックからデータを受け取るべきときに、リクレイミング進行状態3204へ移行する。リクレイミング進行状態3204は、ブロック割り当て構造体が一貫した状態にないことを指示する移行状態である。データが一貫したものになると、ブロックはレディ状態3205へ移行する。しかしながら、リクレイミング進行状態3205の間にエラーが生じた場合には、そのブロックに対してリクレイミングが行われた後に、ブロックが消去待ち行列状態3206へ移行する。消去待ち行列状態3206にあるブロックは、消去されたときに消去状態3201へ移行する。消去が失敗すると、ブロックはリタイア状態3207へ移行する。それからブロックはリタイア状態に留まる。FEPromが最初に初期化されるときには、ブロックがレディ状態又はスペア状態にセットされる。レディ状態にあるブロックはデータを含むことができ、スペア状態にあるブロックはデータを含まない。
【0032】
図34を参照すれば、ブロック3001において、システムは、リクレイミングされるべきスペアブロックに対する変数Statusを、リクレイミング進行中を指示するようにセットする。ブロック3002において、システムは、リクレイミングされるべきブロックのヘッダから変数Seq、SeqCheckSum、及びBootRecordPtrをスペアブロックへコピーする。ブロック3003において、システムは、リクレイミングされるべきブロックに対して割り当て状態にある最終Allocエントリの位置を決定する。リクレイミングプロセス中に、Allocエントリは、最後に割り当てられたエントリの後に無視される。従って、リクレイミングされたブロックは、これらエントリの状態を未使用にセットする。ブロック3004ないし3010において、システムは、最後に割り当てられたエントリまでの各Allocエントリをスペアブロックにコピーする。ブロック3004において、システムは、Allocエントリを指示するインデックスjを初期化する。ブロック3005において、このインデックスjがブロック3003で決定された最後に割り当てられたエントリのインデックスより大きい場合には、全てのAllocエントリとそれに対応する領域がコピーされており、システムはブロック3011へ続き、さもなくば、システムはブロック3006へ続く。ブロック3006において、エントリの状態が割り当てられた状態である場合には、システムはブロック3007へ続き、さもなくばブロック3009へ続く。ブロック3007において、システムは、Alloc〔j〕エントリに対応する領域データをスペアブロックへコピーする。ブロック3008において、システムは、スペアブロックのAlloc〔j〕入力における変数Offsetを更新し、コピーされた領域の位置を指示するようにすると共に、変数Status(位置の状態を適当にセットする)及びLenをコピーし、ブロック3010に続く。ブロック3009では、システムは、スペアブロックのAlloc〔j〕エントリの状態を更新し、そのエントリが自由状態であることを指示するようにする。ブロック3010では、システムはインデックスjを増加して、次のAllocエントリを指示し、ブロック3005へとループする。ブロック3011においては、システムはスペアブロッ
クの状態をレディにセットする。ブロック3012では、システムは、リクレイミングされるべきブロックの状態を消去のための待ち行列にセットする。ブロック3011についての処理が完了した後であって且つブロック3012についての処理が完了する前に、スペアブロックと、リクレイミングされるべきブロックの両方は有効データを有している。ブロック3012についての処理が完了する前に処理が中断した場合には、FEPromは、同じ論理シーケンス番号を有する2つのブロックを含む。システムは、好ましくは、FEPromの初期化中にこの状態をチェックする。このときに、システムはブロック3012の処理を完了することができる。ブロック3013では、システムは、スペアブロック(以下で述べる)の状態を表すように変数PhysicalBlockNum、FirstFreeByteOffset、LenDeallocateSpace及びAllocStructCnt in BlockData〔Seq〕を更新する。ブロック3014では、システムは、スペアブロックのリストを調整するようにDriveRecを更新し、リクレイミングが終了となる(以下で述べる)。
【0033】
表 B
データ構造
struct DriveRec
{ word BlockCnt
word SpareBlockCnt
dword BlockSize
word RootDirPtr
word SpareBlockPtr 〔 〕

struct ConfigRec

word WriteAccessCntThreshold
word EraseCntThreshold
word BlockReclamationThreshold
word BlockEraseLevelingThreshold

struct BlockRec

byte Flags
word PhysicalBlockNum
dword FirstFreeByteOffset
dword LenDeallocatedSpace
word AllocStructCnt
dword BlockEraseCnt
word FirstUseableAllocEntry
word FreeAllocEntryCnt
} BlockData 〔 〕
定義
BlockCnt FEProm内の物理ブロックの数
BlockSize ブロック内のバイトの数
RootDirPtr FEPromをファイル記憶装置として使用した時のルート
ディレクトリを含むデータ領域へのハンドル
SpareBlockPtr 〔 〕 予備ブロックの物理ブロックの数を含む可変長アレイ
SpareBlockCnt 予備ブロックの数
WriteAccessCntThreshold ブロックを再利用すべきか否かをシステムに決定させる
FEProm への書込みの数
EraseCntThreshold ブロックレベル化を行うべきか否かをシステムに決定
させる FEProm への消去の数
BlockReclamationThreshold ブロック再利用をトリガする割当て解除スペースと
ブロックサイズとの比
BlockEraseLevelingThreshold ブロック間のレベル化プロセスをトリガする最小及び
最大消去数間の差
PhysicalBlockNum 論理的ブロックを含む物理ブロックの数
FirstFreeByteOffset 空きスペースの最初のバイトの物理ブロック内の
オフセット
LenDeallocatedSpace 物理ブロック内の割当て解除済領域の合計の長さ
FirstUseableAllocEntry ブロック内の最初の使用可能な Allocエントリ索引
FreeAllocEntryCnt Alloc エントリの数
BlockEraseCnt 物理ブロックが消去された回数
FEPromが最初にロードされる時、FEProm管理者は FEProm を走査して表Bに示す内部データを初期化する。構造 DriveRec は装置に関するデータを含み、構造ConfigRec は構成パラメタに関するデータを含み、アレイ BlockDataは FEProm 内の各物理ブロック毎のデータを有するエントリを含む。アレイBlockDataはブロック変換キャッシュである。初期
化中、 FEProm 管理者はアレイ BlockData内の各変数及び構造 DriveRec 内の予備ブロックに関する変数を初期化する。構造DriveRec内の他の変数はシステム定義された変数である。好ましい実施例では、FEProm管理者は、これらのデータ構造内の領域データの型に特定の情報を記憶している。例えばもし FEProm がファイル記憶装置として使用されていれば、データ構造はルートディレクトリへのハンドルを含むことができる。図31は、好ましい実施例における初期化プロセスの流れ図である。この手順は、 FEProm 上の各ブロック毎にブロック割当て構造を走査することによってDriveRec 及び BlockData構造を初期
化する。システムはブロック2701乃至2709をループして各ブロック毎のデータを読む。ブロック2701ではシステムは、現在アクセスされている物理ブロックを指示する索引iを初期化する。ブロック2702において、もし索引iが FEProm 内のブロックの数より大きければ、全てのブロックは走査されたのでありシステムはブロック2710へ進み、そうでない場合にはシステムはブロック2703へ進む。ブロック2703では、システムは索引iによって指示されたブロックの見出しを読む。ブロック2704では、システムは DriveRec 及び BlockData〔i〕データを更新する。もしそのブロックが予備ブロックであれば、システムは SpareBlockCntをインクリメントさせ、そのブロックをSpareBlockPtrアレイに追加する。好ましい実施例では、システムはこれらの領域内に記
憶されているデータに特定の情報をも走査する。例えばもし FEProm をファイルシステムとして使用していて、そのブロックがブートレコードを含んでいれば、システムは BootRecPtr をセットし、ブートレコードを読み、そして RootDirPtr をセットする。
【0034】
システムはブロック2705乃至2708をループして各 Allocエントリ内のデータを処理する。ブロック2705では、 Allocエントリを指示する指標jを初期化する。ブロック2706において、もしシステムが最後のAlloc エントリを処理済であればシステムはブロック2709へ進み、そうでなければシステムはブロック2707へ進む。ブロック2707では、システムはjによって指示された Allocエントリに基づいて BlockData〔 BlockSeq 〕データを更新する。システムは変数FirstFreeByteOffset、LenDeallocatedSpace 、及び AllocaStructCntを更新する。システムは、変換キャッシュを初期化する
索引iに変数 PhysicalBlockNum をセットする。ブロック2708では、システムは索引jをインクリメントさせて次の Allocエントリを指示させ、ブロック2706へループする。ブロック2710では、システムはブロック使用をレベル化する。システムは BlockDataアレイを走査して最大 BlockEraseCntを有するブロック及び最小 BlockEraseCntを有するブロックを決定する。次いでシステムはブロック間でデータをスワップ(交換)する。システムは先ず最大ブロックを予備ブロックへ複写する。次にシステムは最大ブロック
を消去する。システムは最小ブロックからのデータを消去されたブロックへ複写し、そして好ましくは複写しながらブロック再利用を遂行する。システムは最小ブロックを消去し、予備ブロックからのデータを最小ブロックへ複写し、そして好ましくは複写中にブロック再利用を遂行する。
【0035】
本発明の FEProm 管理者はブロック化されていない、または消去することができない媒体を支援することができる。ブロック再利用及びブロック消去カウントレベル化プロセスはブロック消去可能性に頼っている。従ってもし媒体がブロック消去可能性を支援しなければ、これらのプロセスを不能にすべきである。好ましい実施例では、予備ブロックカウントを0にセットすることによってこれらのプロセスを実効的に不能にすることができる。 FEProm 管理者ははこれらのプロセスを作動させるために少なくとも1つの予備ブロックに頼っている。もし媒体がブロック化されていなければ、任意のブロックサイズを論理的ブロックとして選択することができる。好ましい実施例ではブロックのサイズは、割当てアレイエントリ内のオフセットが全ブロックをアドレスできない程大きくすべきではなく、またブロック見出し及び割当てアレイがブロックサイズのかなりなパーセントを占めたり、または変換キャッシュが大き過ぎる程は小さくすべきでない。
【0036】
FEProm 管理者は、 FEProm 書込み及び消去エラーからの動的な回復を可能にする。書込みエラーは、メモリ位置を指定された値にセットできない場合に生成される。これらのエラーは、ハードウエアの障害によって、または既に0に変化しているあるビット内に1を要求するというように、あるメモリ位置にある値を書込もうと試みることによってもたらされる。
【0037】
書込みエラーはデータ領域、ブロック見出し、及び割当てアレイエントリへ書込む時に発生し得る。好ましい実施例では、データ領域へ書込み中に書込みエラーが発生すると、
FEProm 管理者はそのブロックを割当て解除された状態にセットする。次いでFEProm 管
理者は、図33に示す領域割当てプロセスを再始動させることによって、データを異なるデータ領域へ書込むことを試みる。
【0038】
割当てアレイエントリへ書込み中に書込みエラーが発生すると、 FEProm 管理者はその割当てアレイエントリを空白(ヌル)状態にセットする。あるエントリを置換された( superseded )状態、割当て解除された状態、解放された(フリー)状態、または割当て進行中状態にセットしている時に、もし書込みエラーが発生すると、そのエントリを空白状態にセットすることによって FEProm は一貫した( consistent )状態に保たれる。しかしながら、もしあるエントリを割当て済状態にセットしている時にエラーが発生すると、データ領域は割当て済状態の対応割当てアレイエントリを有していないのであるから、 FEProm は非一貫状態になる。 FEProm 管理者はそのデータ領域に対して別のエントリを割当てる。あるエントリを空白状態にセットしている時にもエラーは発生し得る。空白状態は、0の値のステータスとして定義されているから、あるエントリを空白状態にセットしている時に発生するエラーは必然的にハードウエアエラーである。もしエラーが発生すれば、対応する領域を再利用しなければならないことを指定する再利用を必要とするかも知れない。例えば、もしあるエントリを割当て解除状態にセット中に、及び再びそのエントリを空白状態にセット中にエラーが発生すれば、そのエントリは割当て済状態になる。もしこの状態のままであれば、このエントリ及び対応データ領域は正常の再利用の下では決して再利用されなくなる。
【0039】
ブロック見出しに書込み中にエラーが発生すると、 FEProm 管理者はそのブロックを消去待ち行列状態にセットする。もしあるブロックを消去待ち行列状態にセット中にエラーが発生すれば、 FEProm 管理者はそのブロックを引退( retired)状態にセットするので、そのエラーを回復することはできなくなる。
【0040】
あるブロックを消去中に書込みエラーが発生すると、 FEProm 管理者はそのブロックを引退状態にセットする。もし引退させたブロックが予備ブロックであったならば、 FEProm 管理者は少なくなった予備ブロックで動作する。代替としてFEProm管理者は割当て済の割当てアレイエントリを用いずにブロックを探知することを試みる。次いで FEProm 管理者は探知したブロックを消去し、それを予備状態にセットする。予備ブロックが使用できない場合には FEProm 管理者は FEProm を、あたかもそれが前述した消去不能であるかのように取扱う。
【0041】
本発明は、 FEProm が非一貫状態にある場合の動的エラー回復をも提供する。図33を参照する。例えば、もしブロック2905においてオフセットが書込まれた後に、しかしブロック2908において状態が解放状態から割当て済状態へ更新される前に FEProm が除去されれば、 FEProm は非一貫状態になる。FEPromに次にロードする時に、 FEProm 管理者は割当てエントリが解放されていることを見て、それを再使用しようとする。しかしながら、オフセットへ書込もうとする試みは失敗する(同一データがオフセットへ書込まれている場合を除く)。上述したように、 FEProm 管理者はエントリを空白状態にセットすることによって回復し、領域割当てプロセスを再始動させて異なるエントリを選択する。もしFEPromが取外される前にデータの一部分がデータ領域へ書こまれれば、 FEProm 管理者がデータをその領域へ書込もうとする時にエラーが検出される。このエラーは上述したようにして処理される。
ファイルシステム
本発明は、 FEProm 装置に対してディレクトリをベースとする階層ファイルシステムを提供する。階層ファイルシステムは論理的グルーピング内にファイルを記憶させる。好ましい実施例は、ディレクトリ階層及び内部ファイル記憶の両者を実現するためにリンクされたリストデータ構造を使用する。
【0042】
図1に典型的な階層ディレクトリ構造を示す。ワシントン州レッドモンドのマイクロソフト社から入手できる MS-DOS オペレーティングシステムが、階層ディレクトリ構造を有するファイルシステムを実現する。図1に示すように、ディレクトリ「ルート」100は、2つのサブディレクトリ(「 DOS」102及び「ワード」103)と、2つのファイル(「 AUTOEXEC.BAT 」104及び「 COMMAND.COM」105)とを含む。ディレクトリ「 DOS」102は1つのファイル(「 FORMAT.EXE 」106)を含む。ディレクトリ「ワード」103は次に低いレベルに2つのサブディレクトリ(「デービッド(DAVID) 」107及び「メリー(MARY) 」108)を含む。ディレクトリ「デービッド」107は1つのファイル「 LETTER1.DOC」109を含む。ディレクトリ「メリー」108は3つのファイル「LETTER1.DOC 」110、「LETTER2.DOC 」111及び「LETTER3.DOC 」112を含む。
【0043】
図2は、好ましい実施例において図1のディレクトリ構造を実現する考え得るリンクされたリストを示す。ディレクトリ「ルート」レコード100(本明細書においては「レコード」及び「エントリ」という語を互換可能なように使用する)はポインタ120を有し、このポインタ120は次に低いレベルのサブディレクトリのリンクされたリスト140及びファイルレコードを指し示す。リンクされたリスト140は、ポインタ121、122、123によってリンクされたサブディレクトリレコード DOS102及び「ワード」103と、ファイルレコード「 AUTOEXEC.BAT 」104及び「 COMMAND.COM」105とからなる。サブディレクトリレコード「 DOS」102は次に低いレベルのファイルレコード106を指し示すポインタ124を有し、サブディレクトリレコード「ワード」103は次に低いレベルのファイルレコードのリンクされたリスト141を指し示すポインタ125を有している。リンクされたリスト141は、ポインタ126によってリンクされているディレクトリレコード「デービッド」107及び「メリー」108からなる。サブディレクトリレコード「デービッド」107は次に低いレベルのファイルを指し示すポインタ1
27を有し、サブディレクトリレコード「メリー」108は次に低いレベルのファイルレコードのリンクされたリスト142を指し示すポインタ128を有している。リンクされたリスト142は、ポインタ129及び130によってリンクされているファイルレコード「 LETTER1.DOC」110、「LETTER2.DOC 」111及び「LETTER3.DOC 」112からなる。右上のテンプレート10は図面を通して使用されるレコードレイアウトを示す。好ましい実施例では図2に示すレコードは、以下に説明するように DirEntry 及び FileEntry構造である。
【0044】
図2は、図1を表す単に1つの考え得るリンクされたリスト配列を表すに過ぎない。この配列は、もしファイルが追加されたが次いで削除されたか、またはディレクトリ名が変更されていれば異なる配列になる。図3は別の考え得る配列を示す。図3は、図1と同一のディレクトリ階層を表しているが、一時期存在したディレクトリ「ビル(BILL)」113は削除されている。 FEProm 装置は一回限り書込み可能である(消去された場合を除く)から、本発明の好ましい実施例では図3に示すように、ディレクトリレコード「ビル」113をリンクされたリストから物理的に除去しない。ディレクトリまたはファイルは、ディレクトリまたはファイルエントリのステータスをセットすることによってリンクされたリストから削除される。もしディレクトリまたはファイルがコンピュータディスク上に記憶されていたのであれば、ディレクトリレコード「ビル」113は、ディレクトリレコード「メリー」108を指し示しているポインタ131をディレクトリレコード「デービッド」107内に再書込みすることによって物理的に除去することができる。
【0045】
好ましい実施例は、あるファイルを構成する範囲( extent )をリンクするためにもリンクされたリストデータ構造を使用する。各ファイルはそれに対応付けられたファイルレコードを有し、このファイルレコードは他のデータと共にファイル名を含み、また上述したようにディレクトリ階層内にリンクされている。ある範囲は、そのファイルに関するデータを含むメモリの連続域である。各ファイルは、ファイルデータを含む1またはそれ以上の範囲である。各範囲はそれに対応付けられた範囲レコードを有している。範囲レコードは、他のデータと共にその範囲を指し示すポインタと範囲の長さとを含む。図4はファイル“\A \D.DAT ”202の範囲を示す。範囲レコードR1 203、R2 204及びR3 205はリンクされ、対応範囲E1 211、E2 212及びE3 213を指し示すポインタを含んでいる。ファイルは範囲E1 211、E2 212及びE3 213の論理的連結である。好ましい実施例では、範囲レコードは後述するように FileInfo 構造である。
【0046】
図4は、ファイル“\A \D.DAT ”202のための単なる1つの考え得るリンクされたリスト配列を表すに過ぎない。図5に同一ファイルを表す別の配列を示す。範囲E4 214はファイルに追加されたが、削除されている。好ましい実施例では範囲レコードR4
206は、ファイルを構成する範囲のリンクされたリストから物理的に除去されていない。そうではなく、レコードの削除を指示するようにレコードのステータスをセットすることによって範囲レコードR4 206は論理的に除去されているのである。
【0047】
表C及びDは、本発明の好ましい実施例に使用される幾つかのデータ構造を含んでいる。表Cに示されているデータ構造はBootRecord である。 BootRecord は、以下に説明す
るように、ファイルシステムの識別に関するある一般的な情報、 FEProm をアクセスすることができるファイルシステムのバージョン番号、ルートディレクトリを指し示すポインタ、及び付加的なデータを含む。表Dに示す第1及び第2の構造は、 DirEntry 構造及び
FileEntry構造である。これらの構造の1つが各ディレクトリ及びファイル毎に割当てられる。これらの構造は同一である。変数SiblingPtr はディレクトリ階層の同一レベルの
DirEntry 構造及びFileEntry 構造のリンクされたリスト内の次の同胞を指し示す。変数PrimaryPtr 及び SecondaryPtr は以下に詳述する。第3の構造は、 FileInfo 構造であ
る。各ファイル範囲は関連 FileInfo 構造を有している。変数PrimaryPtr はファイルの
FileInfo 構造を指し示す。
【0048】
表 C
データ構造
struct BootRecord
{ word Signature;
dword SerialNumber;
word FFSWriteVersion;
word FFSReadVersion;
word TotalBlockCount;
word SpareBlockCount;
dword BlockLen;
dword RootDirectoryPtr;
word Status;
byte VolumeLabelLen;
word BootCodeLen;
byte VolumeLabel 〔 〕;
byte BootCode〔 〕;

定義
Signature 媒体がこのファイルシステムを支援することを指示する値
SerialNumber VolumeLabel との組合せは特定 FEProm の独特な識別子である
FFSWriteVersion このボリュームへ書込むために要求されるファイルシステムの
高バイトにおけるバージョン番号及び低バイトにおける改定番号FFSReadVersion このボリュームを読出すために要求されるファイルシステムの
最早バージョンの高バイトにおけるバージョン番号及び低バイト
における改定番号
TotalBlockCount FEProm内の予備ブロックを含むブロックの合計数
SpareBlockCount ブロック再利用及びエラー回復に使用可能なブロックの数
BlockLen バイトで表したブロックの長さ
RootDirectoryPtr ルートディレクトリを指し示すポインタ
Status ファイル名フォーマットを指定するデータ
VolumeLabelLen ボリュームラベル内の文字の数
BootCodeLen ブートコードアレイ内のバイトの数。もし0ならば媒体は
ブート不能
VolumeLabel 〔 〕 ボリュームラベル
BootCode〔 〕 オペレーティングシステムに関するブートコード
表 D
データ構造
struct DirEntry

word Status;
dword SiblingPtr;
dword PrimaryPtr;
dword SecondaryPtr;
byte Attributes;
word Time;
word Date;
byte NameLen;
byte Name〔8〕;
byte Ext 〔3〕;

struct FileEntry

word Status;
dword SiblingPtr;
dword PrimaryPtr;
dword SecondaryPtr;
byte Attributes;
word Time;
word Date;
byte NameLen;
byte Name〔8〕;
byte Ext 〔3〕;

struct FileInfo

word Status;
dword ExtentPtr;
dword PrimaryPtr;
dword SecondaryPtr;
byte Attributes;
word Time;
word Date;
word ExtentLen;
word UncomprssedExtentLen;

定義
Name ディレクトリ/ファイル名
Ext ファイル拡張
Status
bit #
0 1:レコードはディレクトリ構造内に存在(存在)
0:レコードはディレクトリ構造から削除済(削除済)
1 1:レコードは現属性、日付、及び時間データを含む
( ATDRecent )
0:レコードは置換されたデータを含むか、またはデータを
含まない( ATDSuperseded )
3 - 2 11:未定義
10:FileInfo
01:FileEntry
00:DirEntry
4 1: PrimaryPtr は有効ではない
0: PrimaryPtr は有効 ( PrimaryPtrValid )
5 1: SecondaryPtr は有効ではない
0: SecondaryPtr は有効 ( SecondaryPtrValid )
6 1: SiblingPtr/ExtentPtr は有効ではない
0: SiblingPtr/ExtentPtr は有効
( SiblingPtrValid/ExtentPtrValid )
DirEntry
15 - 7 保留
FileEntry
7 1:ファイルは圧縮されていない
0:ファイルは圧縮されている
15 - 8 圧縮アルゴリズムの識別
FileInfo
7 1:ファイルは圧縮されていない
0:ファイルは圧縮されている
8 1:範囲は圧縮されたブロックの最初のセグメントを含まない
0:範囲は圧縮されたブロックの最初のセグメントを含む
9 1:範囲は圧縮されたブロックの最後のセグメントを含まない
0:範囲は圧縮されたブロックの最後のセグメントを含む
15 - 10 保留
SiblingPtr 同胞連鎖内の次の DirEntry または FileEntryを指すポインタ
ExtentPtr FileInfoEntry に対応付けられた範囲を指すポインタ
PrimaryPtr DirEntry:ディレクトリ階層内の次に低いレベルの最初の
DirEntry またはFileEntryを指す
FileEntry :ファイルに対応付けられた FileInfo エントリの
リンクされたリストを指す
FileInfo:ファイルのための次のFileInfo エントリを指す
SecondaryPtr DirEntry:ディレクトリのための次の DirEntry エントリを指す
;SecondaryPtrを除くこのエントリの全内容は有効で
はなく、無視される
FileEntry :ファイルのための次のFileEntryエントリを指す
;SecondaryPtrを除くこのエントリの全内容は有効
ではなく、無視される
FileInfo:ファイルのための次のFileInfo エントリを指す
Attributes 読出し専用、読出し/書込み等のようなファイル属性
Time 創成または変更の時刻
Date 創成または変更の日付
NameLen バイトで表した名前及び拡張の長さ
Name〔8〕 名前
Ext 〔3〕 拡張
ExtentLen バイトで表した範囲の長さ
本発明のファイルシステムは、ディレクトリ及びファイル構造をブロック消去可能な FEProm 内のブロック境界を横切って分散させる。ファイルシステムは、FEProm内の記憶装置の割当て及び割当て解除に FEProm 管理者を使用する。ファイルシステムは、上述したように、リンクされたリスト内のポインタとしてハンドルを使用する。以下の説明では「ハンドル」及び「ポインタ」を互換可能に使用する。図30は、図2のディレクトリ階層の一部のブロック割当て例を示す。図30に示した部分はディレクトリ「ルート」、ディレクトリ「 DOS」、ディレクトリ「ワード」、ファイル「 AUTOEXEC.BAT 」、及びファイル「 COMMAND.COM」のための DirEntry 及び FileEntryレコードからなっている。ブロック0はディレクトリ「 DOS」及びディレクトリ「ワード」を含み、ブロック 12 はディレクトリ「ルート」及びファイル「 COMMAND.COM」を含み、そしてブロック 14 はファイル「 AUTOEXEC.BAT 」を含んでいる。
【0049】
図28は、図30の例のブロック割当て構造及び領域例を示す。図28はブロック0 2401、ブロック12 2402、及びブロック14 2403を示す。ブロック0 2401は、領域2420及び2430を含む。領域2420はディレクトリ「 DOS」の
ための DirEntry を含み、領域2430はディレクトリ「ワード」のための DirEntry を含む。ブロック0 2401は、見出し2404、領域2420に対応する Alloc〔0〕エントリ2421、及び領域2430に対応する Alloc〔1〕エントリ2431をも含む。ブロック12 2402は領域2410及び2450を含む。領域2410はディレクトリ「ルート」のための DirEntry を含み、領域2450はファイル「 COMMAND.COM」のための FileEntryを含む。ブロック12 2402は、ブロック見出し2405、領域2410に対応する Alloc〔0〕エントリ2411、及び領域2450に対応する Alloc〔1〕エントリ2451をも含む。ブロック14 2403は、領域2490及び2440を含む。領域2490はブートレコードを含み、領域2440はファイル「 AUTOEXEC.BAT 」のための FileEntryを含む。ブロック14 2403は、ブロック見出し2406、領域2490に対応する Alloc〔0〕エントリ2491、及び領域2440に対応する Alloc〔1〕エントリ2441をも含む。
【0050】
図28では、ポインタ2407、2413、24233、2433、2443、2453、及び2493は、ポインタ2407から始まりブロック見出し2406内のブートレコードまでのディレクトリ階層を限定する。ブートレコード2490はブロック14 2403内にある。ブロック14 2403のための可変ステータスは、このブロックがブートディレクトリを含んでいることを指示する。 BootRecordPtr2407はブートレコードのための Alloc〔0〕エントリ2491を指し示している。 Alloc〔0〕エントリ2491は、領域2490のオフセットを含む変数「オフセット」2492を含む。領域2490はブートレコードを含む。ブートレコードはディレクトリ「ルート」に対応する Alloc〔0〕エントリ2411を指し示すポインタ RootDirectoryPtr 2493を含む。 Alloc〔0〕エントリ2411は、領域2410のオフセットを含む変数「オフセット」2412を含む。領域2410はディレクトリ「ルート」のための DirEntry を含む。ディレクトリ「ルート」の PrimaryPtr 2413はディレクトリ「 DOS」に対応する Alloc〔0〕エントリ2421を指し示す。 Alloc〔0〕エントリ2421は、領域2420のオフセットを含む変数「オフセット」2422を含む。
【0051】
領域2420はディレクトリ DOSのための DirEntry を含む。ディレクトリ「 DOS」の
SiblingPtr 2423はディレクトリ「ワード」のための Alloc〔1〕エントリ2431を指し示す。 Alloc〔1〕エントリ2431は、領域2430のオフセットを含む変数「オフセット」2432を含む。領域2430はディレクトリ「ワード」のための DirEntry を含む。ディレクトリ「ワード」の SiblingPtr 2433はファイル「 AUTOEXEC.BAT 」のための Alloc〔1〕エントリ2441を指し示す。 Alloc〔1〕エントリ2441は、領域2440のオフセットを含む変数「オフセット」2442を含む。領域2440はファイル「 AUTOEXEC.BAT 」のための FileEntryを含む。ファイル「 AUTOEXEC.BAT 」のためのポインタ SiblingPtr 2443はファイル「 COMMAND.COM」のための Alloc〔1〕エントリ2451を指し示す。 Alloc〔1〕エントリ2451は、領域2450のオフセットを含む変数「オフセット」2452を含む。領域2450はファイル「 COMMAND.COM」のための FileEntryを含む。 SiblingPtr 2453は FNULLにセットされ、リンクされたリストの終わりを指示する。
【0052】
このファイルシステムは、ディレクトリの追加及び削除、及びファイルの創成、拡張及び変更を可能にする。図7は、ディレクトリを FEProm へ追加するルーチンの流れ図である。このルーチンの入力パラメタは、新しいディレクトリの完全パスネームと、新しいディレクトリのための属性データである。このルーチンは、親ディレクトリのための DirEntry のアドレスを含むように変数Pをセットし、また子ディレクトリのためのDirEntry
のアドレスを含むように変数Cをセットする。例えば、パスネーム“\P\C”は、ルートディレクトリのサブディレクトリであるPのサブディレクトリであるディレクトリCが創成されることを意味する。図8はディレクトリCがPの最初のサブディレクトリである
場合を示し、図9はディレクトリCがPの最初のサブディレクトリではない場合を示す。図8及び9において、実線はディレクトリCを追加する前のディレクトリ構造を示し、点線はディレクトリCが追加された後のディレクトリ構造を示す。
【0053】
図7のブロック401においてシステムは、ルートディレクトリからの経路を追跡することによってディレクトリPを探知し、ディレクトリPのための DirEntry を指し示すように変数Pをセットする。ディレクトリPを探知する時システムは、変数 SecondaryPtr によって置換されていない限り変数 PrimaryPtr を追跡する。ブロック402では、システムはディレクトリCのための DirEntry に領域を割当てる。システムは、 FEProm 管理者の手順を呼出すことによって領域を割当てる。システムは、割当て済領域を指し示すように変数Cをセットする。以下の説明では FEProm 管理者から戻されるハンドルを領域を指し示すポインタと呼ぶ。ブロック403においてシステムは、変数「名、時刻、日付、及び属性」を新たに割当てられたレコード内にセットし、新たに割当てられたエントリがディレクトリエントリであることを指示するように変数「ステータス」をセットする。
【0054】
ブロック405乃至412においてシステムは、新しいディレクトリエントリを古いディレクトリ構造内へリンクする。システムは、ブロック406乃至410において新しいディレクトリがPの最初のサブディレクトリではない場合の状況を処理し、ブロック411及び412において新しいディレクトリがPの最初のサブディレクトリである場合の状況を処理する。ブロック405において、もし PrimaryPtr が有効であることをP−>「ステータス」が指示すれば、ディレクトリPはサブディレクトリを有しているか、または有していたのであり、システムはブロック406へ進み、そうでない場合ディレクトリPはサブディレクトリを有していたことはなく、システムはブロック411へ進む。ブロック411では、システムは新たに割当てられたディレクトリエントリであるディレクトリCを指し示すようにP−> PrimaryPtr をセットして新しいディレクトリへのリンキングを遂行する。ブロック412においてシステムは、変数 PrimaryPtr が有効であることを指示するようにP−>「ステータス」をセットしてルーチンを終了する。
【0055】
ブロック406においてシステムは、変数 next-ptr をP−> PrimaryPtr に等しくセットする。変数 next-ptr は同胞サブディレクトリのリンクされたリスト内の次のディレクトリを指し示すポインタを含む。ブロック407において、SiblingPtrが有効であることを next-ptr によって指し示されるレコードのステータスが指示していればシステムはブロック408へ進み、そうでなければ同胞のリンクされたリストの終わりに到達したのであり、システムはブロック409へ進む。ブロック408では、 next-ptr は next-ptr によって指し示されるレコードの SiblingPtr に等しくセットされ、これはリンクされたリスト内の次のディレクトリを指し示すように next-ptr を前進させ、システムはブロック407へ進められてリンクされたリストの終わりに達したか否かが決定される。同胞のリンクされたリストの終わりを探索する場合、システムは変数 SiblingPtr を追跡する。システムはブロック409において、 next-ptr によって指し示されるレコードの SiblingPtr を、ディレクトリCのためのDirEntryを指し示すポインタに等しくセットする。ブロック410においてシステムは、新たに割当てられたディレクトリエントリを指し示すエントリ内の SiblingPtr が有効であることを指示するように、 next-ptr によって指し示されるレコードの「ステータス」をセットし、ルーチンを終了する。
【0056】
図10は、新しいファイルに関して FileEntryレコードをファイルシステム内へ追加するルーチンの流れ図である。 FileEntryレコードは階層的な木構造のファイルシステムの単なる葉ノードに過ぎず、FileEntryレコードを追加するルーチンは図7に示したディレ
クトリ追加ルーチンに酷似している。主要な相違点はブロック803において、レコードがファイルであることを指示するように変数「ステータス」がセットされることである。

【0057】
図11及び12は、データをファイルの終わりに追加するためのルーチンの流れ図である。このルーチンには、完全パスネーム、書込まれるデータ及び書込まれるバイトの数が渡される。図13は拡張されるファイル\L.DAT を含むディレクトリ構造のレイアウトの見本である。実線はファイルが拡張される前の構造を示し、点線はファイルが拡張された後の構造を示す。ファイル「 L.DAT」は始めに FileEntryレコード1101、 FileInfo レコード1102、及びそれに対応付けられた範囲1103を有している。点線は、範囲D2 1105内のファイルへ追加されるデータを有する FileInfo レコード1104を表す。
【0058】
図11のブロック1001においてシステムは、領域を FEProm 内の新 FileInfo レコードに割当て、そのレコードを指し示すように変数 FI をセットする。システムはブロック1002において領域をデータ範囲に割当て、その範囲を指し示すように変数Dをセットする。システムはブロック1003において、割当てられたブロックへデータを書込む。ブロック1004においてシステムは割当てられた FileInfo エントリ内に変数「属性、時刻、及び日付」をセットする。ブロック1005においてシステムは、 FI −> ExtentPtrを割当てられた範囲のハンドルにセットする。ブロック1005Aでは、 FI −>
ExtentLenが範囲の長さを含むようにセットされる。ブロック1005Bでは FI −>「ステータス」が、「存在」、 ATDRecent、 FileInfo 、及び ExtentPtrvalid にセットされる。ブロック1006ではシステムは、拡張すべきファイルの FileEntryレコードを探知し、そのレコードのアドレスに FE をセットする。好ましい実施例では、システムは新範囲及び FileInfo レコードを割当てる前に FileEntryレコードを探知して、何等かの割当てが行われる前にファイルが存在するようにしている。
【0059】
図11の続きである図12のブロック1007乃至1012においてシステムは、拡張すべきファイルの最後のFileInfo レコード(もし1つが存在すれば)を探知する。シス
テムは FileEntryレコード及び FileInfo レコードの PrimaryPtr または SecondaryPtr を追跡する。有効 SecondaryPtr は、 PrimaryPtr によって指し示されるレコードが、 SecondaryPtr によって指し示されるレコード内のデータによって置換されたことを指示する。ブロック1007においてシステムは、ポインタ next-ptr を FileEntryレコードを指し示すポインタに等しくセットする。ブロック1008Aでは、ポインタ prev-ptr が
next-ptr に等しくセットされる。ファイル内の最後の FileInfo レコードが探知されると、ポインタ prev-ptr はそのレコードを指し示すポインタを含む。ブロック1009では、もしSecondaryPtr が有効であることを next-ptr によって指し示されるレコードのステータスが指示していれば、 PrimaryPtr によって指し示されるレコード内のデータは置換されたのであり、システムはブロック1011へ進み、そうでない場合はシステムはブロック1010へ進む。ブロック1010においてシステムは next-ptr を、 next-ptr によって指し示されるレコードの PrimaryPtr に等しくセットしてリンクされたリスト内の次のレコードを指し示すポインタを入手し、ブロック1012へ進む。ブロック1011ではシステムは next-ptr を、 next-ptr によって指し示されるレコードの SecondaryPtr に等しくセットしてリンクされたリスト内の次のレコードを指し示すポインタを入手し、ブロック1008Aへ進む。ブロック1012では、もし next-ptr が有効であれば、リンクされたリストの終わりに達したのであり、システムはブロック1013へ進み、そうでない場合にはシステムは1008Aへ戻ってリンクされたリスト内の次のレコードを処理する。ブロック1013ではシステムは prev-ptr によって指し示されるレコードの PrimaryPtr を、 FI を指し示すポインタに等しくセットしてファイルの拡張を遂行する。ブロック1014においてシステムはprev-ptrによって指し示されるレコードの「ステータス」をPrimaryPtrValidに等しくセットしてルーチンを終了する。
【0060】
図14及び15は、ファイル内のデータを更新する「ファイル更新」ルーチンの流れ図
である。このルーチンのパラメタは、変更された関連範囲を持つためのFileInfoブロックのアドレスであるRと、新データのための範囲内へのオフセットであるextent-offsetと
、新データである new-data と、新データの長さであるdata-lengthとである。少なくともあるブロックが消去されるまでは、FEPromは1回書込み装置であるから、データが記憶される領域は、ファイルへの更新が発生する時には再書込みはできない。以下に説明するように好ましい実施例では更新されるデータは FEProm の異なる領域へ書込まれる。
【0061】
図16は、あるファイルのための FileInfo レコードのリンクされたリストの典型的部分を示す。ファイル更新ルーチンは陰影を施した領域1301によって表されるデータを置換する。図17は変更されるデータが FEProm へ書込まれた後のリンクされたリストの構造を示す。3つの FileInfo レコードR1 1411、R2 1412、及びR3 1413がリンクされたリスト内へ挿入されている。範囲全体が再書込みされるのではなく、実際に変更された部分だけが再書込みされるのである。ルーチンは範囲を3つの区分D1 1401、D2 1402、及びD3 1403に分割する。区分D1 1401及びD3 1403は、更新によって変化しないデータを含み、区分D2 1402は変化するデータを含む。各区分は対応する FileInfo レコードを有する。 FileInfo レコードR1 1411、R2 1412、及びR3 1413はそれらの PrimaryPtr フィールドを通してリンクされている。またR1 1411及びR3 1413内の ExtentPtrフィールドはそれらの対応範囲区分を指し示すようにセットされ、ExtentLenフィールドが
セットされる。新範囲は、レコードR2 1412によって指し示される区分である新D2 1404に対応する新データに割当てられる。レコードR 1410の SecondaryPtr は FileInfo R1 1411を指し示し、R 1410の PrimaryPtr が置換されたことを指示する。 FileInfo レコードR3 1413の PrimaryPtr は FileInfo レコードR 1410の PrimaryPtr 内に含まれている値にセットされてリンクを完了する。ファイル更新ルーチンは、ブロック内に3つの新 Allocエントリを追加するための範囲を含む十分なスペースが存在することに依存する。これら3つの Allocエントリは、1つの領域ではなく3つの領域内に範囲を再定義する。もし十分なスペースが存在しなければ、ブロックの再利用によって空きスペースを発生させることができ、ファイル更新ルーチンを呼出すことができる。しかし、もし十分な空きスペースが存在しなければ、その範囲内のデータは新範囲へ移動させられる。もしデータが移動させられれば、新データは古データと統合され、1つだけの FileInfo レコードを有する新ブロック内の1領域へ書込まれる。古ブロック内の領域は割当て解除される。好ましい実施例では、 FEProm 管理者は既存領域の部分を指し示すAlloc エントリの追加を支援する。図17の例は、ブロックへ追加する3つの新Alloc エントリを必要とし、これらはD1、D2、及びD3に関連付けられた新たに定義された領域に対応する。D2のための Allocエントリは割当て解除され、D1及びD3のための Allocエントリが割当てられる。区分D1、D2、及びD3からなる領域に対応する古い Allocエントリのステータスは、それが置換されたことを指示するようにセットされる。置換済のステータスは、 Allocエントリが本質的に対応領域を用いずに割当て解除されることを指示する。
【0062】
図14のブロック1201においてシステムは FileInfo レコードのための3つの領域を割当て、領域のアドレスを含むように変数R1、R2、及びR3をセットする。ブロック1202においてもしR−>「ステータス」が ATDRecentを指示していれば、システムはR1−>「時刻」、R1−>「日付」、及びR1−>「属性」をR内の値にセットし、R1−>「ステータス」を ATDRecentにセットし、そうではない場合には、システムはこれらのフィールドをFNULLにしたままである。好ましい実施例では、 FEProm 管理者は Allocエントリを置換にセットするのと、 Allocエントリを既存領域に割当てるのを支援す
る。ブロック1203においてシステムはある領域を新データに割当て、 R2NewDataをその領域のアドレスにセットする。ブロック1204では、3つのAllocエントリが割当て
られる。これらのエントリはD1、D2、及びD3を指し示すように初期化される。D1
、D2、及びD3からなる領域を指し示す Allocエントリのステータスは置換にセットされる。ブロック1205においてシステムはR2NewDataによってアドレスされた新領域へ new-data を書込む。システムはブロック1206乃至1208Aにおいてデータを FileInfo レコードR2内にセットする。ブロック1206においてシステムは、R2−> ExtentPtrを新データのための領域を指し示すポインタに等しくセットする。ブロック12
07では、R2−> ExtentLenを新領域の長さに等しくセットする。ブロック1208においては、R2−> PrimaryPtr がR3を指し示すポインタにセットされる。ブロック1208Aにおいてシステムは、ExtentPtr 及び PrimaryPtr が有効であることを指示するようにR2−>「ステータス」をセットする。
【0063】
図14の続きである図15のブロック1209乃至1211Aにおいてシステムは、データを FileInfo レコードR3内にセットする。ブロック1209ではD3領域を指し示すポインタに等しくR3−> ExtentPtrをセットする。ブロック1210ではR3−> ExtentLenをD3領域の長さに等しくセットする。ブロック1211においてシステムは、R3−> PrimaryPtr をR−> PrimaryPtr に等しくセットする。ブロック1211Aでは、ExtentPtr 及び PrimaryPtr が有効であることを指示するようにR3−>「ステータス」をセットする。
【0064】
ブロック1212乃至1214Aにおいてシステムは、データを FileInfo レコードR1内にセットする。ブロック1212ではD1領域を指し示すポインタに等しくR1−>
ExtentPtrをセットする。ブロック1213ではR1−> ExtentLenをD3領域の長さに等しくセットする。ブロック1214においてシステムは、R1−> PrimaryPtr をR2を指し示すポインタにセットする。ブロック1214Aでは、ExtentPtr 及び PrimaryPtr が有効であることを指示するようにR1−>「ステータス」をセットする。
【0065】
ブロック1215においては、R1を指し示すポインタに等しくなるようにR−> SecondaryPtr がセットされる。ブロック1216では、 SecondaryPtr が有効であることを指示するようにR−>「ステータス」がセットされる。これでルーチンが終了する。
【0066】
図18及び19は、ファイル更新の特別な場合の結合の FileInfo リストを示す。これらの特別な場合を処理するためのルーチンは、図14、15に示したファイル更新の一般的な場合の処理に必要なルーチンの部分集合である。図18において、範囲の始まりから始まるデータが更新される。区分D1 1501は更新すべき範囲の始まりのデータを含み、区分D2 1502は更新されない範囲の終わりのデータを含む。2つの新 FileInfo レコードだけが必要である。第1の FileInfo レコードR1 1511は新データ1503を指し示し、第2のFileInfoレコードR2 1512は区分D2 1502内の古いデータを指し示す。図19に示すように範囲境界上で終わるデータが更新される場合にも同様な状況が発生する。ファイル更新の一般的な場合のように、D1及びD2を含む古い領域は、古い領域を含むブロックに2つの新しい割当て表エントリを割当てることによって2つの領域に細分される。またもしエントリのために十分なスペースが存在しなければ、変更されないデータは新ブロックへ移動させられる。
【0067】
図20は更新データが範囲境界にまたがる場合の FileInfo レコードのためのリンクされたリストを示す。
図21は、 FEProm からディレクトリを削除するルーチンの流れ図である。ファイルを削除するルーチンは、対応付けられた FileInfo レコードが割当て解除されること以外は同一である。このルーチンは、DirEntry のステータスを、それが削除されることを指示
するようにセットする。ブロック1801においてシステムは、削除すべきディレクトリを探知し、そのディレクトリのアドレスを含むように変数「ポインタD」をセットする。ブロック1802では、そのディレクトリを削除することを指示するようにD−>「ステ
ータス」をセットする。
【0068】
ディレクトリまたはファイルの名前は、新しい DirEntry または FileEntryをそれぞれ割当て、次いで新しいエントリを指し示すように古いエントリのSecondaryPtr をセット
することによって変更される。図23は、名前が“ B.DAT”に変更される時の、“ D.DAT”のためのファイルエントリを実線で、また変更を点線で示してある。新エントリはFileInfo エントリ、ディレクトリ構造、及び古いエントリに対応付けられた範囲のリンクさ
れたリストを指し示す。
【0069】
図22はファイル名の変更を実現する好ましいサブルーチンの流れ図である。ディレクトリ名を変更するためのサブルーチンは、対応付けられる範囲が存在しないことを除いて同一である。このルーチンへの入力パラメタは、ファイルの同胞及び新ファイル名である。ブロック1901においてシステムはディレクトリを通してシステムを探索し、名前を変更すべきファイルを探知し、 FileEntryを指し示すように変数Pをセットする。システムは、そのファイルのためのエントリのリンクされたリスト内の最後の FileEntryを探索する。ファイルは各名前変更毎にエントリを有する。
【0070】
ブロック1904においてシステムは、領域を新 FileEntryに割当て、その領域を指し示すように変数Cをセットする。ブロック1905においてシステムはC−>「名前」を新ファイル名に等しくセットし、C−>「属性」、C−>「日付」、C−>「時刻」をセットし、 ATDRecentに置換されるファイルエントリに基づいてC−>「ステータス」をセットする。ブロック1906においてシステムは、C−> SiblingPtr をP−> SiblingPtr に等しくセットしてエントリをディレクトリ階層にリンクする。ブロック1909では、C−> PrimaryPtr がP−> PrimaryPtr に等しくセットされ、新エントリは範囲のリストにリンクされる。ブロック1909Aでは、 ExtentPtr及び PrimaryPtr が有効であることを指示するためにC−>「ステータス」がセットされる。ブロック1910ではシステムはCを指し示すポインタに等しくP−> SecondaryPtr をセットする。ブロック1911においてシステムはSecondaryPtr が有効であることを指示するようにP−>「
ステータス」をセットし、古いエントリの置換を完了させてルーチンを終了させる。
【0071】
図24及び25は、あるファイルの属性データを変更するルーチンの流れ図である。あるファイルに関連する属性データは、ATDRecentのステータスを有し、また「性、日付、
及び時刻」フィールドが FNULLにセットされている第1のFileInfo エントリを選択することによって変更される。もしこのようなフィールドが存在しなければ、新しいFileInfo エントリが創成され、選択される。次いでシステムは「属性、日付、及び時刻」フィールドを選択された FileInfo エントリ内にセットする。先に最新の「属性、日付、及び時刻」データを記憶していたFileInfoエントリは、 ATDSupereseded にセットされているステータスを有している。入力パラメタはパスネーム及び属性データである。ブロック2101においてシステムはディレクトリ構造を通して探索してファイルを探知し、 FileEntryを指し示すように変数Pをセットする。ブロック2102においてもしP−>「ステータス」が ATDRecentを指示していれば、 FileEntryは最新の属性データを含んでおり、システムはブロック2103に進み、そうでない場合にはシステムはブロック2104に進む。ブロック2103においてシステムは変数Xを変数Pにセットして図25のブロック2111に進む。ブロック2104ではシステムは変数CをP−> PrimaryPtr に等しくセットする。システムはブロック2105乃至2108をループして最新の属性データを指示しているステータスを有するFileInfoエントリを探索する。ブロック2105においてもしSecondaryPtr が有効であることをC−>「ステータス」が指示していれば、シス
テムはブロック2106へ進み、そうでない場合はシステムはブロック2107へ進む。ブロック2106では変数CはC−>SecondaryPtr にセットされて置換されるエントリを指し示すようにされ、ブロック2105へループバックされる。ブロック2107にお
いてもしC−>「ステータス」が ATDRecentを指示していればFileInfoエントリは最新の属性データを含んでいるのであり、システムはブロック2109へ進み、そうでない場合にはシステムはブロック2108へ進む。ブロック2108においてシステムは変数CをC−> PrimaryPtr に等しくセットし、ブロック2105へループバックする。ブロック2109においてはシステムは変数Xを変数Cにセットし、図25のブロック2111へ進む。
【0072】
システムは、ブロック2111において変数Yを変数Xに初期化する。変数Xは最新の属性データを有するエントリを指し示す。ブロック2112乃至2119においては、再新のステータスを有し FNULLにセットされた属性データを有する次のエントリを探知する。ブロック2112においてもし PrimaryPtr が有効であることをY−>「ステータス」が指示していれば、システムはブロック2113へ進み、そうでなければ新エントリを追加するためにブロック2120へ進む。ブロック2113では、変数YはY−> PrimaryPtr にセットされる。ブロック2114においてもしSecondaryPtr が有効であることを
Y−>「ステータス」が指示していれば、システムはブロック2115へ進み、そうでなければブロック2116へ進む。ブロック2115では変数YがY−> SecondaryPtr に等しくセットされ、ブロック2114へループバックされる。ブロック2116においてもしY−>「ステータス」が ATDRecentにセットされていればシステムはブロック2117へ進み、そうでなければブロック2112へ戻される。ブロック2117においてもしY−>「属性」、Y−>「日付」、及びY−>「時刻」が FNULLに等しければシステムはブロック2118へ進み、そうでなければブロック2112へループバックされる。ブロック2118において、Y−>「属性」、Y−>「日付」及びY−>「時刻」は新しい属性データにセットされる。ブロック2119ではX−>「ステータス」が ATDSupersededに等しくセットされ、ルーチンは完了する。
【0073】
ブロック2120乃至2123においてシステムは新 FileInfo エントリを割当てて初期化する。ブロック2120では新 FileInfo エントリが割当てられ、新エントリを指し示すように変数Zがセットされる。ブロック2121では、システムはZ−>「属性」、Z−>「日付」、及びZ−>「時刻」を新属性データにセットし、Z−>「ステータス」を「存在」、 ATDRecent、及び FileInfo にセットし、Z−>ExtentPtr をY−>ExtentPtr にセットし、そしてZ−>ExtentLen をY−>ExtentLen にセットする。ブロック2122ではY−>SecondaryPtrが変数Zに等しくセットされ、 SecondaryPtr が有効であることを指示するようにY−>「ステータス」がセットされる。ブロック2123では、X−>「ステータス」が ATDSupersededに等しくセットされ、エントリが最早現属性データを含んでいないことを指示し、ルーチンが完了する。
【0074】
以上に本発明を好ましい実施例に関して説明したが、本発明はこの実施例に限定されるものではない。当業者ならば本発明の思想に基づく多くの変更が明白であろう。本発明の範囲は特許請求の範囲によってのみ限定されるものである。
【符号の説明】
【0075】
100 ディレクトリ「ルート」
102 「DOS」サブディレクトリ
103 「ワード」サブディレクトリ
104 「AUTOEXEC.BAT」ファイル
105 「COMMAND.COM」ファイル
106 「FORMATEXE」ファイル
107 「デービッド」サブディレクトリ
108 「メリー」サブディレクトリ
109 「LETTER1.DOC」ファイル
110 「LETTER1.DOC」ファイル
111 「LETTER2.DOC」ファイル
112 「LETTER3.DOC」ファイル
113 「ビル」ディレクトリ
120−132 ポインタ
140−142 リンクされたリスト
200−202 ファイル
203−206 範囲レコード
211−214 範囲
301 FEProm
302 ブロック
2302 ブロック割り当て構造体
2303 データ領域
2304 自由スペース
2310−2315 オフセット

【特許請求の範囲】
【請求項1】
ブロック消去可能で一回書き込み多数回読み取りのメモリにおいて消去カウントを均等化する方法において、前記メモリはメモリ位置のブロックに分割され、各ブロックは該ブロックが消去された回数を示す消去カウントを有し、前記方法は、
消去カウントを有する、前記ブロック消去可能で一回書き込み多数回読み取りのメモリの第1のブロックを識別するステップと、
前記第1のブロックよりも小さい消去カウントを有する、前記ブロック消去可能で一回書き込み多数回読み取りのメモリの第2のブロックを識別するステップと、
前記第1のブロックのデータをスペアブロックにコピーするステップと、
前記第1のブロックを消去するステップと、
前記第1のブロックにつき前記消去カウントをインクリメントするステップと、
前記第1のブロックについての前記インクリメントされた消去カウントを前記第1のブロックに記憶するステップと、
前記第2のブロックからデータを前記第1のブロックにコピーするステップと、
前記第2のブロックを消去するステップと、
前記第2のブロックにつき前記消去カウントをインクリメントするステップと、
前記第2のブロックについての前記インクリメントされた消去カウントを前記第2のブロックに記憶するステップと、
前記データを前記スペアブロックから前記第2のブロックにコピーするステップと
を含む方法。

【図1】
image rotate

【図2】
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

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate

【図14】
image rotate

【図15】
image rotate

【図16】
image rotate

【図17】
image rotate

【図18】
image rotate

【図19】
image rotate

【図20】
image rotate

【図21】
image rotate

【図22】
image rotate

【図23】
image rotate

【図24】
image rotate

【図25】
image rotate

【図26】
image rotate

【図27】
image rotate

【図28】
image rotate

【図29】
image rotate

【図30】
image rotate

【図31】
image rotate

【図32】
image rotate

【図33】
image rotate

【図34】
image rotate

【図35】
image rotate

【図36】
image rotate


【公開番号】特開2010−49714(P2010−49714A)
【公開日】平成22年3月4日(2010.3.4)
【国際特許分類】
【出願番号】特願2009−273039(P2009−273039)
【出願日】平成21年12月1日(2009.12.1)
【分割の表示】特願2009−81080(P2009−81080)の分割
【原出願日】平成5年1月29日(1993.1.29)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】