top >
技術情報 >
イレーズブロック構造
|
イレーズブロックの構造化について
|
さきほど、どのようにイレーズブロックにデータを書き込むかということについて説明しましたが、これを発展させて、実際にファイルを書き込むとどのようになるか説明します。
たとえばルートディレクトリの下に"test.dat"という512バイトのデータを持つファイルを書き込むと下図のようになります。(a)はイレーズブロック中の各構造体の配置状況を説明しています。また(b)は各構造体のポインタによるリンク状況を抜き出したものです。
|
|
(a)イレーズブロック中の各構造体の配置 |
 |
|
(b)各構造体のポインタによるリンク |
 |
|
上図を少し詳しく説明しておきたいと思います。
まず、ルートディレクトリをあらわすDirEntryが最初に置かれます。
次にファイル"test.dat"をあらわすFileEntryが置かれます。このファイルはルートディレクトリの下に置くので、DirEntryのPrimaryPtrからリンクされます。
ポインタは直接FileEntryを指しているのではありません。
ポインタは「論理ブロック番号 : ASのインデックス」という構造になっていますので、
BASの可変部にあるASを指します。
そしてASには、割り当てられた領域のオフセットとサイズが格納されています。このオフセットとサイズによって、イレーズブロック中のどこにリンク先の構造体が配置されているか分るようになっています。
あとは同じ要領でリンクされていきます。ファイルのデータを管理するためにFileInfoを割り当て、FileEntryからPrimaryPtrを使用してリンクします。
そして、ファイルのデータはExtentとして書き込まれます。ExtentはFileInfoからExtentPtrを使ってリンクされます。
この"test.dat"を書き込んだ場合の図からは2つの事が理解できます。
1つ目は「イレーズブロックの構造化」ということです。イレーズブロックに、ディレクトに関連する情報 (DirEntry)、ファイルに関連する情報(FileEntry)、ファイルのデータに関する情報(FileInfo)、そしてファイルのデータそのもの(Extent)というように構造化することによって、情報に変更があった場合に更新すべき領域を最小限にとどめることができます。
つまり、イレーズブロック全体を更新する必要がなくなります。
2つ目は「仮想アドレス」についてです。データや管理情報をイレーズブロックに書き込むと、そのすべての情報はポインタとASによって位置決めされます。ポインタとASにある情報はすべて論理的なもの、相対的なものになっています。これを仮想アドレスといいます。
この仮想アドレスを使用することによって、あとで説明しますガーベジコレクションを実現しています。
ポインタやASには物理的な絶対的情報は含んでいない訳ですが、フラッシュファイルシステムがフラッシュメモリにデータを書き込むためにはイレーズブロックの物理アドレスが必要になります。ポインタから物理アドレスに変換する手順を次に示します。
また、この手順を使用することによりポインタによるリンクをたどることができます。フラッシュファイルシステムは
|
- フラッシュメモリのアドレス空間の開始物理アドレス
- フラッシュメモリチップの個数
- メモリ内のイレーズブロックの数とサイズ
|
|
を知っています。これらの情報をもとにして |
[1]の論理ブロック番号を持つイレーズブロックをフラッシュメモリのアドレス空間からさがす。論理ブロックの開始物理アドレスがわかる。 |
BASの位置及び固定部のサイズは決まっている。ASのサイズも決まっているので、3.のインデックスからOffsetとLenの値を取りだすことができる。 |
論理ブロックの開始物理アドレスにOffsetを加えたアドレスからLenのサイズ分が目的の領域となる。
|
|
とします。 |
|