(57)【要約】【課題】複数の書き込み先ブロックを同時に利用することができるメモリシステムを実現する。【解決手段】メモリシステムは、複数の書き込み先ブロック内の第１の書き込み先ブロックを示す第１の識別子を有する第１の識別子を有する一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または前記第１の識別子を有する２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、不揮発性メモリのデータ書き込み単位と同じ第１のサイズを有するライトデータを、ホストから取得する。メモリシステムは、前記第１のサイズを有する前記取得されたライトデータを前記第１の書き込み動作によって前記第１の書き込み先ブロックに書き込む。【選択図】図６
2019191909.tif 000002
【特許請求の範囲】
【請求項１】
ホストに接続可能なメモリシステムであって、
複数のブロックを含む不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記複数のブロックから割り当てられた複数の書き込み先ブロックを管理し、前記不揮発性メモリに同じデータを一回または複数回転送することを伴う第１の書き込み動作を実行するように構成されたコントローラとを具備し、
前記コントローラは、
書き込むべきライトデータが存在する前記ホストのメモリ上の位置と、前記ライトデータの長さと、前記ライトデータが書き込まれるべきブロックを示す識別子とを各々が指定するライトコマンドそれぞれを前記ホストから受信し、
前記複数の書き込み先ブロック内の第１の書き込み先ブロックを示す第１の識別子を有する一つ以上のライトコマンドを受信した後、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または前記第１の識別子を有するライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、前記不揮発性メモリのデータ書き込み単位と同じ第１のサイズを有するライトデータを、前記ホストから取得し、
前記第１のサイズを有する前記取得されたライトデータを前記第１の書き込み動作によって前記第１の書き込み先ブロックに書き込むように構成されている、メモリシステム。
【請求項２】
前記コントローラは、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータ全体に対する前記第１の書き込み動作の全てが終了した場合、前記一つのライトコマンドのコマンド完了を示すレスポンスを前記ホストに返すように構成されている請求項１記載のメモリシステム。
【請求項３】
前記コントローラは、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータ全体に対する前記第１の書き込み動作の全てが終了し且つ前記ライトデータ全体が前記不揮発性メモリから読み出し可能になった場合、前記一つのライトコマンドのコマンド完了を示すレスポンスを前記ホストに返すように構成されている請求項１記載のメモリシステム。
【請求項４】
前記コントローラは、前記第１の識別子を有する最後のライトコマンドが前記ホストから受信されてから閾期間前記第１の識別子を有する次のライトコマンドが受信されない場合、ダミーデータを前記第１の書き込み先ブロック内の１以上のページに書き込み、次のライトデータが書き込まれるべき前記第１の書き込み先ブロック内の書き込み先ページの位置を進めるように構成されている請求項１記載のメモリシステム。
【請求項５】
前記第１の書き込み動作は、少なくとも第１段階の書き込み動作と第２段階の書き込み動作とを含み、前記不揮発性メモリに同じデータを複数回転送する複数段階の書き込み動作であり、
前記コントローラは、
前記第１の識別子を有する最後のライトコマンドに関連付けられたライトデータを前記第１段階の書き込み動作によって前記第１の書き込み先ブロックに書き込み、
前記最後のライトコマンドが前記ホストから受信されてから閾期間前記第１の識別子を有する次のライトコマンドが受信されない場合、前記最後のライトコマンドに関連付けられたライトデータの前記第２段階の書き込み動作が実行可能になるように、ダミーデータを前記第１段階の書き込み動作によって前記第１の書き込み先ブロック内の１以上のページに書き込み、次のライトデータが書き込まれるべき前記第１の書き込み先ブロック内の書き込み先ページの位置を進めるように構成されている請求項１記載のメモリシステム。
【請求項６】
前記コントローラは、前記第１の識別子を有する先行するライトコマンドに関連付けられたライトデータのサイズが前記第１のサイズよりも小さい場合、前記第１の識別子を有する後続のライトコマンドの受信を待つように構成されている請求項１記載のメモリシステム。
【請求項７】
前記第１の書き込み動作は、少なくとも第１段階の書き込み動作と第２段階の書き込み動作とを含み、前記不揮発性メモリに同じデータを複数回転送する複数段階の書き込み動作であり、
前記コントローラは、
前記ホストから取得される、前記第１のサイズを各々が有する複数のライトデータを、前記メモリシステム内のバッファに格納し、
前記第１の書き込み先ブロックに次に書き込むべき第１のライトデータを前記バッファから取得し、前記第１段階の書き込み動作によって前記第１のライトデータを前記第１の書き込み先ブロックに書き込み、
前記第１のライトデータの前記第２段階の書き込み動作を実行すべき時点において前記第１のライトデータが前記バッファに存在する場合、前記第１のライトデータを前記バッファから取得し、前記第２段階の書き込み動作によって前記第１のライトデータを前記第１の書き込み先ブロックに書き込むように構成されている請求項１記載のメモリシステム。
【請求項８】
前記コントローラは、前記不揮発性メモリへの前記第１のライトデータの最終回のデータ転送を行った後に、前記第１のライトデータを前記バッファから破棄することによって前記バッファに空き領域を確保するように構成されている請求項７記載のメモリシステム。
【請求項９】
前記コントローラは、前記ホストから取得されるライトデータを格納するための空き領域が前記バッファにない場合、前記第１段階の書き込み動作が終了している前記バッファ内のライトデータのうちの一つのライトデータを破棄して前記空き領域を前記バッファに確保し、
前記第１のライトデータの前記第２段階の書き込み動作を実行すべき時点において前記第１のライトデータが前記バッファに存在しない場合、前記第１のライトデータを前記ホストから取得するように構成されている請求項７記載のメモリシステム。
【請求項１０】
前記コントローラは、前記バッファに空き領域がない状態で前記ホストからライトコマンドを受信した場合、前記第１段階の書き込み動作が終了している前記バッファ内のライトデータのうちで最も古いライトデータを破棄するように構成されている請求項９記載のメモリシステム。
【請求項１１】
前記コントローラは、前記バッファに空き領域がない状態で前記ホストからライトコマンドを受信した場合、前記第１段階の書き込み動作が終了している前記バッファ内のライトデータのうちで、前記不揮発性メモリへの残りデータ転送回数が最も少ないライトデータを破棄するように構成されている請求項９記載のメモリシステム。
【請求項１２】
前記コントローラは、
前記ホストから受信されるリードコマンドによって指定された第１のデータが、前記第１の書き込み動作の全てが終了していないデータ、または前記第１の書き込み動作の全てが終了しているが前記不揮発性メモリからまだ読み出し可能となっていないデータである場合、前記第１のデータが前記バッファに存在するか否かを判定し、
前記第１のデータが前記バッファに存在しない場合、前記第１のデータを前記ホストから取得し、前記第１のデータを前記バッファに格納し、前記第１のデータを前記バッファから前記ホストに返すように構成されている請求項７記載のメモリシステム。
【請求項１３】
ホストに接続可能なメモリシステムであって、
複数のブロックを含む不揮発性メモリと、
前記不揮発性メモリに電気的に接続され、前記複数のブロックから割り当てられた複数の書き込み先ブロックを管理し、少なくとも第１段階の書き込み動作と第２段階の書き込み動作とを含み、前記不揮発性メモリに同じデータを複数回転送することを伴う複数段階の書き込み動作を実行するように構成されたコントローラとを具備し、
前記コントローラは、
書き込むべきライトデータが存在する前記ホストのメモリ上の位置と、前記ライトデータの長さと、前記ライトデータが書き込まれるべきブロックを示す識別子とを各々が指定するライトコマンドそれぞれを前記ホストから受信し、
前記複数の書き込み先ブロック内の第１の書き込み先ブロックを示す第１の識別子を有する一つ以上のライトコマンドを受信した後、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または前記第１の識別子を有するライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、前記不揮発性メモリの書き込み単位と同じ第１のサイズを有するライトデータを、前記ホストから取得し、
前記ホストから取得される、前記第１のサイズを各々が有する複数のライトデータを、前記メモリシステム内のバッファに格納し、
前記第１の書き込み先ブロックに次に書き込むべき第１のライトデータを前記バッファから取得し、前記第１段階の書き込み動作によって前記第１のライトデータを前記第１の書き込み先ブロックに書き込み、
前記ホストから取得されるライトデータを格納するための空き領域が前記バッファにない場合、前記第１段階の書き込み動作が終了している前記バッファ内のライトデータの一つを破棄して前記空き領域を前記バッファに確保し、
前記第１のライトデータの前記第２段階の書き込み動作を実行すべき時点において前記第１のライトデータが前記バッファに存在しない場合、前記第１のライトデータを前記ホストから取得するように構成されている、メモリシステム。
【請求項１４】
前記コントローラは、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータ全体に対する前記複数段階の動作の全てが終了した場合、または前記ライトデータ全体に対する前記複数段階の書き込み動作の全てが終了し且つ前記ライトデータ全体が前記不揮発性メモリから読み出し可能になった場合、前記一つのライトコマンドのコマンド完了を示すレスポンスを前記ホストに返すように構成されている請求項１３記載のメモリシステム。
【請求項１５】
複数のブロックを含む不揮発性メモリを制御し、前記不揮発性メモリに同じデータを一回または複数回転送することを伴う第１の書き込み動作を実行する制御方法であって、
書き込むべきライトデータが存在するホストのメモリ上の位置と、前記ライトデータの長さと、前記ライトデータが書き込まれるべきブロックを示す識別子とを各々が指定するライトコマンドそれぞれを前記ホストから受信することと、
前記複数のブロックから割り当てられた複数の書き込み先ブロック内の第１の書き込み先ブロックを示す第１の識別子を有する一つ以上のライトコマンドを受信した後、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または前記第１の識別子を有するライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、前記不揮発性メモリのデータ書き込み単位と同じ第１のサイズを有するライトデータを、前記ホストから取得することと、
前記第１のサイズを有する前記取得されたライトデータを前記第１の書き込み動作によって前記第１の書き込み先ブロックに書き込むこととを具備する制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【０００２】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、ＮＡＮＤフラッシュ技術ベースのソリッドステートドライブ（ＳＳＤ）が知られている。
データセンターのサーバにおいても、ストレージデバイスとしてＳＳＤが使用されている。
【０００３】
サーバのようなホスト計算機システムにおいて利用されるストレージデバイスにおいては、高いＩ／Ｏ性能が求められている。
このため、最近では、ホストとストレージデバイスとの間の新たなインタフェースが提案され始めている。
また、最近のストレージデバイスにおいては、異なる種類のデータを異なる書き込み先ブロックに書き込むことを可能にすることが求められる場合がある。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】Yiying Zhang, 外, "De-indirection for flash-based SSDs with nameless writes." FAST. 2012, [online], [平成29年9月13日検索], インターネット<URL: https://www.usenix.org/system/files/conference/fast12/zhang.pdf >
【発明の概要】
【発明が解決しようとする課題】
【０００５】
このため、複数の書き込み先ブロックを同時に利用可能にするための新たな技術の実現が要求される。
本発明が解決しようとする課題は、複数の書き込み先ブロックを同時に利用することができるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、ホストに接続可能なメモリシステムは、複数のブロックを含む不揮発性メモリと、前記不揮発性メモリに電気的に接続され、前記複数のブロックから割り当てられた複数の書き込み先ブロックを管理し、前記不揮発性メモリに同じデータを一回または複数回転送することを伴う第１の書き込み動作を実行するように構成されたコントローラとを具備する。前記コントローラは、書き込むべきライトデータが存在する前記ホストのメモリ上の位置と、前記ライトデータの長さと、前記ライトデータが書き込まれるべきブロックを示す識別子とを各々が指定するライトコマンドそれぞれを前記ホストから受信する。前記コントローラは、前記複数の書き込み先ブロック内の第１の書き込み先ブロックを示す第１の識別子を有する一つ以上のライトコマンドを受信した後、前記第１の識別子を有するライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または前記第１の識別子を有するライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、前記不揮発性メモリのデータ書き込み単位と同じ第１のサイズを有するライトデータを、前記ホストから取得する。前記コントローラは、前記第１のサイズを有する前記取得されたライトデータを前記第１の書き込み動作によって前記第１の書き込み先ブロックに書き込む。
【図面の簡単な説明】
【０００７】
【図１】ホストと実施形態に係るメモリシステム（フラッシュストレージデバイス）との関係を示すブロック図。
【図２】同実施形態のメモリシステムの構成例を示すブロック図。
【図３】同実施形態のメモリシステムにおいて使用される複数のチャンネルと複数のＮＡＮＤ型フラッシュメモリチップとの関係を示すブロック図。
【図４】同実施形態のメモリシステムにおいて使用される、あるスーパーブロックの構成例を示す図。
【図５】ホストに含まれるライトデータバッファおよびフラッシュトランスレーション部と同実施形態のメモリシステムに含まれるライト制御部、ＤＭＡＣおよび内部バッファとの関係を示すブロック図。
【図６】同実施形態のメモリシステムによって実行されるＩ／Ｏコマンド処理を説明するためのブロック図。
【図７】同実施形態のメモリシステムによって実行される複数段階の書き込み動作を説明するための図。
【図８】同実施形態のメモリシステム内のある書き込み先ブロックへのデータの書き込み順序を説明するための図。
【図９】不揮発性メモリのデータ書き込み単位と同じサイズの単位でライトデータをホストから同実施形態のメモリシステムに転送する動作を説明するための図。
【図１０】同実施形態のメモリシステムによって実行されるデータ書き込み処理の手順を示すフローチャート。
【図１１】ホストによって実行されるライトデータ破棄処理の手順を示すフローチャート。
【図１２】最後のライトコマンドが受信されてから閾期間、次のライトコマンドが受信されない場合に、同実施形態のメモリシステムによって実行されるダミーデータ書き込み処理を説明するための図。
【図１３】同実施形態のメモリシステムによって実行されるダミーデータ書き込み処理の手順を示すフローチャート。
【図１４】内部バッファを使用して同実施形態のメモリシステムによって実行されるデータ転送動作を示すブロック図。
【図１５】内部バッファを使用して同実施形態のメモリシステムによって実行される書き込み処理と内部バッファ内のライトデータを破棄する処理とを説明するための図。
【図１６】内部バッファに空き領域がない場合に同実施形態のメモリシステムによって実行される内部バッファ内のライトデータを破棄する処理を説明するための図。
【図１７】内部バッファを使用して同実施形態のメモリシステムによって実行されるデータ書き込み処理の手順を示すフローチャート。
【図１８】同実施形態のメモリシステムによって実行されるデータ読み出し処理の手順を示すフローチャート。
【図１９】ホストが書き込み先ブロックを指定し且つ同実施形態のメモリシステムが書き込み先ページを決定するデータ書き込み処理と、ホストがブロックアドレスとページアドレスとを指定するデータ読み出し処理とを説明するための図。
【図２０】同実施形態のメモリシステムに適用されるブロックアロケートコマンド（ブロック割り当て要求）を説明するための図。
【図２１】ブロックアロケートコマンドに対するレスポンスを説明するための図。
【図２２】同実施形態のメモリシステムに適用されるライトコマンドを説明するための図。
【図２３】ライトコマンドのコマンド完了を示すレスポンスを説明するための図。
【図２４】同実施形態のメモリシステムに適用されるリードコマンドを説明するための図。
【発明を実施するための形態】
【０００８】
以下、図面を参照して、実施形態を説明する。  
まず、図１を参照して、本実施形態に係るメモリシステムとホストとの関係を説明する。
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、ＮＡＮＤフラッシュ技術ベースのフラッシュストレージデバイス３として実現されている。
【０００９】
ホスト（ホストデバイス）２は、複数のフラッシュストレージデバイス３を制御するように構成されている。ホスト２は、複数のフラッシュストレージデバイス３によって構成されるフラッシュアレイをストレージとして使用するように構成された情報処理装置によって実現される。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【００１０】
なお、フラッシュストレージデバイス３は、ストレージアレイ内に設けられる複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージ（例えば複数のフラッシュストレージデバイス３）を制御するコントローラを含む。フラッシュストレージデバイス３がストレージアレイに適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス３のホストとして機能してもよい。
【００１１】
以下では、サーバコンピュータのような情報処理装置がホスト２として機能する場合を例示して説明する。
ホスト（サーバ）２と複数のフラッシュストレージデバイス３は、インタフェース５０を介して相互接続される（内部相互接続）。この相互接続のためのインタフェース５０としては、これに限定されないが、ＰＣＩ  Ｅｘｐｒｅｓｓ（ＰＣＩｅ）（登録商標）、ＮＶＭ  Ｅｘｐｒｅｓｓ（ＮＶＭｅ）（登録商標）、Ｅｔｈｅｒｎｅｔ（登録商標）、ＮＶＭｅ  ｏｖｅｒ  Ｆａｂｒｉｃｓ（ＮＶＭｅＯＦ）等を使用し得る。
【００１２】
ホスト２として機能するサーバコンピュータの典型例としては、データセンター内のサーバコンピュータ（以下、サーバと称する）が挙げられる。
ホスト２がデータセンター内のサーバによって実現されるケースにおいては、このホスト（サーバ）２は、ネットワーク６０を介して複数のエンドユーザ端末（クライアント）６１に接続されてもよい。ホスト２は、これらエンドユーザ端末６１に対して様々なサービスを提供することができる。
【００１３】
ホスト（サーバ）２によって提供可能なサービスの例には、（１）システム稼働プラットフォームを各クライアント（各エンドユーザ端末６１）に提供するプラットホーム・アズ・ア・サービス（ＰａａＳ）、（２）仮想サーバのようなインフラストラクチャを各クライアント（各エンドユーザ端末６１）に提供するインフラストラクチャ・アズ・ア・サービス（ＩａａＳ）、等がある。
【００１４】
複数の仮想マシンが、このホスト（サーバ）２として機能する物理サーバ上で実行されてもよい。ホスト（サーバ）２上で走るこれら仮想マシンの各々は、この仮想マシンに対応するクライアント（エンドユーザ端末６１）に各種サービスを提供するように構成された仮想サーバとして機能することができる。各仮想マシンにおいては、対応するエンドユーザ端末６１によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。各仮想マシンに対応するオペレーティングシステムは、Ｉ／Ｏサービスを含む。このＩ／Ｏサービスは、論理ブロックアドレス（ＬＢＡ）ベースのブロックＩ／Ｏサービスであってもよいし、あるいは、キー・バリュー・ストアサービスであってもよい。Ｉ／Ｏサービスは、アクセス対象のデータを識別するためのタグそれぞれとフラッシュストレージデバイス３の物理アドレスそれぞれとの間のマッピングを管理するアドレス変換テーブルを含んでいてもよい。タグは、ＬＢＡのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよい。
【００１５】
各仮想マシンに対応するオペレーティングシステムにおいては、Ｉ／Ｏサービスは、ユーザアプリケーションからのライト／リード要求に応答して、Ｉ／Ｏコマンド（ライトコマンド、リードコマンド）を発行する。これらＩ／Ｏコマンドはコマンドキューを介してフラッシュストレージデバイス３に送出される。
【００１６】
フラッシュストレージデバイス３は、ＮＡＮＤ型フラッシュメモリのような不揮発性メモリを含む。フラッシュストレージデバイス３は、不揮発性メモリ内の複数のブロックから割り当てられた複数の書き込み先ブロックを管理する。書き込み先ブロックとは、データが書き込まれるべきブロックを意味する。ホスト２からフラッシュストレージデバイス３に送出されるライトコマンドは、書き込むべきライトデータが存在するホスト２のメモリ上の位置と、このライトデータの長さと、このライトデータが書き込まれるべきブロックを示す識別子とを指定する。したがって、ホスト２は、データが書き込まれるべき特定の書き込み先ブロックを指定することができる。この結果、例えば、ホスト２は、あるエンドユーザ端末６１（クライアント）に対応するユーザアプリケーションのデータが１以上の特定の書き込み先ブロックに書き込まれ、他のエンドユーザ端末６１（クライアント）に対応するユーザアプリケーションのデータが別の１以上の特定の書き込み先ブロックに書き込まれる、といったデータ配置を実現することができる。
【００１７】
ライトデータが書き込まれるべきブロックを示す識別子は、特定の書き込み先ブロックを指定するブロックアドレス（ブロック番号）によって表されてもよい。フラッシュストレージデバイス３が複数のＮＡＮＤ型フラッシュメモリチップを含むケースにおいては、このブロックアドレスは、ブロックアドレスとチップ番号との組み合わせによって表されてもよい。
【００１８】
フラッシュストレージデバイス３がストリーム書き込みをサポートしているケースにおいては、ライトデータが書き込まれるべきブロックを示す識別子は、複数のストリーム内の一つのストリームの識別子（ストリームＩＤ）であってもよい。ストリーム書き込みにおいては、複数の書き込み先ブロックが複数のストリームにそれぞれ関連付けられる。換言すれば、フラッシュストレージデバイス３があるストリームＩＤを含むライトコマンドをホスト２から受信した場合、このフラッシュストレージデバイス３は、このストリームＩＤに対応するストリームに関連づけられた書き込み先ブロックにデータを書き込む。フラッシュストレージデバイス３が別のストリームＩＤを含むライトコマンドをホスト２から受信した場合、このフラッシュストレージデバイス３は、この別のストリームＩＤに対応する別のストリームに関連づけられた別の書き込み先ブロックにデータを書き込む。フラッシュストレージデバイス３においては、ストリームＩＤそれぞれとブロックアドレスそれぞれとの間のマッピングを管理するための管理テーブルが使用されてもよい。
【００１９】
フラッシュストレージデバイス３は、以下のタイプ＃１−ストレージデバイス、タイプ＃２−ストレージデバイス、タイプ＃３−ストレージデバイスのうちの任意のストレージデバイスとして実現されうる。
タイプ＃１−ストレージデバイスは、ホスト２が、データが書き込まれるべきブロックとこのデータが書き込まれるべきページアドレスの双方を指定するタイプのストレージデバイスである。タイプ＃１−ストレージデバイスに適用されるライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。ブロックアドレスは、ホスト２から受信されるライトデータが書き込まれるべきブロックを指定する。ページアドレスは、このライトデータが書き込まれるべきこのブロック内のページを指定する。データポインタは、このライトデータが存在するホスト２内のメモリ上の位置を示す。長さは、このライトデータの長さを示す。
【００２０】
タイプ＃２−ストレージデバイスは、ホスト２がデータが書き込まれるべきブロックを指定し、ストレージデバイスがこのデータが書き込まれるべきこのブロック内の位置（ページ）を指定するタイプのストレージデバイスである。タイプ＃２−ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ（例えば、ＬＢＡ、キー）、ブロックアドレス、データポインタ、長さを含む。さらに、ライトコマンドは、ＱｏＳドメインＩＤを含んでもよい。ＱｏＳドメインＩＤは、ＮＡＮＤ型フラッシュメモリを論理的に分割することによって得られる複数の領域の一つを指定する。複数の領域の各々は、複数のブロックを含む。タイプ＃２−ストレージデバイスは、不良ページ、ページ書き込み順序の制約を考慮して、データが書き込まれるべきページを決定することができる。
【００２１】
つまり、フラッシュストレージデバイス３がタイプ＃２−ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス３は、ブロックをホスト２にハンドリングさせつつ、ページ書き込み順序制約、バッドページ、ページサイズ等を隠蔽することができる。この結果、ホスト２は、ブロック境界を認識でき、且つページ書き込み順序制約、バッドページ、ページサイズについては意識することなく、どのユーザデータがどのブロックに存在するかを管理することができる。
【００２２】
タイプ＃３−ストレージデバイスは、ホスト２がデータを識別するタグ（例えばＬＢＡ）を指定し、ストレージデバイスがこのデータが書き込まれるべきブロックおよびページの双方を決定するタイプのストレージデバイスである。タイプ＃３−ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ（例えば、ＬＢＡ、キー）、ストリームＩＤ、データポインタ、長さを含む。ストリームＩＤは、このライトデータに関連付けられたストリームの識別子である。フラッシュストレージデバイス３がタイプ＃２−ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス３は、ストリームＩＤそれぞれとブロックアドレスそれぞれとの間のマッピングを管理する管理テーブルを参照して、このライトデータが書き込まれるべきブロックを決定する。さらに、フラッシュストレージデバイス３は、論理物理アドレス変換テーブルと称されるアドレス変換テーブルを使用して、タグ（ＬＢＡ）それぞれとＮＡＮＤ型フラッシュメモリの物理アドレスそれぞれとの間のマッピングを管理する。
【００２３】
フラッシュストレージデバイス３はタイプ＃１−ストレージデバイス、タイプ＃２−ストレージデバイス、またはタイプ＃３−ストレージデバイスのいずれであってもよいが、フラッシュストレージデバイス３は、ＮＡＮＤ型フラッシュメモリに含まれる複数のブロックから割り当てられる複数の書き込み先ブロックを管理し、あるライトコマンドに関連付けられたライトデータを、このライトコマンドによって指定される書き込み先ブロックに書き込む。
【００２４】
タイプ＃１−ストレージデバイスにおいては、書き込み先ブロック内のページ書き込み順序はホスト２によって指定される。したがって、フラッシュストレージデバイス３がタイプ＃１−ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス３は、ホスト２からのライトコマンドそれぞれによって指定されるページアドレスに対応する順序で、書き込み先ブロック内のページそれぞれにデータを書き込む。
【００２５】
タイプ＃２−ストレージデバイスにおいては、書き込み先ブロックはホスト２からのライトコマンドに含まれるブロックアドレスによって指定されるが、この書き込み先ブロック内の書き込み先ページはフラッシュストレージデバイス３によって決定される。したがって、フラッシュストレージデバイス３がタイプ＃２−ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス３は、ライトコマンドに含まれるブロックアドレスによって指定される書き込み先ブロックの先頭のページから最後のページの順序でデータが書き込まれるように書き込み先ページを決定する。
【００２６】
タイプ＃３−ストレージデバイスにおいては、フラッシュストレージデバイス３は、ライトコマンドに含まれるストリームＩＤに関連付けられたブロックを書き込み先ブロックとして選択し、この書き込み先ブロック内の書き込み先ページを決定する。したがって、フラッシュストレージデバイス３がタイプ＃３−ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス３は、例えば、この書き込み先ブロックの先頭のページから最後のページの順序でデータが書き込まれるように書き込み先ページを決定する。
【００２７】
フラッシュストレージデバイス３によって管理される複数の書き込み先ブロックは、このフラッシュストレージデバイス３を共有する複数のエンドユーザ（クライアント）によってそれぞれ使用され得る。この場合、フラッシュストレージデバイス３においては、フラッシュストレージデバイス３を共有するエンドユーザの数と同数の、またはそれ以上の数の書き込み先ブロックが同時にオープンされる。
【００２８】
図２は、フラッシュストレージデバイス３の構成例を示す。
フラッシュストレージデバイス３は、コントローラ４および不揮発性メモリ（ＮＡＮＤ型フラッシュメモリ）５を備える。フラッシュストレージデバイス３は、ランダムアクセスメモリ、例えば、ＤＲＡＭ６も備えていてもよい。
【００２９】
ＮＡＮＤ型フラッシュメモリ５は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。ＮＡＮＤ型フラッシュメモリ５は、２次元構造のＮＡＮＤ型フラッシュメモリであってもよいし、３次元構造のＮＡＮＤ型フラッシュメモリであってもよい。
【００３０】
ＮＡＮＤ型フラッシュメモリ５のメモリセルアレイは、複数のブロックＢＬＫ０〜ＢＬＫｍ−１を含む。ブロックＢＬＫ０〜ＢＬＫｍ−１の各々は複数のページ（ここではページＰ０〜Ｐｎ−１）を含む。ブロックＢＬＫ０〜ＢＬＫｍ−１は、消去単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページＰ０〜Ｐｎ−１は、データ書き込み動作およびデータ読み込み動作の単位である。
【００３１】
コントローラ４は、ＴｏｇｇｌｅＮＡＮＤフラッシュインタフェース、オープンＮＡＮＤフラッシュインタフェース（ＯＮＦＩ）のようなＮＡＮＤインタフェース１３を介して、不揮発性メモリであるＮＡＮＤ型フラッシュメモリ５に電気的に接続されている。コントローラ４は、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたメモリコントローラとして動作する。このコントローラ４は、Ｓｙｓｔｅｍ−ｏｎ−ａ−ｃｈｉｐ（ＳｏＣ）のような回路によって実現されてもよい。
【００３２】
ＮＡＮＤ型フラッシュメモリ５は、図３に示すように、複数のＮＡＮＤ型フラッシュメモリチップ（ＮＡＮＤ型フラッシュメモリダイ）を含んでいてもよい。個々のＮＡＮＤ型フラッシュメモリチップは独立して動作可能である。このため、ＮＡＮＤ型フラッシュメモリチップは、並列動作可能な単位として機能する。図３においては、ＮＡＮＤインタフェース１３に１６個のチャンネルＣｈ．１〜Ｃｈ．１６が接続されており、１６個のチャンネルＣｈ．１〜Ｃｈ．１６の各々に２つのＮＡＮＤ型フラッシュメモリチップが接続されている場合が例示されている。この場合、チャンネルＣｈ．１〜Ｃｈ．１６に接続された１６個のＮＡＮＤ型フラッシュメモリチップ＃１〜＃１６がバンク＃０として編成されてもよく、またチャンネルＣｈ．１〜Ｃｈ．１６に接続された残りの１６個のＮＡＮＤ型フラッシュメモリチップ＃１７〜＃３２がバンク＃１として編成されてもよい。バンクは、複数のメモリモジュールをバンクインタリーブによって並列動作させるための単位として機能する。図３の構成例においては、１６チャンネルと、２つのバンクを使用したバンクインタリーブとによって、最大３２個のＮＡＮＤ型フラッシュメモリチップを並列動作させることができる。
【００３３】
消去動作は、一つのブロック（物理ブロック）の単位で実行されてもよいし、並列動作可能な複数の物理ブロックの集合を含む並列単位（スーパーブロック）の単位で実行されてもよい。一つの並列単位、つまり複数の物理ブロックの集合を含む一つのスーパーブロックは、これに限定されないが、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２から一つずつ選択される計３２個の物理ブロックを含んでいてもよい。なお、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２の各々はマルチプレーン構成を有していてもよい。例えば、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２の各々が、２つのプレーンを含むマルチプレーン構成を有する場合には、一つのスーパーブロックは、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２に対応する６４個のプレーンから一つずつ選択される計６４個の物理ブロックを含んでいてもよい。
【００３４】
図４には、３２個の物理ブロック（ここでは、ＮＡＮＤ型フラッシュメモリチップ＃１内の物理ブロックＢＬＫ２、ＮＡＮＤ型フラッシュメモリチップ＃２内の物理ブロックＢＬＫ３、ＮＡＮＤ型フラッシュメモリチップ＃３内の物理ブロックＢＬＫ７、ＮＡＮＤ型フラッシュメモリチップ＃４内の物理ブロックＢＬＫ４、ＮＡＮＤ型フラッシュメモリチップ＃５内の物理ブロックＢＬＫ６、…、ＮＡＮＤ型フラッシュメモリチップ＃３２内の物理ブロックＢＬＫ３）を含む一つのスーパーブロック（ＳＢ）が例示されている。
【００３５】
書き込み先ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。なお、一つのスーパーブロックが一つの物理ブロックのみを含む構成が利用されてもよく、この場合には、一つのスーパーブロックは一つの物理ブロックと等価である。
【００３６】
次に、図２のコントローラ４の構成について説明する。
コントローラ４は、ホストインタフェース１１、ＣＰＵ１２、ＮＡＮＤインタフェース１３、およびＤＲＡＭインタフェース１４、直接メモリアクセスコントローラ（ＤＭＡＣ）１５、ＥＣＣエンコード／デコード部１６等を含む。これらホストインタフェース１１、ＣＰＵ１２、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、ＤＭＡＣ１５、ＥＣＣエンコード／デコード部１６は、バス１０を介して相互接続される。
【００３７】
このホストインタフェース１１は、ホスト２との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース１１は、例えば、ＰＣＩｅコントローラ（ＮＶＭｅコントローラ）であってもよい。あるいは、フラッシュストレージデバイス３がＥｔｈｅｒｎｅｔ（登録商標）を介してホスト２に接続される構成においては、ホストインタフェース１１は、ＮＶＭｅ  ｏｖｅｒ  Ｆａｂｒｉｃｓ（ＮＶＭｅＯＦ）コントローラであってもよい。
【００３８】
ホストインタフェース１１は、ホスト２から様々なコマンドを受信する。これらコマンドには、ライトコマンド、リードコマンド、他の様々なコマンドが含まれる。
ＣＰＵ１２は、ホストインタフェース１１、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４を制御するように構成されたプロセッサである。ＣＰＵ１２は、フラッシュストレージデバイス３の電源オンに応答してＮＡＮＤ型フラッシュメモリ５または図示しないＲＯＭから制御プログラム（ファームウェア）をＤＲＡＭ６にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはコントローラ４内の図示しないＳＲＡＭ上にロードされてもよい。このＣＰＵ１２は、ホスト２からの様々なコマンドを処理するためのコマンド処理等を実行することができる。ＣＰＵ１２の動作は、ＣＰＵ１２によって実行される上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ４内の専用ハードウェアによって実行してもよい。
【００３９】
ＣＰＵ１２は、ライト制御部２１およびリード制御部２２として機能することができる。なお、これらライト制御部２１およびリード制御部２２の各々一部または全部も、コントローラ４内の専用ハードウェアによって実現されてもよい。
ライト制御部２１は、ＮＡＮＤ型フラッシュメモリ５の複数のブロックから割り当てられた複数の書き込み先ブロックを管理する。現代のＮＡＮＤ型フラッシュメモリの多くにおいては、プログラムディスターブを低減するための複雑な書き込み動作が実行される場合が多い。このため、現代のＮＡＮＤ型フラッシュメモリの多くにおいては、たとえブロック内のあるページにデータが書き込まれても、このページに書き込まれたデータは、その書き込み直後には正常に読み出すことができず、このページに後続する１以上のページへのデータ書き込みの完了後に、このページからのデータの読み出しが可能となるケースがある。
【００４０】
また、現代のＮＡＮＤ型フラッシュメモリにおいては、同じライトデータをＮＡＮＤ型フラッシュメモリに複数回転送することを伴う複数段階の書き込み動作が適用されるケースもある。このような複数段階の書き込み動作の例の一つとしては、フォギー・ファイン書き込み動作が挙げられる。
【００４１】
複数段階の書き込み動作は、少なくとも、フォギー書き込み動作のような第１段階の書き込み動作とファイン書き込み動作のような第２段階の書き込み動作とを含む。フォギー書き込み動作は各メモリセルの閾値分布を荒く設定する書き込み動作であり、ファイン書き込み動作は各メモリセルの閾値分布を調整する書き込み動作である。さらに、フォギー書き込み動作とファイン書き込み動作との間に、中間の書き込み動作が実行されてもよい。
【００４２】
ライト制御部２１は、フォギー・ファイン書き込み動作のように同じライトデータをＮＡＮＤ型フラッシュメモリ５に複数回転送することを伴う書き込み動作（複数段階の書き込み動作）によってこのライトデータを書き込み先ブロックに書き込んでもよいし、フル・シーケンス書き込み動作または他の様々な種類の書き込み動作のようにライトデータをＮＡＮＤ型フラッシュメモリ５に１回転送することを伴う書き込み動作によってこのライトデータを書き込み先ブロックに書き込んでもよい。
【００４３】
ライト制御部２１は、ライトコマンドそれぞれをホスト２から受信する。これら各ライトコマンドは、書き込むべきライトデータが存在するホスト２のメモリ上の位置と、ライトデータの長さと、ライトデータが書き込まれるべきブロックを示す識別子とを指定する。
【００４４】
ライトデータの長さは、個々のライトコマンド毎に異なる。例えば、あるライトコマンドは例えば１Ｍバイト程度の大きなサイズのライトデータの書き込みを要求するかもしれないし、他のライトコマンドは例えば４Ｋバイト程度の小さなサイズのライトデータの書き込みを要求するかもしれない。このため、もしフラッシュストレージデバイス３が個々のライトコマンドによって指定されたサイズのライトデータそのものをホスト２からフラッシュストレージデバイス３の内部バッファに単純に転送するという方法が使用されたならば、ある特定の書き込み先ブロックへ書き込むべき大きなサイズのライトデータによって内部バッファが長い時間専有されてしまい、他の各書き込み先ブロックへのデータ書き込み動作が実行できなくなる可能性がある。この結果、複数の書き込み先ブロックを同時に利用することが困難となる。
【００４５】
そこで、ライト制御部２１は、個々のライトコマンドによって指定されたサイズとは関係なく、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位で、ホスト２からライトデータを取得する。ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位とは、ＮＡＮＤ型フラッシュメモリ５へのデータ書き込みのためのデータ転送サイズを意味する。ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位の典型例は、ページサイズ（例えば１６Ｋバイト）である。あるいは、複数ページに対応するデータサイズ（ページサイズの数倍のサイズ）がデータ書き込み単位として使用されてもよい。
【００４６】
ある書き込み先ブロックを指定するライトコマンドに関連付けられたライトデータのサイズがＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位よりも小さい場合には、ライト制御部２１は、この書き込み先ブロックを指定する次のライトコマンドを待つ。この書き込み先ブロックを指定する幾つかのライトコマンドに関連付けられた幾つかのライトデータの総サイズがＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位以上になると、ライト制御部２１は、これらライトデータを結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズのデータを、ホスト２から取得する。例えば、同じ書き込み先ブロックを指定する４つのライトコマンドが４つの４Ｋバイトライトデータの書き込みをそれぞれ要求するケースにおいては、ライト制御部２１は、これら４つの４Ｋバイトライトデータを互いに結合することによって得られる１６Ｋバイトのライトデータをホスト２から取得してもよい。この場合、ライト制御部２１は、４回のＤＭＡ転送によってこれら４つの４Ｋバイトライトデータをホスト２から順次取得してもよい。そして、ライト制御部２１は、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有する、この取得したライトデータを、ＮＡＮＤ型フラッシュメモリ５に転送し、このライトデータをＮＡＮＤ型フラッシュメモリ５のこの書き込み先ブロックに書き込む。
【００４７】
一方、ある書き込み先ブロックを指定するライトコマンドに関連付けられたライトデータのサイズがＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位よりも大きい場合には、ライト制御部２１は、このライトデータを複数のライトデータ（複数のデータ部）に分割することによって得られる、データ書き込み単位と同じサイズを有する１つ以上のライトデータを得る。そして、ライト制御部２１は、データ書き込み単位と同じサイズを有する、得られた一つのライトデータをホスト２から取得する。この場合、ライト制御部２１は、１回のＤＭＡ転送によってこの得られたライトデータをホスト２から取得してもよい。そして、ライト制御部２１は、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有する、この取得したライトデータを、ＮＡＮＤ型フラッシュメモリ５に転送し、このライトデータをＮＡＮＤ型フラッシュメモリ５のこの書き込み先ブロックに書き込む。
【００４８】
このように、ライト制御部２１は、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドを受信した後、受信されたライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータ（複数のデータ部）に分割、または受信されたライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有するライトデータを、ホスト２から取得する。
【００４９】
ここで、ライトデータの分割／結合とは、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドの各々によってそれぞれ指定されるデータポインタおよび長さに基づいて、これら一つ以上のライトコマンドに関連付けられたライトデータの集合を、その先頭からＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有する境界で区切り、各境界に対応するホストメモリ内の位置を特定する動作を意味する。
【００５０】
したがって、個々のライトコマンドによって指定されるライトデータのサイズとは関係なく、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位でホスト２からライトデータを取得できるので、この取得したライトデータをＮＡＮＤ型フラッシュメモリ５に即座に転送することができる。よって、たとえある書き込み先ブロックへの大きなサイズのライトデータの書き込みを要求するライトコマンドが受信されても、これによって他の書き込み先ブロックへのデータ書き込み動作が滞ることを防ぐことができる。
【００５１】
また、内部バッファがフラッシュストレージデバイス３内に存在しない、または内部バッファの容量がほぼゼロに近い、というバッファレスの構成をフラッシュストレージデバイス３に適用することが可能となる。
なお、複数の書き込み先ブロックが異なるＮＡＮＤ型フラッシュメモリチップにそれぞれ属している場合においては、ライトデータをＮＡＮＤ型フラッシュメモリ５に転送する動作は、このライトデータが書き込まれるべき書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップにこのライトデータを転送することを意味する。
【００５２】
また、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位でホスト２からライトデータを取得するという上述の処理は、個々の書き込み先ブロックに対する書き込み動作の進行に合わせて実行される。
つまり、ライト制御部２１は、書き込み先ブロック毎に書き込み動作の進行を管理する。そして、ライト制御部２１は、例えば、ある書き込み先ブロックの次の書き込み先ページへのデータ転送が可能となる度に、この書き込み先ブロック内の書き込み先ページの位置を進め、次の書き込み先ページに書き込むべきライトデータをホストメモリから取得し、この取得したライトデータを書き込み先ブロックに書き込む。
【００５３】
さらに、ライト制御部２１は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送する書き込み動作）の全てが終了した場合、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す。
【００５４】
例えば、一つのライトコマンドに関連付けられた大きなサイズのライトデータが、複数のライトデータ部に分割された場合には、これら複数のライトデータ部の全ての書き込みに必要な全てのデータ転送および全ての書き込み動作が終了した場合に、このライトコマンドのコマンド完了を示すレスポンスがホスト２に返される。この結果、コマンド完了をライトコマンドの単位でホスト２に正しく通知することができる。よって、一つのライトコマンドによって書き込みが要求された大きなサイズのライトデータが複数のライトデータ部に分割されて処理された場合であっても、ホスト２は、この一つのライトコマンドのコマンド完了を示す一つのレスポンスのみをフラッシュストレージデバイス３から正しく受け取ることができる。よって、ホスト２は、コマンド完了が通知されたライトコマンドに対応するライトデータをホストメモリから破棄するという単純な処理を行うだけでよい。
【００５５】
また、ライト制御部２１は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送することを伴う書き込み動作）の全てが終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能になった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す。
【００５６】
例えば、ある書き込み先ブロックのあるページに書き込まれたデータが、後続の１以上のページにデータが書き込まれた後に読み出し可能となるケースを想定する。この場合、ライト制御部２１は、一つのライトコマンドに関連付けられた大きなサイズのライトデータを分割する事によって得られた複数のライトデータ部の全ての書き込みに必要な全てのデータ転送および全ての書き込み動作が終了した時点では、コマンド完了を示すレスポンスをホスト２に返さない。そして、後続の１以上のページにデータが書き込まれた後に、ライト制御部２１は、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す。
【００５７】
これにより、ホスト２は、コマンド完了が通知されたライトコマンドに対応するライトデータをホストメモリから破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータが読み出し可能になるまでこのライトデータをホストメモリ内に維持することができる。
【００５８】
リード制御部２２は、ホスト２からリードコマンドを受信し、この受信されたリードコマンドによって指定されたデータをＮＡＮＤ型フラッシュメモリ５または内部バッファ３１から読み出す。
リードコマンドによって指定されたデータ（第１のデータ）が、書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送することを伴う書き込み動作）の全てが終了していないデータ、または書き込み動作の全てが終了しているがＮＡＮＤ型フラッシュメモリ５からまだ読み出し可能となっていないデータである場合、リード制御部２２は、この第１のデータが内部バッファ３１に存在するか否かを判定する。第１のデータが内部バッファ３１に存在しない場合、リード制御部２２は、この第１のデータをホストメモリから取得し、この取得した第１のデータを内部バッファ３１に格納し、この取得した第１のデータを内部バッファ３１からホスト２に返す。これにより、ホスト２は、リードしたいデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能な状態であるか否かを管理するための複雑な処理を行うことなく、リードしたいデータを指定するリードコマンドをフラッシュストレージデバイス３に送出するという単純な処理を行うだけで、リードしたいデータをフラッシュストレージデバイス３から受け取ることができる。
【００５９】
ＮＡＮＤインタフェース１３は、ＣＰＵ１２の制御の下、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたメモリ制御回路である。
ＤＲＡＭインタフェース１４は、ＣＰＵ１２の制御の下、ＤＲＡＭ６を制御するように構成されたＤＲＡＭ制御回路である。ＤＲＡＭ６の記憶領域の一部は、内部バッファ（共有キャッシュ）３１として利用されてもよい。この内部バッファ（共有キャッシュ）３１は複数の書き込み先ブロックによって共有され、ホスト２から受信される任意のライトコマンドに関連付けられたライトデータを一時的に格納するために使用される。なお、上述したように、内部バッファ（共有キャッシュ）３１がフラッシュストレージデバイス３内に存在しない、または内部バッファ（共有キャッシュ）３１の容量がほぼゼロに近い、というバッファレス構成がフラッシュストレージデバイス３に適用されてもよい。
【００６０】
また、ＤＲＡＭ６の記憶領域の他の一部は、ブロック管理テーブル３２、不良情報管理テーブル３３の格納のために使用されてもよい。ブロック管理テーブル３２は、ＮＡＮＤ型フラッシュメモリ５内の複数のブロックそれぞれに対応する複数の管理テーブルを含む。各管理テーブルは、この管理テーブルに対応するブロックに含まれている複数のデータにそれぞれ対応する複数の有効／無効管理情報を含む。各有効／無効管理情報は、この有効／無効管理情報に対応するデータが有効データまたは無効データのいずれであるかを示す。不良情報管理テーブル３３は、不良ブロックのリストを管理する。
【００６１】
これら内部バッファ（共有キャッシュ）３１、ブロック管理テーブル３２、不良情報管理テーブル３３は、コントローラ４内の図示しないＳＲＡＭに格納されてもよい。
ＤＭＡＣ１５は、ＣＰＵ１２の制御の下、ホストメモリと内部バッファ（共有キャッシュ）３１との間のデータ転送を実行する。ホストメモリから内部バッファ（共有キャッシュ）３１にライトデータを転送すべき場合には、ＣＰＵ１２は、ホストメモリ上の位置を示す転送元アドレス、データサイズ、内部バッファ（共有キャッシュ）３１上の位置を示す転送先アドレスをＤＭＡＣ１５に対して指定する。
【００６２】
ＥＣＣエンコード／デコード部１６は、ＮＡＮＤ型フラッシュメモリ５にデータをライトすべき時、データ（書き込むべきデータ）をエンコード（ＥＣＣエンコード）することによってこのデータにエラー訂正コード（ＥＣＣ）を冗長コードとして付加する。ＮＡＮＤ型フラッシュメモリ５からデータがリードされた時、ＥＣＣエンコード／デコード部１６は、リードされたデータに付加されたＥＣＣを使用して、このデータのエラー訂正を行う（ＥＣＣデコード）。
【００６３】
図５は、ホスト２に含まれるライトデータバッファ５１およびフラッシュトランスレーション部５２とフラッシュストレージデバイス３に含まれるライト制御部２１、ＤＭＡＣ１５および内部バッファ（共有キャッシュ）３１との関係を示す。
ホスト２は、ライトデータをホストメモリ上のライトデータバッファ５１に格納し、そしてライトコマンドをフラッシュストレージデバイス３に発行する。このライトコマンドは、このライトデータが存在するライトデータバッファ５１上の位置を示すデータポインタと、このライトデータを識別するタグ（例えばＬＢＡ）と、このライトデータの長さと、ライトデータが書き込まれるべきブロックを示す識別子（ブロックアドレス、またはストリームＩＤ）とを含んでいてもよい。
【００６４】
フラッシュストレージデバイス３においては、ライト制御部２１の制御の下、このブロックの識別子によって指定される書き込み先ブロックの書き込み動作の進行に合わせて、ライトデータバッファ５１から内部バッファ（共有キャッシュ）３１へのデータ転送がＤＭＡＣ１５によって実行される。このデータ転送は、上述したように、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位で実行される。ライト制御部２１の制御の下、書き込むべきライトデータが、内部バッファ（共有キャッシュ）３１から、この書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップに転送され、そして、ライト制御部２１からこのＮＡＮＤ型フラッシュメモリチップに書き込み指示用のＮＡＮＤコマンドが送出される。
【００６５】
フラッシュストレージデバイス３がタイプ＃２−ストレージデバイスとして実現されている場合には、ライト制御部２１は、ホスト２から受信されるブロック割り当て要求に応答して、フリーブロックの一つを書き込み先ブロックとしてホスト２に割り当てる処理も実行する。ブロック割り当て要求は、ＱｏＳドメインＩＤを含んでいてもよい。ライト制御部２１は、このＱｏＳドメインＩＤに属するフリーブロックの一つを書き込み先ブロックとして決定し、この書き込み先ブロックのブロックアドレスをホスト２に通知する。これにより、ホスト２は、このブロックアドレスと、データポインタと、タグ（例えばＬＢＡ）と、長さとを指定するライトコマンドを発行することができる。このライトデータがこの書き込み先ブロックに書き込まれた後、ライト制御部２１は、このライトデータが書き込まれた書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれたこの書き込み先ブロック内のページを示すページアドレスと、このライトデータのタグ（例えばＬＢＡ）とをホスト２に通知する。ホスト２のフラッシュトランスレーション部５２は、タグ（例えばＬＢＡ）それぞれとＮＡＮＤ型フラッシュメモリ５の物理アドレス（ブロックアドレス、ページアドレス、等）それぞれとの間のマッピングを管理するアドレス変換テーブルであるＬＵＴ４０４Ａを含む。ブロックアドレス、ページアドレス、およびタグ（例えばＬＢＡ）がフラッシュストレージデバイス３から通知された場合、フラッシュトランスレーション部５２は、ＬＵＴ４０４Ａを更新し、通知されたタグ（例えばＬＢＡ）に、通知された物理アドレス（ブロックアドレス、ページアドレス）をマッピングする。フラッシュトランスレーション部５２は、ＬＵＴ４０４Ａを参照することによって、リード要求に含まれるタグ（例えばＬＢＡ）を物理アドレス（ブロックアドレス、ページアドレス）に変換することができ、これによって物理アドレスを含むリードコマンドをフラッシュストレージデバイス３に発行することができる。
【００６６】
図６は、フラッシュストレージデバイス３によって実行されるＩ／Ｏコマンド処理を示す。
上述したように、本実施形態では、フラッシュストレージデバイス３はタイプ＃１−ストレージデバイス、タイプ＃２−ストレージデバイス、タイプ＃３−ストレージデバイスのいずれであってもよいが、図６では、フラッシュストレージデバイス３がタイプ＃１−ストレージデバイスである場合を例示する。
【００６７】
ホスト２によって発行される各ライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各ライトコマンドはＩ／Ｏコマンドキュー４２に入れられる。ホスト２によって発行される各リードコマンドも、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各リードコマンドもＩ／Ｏコマンドキュー４２に入れられる。
【００６８】
ホスト２がライトデータの書き込みをフラッシュストレージデバイス３に要求することを望む場合、ホスト２は、まず、このライトデータをホストメモリ上のライトデータバッファ５１に格納し、そして、ライトコマンドをフラッシュストレージデバイス３に発行する。このライトコマンドは、このライトデータが書き込まれるべき書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれるべきこの書き込み先ブロック内のページを示すページアドレスと、このライトデータが存在するライトデータバッファ５１内の位置を示すデータポインタと、このライトデータの長さとを含む。
【００６９】
フラッシュストレージデバイス３は、プログラム／リードシーケンサ４１を含む。このプログラム／リードシーケンサ４１は、上述のライト制御部２１およびリード制御部２２によって実現される。プログラム／リードシーケンサ４１は、Ｉ／Ｏコマンドキュー４２に入れられたコマンドそれぞれを任意の順序で実行することができる。
【００７０】
プログラム／リードシーケンサ４１が、ある同じ書き込み先ブロックを指定する１以上のライトコマンドをＩ／Ｏコマンドキュー４２から取得した後、プログラム／リードシーケンサ４１は、この書き込み先ブロックの書き込み動作の進行に合わせて、この書き込み先ブロックに書き込むべき次のライトデータ（例えば、１ページサイズ分のライトデータ）を内部バッファ（共有キャッシュ）３１またはライトデータバッファ５１から取得するための転送要求を内部バッファ（共有キャッシュ）３１に送出する。この転送要求は、データポインタと長さとを含んでいてもよい。この転送要求に含まれるデータポインタは、１つのライトコマンドに関連付けられたライトデータを分割、または同じ書き込み先ブロックを指定する２以上のライトコマンドに関連付けられた２以上のライトデータを結合する処理によって算出される。つまり、プログラム／リードシーケンサ４１は、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドに関連付けられたライトデータの集合を、その先頭からＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有する境界で区切り、各境界に対応するホストメモリ内の位置を特定する。これによって、プログラム／リードシーケンサ４１は、書き込み単位と同じサイズの単位でライトデータをホスト２から取得することができる。
【００７１】
この転送要求に含まれるデータポインタは、この１ページサイズ分のライトデータが存在するライトデータバッファ５１上の位置を示す。この１ページサイズ分のライトデータは、この書き込み先ブロックを指定する複数のライトコマンドに関連付けられた複数の小さなサイズのライトデータの集合であってもよいし、この書き込み先ブロックを指定する一つのライトコマンドに関連付けられた大きなサイズのライトデータの一部分であってもよい。
【００７２】
さらに、プログラム／リードシーケンサ４１は、この１ページサイズ分のライトデータが書き込まれるべき書き込み先ブロックのブロックアドレスと、この１ページサイズ分のライトデータが書き込まれるべきページのページアドレスとを内部バッファ（共有キャッシュ）３１に送出する。
【００７３】
フラッシュストレージデバイス３のコントローラ４は内部バッファ（共有キャッシュ）３１を制御するキャッシュコントローラを含んでいてもよい。この場合、このキャッシュコントローラは内部バッファ（共有キャッシュ）３１をあたかも制御ロジックであるかのように動作させることができる。内部バッファ（共有キャッシュ）３１と複数の書き込み先ブロック＃０、＃１、＃２、…、＃ｎとの間には、複数のフラッシュコマンドキュー４３が存在する。これらフラッシュコマンドキュー４３は、複数のＮＡＮＤ型フラッシュメモリチップにそれぞれ対応づけられている。
【００７４】
内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、転送要求によって指定されたこの１ページサイズ分のライトデータが内部バッファ（共有キャッシュ）３１に存在するか否かを判定する。
この転送要求によって指定されたこの１ページサイズ分のライトデータが内部バッファ（共有キャッシュ）３１に存在するならば、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、この１ページサイズ分のライトデータを、このライトデータが書き込まれるべき書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップに転送する。さらに、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップに、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のＮＡＮＤコマンド（フラッシュライトコマンド）を、フラッシュコマンドキュー４３を介して送出する。フラッシュコマンドキュー４３は、ＮＡＮＤ型フラッシュメモリチップ毎に設けられている。このため、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップに対応するフラッシュコマンドキュー４３に、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のＮＡＮＤコマンド（フラッシュライトコマンド）を入れる。
【００７５】
なお、内部バッファ（共有キャッシュ）３１からＮＡＮＤ型フラッシュメモリチップへのこの１ページサイズ分のライトデータの転送が、このライトデータをＮＡＮＤ型フラッシュメモリチップに書き込むために必要な最終回のデータ転送であるならば、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、このライトデータを内部バッファ（共有キャッシュ）３１から破棄し、このライトデータが格納されていた領域を空き領域として確保する。ＮＡＮＤ型フラッシュメモリチップにデータを一回転送することを伴う書き込み動作（例えば、フル・シーケンス書き込み動作、等）によってライトデータを書き込み先ブロックに書き込むケースにおいては、ＮＡＮＤ型フラッシュメモリチップへの初回のデータ転送が最終回のデータ転送となる。一方、ＮＡＮＤ型フラッシュメモリチップにデータを複数回転送することを伴う書き込み動作（例えば、フォギー・ファイン書き込み動作）によってライトデータを書き込み先ブロックに書き込むケースにおいては、最後のファイン書き込みのために必要なＮＡＮＤ型フラッシュメモリチップへのデータ転送が最終回のデータ転送となる。
【００７６】
次に、転送要求によって指定されたこの１ページサイズ分のライトデータが内部バッファ（共有キャッシュ）３１に存在しない場合について説明する。
この転送要求によって指定されたこの１ページサイズ分のライトデータが内部バッファ（共有キャッシュ）３１に存在しないならば、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、この転送要求（データポインタ、長さ）をＤＭＡＣ１５に送出する。この転送要求（データポインタ、長さ）に基づいて、ＤＭＡＣ１５は、この１ページサイズ分のライトデータをホストメモリ上のライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送する。このデータ転送が終了すると、ＤＭＡＣ１５は、転送完了（Ｄｏｎｅ）と、このデータポインタ、この長さとを、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラに通知する。
【００７７】
内部バッファ（共有キャッシュ）３１に空き領域が存在するならば、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、ＤＭＡ転送によってライトデータバッファ５１から取得されたライトデータを、この空き領域に格納する。
内部バッファ（共有キャッシュ）３１に空き領域が存在しないならば、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、内部バッファ（共有キャッシュ）３１内の最も古いライトデータを内部バッファ（共有キャッシュ）３１から破棄し、最も古いライトデータが格納されていた領域を空き領域として確保する。そして、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、ＤＭＡ転送によってライトデータバッファ５１から取得されたライトデータを、この空き領域に格納する。
【００７８】
フォギー・ファイン書き込み動作のような多段階の書き込み動作が使用されるケースにおいては、キャッシュコントローラは、フォギー書き込み動作のような第１段階の書き込み動作が終了している内部バッファ（共有キャッシュ）３１内のライトデータのうちで、最も古いライトデータを破棄する。
【００７９】
データ書き込み量の少ない書き込み先ブロックへのデータ書き込み動作の進行速度に比べ、データ書き込み量の多い書き込み先ブロックへのデータ書き込み動作の進行速度は速くなる傾向がある。このため、データ書き込み量の多い書き込み先ブロックに書き込まれるべきライトデータは頻繁にライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送される。この結果、この最も古いライトデータは、ホスト２から書き込まれるデータ量が比較的少ない書き込み先ブロックへのライトデータである可能性が高い。したがって、フォギー書き込み動作のような第１段階の書き込み動作が終了している内部バッファ（共有キャッシュ）３１内のライトデータのうちで最も古いライトデータを破棄するという方法を使用することにより、ホスト２とフラッシュストレージデバイス３との間のデータトラフィックを効率よく低減することが可能となる。
【００８０】
なお、フォギー書き込み動作のような第１段階の書き込み動作が終了している内部バッファ（共有キャッシュ）３１内のライトデータの中から破棄すべきライトデータを選択するためのアルゴリズムは、最も古いデータを選択するファースト・イン・ファースト・アウトに限定されず、ＬＲＵ、ランダムのような他のアルゴリズムを使用してもよい。
【００８１】
プログラム／リードシーケンサ４１は、各ＮＡＮＤ型フラッシュメモリチップからステータス、つまり、書き込み完了（Ｄｏｎｅ）、書き込み失敗（Ｅｒｒｏｒ）、ブロックアドレス、ページアドレス、を受信する。そして、これらステータスに基づいて、プログラム／リードシーケンサ４１は、ライトコマンド毎に、このライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリチップに同じデータを１回または複数回転送する書き込み動作）の全てが終了したか否かを判定する。あるライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したならば、プログラム／リードシーケンサ４１は、このライトコマンドのコマンド完了を示すレスポンス（Ｄｏｎｅ）をホスト２に送信する。このコマンド完了を示すレスポンス（Ｄｏｎｅ）は、このライトコマンドを一意に識別するコマンドＩＤを含む。
【００８２】
次に、リードコマンドの処理について説明する。
リードコマンドは、リードすべきデータが格納されているブロックを示すブロックアドレスと、このデータが格納されているページを示すページアドレスと、このデータが転送されるべきホストメモリ上のリードデータバッファ５３内の位置を示すデータポインタと、このデータの長さとを含む。
【００８３】
プログラム／リードシーケンサ４１は、リードコマンドによって指定されたブロックアドレスおよびページアドレスを内部バッファ（共有キャッシュ）３１に送出し、リードコマンドによって指定されたデータの読み出しを内部バッファ（共有キャッシュ）３１に要求する。
【００８４】
内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、ＮＡＮＤ型フラッシュメモリチップに、このブロックアドレスと、このページアドレスと、リード指示用のＮＡＮＤコマンド（フラッシュリードコマンド）を、フラッシュコマンドキュー４３を介して送出する。ＮＡＮＤ型フラッシュメモリチップから読み出されたデータは、ＤＭＡＣ１５によってリードデータバッファ５３に転送される。
【００８５】
なお、リードコマンドによって指定されたデータが、書き込み動作が終了していないデータ、または書き込み動作の全てが終了しているがＮＡＮＤ型フラッシュメモリ５からまだ読み出し可能となっていないデータである場合、内部バッファ（共有キャッシュ）３１、つまりキャッシュコントローラは、内部バッファ（共有キャッシュ）３１にこのデータが存在するか否かを判定してもよい。内部バッファ（共有キャッシュ）３１にこのデータが存在するならば、このデータが内部バッファ（共有キャッシュ）３１から読み出され、そしてＤＭＡＣ１５によってリードデータバッファ５３に転送される。
【００８６】
一方、内部バッファ（共有キャッシュ）３１にこのデータが存在しないならば、このデータは、まず、ＤＭＡＣ１５によってライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送される。そして、このデータが内部バッファ（共有キャッシュ）３１から読み出され、そしてＤＭＡＣ１５によってリードデータバッファ５３に転送される。
【００８７】
図７は、フラッシュストレージデバイス３によって実行される複数段階の書き込み動作を示す。
ここでは、４つのワード線を往復する場合のフォギー・ファイン書き込み動作を例示する。また、ここでは、ＮＡＮＤ型フラッシュメモリ５が、メモリセル当たりに４ビットのデータを格納するＱＬＣ−フラッシュである場合を想定する。ＮＡＮＤ型フラッシュメモリ５内の一つの特定の書き込み先ブロック（ここでは、書き込み先ブロックＢＬＫ＃１）に対するフォギー・ファイン書き込み動作は以下のように実行される。
【００８８】
（１）まず、４ページ（Ｐ０〜Ｐ３）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ０に接続された複数のメモリセルに、これら４ページ（Ｐ０〜Ｐ３）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００８９】
（２）次いで、次の４ページ（Ｐ４〜Ｐ７）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ１に接続された複数のメモリセルに、これら４ページ（Ｐ４〜Ｐ７）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００９０】
（３）次いで、次の４ページ（Ｐ８〜Ｐ１１）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ２に接続された複数のメモリセルに、これら４ページ（Ｐ８〜Ｐ１１）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００９１】
（４）次いで、次の４ページ（Ｐ１２〜Ｐ１５）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ３に接続された複数のメモリセルに、これら４ページ（Ｐ１２〜Ｐ１５）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００９２】
（５）ワード線ＷＬ３に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ０に戻り、ワード線ＷＬ０に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ０に対するフォギー書き込み動作で使用された４ページ（Ｐ０〜Ｐ３）分のライトデータと同じ４ページ（Ｐ０〜Ｐ３）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ０に接続された複数のメモリセルに、これら４ページ（Ｐ０〜Ｐ３）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ０〜Ｐ３に対するフォギー・ファイン書き込み動作が終了する。
【００９３】
（６）次いで、次の４ページ（Ｐ１６〜Ｐ１９）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ４に接続された複数のメモリセルに、これら４ページ（Ｐ１６〜Ｐ１９）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００９４】
（７）ワード線ＷＬ４に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ１に戻り、ワード線ＷＬ１に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ１に対するフォギー書き込み動作で使用された４ページ（Ｐ４〜Ｐ７）分のライトデータと同じ４ページ（Ｐ４〜Ｐ７）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ１に接続された複数のメモリセルに、これら４ページ（Ｐ４〜Ｐ７）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ４〜Ｐ７に対するフォギー・ファイン書き込み動作が終了する。
【００９５】
（８）次いで、次の４ページ（Ｐ２０〜Ｐ２３）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ５に接続された複数のメモリセルに、これら４ページ（Ｐ２０〜Ｐ２３）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【００９６】
（９）ワード線ＷＬ５に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ２に戻り、ワード線ＷＬ２に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ２に対するフォギー書き込み動作で使用された４ページ（Ｐ８〜Ｐ１１）分のライトデータと同じ４ページ（Ｐ８〜Ｐ１１）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ２に接続された複数のメモリセルに、これら４ページ（Ｐ８〜Ｐ１１）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ８〜Ｐ１１に対するフォギー・ファイン書き込み動作が終了する。
【００９７】
図８は、書き込み先ブロックＢＬＫ＃１へのデータの書き込み順序を示す。
ここでは、図７と同様に、４つのワード線を往復する場合のフォギー・ファイン書き込み動作が実行される場合を想定する。
図８の左部に示されるデータｄ０、データｄ１、データｄ２、データｄ３、データｄ４、データｄ５、データｄ６、データｄ７、…、データｄ２５２、データｄ２５３、データｄ２５４、データｄ２５５は、書き込み先ブロックＢＬＫ＃１を指定する複数のライトコマンドそれぞれに対応する複数のライトデータを示している。ここでは、図示の簡単化のために、全てのライトデータが同じサイズを有している場合が想定されている。
【００９８】
図８の右部は、書き込み先ブロックＢＬＫ＃１へのデータの書き込み順序を示している。書き込み動作は、ワード線ＷＬ０に接続された複数のメモリセルへのデータｄ０の書き込み（フォギー書き込み）、ワード線ＷＬ１に接続された複数のメモリセルへのデータｄ１の書き込み（フォギー書き込み）、ワード線ＷＬ２に接続された複数のメモリセルへのデータｄ２の書き込み（フォギー書き込み）、ワード線ＷＬ３に接続された複数のメモリセルへのデータｄ３の書き込み（フォギー書き込み）、ワード線ＷＬ０に接続された複数のメモリセルへのデータｄ０の書き込み（ファイン書き込み）、ワード線ＷＬ４に接続された複数のメモリセルへのデータｄ４の書き込み（フォギー書き込み）、ワード線ＷＬ１に接続された複数のメモリセルへのデータｄ１の書き込み（ファイン書き込み）、ワード線ＷＬ５に接続された複数のメモリセルへのデータｄ５の書き込み（フォギー書き込み）、ワード線ＷＬ２に接続された複数のメモリセルへのデータｄ２の書き込み（ファイン書き込み）、…という順序で実行される。
【００９９】
図９は、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズの単位でライトデータをホスト２からフラッシュストレージデバイス３に転送する動作を示す。
図９の左部に示されるデータｄ１、データｄ２、データｄ３、データｄ４、データｄ５、データｄ６、データｄ７、データｄ８、データｄ９、データｄ１０、…は、書き込み先ブロックＢＬＫ＃１を指定する１０個のライトコマンドにそれぞれ対応する１０個のライトデータを示している。ライトデータの長さ（サイズ）は、個々のライトコマンド毎に異なる。図９では、データｄ１、データｄ２、データｄ３、データｄ４の各々が４Ｋバイトのサイズを有し、データｄ５が８Ｋバイトのサイズを有し、データｄ６が４０Ｋバイトのサイズを有し、データｄ７が１６Ｋバイトのサイズを有し、データｄ８、データｄ９の各々が８Ｋバイトのサイズを有し、データｄ１０が１Ｍバイトのサイズを有する場合が想定されている。
【０１００】
ホスト２から受信される各ライトコマンドはデータポインタ、長さ、ブロック識別子（例えばブロックアドレス）を含むので、フラッシュストレージデバイス３のコントローラ４は、ホスト２から受信されるライトコマンドを、複数の書き込み先ブロックにそれぞれ対応する複数のグループに分類することができる。上述のデータｄ１、データｄ２、データｄ３、データｄ４、データｄ５、データｄ６、データｄ７、データｄ８、データｄ９、データｄ１０、…は、書き込み先ブロックＢＬＫ＃１に対応するグループに分類された１０個のライトコマンドにそれぞれ対応している。これら１０個のライトコマンドは、書き込み先ブロックＢＬＫ＃１を示すブロック識別子（例えばブロックアドレス）を含むライトコマンドである。
【０１０１】
フラッシュストレージデバイス３のコントローラ４は、書き込み先ブロックＢＬＫ＃１を指定するこれらライトコマンド内のデータポインタおよび長さに基づいて、データｄ１、データｄ２、データｄ３、データｄ４、データｄ５、データｄ６、データｄ７、データｄ８、データｄ９、データｄ１０がそれぞれ存在するライトデータバッファ５１上の位置、およびデータｄ１、データｄ２、データｄ３、データｄ４、データｄ５、データｄ６、データｄ７、データｄ８、データｄ９、データｄ１０それぞれの長さを管理する。そして、コントローラ４は、一つのライトコマンドに関連付けられた大きなサイズのライトデータを複数のライトデータ（複数のデータ部）に分割、または２以上のライトコマンドにそれぞれ関連付けられた小さなサイズの２以上のライトデータを互いに結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有するライトデータを、ホスト２から取得する。
【０１０２】
図９では、コントローラ４は、最初に、各々が４Ｋバイトのサイズを有するデータｄ１、データｄ２、データｄ３、データｄ４を互いに結合することによって得られる１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、４回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。最初のＤＭＡ転送では、データｄ１の先頭位置を指定する転送元アドレスと、データ長＝４ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ１の先頭位置を指定する転送元アドレスは、データｄ１に対応するライトコマンド内のデータポインタによって表される。２回目のＤＭＡ転送では、データｄ２の先頭位置を指定する転送元アドレスと、データ長＝４ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ２の先頭位置を指定する転送元アドレスは、データｄ２に対応するライトコマンド内のデータポインタによって表される。３回目のＤＭＡ転送では、データｄ３の先頭位置を指定する転送元アドレスと、データ長＝４ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ３の先頭位置を指定する転送元アドレスは、データｄ３に対応するライトコマンド内のデータポインタによって表される。４回目のＤＭＡ転送では、データｄ４の先頭位置を指定する転送元アドレスと、データ長＝４ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ４の先頭位置を指定する転送元アドレスは、データｄ４に対応するライトコマンド内のデータポインタによって表される。
【０１０３】
そして、コントローラ４は、ＤＭＡ転送によって取得されるこの１６Ｋバイトライトデータ（ｄ１、ｄ２、ｄ３、ｄ４）を、書き込み先ブロックＢＬＫ＃１のページＰ０に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ１に変更し、８Ｋバイトのサイズを有するデータｄ３と、データｄ６内の先頭の８Ｋバイトデータｄ６−１とを互いに結合することによって得られる１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、２回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。最初のＤＭＡ転送では、データｄ５の先頭位置を指定する転送元アドレスと、データ長＝８ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ５の先頭位置を指定する転送元アドレスは、データｄ５に対応するライトコマンド内のデータポインタによって表される。２回目のＤＭＡ転送では、データｄ６−１の先頭位置を指定する転送元アドレスと、データ長＝８ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ６−１の先頭位置を指定する転送元アドレスは、データｄ６に対応するライトコマンド内のデータポインタによって表される。
【０１０４】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ５、ｄ６−１）を、書き込み先ブロックＢＬＫ＃１のページＰ１に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ２に変更し、データｄ６の残りの３２Ｋバイトデータのうちの最初の１６Ｋバイトデータｄ６−２をホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、１回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。このＤＭＡ転送では、データｄ６−２の先頭位置を指定する転送元アドレスと、データ長＝１６ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ６−２の先頭位置を指定する転送元アドレスは、データｄ６に対応するライトコマンド内のデータポインタの値に８ＫＢ分のオフセットを加算することによって求めることができる。
【０１０５】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ６−２）を、書き込み先ブロックＢＬＫ＃１のページＰ２に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ３に変更し、データｄ６の残りの１６Ｋバイトデータｄ６−３をホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、１回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。このＤＭＡ転送では、データｄ６−３の先頭位置を指定する転送元アドレスと、データ長＝１６ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ６−３の先頭位置を指定する転送元アドレスは、データｄ６に対応するライトコマンド内のデータポインタの値に２４ＫＢ分のオフセットを加算することによって求めることができる。
【０１０６】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ６−３）を、書き込み先ブロックＢＬＫ＃１のページＰ３に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
そして、コントローラ４は、フォギー書き込み動作によって４ページ分のデータ（Ｐ０〜Ｐ３）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ０に接続された複数のメモリセルに書き込む。
【０１０７】
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ４に変更し、１６Ｋバイトのサイズを有するデータｄ７をホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、１回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。このＤＭＡ転送では、データｄ７の先頭位置を指定する転送元アドレスと、データ長＝１６ＫＢがＤＭＡＣ１５にセットされてもよい。データ７の先頭位置を指定する転送元アドレスは、データｄ７に対応するライトコマンド内のデータポインタによって表される。
【０１０８】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ７）を、書き込み先ブロックＢＬＫ＃１のページＰ４に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ５に変更し、８Ｋバイトのサイズを有するデータｄ８と、８Ｋバイトのサイズを有するデータｄ９とを互いに結合することによって得られる１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、２回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。最初のＤＭＡ転送では、データｄ８の先頭位置を指定する転送元アドレスと、データ長＝８ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ８の先頭位置を指定する転送元アドレスは、データｄ８に対応するライトコマンド内のデータポインタによって表される。２回目のＤＭＡ転送では、データｄ９の先頭位置を指定する転送元アドレスと、データ長＝８ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ９の先頭位置を指定する転送元アドレスは、データｄ９に対応するライトコマンド内のデータポインタによって表される。
【０１０９】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ８、ｄ９）を、書き込み先ブロックＢＬＫ＃１のページＰ５に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ６に変更し、データｄ１０内の先頭の１６Ｋバイトデータｄ１０−１をホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、１回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。このＤＭＡ転送では、データｄ１０−１の先頭位置を指定する転送元アドレスと、データ長＝１６ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ１０−１の先頭位置を指定する転送元アドレスは、データｄ１０に対応するライトコマンド内のデータポインタによって表される。
【０１１０】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ１０−１）を、書き込み先ブロックＢＬＫ＃１のページＰ６に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ７に変更し、データｄ１０内の次の１６Ｋバイトデータｄ１０−２をホスト２のライトデータバッファ５１から取得する。この場合、コントローラ４は、これに限定されないが、例えば、１回のＤＭＡ転送によって、この１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に転送してもよい。このＤＭＡ転送では、データｄ１０−２の先頭位置を指定する転送元アドレスと、データ長＝１６ＫＢがＤＭＡＣ１５にセットされてもよい。データｄ１０−２の先頭位置を指定する転送元アドレスは、データｄ１０に対応するライトコマンド内のデータポインタの値に１６ＫＢ分のオフセットを加算することによって求めることができる。
【０１１１】
そして、コントローラ４は、この１６Ｋバイトライトデータ（ｄ１０−２）を、書き込み先ブロックＢＬＫ＃１のページＰ７に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。
そして、コントローラ４は、フォギー書き込み動作によって４ページ分のデータ（Ｐ４〜Ｐ７）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ１に接続された複数のメモリセルに書き込む。
【０１１２】
このように、コントローラ４は、書き込み先ブロックＢＬＫ＃１の書き込み動作の進行に合わせて、書き込み先ブロックＢＬＫ＃１の書き込み先ページに転送すべき１６Ｋバイトデータをホスト２から取得する。
そして、ワード線ＷＬ３に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、ワード線ＷＬ０に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。コントローラ４は、書き込み先ブロックＢＬＫ＃１の次の書き込み先ページをページＰ１に変更し、上述と同様の手順で、ライトデータ（Ｐ０〜Ｐ３）をページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送し、そしてファイン書き込み動作によってこれら４ページ分のライトデータ（Ｐ０〜Ｐ３）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ０に接続された複数のメモリセルに書き込む。
【０１１３】
これにより、最初の６つのライトコマンド、つまりデータｄ１に対応するライトコマンド、データｄ２に対応するライトコマンド、データｄ３に対応するライトコマンド、データｄ４に対応するライトコマンド、データｄ５に対応するライトコマンド、データｄ６に対応するライトコマンドの各々に関しては、各ライトコマンドに関連付けせけたライトデータ全体に対するフォギー・ファイン書き込み動作の全てが終了し、且つデータｄ１〜ｄ６の各々はＮＡＮＤ型フラッシュメモリ５から読み出し可能となる。このため、コントローラ４は、最初の６つのライトコマンドにそれぞれに対応する６つのコマンド完了レスポンスをホスト２に返す。
【０１１４】
なお、図９では、書き込み先ブロックＢＬＫ＃１を指定するライトコマンドそれぞれに関連づけられたライトデータを、書き込み先ブロックＢＬＫ＃１の書き込み動作の進行に合わせて１６Ｋバイトの単位でホスト２からフラッシュストレージデバイス３に転送する動作を説明したが、他の各書き込み先ブロックＢＬＫ＃に関しても、図９で説明した動作と同様の動作が実行される。
【０１１５】
図１０のフローチャートは、フラッシュストレージデバイス３によって実行されるデータ書き込み処理の手順を示す。
フラッシュストレージデバイス３のコントローラ４は、データポインタ、長さ、ブロック識別子（例えばブロックアドレス）を各々が含むライトコマンドそれぞれをホスト２から受信する（ステップＳ１１）。
【０１１６】
次いで、コントローラ４は、特定の書き込み先ブロックを指定する一つのライトコマンドに対応する大きなサイズのライトデータを２以上のデータ部に分割、またはこの特定の書き込み先ブロックを指定する２以上のライトコマンドに対応する２以上のライトデータを結合し、これによってＮＡＮＤ型フラッシュメモリ５の書き込み単位（データ転送サイズ）と同じサイズの単位でデータをホスト２からフラッシュストレージデバイス３に転送する（ステップＳ１２）。ステップＳ１２では、図９で説明したように、例えば、小さなサイズを有する幾つかのライトデータ部を互いに結合することによって得られる一つの１６Ｋバイトデータ、あるいは大きなサイズを有するライトデータを分割することによって得られる幾つかの１６Ｋバイトデータの一つが、ホスト２からフラッシュストレージデバイス３に転送される。フラッシュストレージデバイス３が内部バッファ３１を含む構成であるケースにおいては、ホスト２からフラッシュストレージデバイス３に転送される各１６バイトライトデータは内部バッファ３１に格納される。また、ステップＳ１２では、小さなサイズを有する幾つかのライトデータ部を互いに結合するために、コントローラ４は、ある書き込み先ブロックを指定する識別子を有する先行するライトコマンドに関連付けられたライトデータのサイズが書き込み単位（例えば１６Ｋバイト）よりも小さい場合、この書き込み先ブロックを指定する識別子を有する後続のライトコマンドの受信を待つ。
【０１１７】
コントローラ４は、ホスト２から転送された１６ＫバイトデータをＮＡＮＤ型フラッシュメモリ５に転送し、この１６Ｋバイトデータを、この特定の書き込み先ブロックに書き込む（ステップＳ１３）。
そして、コントローラ４は、この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送することを伴う書き込み動作）の全てが終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能になったか否かを判定する（ステップＳ１４）。
【０１１８】
この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能になったならば、コントローラ４は、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す（ステップＳ１５）。
【０１１９】
なお、フォギー・ファイン書き込み動作のように、ＮＡＮＤ型フラッシュメモリ５に同じデータを複数回転送することを伴う書き込み動作が使用されるケースにおいては、コントローラ４は、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（複数段階の書き込み動作）の全てが終了した場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返してもよい。フォギー・ファイン書き込み動作では、あるデータのファイン書き込み動作が終了すると、このデータを正しくＮＡＮＤ型フラッシュメモリ５から読み出すことが可能となるからである。
【０１２０】
また、あるページに対するデータのファイン書き込み動作が終了してもこのデータを読み出すことができず、後続の１以上のページへのデータの書き込みの終了後にこのデータを正しく読み出すことが可能となる、というタイプのＮＡＮＤ型フラッシュメモリが用いられてもよい。この場合には、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（複数段階の書き込み動作）の全てが終了し、且つ後続の１以上のページへのデータの書き込みによってこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返してもよい。
【０１２１】
このように、本実施形態では、あるライトコマンドに関連付けられたライトデータがホスト２からフラッシュストレージデバイス３に転送された時点でこのライトコマンドのコマンド完了を示すレスポンスがホスト２に返されるのではなく、あるライトコマンドに関連付けられたライトデータ全体の書き込みに必要な書き込み動作全てが終了するか、またはこのライトデータ全体の書き込み動作全てが終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスがホスト２に返される。
【０１２２】
これにより、ホスト２は、コマンド完了が通知されたライトコマンドに対応するライトデータをライトデータバッファ５１から破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータがフラッシュストレージデバイス３から読み出し可能になるまで、このライトデータをライトデータバッファ５１に維持することができる。
【０１２３】
図１１のフローチャートは、ホスト２によって実行されるライトデータ破棄処理の手順を示す。
ホスト２は、ライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス３から受信したか否かを判定する（ステップＳ２１）。あるライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス３から受信した場合（ステップＳ２２）、ホスト２は、このライトコマンドに関連付けられたライトデータをライトデータバッファ５１から破棄する（ステップＳ２２）。
【０１２４】
図１２は、ある書き込み先ブロックを指定する最後のライトコマンドが受信されてから閾期間、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合に、フラッシュストレージデバイス３によって実行されるダミーデータ書き込み処理を示す。
【０１２５】
図１２の左部に示されるデータｄ１、データｄ２、データｄ３、データｄ４は、書き込み先ブロックＢＬＫ＃１を指定する４個のライトコマンドそれぞれに対応する４個のライトデータを示している。図１２では、データｄ１、データｄ２、データｄ３、データｄ４の各々が４Ｋバイトのサイズを有する場合が想定されている。
【０１２６】
（１）コントローラ４は、データｄ１、データｄ２、データｄ３、データｄ４を互いに結合することによって得られる１６Ｋバイトライトデータをホスト２のライトデータバッファ５１から取得する。そして、コントローラ４は、この１６Ｋバイトライトデータを、書き込み先ブロックＢＬＫ＃１のページＰ０に書き込まれるべきデータとしてＮＡＮＤ型フラッシュメモリ５に転送する。書き込み先ブロックＢＬＫ＃１を指定する最後のライトコマンド、つまりデータｄ４の書き込みを要求したライトコマンド、が受信されてから閾期間、書き込み先ブロックＢＬＫ＃１を指定する後続のライトコマンドが受信されない場合、コントローラ４は、最後のライトコマンドのコマンド完了を示すレスポンスを所定時間内にホスト２に返すことを可能にするために、書き込み先ブロックＢＬＫ＃１内の１以上のページにダミーデータを書き込み、次のライトデータが書き込まれるべき書き込み先ブロックＢＬＫ＃１内の書き込み先ページの位置を進める。例えば、コントローラ４は、ページＰ１〜Ｐ３に対応する３ページ分のダミーデータをページ単位でＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作によって４ページ分のデータ（Ｐ０〜Ｐ３）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ０に接続された複数のメモリセルに書き込む。
【０１２７】
（２）次いで、コントローラ４は、ページＰ４〜Ｐ７に対応する４ページ分のダミーデータをページ単位でＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作によって４ページ分のデータ（Ｐ４〜Ｐ７）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ１に接続された複数のメモリセルに書き込む。
【０１２８】
（３）次いで、コントローラ４は、ページＰ８〜Ｐ１１に対応する４ページ分のダミーデータをページ単位でＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作によって４ページ分のデータ（Ｐ８〜Ｐ１１）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ２に接続された複数のメモリセルに書き込む。
【０１２９】
（４）次いで、コントローラ４は、ページＰ１２〜Ｐ１５に対応する４ページ分のダミーデータをページ単位でＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作によって４ページ分のデータ（Ｐ１２〜Ｐ１５）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ３に接続された複数のメモリセルに書き込む。
【０１３０】
（５）次いで、コントローラ４は、データｄ１、データｄ２、データｄ３、データｄ４を互いに結合することによって得られる１６Ｋバイトライトデータをライトデータバッファ５１または内部バッファ３１からＮＡＮＤ型フラッシュメモリ５に転送し、さらに、ＷＬ０のフォギー書き込み動作で使用した３ページ分のダミーデータ（Ｐ０〜Ｐ３）と同じ３ページ分のダミーデータ（Ｐ０〜Ｐ３）をページ単位でＮＡＮＤ型フラッシュメモリ５に転送する。そして、コントローラ４は、ファイン書き込み動作によって４ページ分のデータ（Ｐ０〜Ｐ３）を書き込み先ブロックＢＬＫ＃１のワード線ＷＬ０に接続された複数のメモリセルに書き込む。これにより、データｄ１、データｄ２、データｄ３、データｄ４の複数段階の書き込み動作が全て完了し、データｄ１、データｄ２、データｄ３、データｄ４がＮＡＮＤ型フラッシュメモリ５読み出し可能となる。コントローラ４は、データｄ１の書き込みを要求した最初のライトコマンドのコマンド完了を示すレスポンスと、データｄ２の書き込みを要求した２番目のライトコマンドのコマンド完了を示すレスポンスと、データｄ３の書き込みを要求した３番目のライトコマンドのコマンド完了を示すレスポンスと、データｄ４の書き込みを要求した４番目のライトコマンドのコマンド完了を示すレスポンスとをホスト２に返す。
【０１３１】
本実施形態では、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位でライトデータがホスト２からフラッシュストレージデバイス３に転送され、あるライトコマンドのライトデータ全体の書き込み動作の全てが終了した時点で、またはこのライトデータ全体の書き込み動作の全てが終了し且つこのライトデータ全体が読み出し可能となった時点で、このライトコマンドのコマンド完了を示すレスポンスがホスト２に返される。このため、例えば、小さなライトデータをある書き込み先ブロックに書き込むことを要求するライトコマンドがホスト２からフラッシュストレージデバイス３に発行された後にしばらくの間、この書き込み先ブロックを指定する後続のライトコマンドがホスト２から発行されない場合には、このライトコマンドのタイムアウトエラーが起こる可能性がある。本実施形態では、コントローラ４は、あるブロック識別子を有する最後のライトコマンドがホスト２から受信されてから閾期間このブロック識別子を有する次のライトコマンドが受信されない場合、ダミーデータを、このブロック識別子に対応する書き込み先ブロック内の次の１以上の未書き込みページに書き込む。したがって、必要に応じて、この書き込み先ブロックの書き込み動作を進行させることができるので、ライトコマンドのタイムアウトエラーが起こることを防止することができる。
【０１３２】
図１３のフローチャートは、フラッシュストレージデバイス３によって実行されるダミーデータ書き込み処理の手順を示す。ここでは、フォギー・ファイン書き込み動作のような複数段階の書き込み動作によってデータが書き込み先ブロックに書き込まれる場合を想定する。
【０１３３】
フラッシュストレージデバイス３のコントローラ４は、ある書き込み先ブロックを指定する最後のライトコマンドに関連付けられたライトデータをフォギー書き込み動作のような第１段階の書き込み動作によってこの書き込み先ブロックに書き込む。この最後のライトコマンドの受信から閾期間（Ｔｈ）、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合（ステップＳ３１のＹＥＳ）、コントローラ４は、最後のライトコマンドに関連付けられたライトデータが書き込まれた書き込み先ブロック内のページに後続する１以上のページにダミーデータを書き込み、これによって、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める（ステップＳ３２）。この書き込み先ブロックへのダミーデータの書き込みによって書き込み先ページの位置が進み、これによって最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作（第２段階の書き込み動作）が実行可能となると、コントローラ４は、最後のライトコマンドに関連付けられたライトデータをライトデータバッファ５１または内部バッファ（共有キャッシュ）３１からＮＡＮＤ型フラッシュメモリ５に再び転送し、このライトデータのファイン書き込み動作を実行する（ステップＳ３３）。
【０１３４】
最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作が終了すると、つまりこのライトデータ全体の複数段階の書き込み動作の全てが終了すると、コントローラ４は、この最後のライトコマンドのコマンド完了を示すレスポンスをホスト２に返す（ステップＳ３４）。
【０１３５】
このように、複数段階の書き込み動作によってライトデータを書き込み先ブロックに書き込むケースにおいては、コントローラ４は、最後のライトコマンドに関連付けられたライトデータの第２段階の書き込み動作が実行可能になるように、ダミーデータをこの書き込み先ブロック内の１以上のページに書き込み、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める。
【０１３６】
図１４は、内部バッファ（共有キャッシュ）３１を使用してコントローラ４によって実行されるデータ転送動作を示す。
内部バッファ（共有キャッシュ）３１は、複数の書き込み先ブロックＢＬＫ＃１、ＢＬＫ＃２、…、ＢＬＫ＃ｎによって共有される。フラッシュストレージデバイス３のコントローラ４は、書き込み先ブロックＢＬＫ＃１、ＢＬＫ＃２、…、ＢＬＫ＃ｎの各々について以下の処理を実行する。
【０１３７】
以下では、書き込み先ブロックＢＬＫ＃１を例示して説明する。
コントローラ４が、書き込み先ブロックＢＬＫ＃１を指定する１以上のライトコマンドを受信した後、コントローラ４は、書き込み先ブロックＢＬＫ＃１を指定する一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または書き込み先ブロックＢＬＫ＃１を指定する２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ５１から取得する。そして、コントローラ４は、ライトデータバッファ５１から取得される、各々がＮＡＮＤ型フラッシュメモリ５の書き込み単位と同じサイズを有する複数のライトデータを内部バッファ（共有キャッシュ）３１に格納する。
【０１３８】
ライトデータバッファ５１は、必ずしも、ホストメモリ上の連続する一つの領域から構成される必要は無く、図１４に示されているように、複数のライトデータバッファ５１−１、５１−２、…、５１−ｎによって実現されてもよい。
コントローラ４は、書き込み先ブロックＢＬＫ＃１に次に書き込むべきライトデータ（第１のライトデータ）を内部バッファ（共有キャッシュ）３１から取得し、第１のライトデータをＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作のような第１段階の書き込み動作によってこのライトデータを書き込み先ブロックＢＬＫ＃１に書き込む。
【０１３９】
内部バッファ（共有キャッシュ）３１にホスト２からのライトデータを効率よく蓄積できるようにするため、ホスト２から取得されるライトデータを格納するための空き領域が内部バッファ（共有キャッシュ）３１に無い場合には、コントローラ４は、フォギー書き込み動作のような第１段階の書き込み動作が終了している内部バッファ（共有キャッシュ）３１内のライトデータ（フォギーステートのライトデータ）を破棄して、空き領域を内部バッファ（共有キャッシュ）３１に確保する。
【０１４０】
例えば、内部バッファ（共有キャッシュ）３１に空き領域がない状態でホスト２から任意の書き込み先ブロックを指定する新たなライトコマンドを受信した場合に、コントローラ４は、フォギー書き込み動作のような第１段階の書き込み動作が終了している内部バッファ（共有キャッシュ）３１内のライトデータ（フォギーステートのライトデータ）を破棄して、新たなライトコマンドに対応するライトデータを格納可能な空き領域を内部バッファ（共有キャッシュ）３１に確保してもよい。
【０１４１】
例えば、内部バッファ（共有キャッシュ）３１全体が多数のフォギーステートのライトデータで満たされている状態でホスト２から新たなライトコマンドを受信した場合には、コントローラ４は、これらフォギーステートのライトデータの中から破棄すべき特定のライトデータを選択してもよく、この選択したライトデータを破棄してもよい。これにより、制限された容量を有する内部バッファ（共有キャッシュ）３１を、複数の書き込み先ブロック間で効率よく共有することができる。
【０１４２】
コントローラ４は、第１のライトデータのファイン書き込み動作のような第２段階の書き込み動作を実行すべき時点において第１のライトデータが内部バッファ（共有キャッシュ）３１に存在しない場合には、第１のライトデータを取得するための要求（転送要求：ＤＭＡ転送要求）をホスト２に送信することによってホスト２のライトデータバッファ５１から再び取得する。この取得された第１のライトデータは内部バッファ（共有キャッシュ）３１に格納されてもよい。そして、コントローラ４は、取得された第１のライトデータをＮＡＮＤ型フラッシュメモリ５に転送し、ファイン書き込み動作のような第２段階の書き込み動作によってこの第１のライトデータを書き込み先ブロックＢＬＫ＃１に書き込む。
【０１４３】
第１のライトデータのファイン書き込み動作のような第２段階の書き込み動作を実行すべき時点において第１のライトデータが内部バッファ（共有キャッシュ）３１に存在している場合には、コントローラ４は、この内部バッファ（共有キャッシュ）３１から第１のライトデータを取得し、取得された第１のライトデータをＮＡＮＤ型フラッシュメモリ５に転送し、ファイン書き込み動作のような第２段階の書き込み動作によってこの第１のライトデータを書き込み先ブロックＢＬＫ＃１に書き込む。
【０１４４】
ＮＡＮＤ型フラッシュメモリ５への第１のライトデータの最終回のデータ転送（ここでは、ファイン書き込み動作のためのデータ転送）を行った後、コントローラ４は、この第１のライトデータを内部バッファ（共有キャッシュ）３１から破棄することによって内部バッファ（共有キャッシュ）３１に空き領域を確保する。あるいは、コントローラ４はこの第１のライトデータのファイン書き込み動作が終了した場合に、この第１のライトデータを内部バッファ（共有キャッシュ）３１から破棄してもよい。
【０１４５】
さらに、コントローラ４は、あるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了した場合、あるいはこのライトデータ全体のファイン書き込み動作が終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す。
【０１４６】
内部バッファ（共有キャッシュ）３１はある限られた容量を有しているが、書き込み先ブロックの数がある一定数以下であるならば、第２段階の書き込み動作を実行すべき時点において第１のライトデータが内部バッファ（共有キャッシュ）３１に存在する確率（ヒット率）は比較的高い。したがって、同じライトデータをホスト２からフラッシュストレージデバイス３に複数回転送すること無く、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を実行することができる。これにより、ホスト２とフラッシュストレージデバイス３との間のデータトラフィックを削減できるので、データ書き込みの度に同じライトデータをホスト２からフラッシュストレージデバイス３に複数回転送する場合に比し、フラッシュストレージデバイス３のＩ／Ｏ性能を向上することができる。
【０１４７】
書き込み先ブロックの数は、ホスト２を利用するクライアントの数と同数であってよい。この場合、あるクライアントに対応するデータはこのクライアントに対応する書き込み先ブロックに書き込まれ、他のクライアントに対応するデータは別の書き込み先ブロックに書き込まれる。したがって、ホスト２を利用するクライアントの数が増えるにつれて、内部バッファ（共有キャッシュ）３１のヒット率は低下する。しかし、第１のライトデータが内部バッファ（共有キャッシュ）３１に存在しない場合（ミス）には、コントローラ４はこの第１のライトデータをホスト２から取得する。したがって、クライアントの数が増加しても、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を正常に実行することができる。
【０１４８】
よって、フラッシュストレージデバイス３は、フラッシュストレージデバイス３を共有するクライアントの数の増加（つまり、同時に利用可能な書き込み先ブロックの数の増加）に柔軟に対応でき且つホスト２とフラッシュストレージデバイス３との間のデータトラフィックを削減することができる。
【０１４９】
ここでは、書き込み先ブロックＢＬＫ＃１にデータを書き込むための書き込み処理について説明したが、他の全ての書き込み先ブロックの各々に対しても同様の書き込み処理が実行される。
図１５は、内部バッファ（共有キャッシュ）３１を使用してコントローラ４よって実行される書き込み処理と内部バッファ（共有キャッシュ）３１内のライトデータを破棄する処理とを示す。
【０１５０】
図１５においては、図示の簡単化のために、内部バッファ（共有キャッシュ）３１が、領域１０１〜１０９を含む場合が例示されている。また、図１５においては、ＮＡＮＤ型フラッシュメモリ５がＱＬＣ−フラッシュとして実現されており、４ページ分のデータサイズの単位でライトデータを破棄する処理を例示する。しかし、本実施形態は、これに限定されず、例えば１ページ分のデータサイズの単位でライトデータをライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送する処理が実行されてもよく、例えば１ページ分のデータサイズの単位でライトデータを破棄する処理が実行されてもよい。また、図１５においては、３つのワード線ＷＬを往復しながら、フォギー・ファイン書き込み動作が実行される場合を想定する。
【０１５１】
内部バッファ（共有キャッシュ）３１の領域１０１、１０２にそれぞれ格納されたライトデータＤ１、Ｄ２の各々は、書き込み先ブロックＢＬＫ＃１１を指定する１以上のライトコマンドに関連付けられている。ライトデータＤ１、Ｄ２の各々は、例えば、４ページ分のサイズを有していてもよい。コントローラ４は、（１）４ページ分のライトデータＤ１をフォギー書き込み動作によって書き込み先ブロックＢＬＫ＃１１のページＰ０−Ｐ３（ワード線ＷＬ０に接続された複数のメモリセル）に書き込み、そして、（２）４ページ分のライトデータＤ２をフォギー書き込み動作によって書き込み先ブロックＢＬＫ＃１１のページＰ４−Ｐ７（ワード線ＷＬ１に接続された複数のメモリセル）に書き込む。
【０１５２】
内部バッファ（共有キャッシュ）３１の領域１０３、１０４、１０５にそれぞれ格納されたライトデータＤ１１、Ｄ１２、Ｄ１３の各々は、書き込み先ブロックＢＬＫ＃１０１を指定する１以上のライトコマンドに関連付けられている。ライトデータＤ１１、Ｄ１２、Ｄ１３の各々は、例えば、４ページ分のサイズを有していてもよい。コントローラ４は、（３）４ページ分のライトデータＤ１１をフォギー書き込み動作によって書き込み先ブロックＢＬＫ＃１０１のページＰ０−Ｐ３（ワード線ＷＬ０に接続された複数のメモリセル）に書き込み、（４）４ページ分のライトデータＤ１２をフォギー書き込み動作によって書き込み先ブロックＢＬＫ＃１０１のページＰ４−Ｐ７（ワード線ＷＬ１に接続された複数のメモリセル）に書き込み、（５）４ページ分のライトデータＤ１３をフォギー書き込み動作によって書き込み先ブロックＢＬＫ＃１０１のページＰ８−Ｐ１１（ワード線ＷＬ２に接続された複数のメモリセル）に書き込む。
【０１５３】
書き込み先ブロックＢＬＫ＃１０１のワード線ＷＬ２に対する４ページ分のライトデータＤ１３のフォギー書き込み動作が終了した後、コントローラ４は、（６）４ページ分のライトデータＤ１１をファイン書き込み動作によって書き込み先ブロックＢＬＫ＃１０１のページＰ０−Ｐ３（ワード線ＷＬ０に接続された複数のメモリセル）に書き込む。ライトデータＤ１１のファイン書き込み動作が終了すると、あるいは書き込み先ブロックＢＬＫ＃１０１を含むＮＡＮＤ型フラッシュメモリチップへのライトデータＤ１１のファイン書き込み動作のための転送（最終回の転送）が終了すると、このライトデータＤ１１のステートはフォギーステートからファインステートに変わる。そして、コントローラ４は、（７）ファイン書き込み動作が終了したこのライトデータＤ１１（ファインステートのライトデータ）を内部バッファ（共有キャッシュ）３１から破棄して領域１０３を空き領域にする。
【０１５４】
図１６は、内部バッファ（共有キャッシュ）３１に空き領域がない場合にコントローラ４によって実行される内部バッファ（共有キャッシュ）３１内のライトデータを破棄する処理を示す。
図１６の上部は、内部バッファ（共有キャッシュ）３１全体が、フォギー書き込み動作（第１段階の書き込み動作）が終了しているフォギーステートのライトデータ（Ｄ２１〜Ｄ２３、Ｄ３１〜Ｄ３３、Ｄ４１〜Ｄ４３）で満たされており、内部バッファ（共有キャッシュ）３１に空き領域がない状態を示している。
【０１５５】
この状態でライトデータバッファ５１から内部バッファ（共有キャッシュ）３１へライトデータを転送することが必要とされた場合、例えばホスト２から新たなライトコマンドを受信した場合、コントローラ４は、図１６の中部に示すように、フォギー書き込み動作（第１段階の書き込み動作）が終了しているライトデータ（フォギーステートのライトデータ）の中から最も古いライトデータ（ここではライトデータＤ１１）を破棄すべきライトデータとして選択し、この最も古いライトデータ（ここではライトデータＤ１１）を内部バッファ（共有キャッシュ）３１から破棄する。
【０１５６】
そして、フラッシュストレージデバイス３のコントローラ４は、図１６の下部に示すように、ライトデータＤ１１を破棄することによって空き領域となった領域１０１に、ライトデータバッファ５１から受信される新たなライトデータ（ここではライトデータＤ５１）を格納する。
【０１５７】
なお、フォギー書き込み動作が終了しているライトデータ（フォギーステートのライトデータ）のうちで最も古いライトデータを破棄する代わりに、フォギー書き込み動作が終了しているライトデータ（フォギーステートのライトデータ）のうちで、ＮＡＮＤ型フラッシュメモリ５への残りデータ転送回数が最も少ないライトデータを破棄してもよい。この場合、例えば、ＮＡＮＤ型フラッシュメモリ５に同じデータを３回転送することを伴う複数段階の書き込み動作が使用されるケースにおいては、ＮＡＮＤ型フラッシュメモリ５への２回の転送が既に実行済みのデータが、ＮＡＮＤ型フラッシュメモリ５への１回の転送のみが実行済みのデータよりも優先して、破棄すべきデータとして選択される。
【０１５８】
図１７のフローチャートは、内部バッファ（共有キャッシュ）３１を使用してコントローラ４によって実行されるデータ書き込み処理の手順を示す。
コントローラ４は、データポインタと、ライトデータの長さと、複数の書き込み先ブロックのいずれか一つを指定する識別子（例えばブロックアドレス）とを各々が含む１つ以上のライトコマンドをホスト２から受信する（ステップＳ１０１）。同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドを受信した後、コントローラ４は、これらライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または同じ書き込み先ブロックを示す識別子を有する２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送する（ステップＳ１０２）。
【０１５９】
コントローラ４は、この書き込み先ブロックに次に書き込むべきライトデータを内部バッファ（共有キャッシュ）３１から取得し、このライトデータをＮＡＮＤ型フラッシュメモリ５に転送し、フォギー書き込み動作によってこの第１のライトデータをこの書き込み先ブロックに書き込む（ステップＳ１０３、Ｓ１０４）。ＮＡＮＤ型フラッシュメモリ５がＱＬＣ−フラッシュとして実現されている場合には、ステップＳ１０３では、４ページ分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に転送され、ステップＳ１０４では、４ページ分のライトデータがフォギー書き込み動作によってこの書き込み先ブロック内の書き込み対象の一つのワード線に接続された複数のメモリセルに書き込まれる。
【０１６０】
なお、ライトデータバッファ５１から内部バッファ（共有キャッシュ）３１へのライトデータの転送は、各書き込み先ブロックの書き込み動作の進行に合わせて実行される。例えば、ある書き込み先ブロックのあるページに書き込むべきライトデータをＮＡＮＤ型フラッシュメモリチップに転送する動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ５１から内部バッファ（共有キャッシュ）３１へ転送されてもよい。あるいは、ある書き込み先ブロックのあるページに書き込むべきライトデータをこの書き込み先ブロックを含むＮＡＮＤ型フラッシュメモリチップに転送する動作が終了し、且つこのライトデータをこの書き込み先ブロックに書き込む動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ５１から内部バッファ（共有キャッシュ）３１へ転送されてもよい。
【０１６１】
フォギー書き込み動作が行われたこのライトデータのファイン書き込み動作を開始すべき時点において、コントローラ４は、このライトデータが、内部バッファ（共有キャッシュ）３１に存在するか否かを判定する。
このライトデータが内部バッファ（共有キャッシュ）３１に存在するならば（ステップＳ１０６のＹＥＳ）、コントローラ４は、このライトデータを内部バッファ（共有キャッシュ）３１から取得し、このライトデータをＮＡＮＤ型フラッシュメモリ５に転送し、ファイン書き込み動作によってこのライトデータをこの書き込み先ブロックに書き込む（ステップＳ１０７、Ｓ１０８、Ｓ１０９）。これにより、このライトデータはＮＡＮＤ型フラッシュメモリ５から読み出し可能となる。
【０１６２】
コントローラ４は、ライトコマンド毎に、そのライトデータ全体のフォギー・ファイン書き込み動作が終了し且つそのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能となったか否かを判定する。そして、コントローラ４は、フォギー・ファイン書き込み動作が終了し且つＮＡＮＤ型フラッシュメモリ５から読み出し可能となったライトデータに対応するライトコマンドのコマンド完了を示すレスポンスをホスト２に返す（ステップＳ１１０）。もしステップＳ１０９の処理によってあるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了したならば、ステップＳ１１０では、このライトコマンドのコマンド完了を示すレスポンスがホスト２に返されてもよい。
【０１６３】
図１８のフローチャートは、コントローラ４によって実行されるデータ読み出し処理の手順を示す。
上述したように、コントローラ４は、ホスト２から受信されるリードコマンドによって指定されたデータが、その書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送する書き込み動作）の全てが終了していないデータ、またはその書き込み動作の全てが終了しているがＮＡＮＤ型フラッシュメモリ５からまだ読み出し可能となっていないデータである場合、このデータが内部バッファ（共有キャッシュ）３１に存在するか否かを判定する。このデータが内部バッファ（共有キャッシュ）３１に存在しない場合、コントローラ４は、このデータをライトデータバッファ５１から取得し、このデータを内部バッファ（共有キャッシュ）３１に格納し、このデータを内部バッファ（共有キャッシュ）３１からホスト２に返す。
【０１６４】
具体的には、以下のデータ読み出し処理が実行される。
コントローラ４がホスト２からリードコマンドを受信した場合（ステップＳ１２１のＹＥＳ）、コントローラ４は、このリードコマンドによって指定されたデータが、その書き込み動作の全てが終了し、且つＮＡＮＤ型フラッシュメモリ５から読み出し可能なデータであるか否かを判定する（ステップＳ１２２）。
【０１６５】
このデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能であるならば（ステップＳ１２２のＹＥＳ）、コントローラ４は、このデータをＮＡＮＤ型フラッシュメモリ５から読み出し、読み出されたデータをホスト２に返す（ステップＳ１２６）。ステップＳ１２６では、コントローラ４は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ５３内の位置に転送する。
【０１６６】
このデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能でないならば（ステップＳ１２２のＮＯ）、コントローラ４は、このデータが内部バッファ（共有キャッシュ）３１に存在するか否かを判定する（ステップＳ１２３）。
このデータが内部バッファ（共有キャッシュ）３１に存在するならば（ステップＳ１２３のＹＥＳ）、コントローラ４は、このデータを内部バッファ（共有キャッシュ）３１から読み出し、この読み出したデータをホスト２に返す（ステップＳ１２４）。
【０１６７】
ステップＳ１２４では、コントローラ４は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ５３内の位置に転送する。
このデータが内部バッファ（共有キャッシュ）３１に存在しないならば（ステップＳ１２３のＮＯ）、コントローラ４は、このデータをライトデータバッファ５１から取得し、内部バッファ（共有キャッシュ）３１に格納する（ステップＳ１２５）。ステップＳ１２５では、ＤＭＡＣ１５によってこのデータがライトデータバッファ５１から内部バッファ（共有キャッシュ）３１の空き領域に転送される。内部バッファ（共有キャッシュ）３１の空き領域が無い場合には、内部バッファ（共有キャッシュ）３１の空き領域を確保する処理が実行される。そして、コントローラ４は、このデータを内部バッファ（共有キャッシュ）３１から読み出し、この読み出したデータをホスト２に返す（ステップＳ１２４）。ステップＳ１２４では、コントローラ４は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ５３内の位置に転送する。
【０１６８】
図１９は、タイプ＃２−ストレージデバイスとして実現されたフラッシュストレージデバイス３に適用されるデータ書き込み動作およびデータ読み出し動作を示す。
このデータ書き込み動作では、ホスト２が書き込み先ブロックを指定し、且つフラッシュストレージデバイス３が書き込み先ページを決定する。また、このデータ読み出し動作では、ホスト２がブロックアドレスとページアドレスとを指定する。
【０１６９】
ホスト２はフラッシュストレージデバイス３を管理するストレージ管理部４０４を含む。ストレージ管理部４０４はフラッシュストレージデバイス３にブロック割り当てコマンドおよびライトコマンドをフラッシュストレージデバイス３に送出する。
フラッシュストレージデバイス３のコントローラ４は、ブロック割り当て部７０１、およびページ割り当て部７０２を含む。ブロック割り当て部７０１、およびページ割り当て部７０２は、図２で説明したライト制御部２１に含まれていてもよい。
【０１７０】
データ書き込み動作は以下の手順で実行される。
（１）ホスト２のストレージ管理部４０４がフラッシュストレージデバイス３にデータ（ライトデータ）を書き込むことが必要な時、ストレージ管理部４０４は、書き込み先ブロックとして使用可能なフリーブロックを割り当てるようにフラッシュストレージデバイス３に要求してもよい。ブロック割り当て部７０１がこの要求（ブロック割り当てコマンド）を受信した時、ブロック割り当て部７０１は、フリーブロック群の一つのフリーブロックを書き込み先ブロックとしてホスト２に割り当て、割り当てられた書き込み先ブロックのブロックアドレス（ＢＬＫ＃）をホスト２に通知する。
【０１７１】
（２）ホスト２のストレージ管理部４０４は、割り当てられた書き込み先ブロックを指定するブロックアドレスと、ライトデータを識別するタグと、このライトデータのデータ長と、データポインタとを含むライトコマンドを、フラッシュストレージデバイス３に送信する。また、ストレージ管理部４０４は、ライトデータをライトデータバッファ５１に格納する。
【０１７２】
（３）ページ割り当て部７０２がライトコマンドを受信した時、ページ割り当て部７０２は、ライトコマンドによって指定されたブロックアドレスを有するブロック（書き込み先ブロック）内の書き込み先ページを示すページアドレスを決定する。コントローラ４は、ライトデータを、例えばページサイズの単位で、ライトデータバッファ５１から内部バッファ（共有キャッシュ）３１に転送し、書き込み先ブロック内のこの決定された書き込み先ページにこのライトデータを書き込む。
【０１７３】
（４）コントローラ４は、この書き込み先ページを示すページアドレスを、このライトコマンドのコマンド完了を示すレスポンスとしてホスト２に通知してもよい。あるいは、コントローラ４は、このライトコマンドに含まれているタグと、このライトコマンドに含まれているブロックアドレスと、決定されたページアドレスとの組を、このライトコマンドのコマンド完了を示すレスポンスとしてホスト２に通知してもよい。ホスト２においては、ライトデータが書き込まれた物理記憶位置を示す物理アドレス（ブロックアドレス、ページアドレス）が、このライトデータのタグにマッピングされるように、ＬＵＴ４０４Ａが更新される。
【０１７４】
データリード動作は以下の手順で実行される。
（１）’ホスト２がフラッシュストレージデバイス３からデータをリードすることが必要な時、ホスト２は、ＬＵＴ４０４Ａを参照することによって、リードすべきデータのタグに対応する物理アドレス（ブロックアドレス、ページアドレス）をＬＵＴ４０４Ａから取得する。
【０１７５】
（２）’ホスト２は、取得されたブロックアドレスおよびページアドレスを指定するリードコマンドをフラッシュストレージデバイス３に送出する。フラッシュストレージデバイス３のコントローラ４がこのリードコマンドをホスト２から受信した時、コントローラ４は、ブロックアドレスおよびページアドレスに基づいて、データを、リード対象のブロック内のリード対象の物理記憶位置からリードする。
【０１７６】
図２０は、タイプ＃２−ストレージデバイスとして実現されたフラッシュストレージデバイス３に適用されるブロックアロケートコマンドを示す。
ブロックアロケートコマンドは、フラッシュストレージデバイス３に書き込み先ブロック（フリーブロック）の割り当てを要求するコマンド（ブロック割り当て要求）である。ホスト２は、ブロックアロケートコマンドをフラッシュストレージデバイス３に送信することによって、書き込み先ブロックを割り当てるようにフラッシュストレージデバイス３に要求し、これによってブロックアドレス（割り当てられた書き込み先ブロックのブロックアドレス）を取得することができる。
【０１７７】
図２１は、ブロックアロケートコマンドに対するレスポンスを示す。
ブロックアロケートコマンドをホスト２から受信した時、フラッシュストレージデバイス３のコントローラ４は、フリーブロックリストから、ホスト２に割り当てるべきフリーブロックを選択し、選択したフリーブロックを書き込み先ブロックとして割り当て、そしてこの書き込み先ブロックのブロックアドレスを含むレスポンスをホスト２に返す。
【０１７８】
図２２は、タイプ＃２−ストレージデバイスとして実現されたフラッシュストレージデバイス３に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス３にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドＩＤ、ブロックアドレス、タグ、長さ、等を含んでもよい。
【０１７９】
コマンドＩＤはこのコマンドがライトコマンドであることを示すＩＤ（コマンドコード）であり、ライトコマンドにはライトコマンド用のコマンドＩＤが含まれる。
ブロックアドレスは、データが書き込まれるべき書き込み先ブロックを指定する物理アドレスである。
【０１８０】
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、ＬＢＡのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよい。タグがＬＢＡのような論理アドレスである場合には、このライトコマンドに含まれる論理アドレス（開始ＬＢＡ）は、ライトデータが書き込まれるべき、論理アドレス空間内の論理位置（最初の論理位置）を示す。
【０１８１】
長さは、書き込まれるべきライトデータの長さを示す。
ライトコマンドは、さらに、ライトデータが格納されているライトデータバッファ５１内の位置を示すデータポインタを含む。
ホスト２からライトコマンドを受信した時、コントローラ４は、ライトコマンドによって指定されたブロックアドレスを有する書き込み先ブロック内の書き込み先位置（書き込み先ページ）を決定する。この書き込み先ページは、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ４は、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置（書き込み先ページ）に書き込む。
【０１８２】
図２３は、図２２のライトコマンドに対するレスポンスを示す。
このレスポンスは、ページアドレス、長さを含む。ページアドレスは、データが書き込まれた、書き込み先ブロック内の物理記憶位置を示す物理アドレスである。この物理アドレスは、ブロック内オフセット（つまりページアドレスとページ内オフセットとの組）によって表されてもよい。長さは、書き込まれたデータの長さを示す。
【０１８３】
あるいは、このレスポンスは、ページアドレス（ブロック内オフセット）および長さだけでなく、タグ、ブロックアドレスをさらに含んでいてもよい。タグは、図２２のライトコマンドに含まれていたタグである。ブロックアドレスは、図２２のライトコマンドに含まれていたブロックアドレスである。
【０１８４】
図２４は、タイプ＃２−ストレージデバイスとして実現されたフラッシュストレージデバイス３に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス３にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドＩＤ、タグ、ブロックアドレス、ページアドレス、長さを含む。
【０１８５】
コマンドＩＤはこのコマンドがリードコマンドであることを示すＩＤ（コマンドコード）であり、リードコマンドにはリードコマンド用のコマンドＩＤが含まれる。
ブロックアドレスは、リードすべきデータが格納されているブロックを指定する。ページアドレスは、リードすべきデータが格納されているページを指定する。このページアドレスは、リードすべきデータが格納されているブロック内の物理記憶位置を示すブロック内オフセット（つまりページアドレスとページ内オフセットとの組）によって表されてもよい。長さは、リードすべきデータの長さを示す。
【０１８６】
さらに、リードコマンドは、リードコマンドによって指定されたデータが転送されるべきリードデータバッファ５３内の位置を示すデータポインタを含む。
以上説明したように、本実施形態によれば、コントローラ４は、同じ書き込み先ブロックを示す第１の識別子を有する一つ以上のライトコマンドを受信した後、受信されたライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータ（複数のデータ部）に分割、または受信されたライトコマンド内の２以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じサイズを有するライトデータを、ホスト２から取得する。そして、コントローラ４は、同じデータを一回または複数回転送することを伴う第１の書き込み動作によって、この取得したライトテータを、第１の識別子によって指定される書き込み先ブロックに書き込む。
【０１８７】
したがって、個々のライトコマンドによって指定されるライトデータのサイズとは関係なく、ＮＡＮＤ型フラッシュメモリ５のデータ書き込み単位と同じデータサイズの単位でホスト２からライトデータを取得でき、このライトデータをＮＡＮＤ型フラッシュメモリ５に転送することができる。よって、たとえある書き込み先ブロックへの大きなサイズのライトデータの書き込みを要求するライトコマンドが受信されても、これによって他の書き込み先ブロックへのデータ書き込み動作が滞ることを防ぐことができる。よって、複数の書き込み先ブロックの任意の一つをそれぞれ指定する複数のライトコマンドそれぞれを効率よく処理することが可能となり、大容量の内部バッファ３１をデバイス側に設けずとも、あるいは内部バッファ３１の容量がほぼゼロに近いバッファレスの構成であっても、複数の書き込み先ブロックを同時に利用することが可能となる。
【０１８８】
つまり、このようにホストメモリ（ライトデータバッファ５１）をデバイス側で流用することにより、大容量の内部バッファ３１をデバイス側に設けることなく、書き込み先ブロックの増加つまりフラッシュストレージデバイス３を共有するクライアントの数の増加に柔軟に対応できるようになり、フラッシュストレージデバイス３の限られたリソースで、同時に利用可能な書き込み先ブロックの数を上限を最大化することができる。
【０１８９】
また、コントローラ４は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送する書き込み動作）の全てが終了した場合、またはある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作（ＮＡＮＤ型フラッシュメモリ５に同じデータを１回または複数回転送することを伴う書き込み動作）の全てが終了し且つこのライトデータ全体がＮＡＮＤ型フラッシュメモリ５から読み出し可能になった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト２に返す。
【０１９０】
これにより、ホスト２は、コマンド完了が通知されたライトコマンドに対応するライトデータをライトデータバッファ５１から破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータが読み出し可能になるまでこのライトデータをライトデータバッファ５１内に維持することができる。
【０１９１】
また、コントローラ４は、ファイン書き込み動作のような第２段階の書き込み動作を実行すべき時点において、ライトすべきデータが内部バッファ３１に存在しない場合にのみ、このライトデータをホスト２のライトデータバッファ５１から内部バッファ３１に再度転送する。したがって、データ書き込みの度に、同じデータをライトデータバッファ５１から内部バッファ３１に複数回転送する必要が無くなる。このように、ホスト２のライトデータバッファ５１をデバイス側で流用することにより、複数段階の書き込み動作のために大容量の内部バッファ３１をデバイス側に設けることなく、書き込み先ブロックの増加つまりフラッシュストレージデバイス３を共有するクライアントの数の増加に柔軟に対応でき、且つホスト２とフラッシュストレージデバイス３との間のデータトラフィックを削減することができる。
【０１９２】
また、本実施形態では、各ライトコマンドによって指定されたサイズのライトデータそのものをホスト２からフラッシュストレージデバイス３に転送し且つこのライトデータの転送が終了した時点でコマンド完了のレスポンスをホスト２に返すのではなく、フラッシュの書き込み単位と同じサイズの単位でホスト２からフラッシュストレージデバイス３にライトデータを転送し且つライトコマンド毎にコマンド完了のレスポンスをホスト２に返す構成であるので、ＮＶＭｅのような標準規格を利用しつつ、書き込み先ブロックの増加つまりフラッシュストレージデバイス３を共有するクライアントの数の増加に柔軟に対応できる。
【０１９３】
なお、ライトデータバッファ５１はホスト２上で実行される各仮想マシンからアクセスできる領域として実現することができる。また、ホスト２とフラッシュストレージデバイス３とがＥｔｈｅｒｎｅｔのようなネットワークを介して接続されるケースにおいては、ライトデータバッファ５１と内部バッファ３１との間のＤＭＡ転送は、リモートＤＭＡ転送によって実行されてもよい。
【０１９４】
また、本実施形態では、不揮発性メモリとしてＮＡＮＤ型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＰＲＡＭ（Ｐｈａｓｅ  ｃｈａｎｇｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲｅＲＡＭ（Ｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、又は、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）のような他の様々な不揮発性メモリにも適用できる。
【０１９５】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１９６】
２…ホスト、３…フラッシュストレージデバイス、４…コントローラ、５…ＮＡＮＤ型フラッシュメモリ、２１…ライト制御部、２２…リード制御部、３１…内部バッファ、５１…ライトデータバッファ、５３…リードデータバッファ。
【図１】
2019191909.tif 000003
【図２】
2019191909.tif 000004
【図３】
2019191909.tif 000005
【図４】
2019191909.tif 000006
【図５】
2019191909.tif 000007
【図６】
2019191909.tif 000008
【図７】
2019191909.tif 000009
【図８】
2019191909.tif 000010
【図９】
2019191909.tif 000011
【図１０】
2019191909.tif 000012
【図１１】
2019191909.tif 000013
【図１２】
2019191909.tif 000014
【図１３】
2019191909.tif 000015
【図１４】
2019191909.tif 000016
【図１５】
2019191909.tif 000017
【図１６】
2019191909.tif 000018
【図１７】
2019191909.tif 000019
【図１８】
2019191909.tif 000020
【図１９】
2019191909.tif 000021
【図２０】
2019191909.tif 000022
【図２１】
2019191909.tif 000023
【図２２】
2019191909.tif 000024
【図２３】
2019191909.tif 000025
【図２４】
2019191909.tif 000026