(57)【要約】 【課題】データが書き込まれていないセクタ領域の先頭を検索する検索処理の処理時間を短縮する。【解決手段】第１のセクタ領域に対応する冗長領域と、第２のセクタ領域に対応する冗長領域を並行して参照する。第１のセクタ領域にデータが書き込まれていない場合は、末尾位置情報を第１のセクタ領域に対応する番号に変更し、第１のセクタ領域だけにデータが書き込まれている場合は、先頭位置情報を第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に末尾位置情報を第２のセクタ領域に対応する番号に変更し、第１のセクタ領域と第２セクタ領域の双方にデータが書き込まれている場合は、先頭位置情報を第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更する処理を繰り返す。【選択図】図５
2008046727.tif 000002
【特許請求の範囲】
【請求項１】
ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するメモリコントローラであって、
前記フラッシュメモリにアクセスするための２つのインターフェースを有するインターフェース手段と、
前記インターフェース手段の一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成する仮想ブロック形成手段と、
前記仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号に１を加えた番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むセクタポインタ情報書込み手段と、
前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持する検索範囲保持手段と、
前記検索範囲保持手段に保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、前記インターフェース手段の前記第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記検索範囲保持手段に保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記検索範囲保持手段に保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に前記検索範囲保持手段に保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更する検索手段とを有する
ことを特徴とするメモリコントローラ。
【請求項２】
ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するメモリコントローラであって、
前記フラッシュメモリにアクセスするための２つのインターフェースを有するインターフェース手段と、
前記インターフェース手段の一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成する仮想ブロック形成手段と、
前記仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むセクタポインタ情報書込み手段と、
前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持する検索範囲保持手段と、
前記検索範囲保持手段に保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、前記インターフェース手段の前記第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記検索範囲保持手段に保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記検索範囲保持手段に保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号に１を加えた値に変更すると共に前記検索範囲保持手段に保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号に１を加えた値に変更する検索手段とを有する
ことを特徴とするメモリコントローラ。
【請求項３】
前記第２のセクタ領域が前記検索範囲保持手段に保持されている先頭位置情報が示す番号と末尾位置情報が示す番号の中間点に対応するセクタ領域、又は該中間点の前後の番号に対応するセクタ領域であることを特徴とする請求項１又は２に記載のメモリコントローラ。
【請求項４】
前記先頭位置情報が示す番号と前記末尾位置情報が示す番号とが等しくなったときに、前記先頭位置情報が示す番号又は前記末尾位置情報が示す番号から前記仮想ブロック内のデータが書き込まれていないセクタ領域の先頭を判別するセクタ領域判別手段を有することを特徴とする請求項１乃至３のいずれか１項に記載のメモリコントローラ。
【請求項５】
請求項１乃至４のいずれか１項に記載のメモリコントローラと、このメモリコントローラによりアクセスが制御されるフラッシュメモリとを備えることを特徴とするフラッシュメモリシステム。
【請求項６】
ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するフラッシュメモリの制御方法であって、
前記フラッシュメモリにアクセスするための一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成し、該仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号に１を加えた番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むステップと、
前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持するステップと、
前記保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、該第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に前記保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更するステップとを有する
ことを特徴とするフラッシュメモリの制御方法。
【請求項７】
ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するフラッシュメモリの制御方法であって、
前記フラッシュメモリにアクセスするための一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成し、該仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むステップと、
前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持するステップと、
前記保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、該第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号に１を加えた値に変更すると共に前記保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号に１を加えた値に変更するステップとを有する
ことを特徴とするフラッシュメモリの制御方法。
【請求項８】
前記第２のセクタ領域が前記保持されている先頭位置情報が示す番号と末尾位置情報が示す番号の中間点に対応するセクタ領域、又は該中間点の前後の番号に対応するセクタ領域であることを特徴とする請求項６又は７に記載のフラッシュメモリの制御方法。
【請求項９】
前記先頭位置情報が示す番号と前記末尾位置情報が示す番号とが等しくなったときに、前記先頭位置情報が示す番号又は前記末尾位置情報が示す番号から前記仮想ブロック内のデータが書き込まれていないセクタ領域の先頭を判別するステップを有することを特徴とする請求項６乃至８のいずれか１項に記載のフラッシュメモリの制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フラッシュメモリに対するアクセスを制御するメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法に係り、特に、フラッシュメモリに対する書き込み処理において、書き込み先の物理ブロックのデータが書き込まれていないセクタ領域の先頭を検索する機能を有するメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法に関するものである。
【背景技術】
【０００２】
メモリカードやシリコンディスク等の記憶媒体である半導体メモリとして、ＮＡＮＤ型フラッシュメモリが多く用いられている。このフラッシュメモリは、複数のメモリセルを有し、各メモリセルが消去状態のとき論理値「１」とされ、書き込み状態のとき論理値「０」とされる。
【０００３】
ところで、これらのメモリセルを消去状態から書き込み状態に変化させる場合には、メモリセル単位で行うことができるが、メモリセルを書き込み状態から消去状態に変化させる場合には、メモリセル単位で行うことができず、所定数のメモリセルからなるブロック単位で一括消去することが行われる（ブロック消去）。
【０００４】
また、所定数のメモリセルからなるブロック（物理ブロック）は、書き込み及び読み出しのアクセス処理単位である複数のページで構成されている。すなわち、小ブロックでは３２ページ、大ブロックでは６４ページである。また、小ブロックでは、１個のページが１セクタ（５１２バイト）のユーザ領域と１６バイトの冗長領域とによって構成されている。
【０００５】
また、大ブロックでは、１個のページが、４セクタ（２０４８バイト）のユーザ領域（以下、５１２バイト単位のユーザ領域をセクタ領域という）と、６４バイトの冗長領域とで構成され、ユーザ領域と冗長領域とがそれぞれ４分割して使用される（以下、大ブロックでは、冗長領域を４分割したものを部分冗長領域という）。よって、小ブロックでは１個のページが１個のセクタ領域に対応し、大ブロックでは１個のページが４個のセクタ領域に対応している。
【０００６】
このようなフラッシュメモリに対する書き込み処理を制御するメモリコントローラは、ホストシステムから与えられるコマンド等に従って、ホストシステムから与えられるデータをフラッシュメモリに書き込む。ここで、フラッシュメモリにデータを書き込む場合は、物理ブロック内の先頭のページ（セクタ領域）から順番にデータが書き込まれる。従って、物理ブロック内の途中のページ（セクタ領域）までデータが書き込まれている物理ブロックにデータを書き込む場合には、データが書き込まれていないページ（セクタ領域）の先頭を検索し、検出されたページ（セクタ領域）からデータの書き込みが開始される。
【０００７】
また、ホストシステム側から与えられる論理アドレスであるＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）に基づいて、各物理ブロック内での書き込み先のページ（セクタ領域）を決めている場合には、既にデータが存在する物理ブロックに対して、データの書き込みを行うことができるかどうかを判別する。このような場合、物理ブロックのデータが書き込まれていないページ（セクタ領域）の先頭を検索する検索処理が行われ、検出されたページ（セクタ領域）がデータの書き込みを開始するセクタ領域より後でなければ、その物理ブロックに対してデータが書き込まれる。一方、検出されたページ（セクタ領域）がデータの書き込みを開始するページ（セクタ領域）より後であれば、別の消去されている物理ブロックにデータが書き込まれる。
【０００８】
このようなデータが書き込まれていないページ（セクタ領域）の先頭を検索する場合、１個の物理ブロックに含まれるセクタ領域の数が増加するにつれて処理負担も増加する。例えば、小ブロックの場合、１個の物理ブロックに含まれるセクタ領域の数は３２個であるが、大ブロックの場合、１個の物理ブロックに含まれるセクタ領域の数は２５６個になる。また、異なるチップ内の物理ブロックを仮想的に結合した仮想ブロックを、１個の物理ブロックと見なしてアクセスする場合には、更に、データが書き込まれていないセクタ領域の先頭を検索する際の処理負担が増加する。
【０００９】
次に、２つのインターフェースｃｈＡ、ｃｈＢを備えたメモリコントローラで仮想ブロックを形成した場合について、図７を参照して説明する。図７（ａ）は、ｃｈＡのインターフェースを介してアクセスされる物理ブロックと、ｃｈＢのインターフェースを介してアクセスされる物理ブロックとを示している。以下、ｃｈＡのインターフェースを介してアクセスされる物理ブロックを“ｃｈＡの物理ブロック”といい、ｃｈＢのインターフェースを介してアクセスされる物理ブロックを“ｃｈＢの物理ブロック”という。
【００１０】
この仮想ブロックは、図７（ｂ）に示したようにｃｈＡの物理ブロック内のセクタ領域とｃｈＢの物理ブロック内のセクタ領域とが交互配列された５１２個のセクタ領域を含んでいる。ここで、ＳＮａ＃０〜ＳＮａ＃２５５はｃｈＡの物理ブロック内のセクタ領域に付けられた通番であり（以下、物理セクタ番号という）、ＳＮｂ＃０〜ＳＮｂ＃２５５はｃｈＢの物理ブロック内のセクタ領域に付けられた通番である（以下、物理セクタ番号と言う）。
【００１１】
また、ＳＮ＃０〜ＳＮ＃５１１は仮想ブロックに含まれる５１２個のセクタ領域に付けられた通番である（以下、セクタ番号ＳＮという）。つまり、図７（ｂ）に示した仮想ブロックでは、ＳＮ＃０がＳＮａ＃０に対応し、ＳＮ＃１がＳＮｂ＃０に対応し、ＳＮ＃２がＳＮａ＃１に対応し、ＳＮ＃３がＳＮｂ＃１に対応し、以下同様に順次割り当てられている。
【００１２】
データが書き込まれていないセクタ領域の先頭を検索する方法として、たとえば特許文献１に示されているようなスタートページ情報を用いた検索方法と一般的に用いられている２分木検索とがある。これらの検索方法について、図面を参照して説明する。尚、以下の説明では、図７（ｂ）に示した仮想ブロックのＳＮ＃２２１のセクタ領域（ＳＮｂ＃１１０のセクタ領域）までデータが書き込まれている場合の検索過程を説明する。又、検索する範囲の先頭を示す先頭位置情報をスタートポインタＸとし、その末尾を示す末尾位置情報をエンドポインタＹとする。
【００１３】
図８は、一般的に用いられている２分木検索の場合の検索過程を示している。この検索では、まずスタートポインタＸに最初のセクタ領域のセクタ番号ＳＮ＃０に対応する０を設定し、エンドポインタＹに最後のセクタ領域のセクタ番号ＳＮ＃５１１に１を加えた５１２を設定する。続いて、スタートポインタＸに設定した値（０）とエンドポインタＹに設定した値（５１２）の中間点に対応するＳＮ＃２５６のセクタ領域に割り当てられている部分冗長領域に書き込まれている付加情報（セクタ領域にデータが書き込まれているか否かを判断することができる付加情報）を参照し、セクタ番号ＳＮがＳＮ＃２５６のセクタ領域にデータが書き込まれているか否かを判断する（検索回数：１）。
【００１４】
ここで、データが書き込まれていると判断した場合には、スタートポインタＸの設定値を参照したセクタ領域のセクタ番号ＳＮの値に変更する。一方、データが書き込まれていないと判断した場合には、エンドポインタＹの設定値を参照したセクタ領域のセクタ番号ＳＮの値に変更する。この例では、ＳＮ＃２５６のセクタ領域にデータが書き込まれていないので、エンドポインタＹの設定値を２５６に変更する。
【００１５】
次に、スタートポインタＸに設定した値（０）とエンドポインタＹに設定した値（２５６）の中間点に対応するＳＮ＃１２８のセクタ領域に割り当てられている部分冗長領域に書き込まれている付加情報を参照し、ＳＮ＃１２８のセクタ領域にデータが書き込まれているか否かを判断する（検索回数：２）。この例では、ＳＮ＃１２８のセクタ領域にデータが書き込まれているので、スタートポインタＸの設定値を１２８に変更する。
【００１６】
次に、スタートポインタＸに設定した値（１２８）とエンドポインタＹに設定した値（２５６）の中間点に対応するＳＮ＃１９２のセクタ領域に割り当てられている部分冗長領域に書き込まれている付加情報を参照し、ＳＮ＃１９２のセクタ領域にデータが書き込まれているか否かを判断する（検索回数：３）。この例では、ＳＮ＃１９２のセクタ領域にデータが書き込まれているので、スタートポインタＸの設定値を１９２に変更する。
【００１７】
以下同様に、スタートポインタＸに設定した値とエンドポインタＹに設定した値の中間点に対応するセクタ領域に割り当てられている部分冗長領域に書き込まれている付加情報を参照して、スタートポインタＸ又はエンドポインタＹの更新を順次行っていき、スタートポインタＸに設定した値とエンドポインタＹに設定した値の差が１になったときにエンドポインタＹに設定した値を、データが書き込まれていないセクタ領域の先頭のセクタ番号ＳＮであると判断する。
【００１８】
図９は、特許文献１に示されているようなスタートページ情報を用いた検索方法の場合の検索過程を示している。なお、特許文献１におけるスタートページ情報（小ブロックのフラッシュメモリにおけるスタートページ情報）を大ブロックのフラッシュメモリに適用するため、以下では、スタートページ情報をセクタポインタ情報として説明するものとする。つまり、セクタポインタ情報は、図７（ｂ）に示したように、一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号に１を加えた番号を示す情報である。例えば、ＳＮ＃０〜４のセクタ領域に対する書き込み処理や、ＳＮ＃５〜１９のセクタ領域に対する書き込み処理が、一連データの書き込み処理に対応する。又、ＳＮ＃０〜４のセクタ領域に割り当てられている部分冗長領域には、セクタポインタ情報として「５」が書き込まれ、ＳＮ＃５〜１９のセクタ領域に割り当てられた部分冗長領域には、セクタポインタ情報として「２０」が書き込まれる。
【００１９】
この検索では、まず、ＳＮ＃０のセクタ領域に割り当てられている部分冗長領域のセクタポインタ情報を参照する（検索回数：１）。この後、参照した部分冗長領域にセクタポインタ情報が書き込まれていた場合は、そのセクタポインタ情報に基づいて順次セクタポインタ情報を参照していき、セクタポインタ情報が書き込まれていなかった場合は検索を終了する。図９に示した例では、ＳＮ＃０のセクタ領域に割り当てられている部分冗長領域に書き込まれているセクタポインタ情報の「５」に基づいて、ＳＮ＃５のセクタ領域に割り当てられている部分冗長領域のセクタポインタ情報を参照する（検索回数：２）。次に、ＳＮ＃５のセクタ領域に割り当てられている部分冗長領域に書き込まれているセクタポインタ情報の「２０」に基づいて、ＳＮ＃２０のセクタ領域に割り当てられている部分冗長領域のセクタポインタ情報を参照する（検索回数：３）。
【００２０】
このような検索過程でＳＮ＃０、ＳＮ＃５、ＳＮ＃２０、ＳＮ＃４０、ＳＮ＃７０、ＳＮ＃９０、ＳＮ＃１２８、ＳＮ＃１６４、ＳＮ＃１９８及びＳＮ＃２２２のセクタ領域に割り当てられている部分冗長領域を順次参照していき、ＳＮ＃２２２のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報が書き込まれていないので、検索を終了する。そして、ＳＮ＃２２２のセクタ領域が、データが書き込まれていないセクタ領域の先頭であると判断する（検索回数：１０）。
【特許文献１】特開２００２−１９６９７７号公報
【発明の開示】
【発明が解決しようとする課題】
【００２１】
ところが、上述した２分木検索では、検索回数が検索対象の物理ブロック若しくは仮想ブロックに含まれるセクタ領域の数によって決まってしまう。例えば、図７（ｂ）のように、仮想ブロックに含まれるセクタ領域が５１２個（２の９乗個）の場合、９回の検索が必要となる。言い換えれば、セクタ領域の数が２のｎ乗個の場合には常にｎ回の検索を行わなければならないという問題があった。
【００２２】
また、上述した特許文献１のようなスタートページ情報を用いた検索処理では、セクタポインタ情報に基づいて、部分冗長領域を順次参照していくため、書き込まれている一連データの数が多くなると検索回数が多くなってしまうという問題があった。
【００２３】
本発明は、このような状況に鑑みてなされたものであり、上記問題点を解決することができるメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法を提供することを目的とする。
【課題を解決するための手段】
【００２４】
本発明のメモリコントローラは、ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するメモリコントローラであって、前記フラッシュメモリにアクセスするための２つのインターフェースを有するインターフェース手段と、前記インターフェース手段の一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成する仮想ブロック形成手段と、前記仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号に１を加えた番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むセクタポインタ情報書込み手段と、前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持する検索範囲保持手段と、前記検索範囲保持手段に保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、前記インターフェース手段の前記第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記検索範囲保持手段に保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記検索範囲保持手段に保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に前記検索範囲保持手段に保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記検索範囲保持手段に保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更する検索手段とを有することを特徴とする。
なお、上記セクタポインタ情報は、前記仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号を示す情報であってもよい。但し、その場合、上記セクタポインタ情報に基づいて先頭位置情報又は末尾位置情報を更新するときに、先頭位置情報又は末尾位置情報をセクタポインタ情報が示す番号に１を加えた値に変更する。
また、前記第１セクタ領域にデータが書き込まれているか否かは、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれているか否かによって判断することができる。つまり、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれている場合は、前記第１セクタ領域にデータが書き込まれていると判断し、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれていない場合は、前記第１セクタ領域にデータが書き込まれていないと判断する。前記第２セクタ領域にデータが書き込まれているか否かについても、同様に判断することができる。つまり、前記第２のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれている場合は、前記第２セクタ領域にデータが書き込まれていると判断し、前記第２のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれていない場合は、前記第２セクタ領域にデータが書き込まれていないと判断する。
また、前記第２のセクタ領域が前記検索範囲保持手段に保持されている先頭位置情報が示す番号と末尾位置情報が示す番号の中間点に対応するセクタ領域、又は該中間点の前後の番号に対応するセクタ領域であるようにすることができる。
また、前記先頭位置情報が示す番号と前記末尾位置情報が示す番号とが等しくなったときに、前記先頭位置情報が示す番号又は前記末尾位置情報が示す番号から前記仮想ブロック内のデータが書き込まれていないセクタ領域の先頭を判別するセクタ領域判別手段を有するようにすることができる。
本発明のフラッシュメモリシステムは、請求項１乃至４のいずれか１項に記載のメモリコントローラと、このメモリコントローラによりアクセスが制御されるフラッシュメモリとを備えることを特徴とする。
本発明のフラッシュメモリの制御方法は、ブロック単位で記憶データの消去が行われるフラッシュメモリに対するアクセスを制御するフラッシュメモリの制御方法であって、前記フラッシュメモリにアクセスするための一方のインターフェースに接続されたフラッシュメモリ内の物理ブロックと他方のインターフェースに接続されたフラッシュメモリ内の物理ブロックとを仮想的に結合した仮想ブロックを形成し、該仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号に１を加えた番号を示すセクタポインタ情報を、前記一連データの書き込み処理でデータが書き込まれるセクタ領域に対応する冗長領域に書き込むステップと、前記ブロック内の検索範囲を特定する情報として、検索範囲の先頭セクタ領域の番号を示す先頭位置情報と検索範囲の末尾セクタ領域の番号を示す末尾位置情報とを保持するステップと、前記保持されている先頭位置情報が示す番号に対応する第１のセクタ領域と、該第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、前記保持されている先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域とにデータが書き込まれているか否かを判断し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、前記保持されている末尾位置情報を前記第１のセクタ領域に対応する番号に変更し、前記第１のセクタ領域だけにデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に前記保持されている末尾位置情報を前記第２のセクタ領域に対応する番号に変更し、前記第１のセクタ領域と前記第２セクタ領域の双方にデータが書き込まれていると判断した場合は、前記保持されている先頭位置情報を前記第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更するステップとを有することを特徴とする。
なお、上記セクタポインタ情報は、前記仮想ブロックに対する一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号を示す情報であってもよい。但し、その場合、上記セクタポインタ情報に基づいて先頭位置情報又は末尾位置情報を更新するときに、先頭位置情報又は末尾位置情報をセクタポインタ情報が示す番号に１を加えた値に変更する。
また、前記第１セクタ領域にデータが書き込まれているか否かは、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれているか否かによって判断することができる。つまり、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれている場合は、前記第１セクタ領域にデータが書き込まれていると判断し、前記第１のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれていない場合は、前記第１セクタ領域にデータが書き込まれていないと判断する。前記第２セクタ領域にデータが書き込まれているか否かについても、同様に判断することができる。つまり、前記第２のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれている場合は、前記第２セクタ領域にデータが書き込まれていると判断し、前記第２のセクタ領域と対応する冗長領域にセクタポインタ情報が書き込まれていない場合は、前記第２セクタ領域にデータが書き込まれていないと判断する。
また、前記第２のセクタ領域が前記保持されている先頭位置情報が示す番号と末尾位置情報が示す番号の中間点に対応するセクタ領域、又は該中間点の前後の番号に対応するセクタ領域であるようにすることができる。
また、前記先頭位置情報が示す番号と前記末尾位置情報が示す番号とが等しくなったときに、前記先頭位置情報が示す番号又は前記末尾位置情報が示す番号から前記仮想ブロック内のデータが書き込まれていないセクタ領域の先頭を判別するステップを有するようにすることができる。
本発明のメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法では、第１のセクタ領域と第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、保持されている末尾位置情報を第１のセクタ領域に対応する番号に変更し、第１のセクタ領域だけにデータが書き込まれていると判断した場合は、保持されている先頭位置情報を第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に保持されている末尾位置情報を第２のセクタ領域に対応する番号に変更し、第１のセクタ領域と第２セクタ領域の双方にデータが書き込まれていると判断した場合は、保持されている先頭位置情報を第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更する。
そして、先頭位置情報が示す番号と末尾位置情報が示す番号との差がなくなったとき、先頭位置情報が示す番号又は末尾位置情報が示す番号から仮想ブロック内のデータが書き込まれていないセクタ領域の先頭を判別する。
【発明の効果】
【００２５】
本発明のメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法によれば、先頭位置情報が示す番号に対応する第１のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報と、第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報を並行して参照していくことにより、データが書き込まれていないセクタ領域の先頭を検索する平均的な検索速度を向上させることができる。つまり、検索対象の物理ブロック若しくは仮想ブロックに含まれるセクタ領域の数が２のｎ乗個の場合、通常の２分木検索であれば、常にｎ回の検索を行わなければならないが、本発明のメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法によれば、ｎ回以下の検索回数で、検索対象のセクタ領域を検出することができる。また、検索対象のセクタ領域を検出するまでの検索回数は、一連データの書き込み状況によって変化するが、書き込まれている一連データの数が多くなった場合でも、検索回数がｎ回より多くなることはない。
【発明を実施するための最良の形態】
【００２６】
本実施形態では、先頭位置情報が示す番号に対応する第１のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報と、第１のセクタ領域と異なる側のインターフェースに接続されたフラッシュメモリに属し、先頭位置情報が示す番号より大きく末尾位置情報が示す番号より小さい番号に対応する第２のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報を並行して参照する。第１のセクタ領域と第２セクタ領域の双方にデータが書き込まれていないと判断した場合は、保持されている末尾位置情報を第１のセクタ領域に対応する番号に変更し、第１のセクタ領域だけにデータが書き込まれていると判断した場合は、保持されている先頭位置情報を第１のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更すると共に保持されている末尾位置情報を第２のセクタ領域に対応する番号に変更し、第１のセクタ領域と第２セクタ領域の双方にデータが書き込まれていると判断した場合は、保持されている先頭位置情報を第２のセクタ領域と対応する冗長領域に書き込まれているセクタポインタ情報が示す番号の値に変更する。この処理を繰り返すことで、仮想ブロック内でのデータが書き込まれていないセクタ領域の先頭を検索するようにした。
【００２７】
これにより、仮想ブロック内のセクタ領域の数が２のｎ乗個の場合、通常の２分木検索であれば、常にｎ回の検索を行わなければならないが、本実施形態では、ｎ回以下の検索回数で物理ブロックのデータが書き込まれていないセクタ領域の先頭を検出することができる。また、検索対象のセクタ領域を検出するまでの検索回数は、一連データの書き込み状況によって変化するが、書き込まれている一連データの数が多くなった場合でも、検索回数がｎ回より多くなることはない。
【００２８】
なお、セクタ領域と対応する冗長領域（第１のセクタ領域と対応する冗長領域、第２のセクタ領域と対応する冗長領域）とは、そのセクタ領域に書き込んだデータに対応するセクタポインタ情報やエラーコレクションコード（ＥＣＣ）を書き込むために割り当てられた冗長領域内の領域である。従って、１ページが複数のセクタ領域で構成されているフラッシュメモリ（例えば、大ブロックのフラッシュメモリ）の場合は、セクタ領域毎に冗長領域内の異なる領域が割り当てられる。
【実施例】
【００２９】
以下、本発明の詳細を図面に基づいて説明する。図１は、本発明のフラッシュメモリシステムの一実施例の概略を説明するためのブロック図である。図１に示すように、フラッシュメモリシステム１は、フラッシュメモリ２と、それを制御するメモリコントローラ３で構成されている。また、フラッシュメモリシステム１は、外部バス１３を介してホストシステム４と接続される。
【００３０】
ホストシステム４は、ホストシステム４の全体の動作を制御するためのＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）と、フラッシュメモリシステム１との情報の授受を担うコンパニオンチップ等とから構成される。ホストシステム４は、たとえば文字、音声、あるいは画像情報等の種々の情報を処理するパーソナルコンピュータやデジタルスチルカメラをはじめとする各種情報処理装置であってもよい。
【００３１】
フラッシュメモリ２は、不揮発性メモリであり、レジスタとメモリセルとの間でデータの複写を行って、データの書き込み又は読み出しを行う。
【００３２】
メモリセルアレイは、複数のメモリセル群と、ワード線とを備える。各メモリセル群は、複数のメモリセルが直列に接続されたものである。ワード線は、メモリセル群の特定のメモリセルを選択するためのものである。このワード線を介して選択されたメモリセルとレジスタとの間で、データの複写、すなわち、レジスタから選択されたメモリセルへの複写又は選択されたメモリセルからレジスタへのデータの複写が行われる。つまり、メモリコントローラ３から与えられたデータは、レジスタを介してメモリセルアレイに書き込まれ、メモリセルアレイに記憶されているデータはレジスタを介してメモリコントローラ３に供給される。
【００３３】
メモリセルアレイを構成するメモリセルは、２つゲートを備えたＭＯＳトランジスタによって構成される。ここで、一方のゲートはコントロールゲート、他方のゲートはフローティングゲートとそれぞれ呼ばれている。フローティングゲートに電荷（電子）を注入若しくはフローティングゲートから電荷（電子）を排出することによって、データの書き込み若しくはデータの消去が行われる。
【００３４】
このフローティングゲートは、周囲が絶縁体で囲まれているので、注入された電子は長期間にわたって保持される。なお、フローティングゲートに電子を注入するときは、コントロールゲートが高電位側となる高電圧がコントロールゲートとフローティングゲートとの間に印加される。また、フローティングゲートから電子を排出するときは、コントロールゲートが低電位側となる高電圧がコントロールゲートとフローティングゲートとの間に印加される。
【００３５】
ここで、フローティングゲートに電子が注入されている状態が書き込み状態であり、論理値「０」に対応する。また、フローティングゲートから電子が排出されている状態が消去状態であり、論理値「１」に対応する。
【００３６】
このようなフラッシュメモリ２のアドレス空間は、“ページ”及び“ブロック（物理ブロック）”で構成されている。ページは、フラッシュメモリ２にて行われるデータ読み出し動作及びデータ書き込み動作における処理単位である。物理ブロックは、フラッシュメモリ２にて行われるデータ消去動作における処理単位であり、複数個のページで構成されている。
【００３７】
ここで、図２は、フラッシュメモリ２のアドレス空間の構造を概略的に示すものであり、１個のページが、４セクタ（２０４８バイト）のユーザ領域２５と、６４バイトの冗長領域２６とで構成され、１個の物理ブロックは６４個のページで構成されている。また、ビットｂ０〜ｂ７は、１バイトに含まれる各ビットを示している。また、ユーザ領域２５と冗長領域２６とはそれぞれ４分割して使用される（以下、ユーザ領域２５を４分割した５１２バイトの領域をセクタ領域といい、冗長領域２６の各セクタ領域に割り当てられている領域を部分冗長領域という）。また、１個のセクタ領域には１個の部分冗長領域がそれぞれ割り当てられている。つまり、このフラッシュメモリ２の各物理ブロックは、２５６個のセクタ領域と各セクタ領域に割り当てられた２５６個の部分冗長領域とで構成されているとみなすことができる。
【００３８】
また、物理ブロックには、図３（ｃ）に示したように、それぞれに固有の物理ブロックアドレス（ＰＢＡ）が割り当てられている。さらに、記憶領域を複数のゾーンに分割して管理する場合には、複数個の物理ブロックで物理ゾーンを構成し、各物理ゾーンに固有の物理ゾーン番号（ＰＺＮ）を割り当てている。各物理ゾーンに含まれる物理ブロックの、各物理ゾーン内での通番を物理ゾーン内ブロック番号（ＰＺＩＢＮ）と呼んでいる。
【００３９】
一方、ホストシステム４側のアドレス空間は、図３（ａ）に示したようにセクタ（５１２バイト）単位で分割した領域に付けた通番であるＬＢＡ（Ｌｏｇｉｃａｌ  Ｂｌｏｃｋ  Ａｄｄｒｅｓｓ）で管理されている。さらに、複数個のセクタをまとめたものを論理ブロックと呼び、複数個の論理ブロックをまとめたものを論理ゾーンと呼んでいる。また、図３（ｂ）に示したように論理ブロックに付けられた通番を論理ブロック番号（ＬＢＮ）と呼び、論理ゾーンに付けられた通番を論理ゾーン番号（ＬＺＮ）と呼んでいる。また、各論理ゾーンに含まれる論理ブロックの、各論理ゾーン内での通番を論理ゾーン内ブロック番号（ＬＺＩＢＮ）と呼んでいる。
【００４０】
また、各論理ゾーンにはそれぞれ１個の物理ゾーンが割り当てられ、論理ゾーンに含まれる各論理ブロックに対応するデータは、その論理ゾーンに割り当てられた物理ゾーンに含まれる物理ブロックに書き込まれる。したがって、１個の論理ブロックに含まれるセクタ数は、１個の物理ブロックに含まれるセクタ領域の個数に応じて設定される。但し、１個の論理ブロックを複数個の物理ブロックに割り当てる場合には、その複数個の物理ブロックを１個の物理ブロックとみなして１個の論理ブロックに含まれるセクタ数を設定する。
【００４１】
図３に示した例では、１個の物理ブロックが２５６個のセクタ領域で構成されたフラッシュメモリを想定しているため、２５６セクタが１個の論理ブロックに対応している。したがって、ＬＢＮ＃０〜＃４９９の５００個の論理ブロックで構成されたＬＺＮ＃０の論理ゾーンは、ＬＢＡ＃０〜＃１２７９９９の１２８０００セクタの領域に対応している。  
【００４２】
以下同様に、ＬＺＮ＃１の論理ゾーンは、ＬＢＡ＃１２８０００〜＃２５５９９９の１２８０００セクタの領域に対応し、ＬＺＮ＃２の論理ゾーンは、ＬＢＡ＃２５６０００〜＃３８３９９９の１２８０００セクタの領域に対応し、ＬＺＮ＃３の論理ゾーンは、ＬＢＡ＃３８４０００〜＃５１１９９９の１２８０００セクタの領域に対応している。
【００４３】
また、ＬＢＮ＃０〜＃４９９の５００個の論理ブロックで構成されたＬＺＮ＃０の論理ゾーンは、ＰＢＡ＃０〜＃５１１の５１２個の物理ブロックで構成されたＰＺＮ＃０の物理ゾーンに割り当てられている。以下同様に、ＬＺＮ＃１の論理ゾーンは、ＰＺＮ＃１の物理ゾーンに割り当てられ、ＬＺＮ＃２の論理ゾーンは、ＰＺＮ＃２の物理ゾーンに割り当てられ、ＬＺＮ＃３の論理ゾーンは、ＰＺＮ＃３の物理ゾーンに割り当てられている。  
【００４４】
ここで、物理ゾーンに含まれる物理ブロックの個数を、論理ゾーンに含まれる論理ブロックの個数より多くしているのは、同一の論理ブロックに対応する新データと旧データが別々の物理ブロックに並存する場合や、データを正常に書き込むことができない不良ブロックが発生した場合等を考慮したものである。
【００４５】
また、各物理ブロックには、その物理ブロックに割り当てられた論理ブロックのデータがＬＢＡの順番で書き込むようにする場合は、物理ブロックと論理ブロックとの対応関係を管理することにより、ホストシステム４から与えられるＬＢＡとフラッシュメモリ２内のアクセス領域の対応関係を管理することができる。
【００４６】
なお、物理ブロックと論理ブロックとの対応関係は、データの書き込みや消去が行われる毎に変化する。このため、個々の時点における両者の対応関係を管理するためアドレス変換テーブルが作成され、対応関係が変化する毎にアドレス変換テーブルが更新される。また、上述のように論理ゾーンと物理ゾーンとの対応関係が予め設定されている場合、アドレス変換テーブルは論理ゾーン毎に作成することができる。
【００４７】
このアドレス変換テーブルは、物理ブロックの先頭ページの冗長領域２６に書き込まれる論理ブロックを示す情報（以下、論理アドレス情報という）に基づいて作成される。冗長領域２６に書き込まれる論理アドレス情報としては、ＬＢＮ等の論理ブロックを特定する情報が用いられる。なお、論理ゾーンと物理ゾーンとの対応関係は予め設定されている場合は、ＬＺＩＢＮに基づいてアドレス変換テーブルを作成することができるので、ＬＢＮよりデータ量の少ないＬＺＩＢＮを論理アドレス情報として用いることが好ましい。
【００４８】
また、物理ブロックの先頭ページの冗長領域２６には、その物理ブロックが不良ブロックであるか否かを示すブロックステータス（フラグ）が書き込まれる。各セクタ領域に割り当てられた部分冗長領域には、それぞれ対応するセクタ領域に書き込まれたユーザデータのエラーコレクションコード（ＥＣＣ）と、セクタポインタ情報（ＳＰ）とが書き込まれる。
【００４９】
次に、フラッシュメモリ２に対してアクセス処理を行うメモリコントローラ３について説明する。メモリコントローラ３は、フラッシュメモリ２にデータ、アドレス情報、内部コマンド等を供給することにより読み出し処理、書き込み処理、ブロック消去処理等の各処理を行う。
【００５０】
ここで、内部コマンドとは、メモリコントローラ３がフラッシュメモリ２に処理の実行を指示するためのコマンドであり、フラッシュメモリ２はメモリコントローラ３から与えられる内部コマンドに従って動作する。一方、ホストシステム４からメモリコントローラ３に与えられるコマンドを外部コマンドという。
【００５１】
メモリコントローラ３は、図１に示すように、マイクロプロセッサ６と、ホストインターフェースブロック７と、ワークエリア８と、バッファ９と、フラッシュメモリインターフェースブロック１０と、ＥＣＣ（エラー・コレクション・コード）ブロック１１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１２とを備えている。これら機能ブロックによって構成されるメモリコントローラ３は、１つの半導体チップ上に集積される。
【００５２】
マイクロプロセッサ６は、ＲＯＭ１２に記憶されているプログラムに従って、メモリコントローラ３の全体の動作を制御する。
【００５３】
また、マイクロプロセッサ６は、ＲＯＭ１２に記憶されているプログラムを読み込むことで、セクタポインタ情報書込み手段、検索範囲保持手段、セクタ領域検索手段、セクタポインタ情報更新手段、第１のセクタ領域判別手段、第２のセクタ領域判別手段を実現している。
【００５４】
ＲＯＭ１２は、不揮発性の記憶素子であり、上記のシーケンスコマンド等を記憶している。ワークエリア８は、フラッシュメモリ２の制御に必要なデータが一時的に格納される作業領域であり、複数のＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）セルによって構成される。上述のアドレス変換テーブルは、このワークエリア８上に作成される。
【００５５】
バッファ９は、フラッシュメモリ２から読み出されたデータ及びフラッシュメモリ２に書き込むべきデータを一時的に蓄積する。すなわち、フラッシュメモリ２から読み出されたデータは、ホストシステム４が受け取り可能な状態となるまでバッファ９に保持され、フラッシュメモリ２に書き込むべきデータは、フラッシュメモリ２が書き込み可能な状態となるまでバッファ９に保持される。
【００５６】
ＥＣＣブロック１１は、フラッシュメモリ２に書き込むデータに付加されるエラーコレクションコードを生成するとともに、読み出しデータに付加されたエラーコレクションコードに基づいて、読み出したデータに含まれる誤りを検出・訂正する。
【００５７】
ホストインターフェースブロック７は、ホストシステム４との間で、外部バス１３を介し、データ、アドレス情報、外部コマンド等の授受を行う。ホストシステム４よりフラッシュメモリシステム１に供給されるデータ等は、ホストインターフェースブロック７を入口としてフラッシュメモリシステム１の内部（たとえば、バッファ９）に取り込まれる。フラッシュメモリシステム１からホストシステム４に供給されるデータ等は、ホストインターフェースブロック７を出口としてホストシステム４に供給される。
【００５８】
フラッシュメモリインターフェースブロック１０は、各種処理等を定義したコマンドセット（以下、シーケンスコマンドという）をＲＯＭ１２から読み出し、このシーケンスコマンドに従って処理を実行する。このシーケンスコマンドに従って処理を実行することにより、フラッシュメモリインターフェースブロック１０は、内部バス１４を介して、フラッシュメモリ２とデータ、アドレス情報、ステータス情報、内部コマンド等の授受を行う。
【００５９】
ホストインターフェースブロック７及びフラッシュメモリインターフェースブロック１０は、図４に示すような各種レジスタを備える。すなわち、ホストインターフェースブロック７は、コマンドレジスタＲ１、セクタ数レジスタＲ２及びＬＢＡレジスタＲ３等を備えている。また、フラッシュメモリインターフェースブロック１０は、物理ブロックアドレスレジスタＲ１１、セクタ番号レジスタＲ１２、カウンタＲ１３、セクタポインタレジスタＲ１４等を備えている。
【００６０】
コマンドレジスタＲ１、セクタ数レジスタＲ２及びＬＢＡレジスタＲ３には、ホストシステム４から与えられる情報が書き込まれる。コマンドレジスタＲ１には、書き込みコマンド、読み出しコマンド等の外部コマンドが書き込まれる。セクタ数レジスタＲ２にはアクセス対象領域のセクタ数が書き込まれる。ＬＢＡレジスタＲ３には、アクセス対象領域の先頭のＬＢＡが書き込まれる。
【００６１】
物理ブロックアドレスレジスタＲ１１、セクタ番号レジスタＲ１２、カウンタＲ１３には、セクタ数レジスタＲ２及びＬＢＡレジスタＲ３に書き込まれた情報に基づく、フラッシュメモリ２内のアクセス対象領域を指示する情報が書き込まれる。
【００６２】
たとえば、ＬＢＡが連続する２５６セクタの領域を、フラッシュメモリ２（１ブロックが６４ページで、１ページが４セクタの場合）の１個の物理ブロックに割り当てた場合、ＬＢＡの下位８ビットがセクタ番号ＳＮに対応し、この下位８ビットを除いた上位側のビットが論理ブロック番号（ＬＢＮ）に対応する。
【００６３】
つまり、ＬＢＡが連続する２５６セクタの領域を１個の論理ブロックとした場合、ＬＢＡの下位８ビットが論理ブロック内の各セクタに付けた通番であるセクタ番号（ＳＮ：＃０〜＃２５５）を示し、このＬＢＡの下位８ビットを除いた上位側のビットが論理ブロック番号（ＬＢＮ）を示している。なお、ＬＢＡ、論理ブロック番号（ＬＢＮ）及びセクタ番号（ＳＮ）のビット数については、フラッシュメモリ２の容量や仕様等に応じて決定される。
【００６４】
次に、物理ブロックアドレスレジスタＲ１１、セクタ番号レジスタＲ１２、カウンタＲ１３に設定される情報について説明する。セクタ番号レジスタＲ１２には、ＬＢＡレジスタＲ３に書き込まれたＬＢＡのセクタ番号ＳＮに対応する部分が書き込まれる。
【００６５】
ここで、各物理ブロックにはＬＢＡの順番でユーザデータが書き込まれるので、上記のセクタ番号（ＳＮ）は、各物理ブロックに含まれるセクタ領域に付けられた通番に対応する。一方、物理ブロックアドレスレジスタＲ１１には、ＬＢＡレジスタＲ３に書き込まれたＬＢＡの論理ブロック番号（ＬＢＮ）を示す部分に基づいて特定された論理ブロックと対応する物理ブロックの物理ブロックアドレス（ＰＢＡ）又は空きブロックの物理ブロックアドレス（ＰＢＡ）が書き込まれる。
【００６６】
つまり、特定された論理ブロックに対応する物理ブロックからユーザデータを読み出す場合、又は、その物理ブロックに追加書き込みをする場合には、特定された論理ブロックと対応する物理ブロックの物理ブロックアドレス（ＰＢＡ）が物理ブロックアドレスレジスタＲ１１に書き込まれる。また、特定された論理ブロックに対応するユーザデータを空きブロックに書き込む場合には、その空きブロックの物理ブロックアドレス（ＰＢＡ）が物理ブロックアドレスレジスタＲ１１に書き込まれる。カウンタＲ１３には、セクタ数レジスタＲ２に設定されたセクタ数が書き込まれる。
【００６７】
なお、ＬＢＡレジスタＲ３及びセクタ数レジスタＲ２に設定された情報に基づいて特定されるアクセス対象領域が複数の論理ブロックに跨っている場合、アクセス対象領域の物理ブロックも複数の物理ブロックに跨っているので、物理ブロックアドレスレジスタＲ１１、セクタ番号レジスタＲ１２、カウンタＲ１３に対する情報の設定は論理ブロック毎に行い、カウンタＲ１３には各論理ブロックのアクセス対象領域に含まれるセクタ数を設定する。
【００６８】
したがって、ＬＢＡレジスタＲ３及びセクタ数レジスタＲ２に設定された情報に基づいて特定されるアクセス対象領域が複数の論理ブロックに跨っている場合、ホストシステム４から与えられる１回の書き込みコマンドに基づいて複数回（たとえば、２個の論理ブロックに跨っている場合は２回）のシーケンス書き込み処理が実行される。
【００６９】
書き込み処理の場合には、セクタポインタレジスタＲ１４にそのシーケンス書き込み処理で最後にユーザデータが書き込まれるセクタ領域の次のセクタ領域の番号が設定される。つまり、セクタポインタレジスタＲ１４には、セクタ番号レジスタＲ１２に設定された値にカウンタＲ１３に設定された値を加えた値が設定される。
【００７０】
また、シーケンス書き込み処理では、１セクタのユーザデータがバッファ９からフラッシュメモリ２に供給される毎にセクタ番号レジスタＲ１２に設定されている値がインクリメント（１ずつ増加）され、カウンタＲ１３に設定されている値がデクリメント（１ずつ減少）される。カウンタＲ１３に設定されている値が０になったときにシーケンス書き込み処理が終了する。
【００７１】
たとえば、セクタ番号レジスタＲ１２に「１０」を設定し、カウンタＲ１３に「８」を設定してシーケンス書き込み処理を開始した場合、ＳＮ＃１０〜＃１７のセクタ領域にユーザデータが書き込まれる。また、セクタポインタレジスタＲ１４には「１８（１０＋８）」が設定されるので、このシーケンス書き込み処理でユーザデータが書き込まれたセクタ領域に割り当てられている部分冗長領域にはセクタポインタ情報（ＳＰ）として「１８」が書き込まれる。
【００７２】
また、シーケンス書き込み処理で連続的に書き込まれるデータを、一連データと呼んでいる。したがって、一連データのセクタ数はカウンタＲ１３に設定された数値によって決まり、一連データが書き込まれたセクタ領域に割り当てられている部分冗長領域には、同一のセクタポインタ情報（ＳＰ）が書き込まれる。
【００７３】
また、一連データの書き込み処理を開始するときに、その一連データの書き込み先の物理ブロックに既にデータが存在する場合には、一連データを書き込むことができるかどうかを判別する。つまり、一連データの先頭データの書き込み先に対応するセクタ領域が、その物理ブロックのデータが書き込まれていないセクタ領域の先頭より前であれば一連データを書き込むことができないと判断し、前でなければ一連データを書き込むことができると判断する。この判断をするため、データが書き込まれていないセクタ領域の先頭を検索する検索処理が行われる。
【００７４】
次に、このようなデータが書き込まれていないセクタ領域の先頭を検索する検索処理を、図５及び図６を用いて説明する。なお、以下に説明する検索処理は、図７（ａ）、（ｂ）で説明したように、ｃｈＡのインターフェースを介してアクセスされる物理ブロックと、ｃｈＢのインターフェースを介してアクセスされる物理ブロックを仮想的に結合した仮想ブロックで行うものとする。また、それぞれの物理ブロックは、１個の物理ブロックが２５６個のセクタ領域で構成されているとみなすことができる大ブロックの場合とする。
【００７５】
この仮想ブロックでは、連続するＬＢＡがｃｈＡの物理ブロックとｃｈＢの物理ブロックに交互に割り振られる。つまり、ＬＢＡの最下位ビットが振り分け先の物理ブロック（ｃｈＡの物理ブロック又はｃｈＢの物理ブロック）を識別する情報として使用される。又、ＬＢＡの下位側から数えて２〜９ビット目は、各物理ブロック内のセクタ領域に付けられた通番である物理セクタ番号に対応し、ＬＢＡの下位９ビットを除いた上位側のビットが論理ブロック番号（ＬＢＮ）に対応する。この論理ブロック番号（ＬＢＮ）はｃｈＡの物理ブロックの物理ブロックアドレス（ＰＢＡ）とｃｈＢの物理ブロックにそれぞれ変換される。
【００７６】
また、ｃｈＡの物理ブロックとｃｈＢの物理ブロックには交互にデータが書き込まれるので、仮想ブロック内のセクタ領域に付けられたセクタ番号が偶数であれば、そのセクタ領域はｃｈＡの物理ブロックに含まれ、仮想ブロック内のセクタ領域に付けられたセクタ番号が奇数であれば、そのセクタ領域はｃｈＢの物理ブロックに含まれる。
【００７７】
また、仮想ブロック内の検索範囲を特定する情報として、先頭位置情報（検索範囲の先頭セクタ領域の番号を示す情報）が示す番号をスタートポインタＸとし、末尾位置情報（検索範囲の末尾セクタ領域の番号を示す情報）が示す番号をエンドポインタＹとする。
【００７８】
次に、図５のフローチャートを参照してデータが書き込まれていないセクタ領域の先頭を検索する検索処理の処理手順を説明する。
【００７９】
この検索処理を開始するときは、スタートポインタＸとエンドポインタＹに初期値を設定する。つまり、スタートポインタＸには仮想ブロック内の先頭セクタ領域のセクタ番号である０を設定し、エンドポインタＹには、仮想ブロック内の末尾セクタ領域のセクタ番号に１を加算した５１２を設定する（ステップＳ１）。
【００８０】
次に、エンドポインタＹとスタートポインタＸとの差が１であるか否かを判断する（ステップＳ２）。エンドポインタＹとスタートポインタＸとの差が１でない場合（ステップＳ２：Ｎｏ）、第１のセクタ領域のセクタ番号（ＳＮ）に対応する番号であるＮａの値をＮａ＝Ｘに設定し、第２のセクタ領域のセクタ番号（ＳＮ）に対応する番号であるＮｂの値をＮｂ＝（Ｘ＋Ｙ）／２に設定する（ステップＳ３）。つまり、ＮａはスタートポインタＸに設定されている値に設定され、ＮｂはスタートポインタＸとエンドポインタＹの中間点に対応する値に設定される。なお、Ｎｂの値は、スタートポインタＸの値より大きくエンドポインタＹより小さい値であれば、スタートポインタＸとエンドポインタＹの中間点に対応する値でなくてもよい。
【００８１】
次いで、ステップＳ３で設定したＮａとＮｂの双方が偶数、又は双方が奇数であるかを判断する（ステップＳ４）。ＮａとＮｂの双方が偶数、又は双方が奇数の場合（ステップＳ４：Ｙｅｓ）、Ｎｂから１を減算する調整を行った後（ステップＳ５）、ステップＳ６に進む。この調整により、セクタ番号（ＳＮ）がＮａの第１のセクタ領域とセクタ番号（ＳＮ）がＮｂの第２のセクタ領域は、一方がｃｈＡの物理ブロックに含まれるセクタ領域になり、他方がｃｈＢの物理ブロックに含まれるセクタ領域になる。
【００８２】
ＮａとＮｂの一方が偶数で他方が奇数の場合（ステップＳ４：Ｎｏ）、ステップＳ５の調整を行わずにステップＳ６に進む。ステップＳ５の調整で、ＮａとＮｂの一方が偶数で他方が奇数になるようにするのは、第１のセクタ領域（セクタ番号（ＳＮ）がＮａのセクタ領域）に割り当てられている部分冗長領域と第２のセクタ領域（セクタ番号（ＳＮ）がＮｂのセクタ領域）に割り当てられている部分冗長領域を、ｃｈＡのインターフェースとｃｈＢのインターフェースを介して並行してアクセスするためである。
【００８３】
次に、ｃｈＡのインターフェースとｃｈＢのインターフェースを介して、セクタ番号（ＳＮ）がＮａの第１のセクタ領域に割り当てられている部分冗長領域とセクタ番号（ＳＮ）がＮｂの第２のセクタ領域に割り当てられている部分冗長領域を平行して参照する。ここでは、部分冗長領域のセクタポインタ情報（ＳＰ）が書き込まれる領域が参照される。尚、セクタポインタ情報（ＳＰ）は、セクタ領域にデータが書き込まれたときに書き込まれるので、セクタポインタ情報（ＳＰ）の有無によって、セクタ領域にデータが書き込まれているか否かを判断することができる。
【００８４】
第１のセクタ領域（セクタ番号（ＳＮ）がＮａのセクタ領域）に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が書き込まれているか否か判断し（ステップＳ６）、セクタポインタ情報（ＳＰ）が有る場合（ステップＳ６：Ｙｅｓ）は、ステップＳ７に進み、セクタポインタ情報（ＳＰ）が無い場合（ステップＳ６：Ｎｏ）は、ステップＳ１３に進む。
【００８５】
第２のセクタ領域（セクタ番号（ＳＮ）がＮｂのセクタ領域）に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が書き込まれているか否か判断し（ステップＳ７）、セクタポインタ情報（ＳＰ）が有る場合（ステップＳ７：Ｙｅｓ）は、ステップＳ８に進み、セクタポインタ情報（ＳＰ）が無い場合（ステップＳ７：Ｎｏ）は、ステップＳ９に進む。
【００８６】
つまり、第１のセクタ領域と第２のセクタ領域の双方にデータが書き込まれていない場合（ステップＳ６：Ｎｏ）は、ステップＳ１３に進む。第１のセクタ領域にデータが書き込まれていて第２のセクタ領域にデータが書き込まれていない場合（ステップＳ６：Ｙｅｓ、ステップＳ７：Ｎｏ）は、ステップＳ９に進む。第１のセクタ領域と第２のセクタ領域の双方にデータが書き込まれている場合（ステップＳ６：Ｙｅｓ、ステップＳ７：Ｙｅｓ）は、ステップＳ８に進む。
【００８７】
第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が無い場合、つまり、第１のセクタ領域に割り当てられている部分冗長領域と第２のセクタ領域に割り当てられている部分冗長領域の双方にセクタポインタ情報（ＳＰ）が無い場合（ステップＳ６：Ｎｏ）は、エンドポインタＹの値をＮａの値に変更する（ステップＳ１３）。つまり、第１のセクタ領域以降のセクタ領域にはデータは書き込まれていないので、エンドポインタＹの値を第１のセクタ領域のセクタ番号であるＮａの値に変更する。ここで、各セクタ領域にはセクタ番号の順番でデータが書き込まれるので、第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が書き込まれていない場合、第１のセクタ領域より後のセクタ領域に割り当てられている部分冗長領域には、セクタポインタ情報（ＳＰ）が書き込まれていない。従って、第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が書き込まれていない場合は、第２のセクタ領域に割り当てられている部分冗長領域にもセクタポインタ情報（ＳＰ）が書き込まれていない。
【００８８】
第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が有り、第２のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が無い場合（ステップＳ６：Ｙｅｓ、ステップＳ７：Ｎｏ）、スタートポインタＸの値を、第１のセクタ領域に割り当てられている部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）であるＳＰａの値に変更し、エンドポインタＹの値をＮｂの値に変更する（ステップＳ９）。つまり、セクタ番号（ＳＮ）がＳＰａより前のセクタ領域にはデータは書き込まれているので、スタートポインタＸの値をＳＰａの値に変更し、第２のセクタ領域以降のセクタ領域にはデータは書き込まれていないので、エンドポインタＹの値を第２のセクタ領域のセクタ番号であるＮｂの値に変更する。
【００８９】
第１のセクタ領域に割り当てられている部分冗長領域と第２のセクタ領域に割り当てられている部分冗長領域の双方にセクタポインタ情報（ＳＰ）が有る場合（ステップＳ６：Ｙｅｓ、ステップＳ７：Ｙｅｓ）、スタートポインタＸの値を、第２のセクタ領域に割り当てられている部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）であるＳＰｂの値に変更する（ステップＳ８）。つまり、セクタ番号（ＳＮ）がＳＰｂより前のセクタ領域にはデータは書き込まれているので、スタートポインタＸの値をＳＰｂの値に変更する。
【００９０】
ステップＳ８，９，１２，１３でスタートポインタＸとエンドポインタＹの双方又はいずれか一方の値を変更した後に、変更後のスタートポインタＸとエンドポインタＹとが等しくなったか否か判断する（ステップＳ１４）。スタートポインタＸとエンドポインタＹとが等しくない場合（ステップＳ１４：Ｎｏ）、ステップＳ２に戻る。
【００９１】
次に、スタートポインタＸとエンドポインタＹの値の変更を繰り返すことにより、エンドポインタＹとスタートポインタＸとの差が１になった場合（ステップＳ２：Ｎｏ）について説明する。エンドポインタＹとスタートポインタＸとの差が１になった場合（ステップＳ２：Ｎｏ）、Ｎａの値をＮａ＝Ｘに設定する（ステップＳ１０）。つまり、ＮａはスタートポインタＸに設定されている値に設定される。尚、スタートポインタＸの値より大きくエンドポインタＹより小さい値は存在しないので、Ｎｂの値は設定しない。従って、エンドポインタＹとスタートポインタＸとの差が１になった場合（ステップＳ２：Ｎｏ）は、第１のセクタ領域（セクタ番号（ＳＮ）がＮａのセクタ領域）に割り当てられている部分冗長領域のセクタポインタ情報（ＳＰ）が書き込まれる領域だけが参照される。
【００９２】
続いて、第１のセクタ領域（セクタ番号（ＳＮ）がＮａのセクタ領域）に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が書き込まれているか否か判断し（ステップＳ１１）、セクタポインタ情報（ＳＰ）が有る場合（ステップＳ１１：Ｙｅｓ）は、ステップＳ１２に進み、セクタポインタ情報（ＳＰ）が無い場合（ステップＳ１１：Ｎｏ）は、ステップＳ１３に進む。
【００９３】
第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）がある場合（ステップＳ１１：Ｙｅｓ）、スタートポインタＸの値を、第１のセクタ領域に割り当てられている部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）であるＳＰａの値に変更する（ステップＳ１２）。
【００９４】
上述のスタートポインタＸとエンドポインタＹの値の変更は、スタートポインタＸとエンドポインタＹとが等しくなるまで繰り返される。そして、スタートポインタＸとエンドポインタＹとが等しくなったときに検索処理を終了し（ステップＳ１４：Ｙｅｓ）、検索処理を終了したときにスタートポインタＸとエンドポインタＹに設定されている値が、データが書き込まれていないセクタ領域の先頭のセクタ番号（ＳＮ）に一致する。
【００９５】
次に、仮想ブロック内のＳＮ＃２２１のセクタ領域までデータが書き込まれている場合の検索処理について図６を参照して具体的に説明する。
【００９６】
＜検索回数１＞
スタートポインタＸの初期値０とエンドポインタＹの初期値５１２に基づいてＮａの値を０に設定し（Ｎａ＝Ｘ＝０）、Ｎｂの値を２５６に設定する（Ｎｂ＝（０＋５１２）／２）。ここで、ＮａとＮｂの双方が偶数なのでＮｂの値を２５５に変更する（Ｎｂ＝２５６−１）。ＳＮ＃０の第１のセクタ領域に割り当てられている部分冗長領域とＳＮ＃２５５の第２のセクタ領域に割り当てられている部分冗長領域を参照する。参照した結果、第１のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が有り、第２のセクタ領域に割り当てられている部分冗長領域にセクタポインタ情報（ＳＰ）が無いと判断し、スタートポインタＸの値を、第１のセクタ領域に対応する部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）の値である５に変更すると共に、エンドポインタＹの値をＮｂの値２５５に変更する。
【００９７】
＜検索回数２＞
スタートポインタＸの値５とエンドポインタＹの値２５５に基づいてＮａの値を５に設定し（Ｎａ＝Ｘ＝５）、Ｎｂの値を１３０に設定する（Ｎｂ＝（５＋２５５）／２）。ＳＮ＃５の第１のセクタ領域に割り当てられている部分冗長領域とＳＮ＃１３０の第２のセクタ領域に割り当てられている部分冗長領域を参照する。参照した結果、第１のセクタ領域に割り当てられている部分冗長領域と第２のセクタ領域に割り当てられている部分冗長領域の双方にセクタポインタ情報（ＳＰ）が有ると判断し、スタートポインタＸの値を、第２のセクタ領域に対応する部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）の値である１６４に変更する。
【００９８】
＜検索回数３＞
スタートポインタＸの値１６４とエンドポインタＹの値２５５に基づいてＮａの値を１６４に設定し（Ｎａ＝Ｘ＝１６４）、Ｎｂの値を２０９に設定する（Ｎｂ＝（１６４＋２５５）／２）。ＳＮ＃１６４の第１のセクタ領域に割り当てられている部分冗長領域とＳＮ＃２０９の第２のセクタ領域に割り当てられている部分冗長領域を参照する。参照した結果、第１のセクタ領域に割り当てられている部分冗長領域と第２のセクタ領域に割り当てられている対応する部分冗長領域の双方にセクタポインタ情報（ＳＰ）が有ると判断し、スタートポインタＸの値を、第２のセクタ領域に対応する部分冗長領域に書き込まれているセクタポインタ情報（ＳＰ）の値である２２２に変更する。
【００９９】
＜検索回数４＞
スタートポインタＸの値２２２とエンドポインタＹの値２５５に基づいてＮａの値を２２２に設定し（Ｎａ＝Ｘ＝２２２）、Ｎｂの値を２３８に設定する（Ｎｂ＝（２２２＋２５５）／２）。ここで、ＮａとＮｂの双方が偶数なのでＮｂの値を２３７に変更する（Ｎｂ＝２３８−１）。ＳＮ＃２２２の第１のセクタ領域に割り当てられている部分冗長領域とＳＮ＃２３７の第２のセクタ領域に割り当てられている部分冗長領域を参照する。参照した結果、第１のセクタ領域に割り当てられている部分冗長領域と第２のセクタ領域に割り当てられている部分冗長領域の双方に、セクタポインタ情報（ＳＰ）が無いと判断し、エンドポインタＹの値をＮａの値２２２に変更する。
【０１００】
ここで、スタートポインタＸの値とエンドポインタＹの値の双方が２２２になったので検索を終了し、データが書き込まれていないセクタ領域の先頭のセクタ番号ＳＮは２２２であると判断する。
【０１０１】
以上で説明したように、本実施例では、セクタ番号（ＳＮ）がスタートポインタＸの値と一致する第１のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報と、セクタ番号（ＳＮ）がスタートポインタＸの値より大きくエンドポインタＹの値より小さい第２のセクタ領域に割り当てられている冗長領域に書き込まれているセクタポインタ情報を並行して参照する。そして、その参照結果に基づいて、スタートポインタＸとエンドポインタＹの値を変更していくことにより、データが書き込まれていないセクタ領域の先頭を検索する平均的な検索速度を向上させることができる。
【０１０２】
なお、セクタポインタ情報は、一連データの書き込み処理でデータが最後に書き込まれるセクタ領域の番号を示す情報であってもよい。但し、その場合、セクタポインタ情報に基づいてスタートポインタＸ（先頭位置情報）又はエンドポインタＹ（末尾位置情報）を更新するときに、スタートポインタＸ（先頭位置情報）又はエンドポインタＹ（末尾位置情報）をセクタポインタ情報が示す番号に１を加えた値に変更する。つまり、セクタポインタ情報は、一連データの書き込み処理でデータが最後に書き込まれたセクタ領域の次のセクタ領域を知ることができる情報であればよい。
【０１０３】
また、本発明のメモリコントローラ、フラッシュメモリシステム及びフラッシュメモリの制御方法は、データが書き込まれていないセクタ領域の先頭を検索する平均的な検索速度を向上させることが目的であり、データが書き込まれていないセクタ領域の先頭を検索する検索処理を実行するメモリコントローラ、フラッシュメモリシステム等であれば、書き込み処理やアドレス変換の方法が異なっていても本発明を適用することができる。また、フラッシュメモリについては、上述した大ブロックのフラッシュメモリに限定されず、小ブロックのフラッシュメモリ若しくはその他のフラッシュメモリであってもよい。
【図面の簡単な説明】
【０１０４】
【図１】本発明のフラッシュメモリシステムの一実施例の概略を説明するためのブロック図である。
【図２】図１のフラッシュメモリのアドレス空間の構造を概略的に示す図である。
【図３】アドレス変換の概要を説明するための図である。
【図４】図１のホストインターフェースブロック及びフラッシュメモリインターフェースブロックの詳細を示すブロック図である。
【図５】仮想ブロック内でのデータが書き込まれていないセクタ領域の先頭を検索する検索処理を説明するためのフローチャートである。
【図６】仮想ブロック内でのデータが書き込まれていないセクタ領域の先頭を検索する検索処理を具体的に説明するための図である。
【図７】仮想ブロックの概要を説明するための図である。
【図８】従来の２分木  検索を用いた検索方法を説明するための図である。
【図９】従来のセクタポインタ情報を用いた検索方法を説明するための図である。
【符号の説明】
【０１０５】
１  フラッシュメモリシステム
２  フラッシュメモリ
３  メモリコントローラ
４  ホストシステム
６  マイクロプロセッサ（セクタポインタ情報書込み手段、検索範囲保持手段、セクタ領域検索手段、セクタポインタ情報更新手段、第１のセクタ領域判別手段、第２のセクタ領域判別手段）
７  ホストインターフェースブロック
８  ワークエリア
９  バッファ
１０  フラッシュメモリインターフェースブロック
１１  ＥＣＣブロック
１２  ＲＯＭ
１３  外部バス
１４  内部バス
２５  ユーザ領域
２６  冗長領域
Ｒ１  コマンドレジスタ
Ｒ２  セクタ数レジスタ
Ｒ３  ＬＢＡレジスタ
Ｒ１１  物理ブロックアドレスレジスタ
Ｒ１２  セクタ番号レジスタ
Ｒ１３  カウンタ
Ｒ１４  セクタポインタレジスタ
【図１】
2008046727.tif 000003
【図２】
2008046727.tif 000004
【図３】
2008046727.tif 000005
【図４】
2008046727.tif 000006
【図５】
2008046727.tif 000007
【図６】
2008046727.tif 000008
【図７】
2008046727.tif 000009
【図８】
2008046727.tif 000010
【図９】
2008046727.tif 000011