フラッシュメモリ上でのデータの更新について説明する前に、フラッシュメモリの構造について説明しておきます。
フラッシュメモリはイレーズブロック(単にブロックとも言う)と呼ばれる単位の集合として構成されています。イレーズブロックはその名が示す通り、データの消去単位を示します。
イレーズブロックを消去することによってデータをクリアします。
ただし、消去できる回数に制限があります。例えば、サイズが64KBのイレーズブロックが16個の構成のフラッシュメモリチップは下図のようになります。
|
64Kバイト×16のフラッシュメモリの構造
|
|
|
イレーズブロックのサイズおよび保証消去回数は、個々のフラッシュメモリチップに依存します。
一般的には下表のようになります。
フラッシュメモリの種類によっては、プログラムコードや設定パラメタなどを配置しやすいようにイレーズブロックサイズに変化をつけたものがありますが、フラッシュファイルシステムでは、チップ内のすべてのイレーズブロックのサイズが同じになっているものを使用します。この理由はのちほど説明します。
|
サイズ |
4Kバイト 〜 256Kバイト |
保証消去回数 |
100,000回 |
バイト書込み時間 |
8μs |
ブロック消去時間 |
1sec |
|
フラッシュメモリではデータを書き込むにあたって、まずイレーズブロックを消去する必要があります。消去することによって、イレーズブロック内のすべてのビットは1になります。そして、消去後にデータを書き込みます。データの読み出し、書込みはバイトもしくはワード単位で行います。
|
|
|
フラッシュメモリへのデータの書込みは、ビットを1から0にすることによって行われます。
一度0にしてしまったビットは、ブロック消去するまで1に変更することができません。このような性質をもっているために、さきほどの例の11110000bから00001111bへの直接的な変更はできなかったのです。
ただし、ビットを0にすることはできるので下記のようなビット操作をすることは可能です。
フラッシュメモリは、データの消去はイレーズブロック単位で行い、データの読み出し、書込みはバイトもしくはワード単位で行うと説明しました。例えば、あるアドレスの1バイトのデータを更新するためには次のような方法を取らなければなりません。
|
11110000b
11100000b
01100000b
00100000b
00000000b
|
|
- 指定したアドレスを含むイレーズブロック内のすべてのデータをRAMにコピーする。
- RAMにコピーしたデータのうち、指定のアドレスの1バイトのデータを更新する。
- イレーズブロックを消去する。
- RAM にコピーしていたデータを、元のイレーズブロックに書き込む。
|
|
|
ほとんど更新されないBIOSなどのファームウェアならこのような方法でもよいかもしれませんが、
頻繁に更新されるデータであった場合は次のような問題が発生します。
|
[1]
|
特定のイレーズブロックが頻繁に更新されることになると、更新の度に消去が発生するとになる。イレーズブロックの消去回数には限界があるので、場合によっては特更新ができなくなる。
|
|
|
[2]
|
フラッシュメモリの消去回数'の表にもあるように、フラッシュメモリへのデータの書込みは低速である。
例えば、1バイトの書込み時間が 8μs だとすると、64Kバイトのイレーズブロックにデータを書き込むためには約524msかかる。 さらにイレーズブロックの消去には1secかかるとすると、単純計算でも1イレーズブロックを更新するために1.5secは必要ということになる。
|
|
ファイルシステムのストレージデバイスとして使用する場合は、これらの問題は致命的なものとなります。そのため、フラッシュ
メモリの特性を考慮したハンドリング技術が必要不可欠です。
ただ、フラッシュメモリにおける消去を、イレーズブロック単位ではなくバイト単位で行うことができたら、上記の問題を多少解決できるかもしれません。しかし、そのような「ビット単位での消去」を実現しようとすると、セル構造や周辺回路が複雑化し、チップが大きくなってしまうため、あまり現実的ではありません。
|