(57)【要約】【課題】ホスト側の負担を軽減できるメモリシステムを実現する。【解決手段】メモリシステムは、ホストのライトバッファからライトデータを取得し、ライトデータを複数のブロックから選択された書き込み先ブロックの書き込み先位置に書き込む書き込み動作を実行する。メモリシステムは、書き込み動作が終了してライトデータが読み出し可能となる前に、ライトデータを読み出し対象データとして指定する第１のリードコマンドがホストから受信された場合、読み出し対象データをホストのライトバッファから読み出す動作と読み出した読み出し対象データをホストに返す動作とを含む読み出し動作を実行する。メモリシステムは、第１のリードコマンドの実行が完了するまで、ライトデータが格納されているライトバッファ内の領域の解放を禁止する。【選択図】図３
2020123040.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 >
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、ストレージデバイス内の不揮発性メモリを制御するためのホスト側の負担が増加されると、これによって十分なＩ／Ｏ性能が得られなくなる場合がある。このため、ホスト側の負担を軽減できるようにするための新たな技術の実現が要求される。
本発明が解決しようとする課題は、ホスト側の負担を軽減することができるメモリシステムおよび制御方法を提供することである。
【課題を解決するための手段】
【０００６】
実施形態によれば、ホストに接続可能なメモリシステムは、複数のブロックを含む不揮発性メモリと、前記不揮発性メモリに電気的に接続され、前記不揮発性メモリを制御するように構成されたコントローラとを具備する。前記コントローラは、ライトデータが格納されている前記ホストのライトバッファ内の記憶位置を示す記憶位置情報を指定するライトコマンドを前記ホストから受信する。前記コントローラは、前記記憶位置情報に基づいて前記ライトデータを前記ホストのライトバッファから取得する。前記コントローラは、前記ライトデータを前記複数のブロックから選択された書き込み先ブロックの書き込み先位置に書き込む書き込み動作を実行する。前記コントローラは、前記書き込み動作が終了して前記ライトデータが前記不揮発性メモリから読み出し可能となる前に、前記ライトデータを読み出し対象データとして指定する第１のリードコマンドが前記ホストから受信された場合、前記読み出し対象データを前記ライトバッファから読み出す動作と前記読み出した前記読み出し対象データを前記ホストに返す動作とを含む読み出し動作を実行する。前記コントローラは、前記第１のリードコマンドの実行が完了するまで、前記ライトデータが格納されている前記ライトバッファ内の領域の解放を禁止する。
【図面の簡単な説明】
【０００７】
【図１】ホストと実施形態に係るメモリシステムとの関係を示すブロック図。
【図２】同実施形態のメモリシステムとホストとの間の役割分担を説明するための図。
【図３】同実施形態のメモリシステムの構成例を示すブロック図。
【図４】同実施形態のメモリシステムに設けられた、ＮＡＮＤインタフェースと複数のＮＡＮＤ型フラッシュメモリチップとの関係を示すブロック図。
【図５】複数の物理ブロックの集合によって構築される一つのブロック（スーパーブロック）の構成例を示す図。
【図６】同実施形態のメモリシステムに適用されるライトコマンドを説明するための図。
【図７】同実施形態のメモリシステムからホストに送られるアドレス記録要求を説明するための図。
【図８】同実施形態のメモリシステムに適用されるリードコマンドを説明するための図。
【図９】同実施形態のメモリシステムに適用されるＱｏＳドメインクリエートコマンドを説明するための図。
【図１０】同実施形態のメモリシステムからホストに送られるライトバッファ解放要求を説明するための図。
【図１１】アドレス記録要求およびリードコマンドの各々に含まれる物理アドレスを規定するブロックアドレスおよびオフセットを説明するための図。
【図１２】スーパーブロックが使用される場合におけるブロックアドレスとオフセットとの関係を説明するための図。
【図１３】同実施形態のメモリシステムによって管理される複数のＱｏＳドメインを説明するための図。
【図１４】ホストと同実施形態のメモリシステムとによって実行されるデータ書き込み処理を説明するためのブロック図。
【図１５】同実施形態のメモリシステムによって実行される、複数回の書き込みステップを含む書き込み動作を説明するための図。
【図１６】ホストと同実施形態のメモリシステムとによって実行されるデータ読み出し処理を説明するためのブロック図。
【図１７】リードコマンドによって指定されたデータの書き込み動作が終了していない場合に、このデータをホストのライトバッファから読み出すデータ読み出し処理を説明するためのブロック図。
【図１８】同実施形態のメモリシステムによって管理される、複数のＱｏＳドメインと共通フラッシュブロックプールとの関係を示すブロック図。
【図１９】同実施形態のメモリシステムによって管理されるコマンド数カウンタを説明するためのブロック図。
【図２０】同実施形態のメモリシステムによって実行されるコマンド数カウンタ更新処理の手順を示すフローチャート。
【図２１】同実施形態のメモリシステムによって実行されるデータ読み出し動作の手順を示すフローチャート。
【図２２】同実施形態のメモリシステムによって実行されるデータ書き込み動作とライトバッファ解放処理の手順を示すフローチャート。
【図２３】リードコマンドによって指定されたデータがフラッシュメモリおよびホストのライトバッファの双方から読み出し可能である場合に実行されるデータ読み出し動作の手順を示すフローチャート。
【図２４】リードコマンドによって指定されたデータがフラッシュメモリおよびホストのライトバッファの双方から読み出し可能である場合に実行されるデータ読み出し動作の別の手順を示すフローチャート。
【発明を実施するための形態】
【０００８】
以下、図面を参照して、実施形態を説明する。  
まず、図１を参照して、本実施形態に係るメモリシステムとホストとの関係を説明する。
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、ＮＡＮＤフラッシュ技術ベースのフラッシュストレージデバイス３として実現されている。
【０００９】
ホスト（ホストデバイス）２は、複数のフラッシュストレージデバイス３を制御するように構成されている。ホスト２は、複数のフラッシュストレージデバイス３によって構成されるフラッシュアレイをストレージとして使用するように構成された情報処理装置によって実現される。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【００１０】
なお、フラッシュストレージデバイス３は、ストレージアレイ内に設けられる複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージ（例えば複数のフラッシュストレージデバイス３）を制御するコントローラを含む。フラッシュストレージデバイス３がストレージアレイに適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス３のホストとして機能してもよい。
【００１１】
以下では、サーバコンピュータのような情報処理装置がホスト２として機能する場合を例示して説明する。
ホスト（サーバ）２と複数のフラッシュストレージデバイス３は、インタフェース５０を介して相互接続される（内部相互接続）。この相互接続のためのインタフェース５０としては、これに限定されないが、ＰＣＩ  Ｅｘｐｒｅｓｓ（ＰＣＩｅ）（登録商標）、ＮＶＭ  Ｅｘｐｒｅｓｓ（ＮＶＭｅ）（登録商標）、Ｅｔｈｅｒｎｅｔ（登録商標）、ＮＶＭｅ  ｏｖｅｒ  Ｆａｂｒｉｃｓ（ＮＶＭｅＯＦ）等を使用し得る。
【００１２】
ホスト２として機能するサーバコンピュータの典型例としては、データセンター内のサーバコンピュータ（以下、サーバと称する）が挙げられる。
ホスト２がデータセンター内のサーバによって実現されるケースにおいては、このホスト（サーバ）２は、ネットワーク６０を介して複数のエンドユーザ端末（クライアント）６１に接続されてもよい。ホスト２は、これらエンドユーザ端末６１に対して様々なサービスを提供することができる。
【００１３】
ホスト（サーバ）２によって提供可能なサービスの例には、（１）システム稼働プラットフォームを各クライアント（各エンドユーザ端末６１）に提供するプラットホーム・アズ・ア・サービス（ＰａａＳ）、（２）仮想サーバのようなインフラストラクチャを各クライアント（各エンドユーザ端末６１）に提供するインフラストラクチャ・アズ・ア・サービス（ＩａａＳ）、等がある。
【００１４】
複数の仮想マシンが、このホスト（サーバ）２として機能する物理サーバ上で実行されてもよい。ホスト（サーバ）２上で走るこれら仮想マシンの各々は、この仮想マシンに対応するクライアント（エンドユーザ端末６１）に各種サービスを提供するように構成された仮想サーバとして機能することができる。各仮想マシンにおいては、この仮想マシンに対応するエンドユーザ端末６１によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。
【００１５】
ホスト（サーバ）２においては、フラッシュトランスレーションレイヤ（ホストＦＴＬ）も実行される。このホストＦＴＬは、アクセス対象のデータを識別するためのデータ識別子（タグ）それぞれとフラッシュストレージデバイス３内の不揮発性メモリの物理アドレスそれぞれとの間のマッピングを管理するアドレス変換テーブルであるルックアップテーブル（ＬＵＴ）を含む。ホストＦＴＬは、このＬＵＴを使用することによって、フラッシュストレージデバイス３内の不揮発性メモリ上のデータ配置を知ることができる。
【００１６】
フラッシュストレージデバイス３は、ＮＡＮＤ型フラッシュメモリのような不揮発性メモリを含む。不揮発性メモリは、各々が複数のページを含む複数のブロックを含む。これらブロックの各々はデータを消去する単位であり、複数のページの各々はデータの書き込みおよび読み出しの単位である。
【００１７】
フラッシュストレージデバイス３は、ローレベルアブストラクションを実行することができる。ローレベルアブストラクションは不揮発性メモリのアブストラクションのための機能である。ローレベルアブストラクションは、データ配置を補助する機能等を含む。データ配置を補助する機能の例は、ホスト２からのユーザデータが書き込まれるべき書き込み先ブロックを割り当てる機能、ユーザデータの書き込み先位置（書き込み先ブロック、この書き込み先ブロック内の位置）を決定する機能、ユーザデータが書き込まれたこの書き込み先位置（ブロックアドレス、オフセット）を上位階層（ホスト２）に通知する機能、等を含んでいてもよい。
【００１８】
フラッシュストレージデバイス３は、ホスト２から受信される様々なコマンドを実行する。これらコマンドには、フラッシュストレージデバイス３内の不揮発性メモリにデータを書き込むためのライトコマンド、不揮発性メモリからデータを読み出すためのリードコマンドが含まれる。本実施形態においては、各リードコマンドは、読み出すべきデータが格納されている記憶位置を示す物理アドレスを指定する。この物理アドレスは、読み出し対象のブロックのブロックアドレスと、この読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセット（ブロック内オフセット）とによって表される。
【００１９】
フラッシュストレージデバイス３は、読み出し対象のブロックのブロックアドレスとこの読み出し対象のブロック内の読み出し対象の記憶位置を示すオフセットとを指定するリードコマンドそれぞれをホスト２から受信し、受信された各リードコマンドに応じてデータ読み出し動作を実行する。
【００２０】
図２はフラッシュストレージデバイス３とホスト２との間の役割分担を示す。
ホスト（サーバ）２においては、複数のエンドユーザにそれぞれ対応する複数の仮想マシン４０１が実行される。各仮想マシン４０１においては、対応するエンドユーザによって使用される、オペレーティングシステムおよびユーザアプリケーション４０２が実行される。
【００２１】
また、ホスト（サーバ）２においては、複数のユーザアプリケーション４０２にそれぞれ対応する複数のＩ／Ｏサービス４０３が実行される。これらＩ／Ｏサービス４０３には、論理ブロックアドレス（ＬＢＡ）ベースのブロックＩ／Ｏサービス、キー・バリュー・ストアサービスなどが含まれてもよい。各Ｉ／Ｏサービス４０３は、タグそれぞれとフラッシュストレージデバイス３の物理アドレスそれぞれとの間のマッピングを管理するルックアップテーブル（ＬＵＴ）を含む。
【００２２】
ここで、タグとは、アクセス対象のデータを識別可能な識別子を意味する。このタグの典型的な例は、これに限定されないが、ＬＢＡのような論理アドレスである。あるいは、キー・バリュー・ストアのキー、またはこのキーのハッシュ値、等がタグとして利用されてもよい。
【００２３】
フラッシュストレージデバイス３の物理アドレスは、フラッシュストレージデバイス３に含まれる不揮発性メモリ内の記憶位置（物理記憶位置）を特定するためのアドレスである。
ＬＢＡベースのブロックＩ／Ｏサービスにおいては、論理アドレス（ＬＢＡ）それぞれとフラッシュストレージデバイス３の物理アドレスそれぞれとの間のマッピングを管理するＬＵＴが使用されてもよい。
【００２４】
一方、キー・バリュー・ストアサービスにおいては、キー（またはキーのハッシュ値）それぞれとこれらキーに対応するデータが格納されているフラッシュストレージデバイス３の物理アドレスそれぞれとこれらキーに対応するデータそれぞれのデータ長との間のマッピングを管理するＬＵＴが使用されてもよい。
【００２５】
各エンドユーザは、使用すべきアドレッシング方法（ＬＢＡ、キー・バリュー・ストアのキー、このキーのハッシュ値、等）を選択することができる。
ホスト（サーバ）２においては、複数の仮想マシン４０１にそれぞれ対応する複数のライトバッファ（ＷＢ）４０４が管理されていてもよい。あるユーザアプリケーション４０２からのライトデータは、このユーザアプリケーション４０２に対応する仮想マシン４０１用のライトバッファ（ＷＢ）４０４に一時的に格納されてもよい。
【００２６】
ホスト（サーバ）２からフラッシュストレージデバイス３へのコマンドの送信およびフラッシュストレージデバイス３からホスト（サーバ）２へのコマンド完了のレスポンス等の返送は、ホスト（サーバ）２およびフラッシュストレージデバイス３の各々に存在するＩ／Ｏキュー５００を介して実行される。
【００２７】
フラッシュストレージデバイス３は、フラッシュストレージデバイス３内の不揮発性メモリを論理的に分割することによって得られる複数の領域それぞれをＱｏＳドメイン６０１として管理する。これらＱｏＳドメイン６０１の各々は、不揮発性メモリに含まれる複数のブロックの部分集合である。不揮発性メモリに含まれる複数のブロックの各々は一つのＱｏＳドメイン６０１のみに属し、同じブロックが異なるＱｏＳドメイン６０１に同時に属することはない。
【００２８】
これらＱｏＳドメイン６０１は、ＱｏＳドメインＩＤと称される識別子によってそれぞれ識別される。これらＱｏＳドメインＩＤは、これら複数の領域（複数のＱｏＳドメイン）をそれぞれアクセスするための複数の識別子として使用される。
本実施形態においては、各ライトコマンドは、書き込まれるべきデータ（ライトデータ）が格納されているホスト２のライトバッファ（ＷＢ）４０４内の記憶位置を示す記憶位置情報を指定する。また、各ライトコマンドは、データ（ライトデータ）が書き込まれるべき領域（ＱｏＳドメイン）の識別子（ＱｏＳドメインＩＤ）を指定することができる。あるＱｏＳドメインＩＤを指定するライトコマンドをホスト２から受信した場合、フラッシュストレージデバイス３は、複数のＱｏＳドメイン６０１によって共有される共通ブロック群６０２のうちの一つのブロックを選択し、この選択したブロックを、このＱｏＳドメインＩＤを有するＱｏＳドメイン用の書き込み先ブロックとして割り当てる。
【００２９】
ここで、書き込み先ブロックとは、データが書き込まれるべきブロックを意味する。共通ブロック群６０２は、複数のＱｏＳドメイン６０１によって共有されるフリーブロックの集合を含む共通フリーブロック群である。
フリーブロックとは、新たな書き込み先ブロックとして再使用（再割り当て）可能な状態（フリー状態）のブロックを意味する。フリーブロックの典型的な例は、有効データを格納していないブロックである。有効データとは、ＬＢＡのようなタグに関連付けられている最新のデータを意味する。つまり、ホスト２のＬＵＴから最新のデータとしてリンクされているデータは有効データである。また、無効データとは、ＬＢＡのようタグに関連付けられていないデータを意味する。ホスト２のＬＵＴからリンクされていないデータは無効データである。例えば、あるＬＢＡに対応する更新データがフラッシュストレージデバイス３に書き込まれた場合には、このＬＢＡに対応する以前のデータは無効データとなる。
【００３０】
そして、フラッシュストレージデバイス３は、受信されたライトコマンドに関連付けられたデータをホスト２のライトバッファ（ＷＢ）４０４から取得し、このデータをＱｏＳドメイン用に割り当てられた書き込み先ブロックに書き込む。なお、利用可能な書き込み先ブロックが既にこのＱｏＳドメイン用に割り当てられているならば、共通ブロック群６０２のうちの一つのブロック（フリーブロック）をこのＱｏＳドメイン用の書き込み先ブロックとして割り当てるという上述の動作を行う必要は無い。フラッシュストレージデバイス３は、受信されたライトコマンドに関連付けられたデータを、既に割り当てられているこの書き込み先ブロック内の次の利用可能ページに書き込む。
【００３１】
受信されたライトコマンドに関連付けられたデータが書き込み先ブロックに書き込まれると、フラッシュストレージデバイス３は、このデータのタグと、このデータが書き込まれた不揮発性メモリ内の記憶位置を示す物理アドレス（ブロックアドレス、オフセット）とをホスト２にアドレス記録要求として送出する。ブロックアドレスは、この書き込み先ブロックを識別するための識別子である。通常、不揮発性メモリは複数の不揮発性メモリチップによって構成されるので、あるブロックのブロックアドレスは、不揮発性メモリチップのチップ番号と、このチップ内のブロック番号とによって表されてもよい。オフセットは、この書き込み先ブロック内の記憶位置を示す。
【００３２】
このアドレス記録要求に応じて、ホスト２は、このデータのタグにこの物理アドレス（ブロックアドレス、オフセット）が関連付けられるようにＬＵＴを更新することができる。
各ＱｏＳドメインに含まれるブロックの各々について、ホスト２は、各ブロックに格納されているデータが有効データまたは無効データのいずれであるかを、ＬＵＴを使用して管理することができる。また、ホスト２は、既にデータが書き込まれている一つのブロックを新たな書き込み先ブロックとして再使用可能な状態（フリーブロック）に遷移させるためのコマンド（リユースコマンド）をフラッシュストレージデバイス３に送信することができる。
【００３３】
図３は、フラッシュストレージデバイス３の構成例を示す。
フラッシュストレージデバイス３は、コントローラ４および不揮発性メモリ（ＮＡＮＤ型フラッシュメモリ）５を備える。フラッシュストレージデバイス３は、ランダムアクセスメモリ、例えば、ＤＲＡＭ６も備えていてもよい。
【００３４】
ＮＡＮＤ型フラッシュメモリ５は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。ＮＡＮＤ型フラッシュメモリ５は、２次元構造のフラッシュメモリであってもよいし、３次元構造のフラッシュメモリであってもよい。
ＮＡＮＤ型フラッシュメモリ５のメモリセルアレイは、複数のブロックＢＬＫ０〜ＢＬＫｍ−１を含む。ブロックＢＬＫ０〜ＢＬＫｍ−１の各々は複数のページ（ここではページＰ０〜Ｐｎ−１）を含む。ブロックＢＬＫ０〜ＢＬＫｍ−１は、消去単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページＰ０〜Ｐｎ−１は、データ書き込み動作およびデータ読み込み動作の単位である。
【００３５】
コントローラ４は、ＴｏｇｇｌｅＮＡＮＤフラッシュインタフェース、オープンＮＡＮＤフラッシュインタフェース（ＯＮＦＩ）のような、ＮＡＮＤインタフェース１３を介して、不揮発性メモリであるＮＡＮＤ型フラッシュメモリ５に電気的に接続されている。コントローラ４は、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたメモリコントローラとして動作する。このコントローラ４は、Ｓｙｓｔｅｍ−ｏｎ−ａ−ｃｈｉｐ（ＳｏＣ）のような回路によって実現されてもよい。
【００３６】
ＮＡＮＤ型フラッシュメモリ５は、図４に示すように、複数のＮＡＮＤ型フラッシュメモリチップ（ＮＡＮＤ型フラッシュメモリダイ）を含んでいてもよい。個々のＮＡＮＤ型フラッシュメモリチップは独立して動作可能である。このため、ＮＡＮＤ型フラッシュメモリチップは、並列動作可能な単位として機能する。図４においては、ＮＡＮＤインタフェース１３に１６個のチャンネルＣｈ．１〜Ｃｈ．１６が接続されており、１６個のチャンネルＣｈ．１〜Ｃｈ．１６の各々に２つのＮＡＮＤ型フラッシュメモリチップが接続されている場合が例示されている。この場合、チャンネルＣｈ．１〜Ｃｈ．１６に接続された１６個のＮＡＮＤ型フラッシュメモリチップ＃１〜＃１６がバンク＃０として編成されてもよく、またチャンネルＣｈ．１〜Ｃｈ．１６に接続された残りの１６個のＮＡＮＤ型フラッシュメモリチップ＃１７〜＃３２がバンク＃１として編成されてもよい。バンクは、複数のメモリモジュールをバンクインタリーブによって並列動作させるための単位として機能する。図４の構成例においては、１６個のチャンネルと、２つのバンクを使用したバンクインタリーブとによって、最大３２個のＮＡＮＤ型フラッシュメモリチップを並列動作させることができる。
【００３７】
消去動作は、一つのブロック（物理ブロック）の単位で実行されてもよいし、並列動作可能な複数の物理ブロックの集合を含むブロックグループ（スーパーブロック）の単位で実行されてもよい。一つのブロックグループ（一つのスーパーブロック）は、これに限定されないが、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２から一つずつ選択される計３２個の物理ブロックを含んでいてもよい。なお、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２の各々はマルチプレーン構成を有していてもよい。例えば、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２の各々が、２つのプレーンを含むマルチプレーン構成を有する場合には、一つのスーパーブロックは、ＮＡＮＤ型フラッシュメモリチップ＃１〜＃３２に対応する６４個のプレーンから一つずつ選択される計６４個の物理ブロックを含んでいてもよい。
【００３８】
図５には、３２個の物理ブロック（ここでは、ＮＡＮＤ型フラッシュメモリチップ＃１内の物理ブロックＢＬＫ２、ＮＡＮＤ型フラッシュメモリチップ＃２内の物理ブロックＢＬＫ３、ＮＡＮＤ型フラッシュメモリチップ＃３内の物理ブロックＢＬＫ７、ＮＡＮＤ型フラッシュメモリチップ＃４内の物理ブロックＢＬＫ４、ＮＡＮＤ型フラッシュメモリチップ＃５内の物理ブロックＢＬＫ６、…、ＮＡＮＤ型フラッシュメモリチップ＃３２内の物理ブロックＢＬＫ３）を含む一つのスーパーブロック（ＳＢ）が例示されている。
【００３９】
書き込み先ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。なお、一つのスーパーブロックが一つの物理ブロックのみを含む構成が利用されてもよく、この場合には、一つのスーパーブロックは一つの物理ブロックと等価である。
【００４０】
次に、図３のコントローラ４の構成について説明する。
コントローラ４は、ホストインタフェース１１、ＣＰＵ１２、ＮＡＮＤインタフェース１３、およびＤＲＡＭインタフェース１４、直接メモリアクセスコントローラ（ＤＭＡＣ）１５、ＥＣＣエンコード／デコード部１６等を含む。これらホストインタフェース１１、ＣＰＵ１２、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、ＤＭＡＣ１５、ＥＣＣエンコード／デコード部１６は、バス１０を介して相互接続される。
【００４１】
このホストインタフェース１１は、ホスト２との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース１１は、例えば、ＰＣＩｅコントローラ（ＮＶＭｅコントローラ）であってもよい。あるいは、フラッシュストレージデバイス３がＥｔｈｅｒｎｅｔ（登録商標）を介してホスト２に接続される構成においては、ホストインタフェース１１は、ＮＶＭｅ  ｏｖｅｒ  Ｆａｂｒｉｃｓ（ＮＶＭｅＯＦ）コントローラであってもよい。
【００４２】
ホストインタフェース１１は、ホスト２から様々なコマンドを受信する。これらコマンドには、ライトコマンド、リードコマンド、コピーコマンド、イレーズコマンド、リユースコマンド、ＱｏＳドメインクリエートコマンド、他の様々なコマンドが含まれる。
【００４３】
ＣＰＵ１２は、ホストインタフェース１１、ＮＡＮＤインタフェース１３、ＤＲＡＭインタフェース１４、ＤＭＡＣ１５、ＥＣＣエンコード／デコード部１６を制御するように構成されたプロセッサである。ＣＰＵ１２は、フラッシュストレージデバイス３の電源オンに応答してＮＡＮＤ型フラッシュメモリ５または図示しないＲＯＭから制御プログラム（ファームウェア）をＤＲＡＭ６にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはコントローラ４内の図示しないＳＲＡＭ上にロードされてもよい。このＣＰＵ１２は、ホスト２からの様々なコマンドを実行するためのコマンド処理等を実行することができる。ＣＰＵ１２の動作は、ＣＰＵ１２によって実行される上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ４内の専用ハードウェアによって実行してもよい。
【００４４】
ＣＰＵ１２は、ライト制御部２１、リード制御部２２、コピー制御部２３、およびライトバッファ解放制御部２４として機能することができる。なお、これらライト制御部２１、リード制御部２２、コピー制御部２３、およびライトバッファ解放制御部２４の各々一部または全部も、コントローラ４内の専用ハードウェアによって実現されてもよい。
【００４５】
ライト制御部２１は、ライトデータが格納されているホスト２のライトバッファ内の記憶位置を示す記憶位置情報を指定するライトコマンドをホスト２から受信する。ライト制御部２１は、記憶位置情報に基づいてライトデータをホスト２のライトバッファから取得する。ライト制御部２１は、このライトデータを、ＮＡＮＤ型フラッシュメモリ５の複数のブロックから選択された書き込み先ブロックの書き込み先位置に書き込む書き込み動作を実行する。
【００４６】
本実施形態では、ライトデータが書き込まれるべき記憶位置を示す物理アドレスを指定するタイプのライトコマンドが使用されてもよいし、ＱｏＳドメインＩＤとタグとを指定し物理アドレスを指定しないタイプのライトコマンドが使用されてもよい。
ホスト２が書き込み先ブロックおよびこの書き込み先ブロック内の書き込み先位置の双方を決定するという構成が利用されるケースにおいては、ライトデータが書き込まれるべき記憶位置を示す物理アドレスを指定するタイプのライトコマンドが使用される。
【００４７】
一方、フラッシュストレージデバイス３が書き込み先ブロックおよびこの書き込み先ブロック内の書き込み先位置の双方を決定するという構成が利用されるケースにおいては、ＱｏＳドメインＩＤとタグとを指定し物理アドレスを指定しないタイプのライトコマンドが使用される。
【００４８】
以下では、ＱｏＳドメインＩＤとタグとを指定し物理アドレスを指定しないタイプのライトコマンドが使用されるケースを想定する。
ライト制御部２１は、ライトバッファ内の記憶位置情報とＱｏＳドメインＩＤとタグとを指定するライトコマンドをホスト２から受信する。タグは、書き込むべきデータ（ユーザデータ）を識別可能な識別子であり、例えば、ＬＢＡであってもよいし、あるいはキー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。ライトコマンドを受信した場合、ライト制御部２１は、共通ブロック群６０２のうちの一つのブロックを選択し、選択したブロックを、ライトコマンドによって指定されたＱｏＳドメインＩＤに対応するＱｏＳドメイン用の書き込み先ブロックとして割り当てる。このＱｏＳドメイン用の書き込み先ブロックとして割り当てられるブロックは、物理ブロックであってもよいし、スーパーブロックであってもよい。
【００４９】
この場合、ライト制御部２１は、共通ブロック群６０２から、最小プログラム／イレーズサイクルカウントを有するブロック（物理ブロックまたはスーパーブロック）を選択してもよい。これにより、ＱｏＳドメイン間でウェアレベリングを実行することができる。利用可能な書き込み先ブロックが既にこのＱｏＳドメイン用に割り当てられているならば、共通ブロック群６０２のうちの一つのブロックをこのＱｏＳドメイン用の書き込み先ブロックとして割り当てる動作は実行されない。
【００５０】
ライト制御部２１は、ページ書き込み順序の制約、およびこの書き込み先ブロック内の不良ページ等を考慮して、データが書き込まれるべき、この書き込み先ブロック内の位置（書き込み先位置）を決定する。次いで、ライト制御部２１は、記憶位置情報に基づいてホスト２のライトバッファからデータ（ライトデータ）を取得し、このライトデータを、この書き込み先ブロックの書き込み先位置に書き込む。この場合、ライト制御部２１は、ホスト２からのライトデータのみならず、このライトデータとこのライトデータのタグの双方を書き込み先ブロックに書き込むことができる。
【００５１】
あるＱｏＳドメイン用の書き込み先ブロック全体がデータで満たされると、ライト制御部２１は、共通ブロック群６０２のうちの一つのブロックをこのＱｏＳドメイン用の新たな書き込み先ブロックとして割り当てる。例えば、あるライトコマンドに関連付けられたライトデータの一部分の書き込みによって現在の書き込み先ブロック全体がデータで満たされると、ライト制御部２１は、共通ブロック群６０２のうちの一つのブロックをこのＱｏＳドメイン用の新たな書き込み先ブロックとして割り当て、このライトコマンドに関連付けられたライトデータの残り部分をこの新たな書き込み先ブロックに書き込む。
【００５２】
ライトデータが書き込み先ブロックに書き込まれると、ライト制御部２１は、このデータが書き込まれたＮＡＮＤ型フラッシュメモリ５内の記憶位置を示す物理アドレス（ブロックアドレス、オフセット）をホスト２にアドレス記録要求として送出する。
一つの物理ブロックが書き込み先ブロックとして割り当てられたケースにおいては、ブロックアドレスは、この物理ブロックを識別するためのブロックアドレスである。このブロックアドレスはチップ番号とこのチップ内のブロック番号とによって表されてもよい。
【００５３】
一つのスーパーブロックが書き込み先ブロックとして割り当てられたケースにおいては、ブロックアドレスは、このスーパーブロックを識別するためのブロックアドレス（スーパーブロックアドレスとも云う）である。フラッシュストレージデバイス３内の全てのスーパーブロックに異なるスーパーブロックアドレスが付与されていてもよい。
【００５４】
オフセットは、書き込み先ブロックの先頭から書き込み先位置までのオフセット、つまり書き込み先ブロックの先頭に対する書き込み先位置のオフセットを示す。書き込み先ブロックの先頭から書き込み先位置までのオフセットのサイズは、あるサイズを有する粒度の倍数で表されてもよい。あるいは、オフセットは、一つのページのページアドレスと、このページ内のオフセットとによって表されてもよい。
【００５５】
リード制御部２２は、ホスト２から受信されるリードコマンドに応じて、このリードコマンドによって読み出し対象データとして指定されたデータをＮＡＮＤ型フラッシュメモリ５から読み出し、そしてこの読み出したデータをホスト２に転送する。
ホスト２が書き込み先ブロックおよびこの書き込み先ブロック内の書き込み先位置の双方を決定するという構成が利用されるケース、またはフラッシュストレージデバイス３が書き込み先ブロックおよびこの書き込み先ブロック内の書き込み先位置の双方を決定するという構成が利用されるケースのいずれにおいても、物理アドレス（すなわち、ブロックアドレスおよびオフセット）を指定するリードコマンドを使用することができる。
【００５６】
物理アドレス（すなわち、ブロックアドレスおよびオフセット）を指定するリードコマンドをホスト２から受信した場合、リード制御部２２は、これらブロックアドレスおよびオフセットに基づいてＮＡＮＤ型フラッシュメモリ５からデータをリードする。リード対象のブロックは、ブロックアドレスによって特定される。このブロック内のリード対象の記憶位置は、オフセットによって特定される。リードコマンドは、さらに、リード対象のＱｏＳドメインのＱｏＳドメインＩＤを含んでいてもよい。
【００５７】
本実施形態では、あるライトデータの書き込み動作が終了してこのライトデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能となる前に、このライトデータ（このライトデータの一部分または全て）を読み出し対象データとして指定するリードコマンドがホスト２から受信された場合、リード制御部２２は、このライトデータ（このライトデータの一部分または全て）をホスト２のライトバッファから読み出す動作と読み出したライトデータ（このライトデータの一部分または全て）をホスト２に返す動作とを含む読み出し動作を実行する。このように、リードコマンドによって読み出し対象データとして指定されたデータの書き込み動作が終了しておらず、このデータをＮＡＮＤ型フラッシュメモリ５から読み出す事ができない場合には、リード制御部２２は、リードエラーをホスト２に返すのでは無く、ホスト２のライトバッファからこのデータを読み出してこのデータをホスト２に返す。
【００５８】
現代のＮＡＮＤ型フラッシュメモリの多くにおいては、プログラムディスターブを低減するための複雑な書き込み動作が実行される場合が多い。このため、現代のＮＡＮＤ型フラッシュメモリの多くにおいては、たとえブロック内のあるページにデータが書き込まれても、このページに書き込まれたデータは、その書き込み直後には読み出すことができず、このページに後続する１以上のページへのデータ書き込み後に、このページからのデータの読み出しが可能となるケースがある。
【００５９】
ＮＡＮＤ型フラッシュメモリにおいては、セルの微細化が進んでおり、セルへのデータ書き込みによって隣接するセルの閾値レベルが変動するというプログラムディスターブが起こり得る。このため、ＮＡＮＤ型フラッシュメモリメモリにおいては、プログラムディスターブによる影響を考慮して、あるページ内の各セルへのデータの書き込みによって、その直前の一つ以上のページ内の各セルの閾値レベルを補正するといったプログラム動作が実行される場合がある。補正が完了する前のページからデータをリードすると、本来のデータとは異なる誤ったデータがリードされてしまう。補正を完了するタイミングは使用されるＮＡＮＤ型フラッシュメモリのタイプによって異なる。
【００６０】
また、現代のＮＡＮＤ型フラッシュメモリにおいては、データ書き込み動作が、同じライトデータをＮＡＮＤ型フラッシュメモリに複数回転送することを含む複数回の書き込みステップによって実行されるケースもある。複数回の書き込みステップを含むデータ書き込み動作の例の一つとしては、フォギー・ファイン書き込み動作が挙げられる。
【００６１】
複数回の書き込みステップを含むデータ書き込み動作は、少なくとも、フォギー書き込み動作のような第１段階の書き込み動作とファイン書き込み動作のような第２段階の書き込み動作とを含む。フォギー書き込み動作は各メモリセルの閾値分布を荒く設定する書き込み動作であり、ファイン書き込み動作は各メモリセルの閾値分布を調整する書き込み動作である。さらに、フォギー書き込み動作とファイン書き込み動作との間に、中間の書き込み動作が実行されてもよい。
【００６２】
また、現代のＮＡＮＤ型フラッシュメモリにおいては、データ書き込み動作は、隣接する幾つかのワード線を往復しながら実行される。例えば、２つのワード線を往復するフォギー・ファイン書き込み動作では、（１）１番目のワード線に接続されたメモリセル群に対するフォギー書き込み動作、（２）２番目のワード線に接続されたメモリセル群に対するフォギー書き込み動作、（３）１番目のワード線に接続されたメモリセル群に対するファイン書き込み動作、（４）３番目のワード線に接続されたメモリセル群に対するフォギー書き込み動作、（５）２番目のワード線に接続されたメモリセル群に対するファイン書き込み動作、…、というプログラム順序が適用される。
【００６３】
したがって、現代のＮＡＮＤ型フラッシュメモリにおいては、あるデータを書き込むための書き込み動作の開始から終了までに多くの時間が必要される。
本実施形態では、ライトデータの書き込み動作が終了（例えばフォギー書き込み動作とファイン書き込み動作の双方が終了）してこのライトデータが読み出し可能となる前に、このライトデータを読み出し対象データとして指定するリードコマンドがホスト２から受信された場合には、リード制御部２２は、ホスト２のライトバッファからこの読み出し対象データを読み出し、この読み出したデータをホスト２に返す。したがって、ホスト２は、リードすべきデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能であるか否かをチェックする処理およびライトバッファに向けたリード要求とフラッシュストレージデバイス３に向けたリードコマンドを選択的に発行する処理を行わずとも、フラッシュストレージデバイス３に向けたリードコマンドそれぞれを発行するというシンプルな処理を行うだけで、所望のデータをフラッシュストレージデバイス３から受け取ることができる。
【００６４】
コピー制御部２３は、ホスト２から受信されるコピーコマンドに応じて、あるＱｏＳドメイン用に割り当てられているあるブロック内に格納されているデータを、このＱｏＳドメイン用のまたは別のＱｏＳドメイン用のブロック（コピー先ブロック）にコピーする。コピー先ブロックは、不揮発性メモリ内に既に書き込まれているデータが書き込まれるべき（コピーされるべき）書き込み先ブロックである。このコピーコマンドは、コピー元ＱｏＳドメインのＱｏＳドメインＩＤと、コピー元ブロックのブロックアドレスと、コピー先ＱｏＳドメインのＱｏＳドメインＩＤとを指定してもよい。コピー元ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。
【００６５】
また、ホスト２は、所定の管理サイズ（例えば４ＫＢ）単位でコピー元ブロック内の各データが有効データまたは無効データのいずれであるかを示す管理データ（マップデータ）をフラッシュストレージデバイス３に送信することができる。このマップデータはコピーコマンドに含まれていてもよいし、コピーコマンドとは別にホスト２からフラッシュストレージデバイス３に送信されてもよい。コピー制御部２３は、ホスト２から受信されるマップデータおよびコピーコマンドに応じて、コピー元ブロック内に格納されている有効データそれぞれを、このＱｏＳドメイン用のまたは別のＱｏＳドメイン用のブロック（コピー先ブロック）にコピーすることができる。
【００６６】
コピー元ブロックからコピー先ブロックへのデータ（有効データ）それぞれのコピーが完了すると、コピー制御部２３は、コピーされたデータ毎にこのデータのタグとこのデータのコピー先物理アドレス（ブロックアドレス、オフセット）とをホスト２に通知する。
【００６７】
ライトバッファ解放制御部２４は、ＮＡＮＤ型フラッシュメモリ５から読み出し可能となっていないライトデータを読み出し対象データとして指定するリードコマンドが存在する場合には、このリードコマンドの実行が完了するまで、このライトデータが格納されているライトバッファ内の領域の解放を禁止する。そして、このリードコマンドの実行が完了した後に、ライトバッファ解放制御部２４は、ライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信する。
【００６８】
つまり、ライトバッファ解放制御部２４は、あるライトデータの書き込み動作が終了してこのライトデータが読み出し可能となった場合、リードコマンドによって読み出し対象データとして指定されたこのライトデータをライトバッファから読み出してホスト２に返す読み出し動作が実行中であるか否かを判定する。この読み出し動作が実行中である場合、ライトバッファ解放制御部２４は、この読み出し動作が終了するまでライトバッファ解放要求をホスト２に送信せず、この読み出し動作が終了した後、ライトバッファ解放要求をホスト２に送信する。よって、ライトバッファから読み出すべきことが決定されたデータまたはライトバッファから読み出し中のデータなどがライトバッファから消失されてしまうという、ライトバッファ解放要求とリードコマンドとの衝突（解放要求／リードコマンド衝突）を回避することができる。
【００６９】
ＮＡＮＤインタフェース１３は、ＣＰＵ１２の制御の下、ＮＡＮＤ型フラッシュメモリ５を制御するように構成されたメモリ制御回路である。
ＤＲＡＭインタフェース１４は、ＣＰＵ１２の制御の下、ＤＲＡＭ６を制御するように構成されたＤＲＡＭ制御回路である。ＤＲＡＭ６の記憶領域は、ブロック管理テーブル３２を格納するために使用される。また、ＤＲＡＭ６の記憶領域は、ライトデータ等を一時的に格納するための内部バッファとしても利用され得る。なお、内部バッファがフラッシュストレージデバイス３内に存在しない、または内部バッファの容量がほぼゼロに近い、というバッファレス構成がフラッシュストレージデバイス３に適用されてもよい。
【００７０】
ブロック管理テーブル３２は、ＮＡＮＤ型フラッシュメモリ５内の複数のブロックそれぞれに対応する複数の管理テーブルを含む。各管理テーブルは、この管理テーブルに対応するブロックを管理するための管理情報（メタデータ）を格納するために使用される。メタデータは、これに限定されないが、書き換え回数（プログラム／イレーズサイクルの数）、オープン／クローズ状態、書き込み先ページ範囲、等を含んでいてもよい。オープン／クローズ状態は、このブロックがオープン状態またはクローズ状態のいずれであるかを示す。オープン状態は、このブロックが書き込み先ブロックとして使用中の状態を示す。書き込み先ブロックには、ホスト２からのデータが書き込まれるホスト書き込み用の書き込み先ブロックと、不揮発性メモリ内に既に書き込まれているデータのコピー用の書き込み先ブロックとがある。データコピー用の書き込み先ブロックはコピー先ブロックと称される。
【００７１】
クローズ状態は、ブロックがデータで満たされてアクティブブロックとして管理されている状態を示す。書き込み先ページ範囲は、どのページからどのページまでが現在書き込み（プログラム）動作中であるかを示す。
ＤＭＡＣ１５は、ＣＰＵ１２の制御の下、ホスト２内のメモリ（ライトバッファ）とＤＲＡＭ６（内部バッファ）との間のデータ転送を実行する。ホスト２のライトバッファから内部バッファにライトデータを転送すべき場合には、ＣＰＵ１２は、ライトバッファ上の位置を示す転送元アドレス、データサイズ、内部バッファ上の位置を示す転送先アドレスをＤＭＡＣ１５に対して指定する。
【００７２】
ＥＣＣエンコード／デコード部１６は、ＮＡＮＤ型フラッシュメモリ５にデータをライトすべき時、書き込むべきライトデータをエンコード（ＥＣＣエンコード）することによってこのデータにエラー訂正コード（ＥＣＣ）を付加する。ＮＡＮＤ型フラッシュメモリ５からデータがリードされた時、ＥＣＣエンコード／デコード部１６は、リードされたデータに付加されているＥＣＣを使用して、このデータのエラー訂正を行う（ＥＣＣデコード）。
【００７３】
図６は、フラッシュストレージデバイス３に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス３にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドＩＤ、ＱｏＳドメインＩＤ、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
【００７４】
コマンドＩＤはこのコマンド（このライトコマンド）の固有の識別子である。ＱｏＳドメインＩＤは、データが書き込まれるべきＱｏＳドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト２から送信されるライトコマンドは、このエンドユーザに対応するＱｏＳドメインを指定するＱｏＳドメインＩＤを含む。
【００７５】
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、ＬＢＡのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
長さは、書き込まれるべきライトデータの長さを示す。この長さ（データ長）は、上述の粒度（Ｇｒａｉｎとしても参照される）の数によって指定されてもよいし、ＬＢＡの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
【００７６】
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ（ホスト２のライトバッファ）内の記憶位置を示す記憶位置情報である。ライトバッファアドレスは、データポインタとしても参照される。
コントローラ４は、ホスト２から受信されるＱｏＳドメインクリエートコマンドに基づいて、ＱｏＳドメインクリエートコマンドによって指定された容量を有するＱｏＳドメインを作成することができる。この場合、コントローラ４は、図２の共通ブロック群６０２のうちの、指定された容量に対応する個数のブロックを、このＱｏＳドメイン用に確保（予約）してもよい。ホスト２がＱｏＳドメインクリエートコマンドを送信する度に、新たなＱｏＳドメインが作成される。
【００７７】
コントローラ４は、共通ブロック群６０２に加え、各ＱｏＳドメインに対応するアクティブブロックリスト（アクティブブロックプール）も管理することができる。
各ブロックの状態は、有効データを格納しているアクティブブロック（クローズ状態のブロック）と、有効データを格納しておらず書き込み先ブロックとして再使用可能なフリーブロックとに大別される。あるＱｏＳドメインにおいては、アクティブブロックである各ブロックは、このＱｏＳドメインに対応するアクティブブロックリストによって管理される。一方、各ＱｏＳドメインの各フリーブロックは、共通ブロック群６０２によって管理される。
【００７８】
あるＱｏＳドメインＩＤを指定するライトコマンドをホスト２から受信した時、コントローラ４は、共通ブロック群６０２内の一つのブロック（フリーブロック）を選択し、選択されたブロックを、このＱｏＳドメインに書き込み先ブロックとして割り当てる。さらに、コントローラ４は、この書き込み先ブロック内の位置（書き込み先位置）を決定する。書き込み先ブロック内の書き込み先位置は、ページ書き込み順序の制約および不良ページ等を考慮して決定される。そして、コントローラ４は、ホスト２からのデータを、書き込み先ブロック内の書き込み先位置に書き込む。
【００７９】
この書き込み先ブロック全体がユーザデータで満たされたならば、コントローラ４は、この書き込み先ブロックをこのＱｏＳドメインのアクティブブロックリスト（アクティブブロックプール）に移動する。そして、コントローラ４は、共通ブロック群６０２内の一つのブロック（フリーブロック）を再び選択し、選択されたブロックをこのＱｏＳドメインに新たな書き込み先ブロックとして割り当てる。
【００８０】
あるＱｏＳドメインに割り当て可能なブロックの数の上限は、このＱｏＳドメインの容量に対応するブロックの個数までに制限される。共通ブロック群６０２から一つのブロックがこのＱｏＳドメインに割り当てられると、コントローラ４は、このＱｏＳドメインに割り当て可能なブロックの現在の個数を１だけ減らす。このＱｏＳドメインの一つのブロックを指定する上述のリユースコマンドまたはイレーズコマンドによってこのブロックが共通ブロック群６０２に返却されると、コントローラ４は、このＱｏＳドメインに割り当て可能なブロックの現在の個数を１だけ増やす。
【００８１】
図７は、フラッシュストレージデバイス３からホスト２に送られるアドレス記録要求を示す。
アドレス記録要求は、ライトコマンドに関連付けられたライトデータが書き込まれたＮＡＮＤ型フラッシュメモリ５内の記憶位置（物理記憶位置）を示す物理アドレスをホスト２に通知するために使用される。このアドレス記録要求は、ＱｏＳドメインＩＤ、タグ、物理アドレス、長さを含んでもよい。
【００８２】
ＱｏＳドメインＩＤは、ライトデータが書き込まれたＱｏＳドメインを識別する識別子である。タグは、図６のライトコマンドに含まれていたタグである。物理アドレスは、ライトコマンドに関連付けられたライトデータが書き込まれた物理記憶位置を示す。物理アドレスは、ブロックアドレスとオフセットとによって表される。長さは、書き込まれたライトデータの長さを示す。
【００８３】
フラッシュストレージデバイス３から受信されるアドレス記録要求に基づいて、ホスト２は、ライトデータが書き込まれた記憶位置を示す物理アドレス（ブロックアドレス、オフセット）がこのライトデータのタグ（例えばＬＢＡ）に関連付けられるように、このＱｏＳドメインに対応するＬＵＴを更新することができる。また、ホスト２は、各ＱｏＳドメインに対応するＬＵＴの内容に基づいて、各ＱｏＳドメインで使用されているブロック毎に有効／無効管理情報を管理することができる。あるブロックに対応する有効／無効管理情報は、このブロックに格納されている複数のデータそれぞれが有効データであるか無効データであるかを示す。
【００８４】
図８は、フラッシュストレージデバイス３に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス３にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドＩＤ、ＱｏＳドメインＩＤ、物理アドレス、長さ、リードバッファアドレスを含んでもよい。
【００８５】
コマンドＩＤはこのコマンド（このリードコマンド）の固有の識別子である。ＱｏＳドメインＩＤは、読み出されるべきデータが格納されているＱｏＳドメインを識別する識別子である。物理アドレスは、読み出されるべきデータが格納されている物理記憶位置を示す。物理アドレスは、ブロックアドレスとオフセットとによって表される。このブロックアドレスは、読み出し対象のブロックのブロックアドレスである。オフセットは、読み出し対象のブロック内の読み出し対象の記憶位置を示す。長さは、読み出されるべきデータの長さを示す。リードバッファアドレスは、読み出されたデータが転送されるべきホストメモリ（ホスト２のリードバッファ）内の位置を示す。
【００８６】
図９は、ＱｏＳドメインクリエートコマンドを示す。
ＱｏＳドメインクリエートコマンドは、ＱｏＳドメインを作成するためのコマンドである。このＱｏＳドメインクリエートコマンドは、コマンドＩＤ、ＱｏＳドメインＩＤ、容量を含んでもよい。
コマンドＩＤはこのコマンド（このＱｏＳドメインクリエートコマンド）の固有の識別子である。ＱｏＳドメインＩＤは、作成すべきＱｏＳドメインの識別子である。容量は、作成すべきＱｏＳドメイン用に確保すべき容量を示す。コントローラ４は、この容量に対応する個数のブロックを共通ブロック群６０２から確保し、このＱｏＳドメインＩＤを指定するライトコマンドに応じて、この確保されたブロックのうちの一つのブロックをこのＱｏＳドメイン用の書き込み先ブロックとして割り当てる。
【００８７】
図１０は、フラッシュストレージデバイス３からホスト２に送られるライトバッファ解放要求を示す。
ライトバッファ解放要求は、ＮＡＮＤ型フラッシュメモリ５への書き込みが終了することによってＮＡＮＤ型フラッシュメモリ５から読み出し可能になったデータが格納されているライトバッファ内の領域を解放するために使用される。ライトバッファ解放要求は、ライトコマンドＩＤを含んでいてもよい。ライトコマンドＩＤは、解放可能なライトデータに対応するライトコマンドの識別子である。例えば、あるライトコマンドに関連付けられたライトデータの書き込みが終了した場合、フラッシュストレージデバイス３のコントローラ４は、このライトコマンドの識別子（コマンドＩＤ）を含むライトバッファ解放要求をホスト２に送信してもよい。あるいは、ライトバッファ解放要求は、ライトバッファ内の解放可能領域を示す記憶位置情報を含んでいてもよい。
【００８８】
図１１は、物理アドレスを規定するブロックアドレスおよびオフセットを示す。
ブロックアドレスはある一つのブロックＢＬＫを指定する。各ブロックＢＬＫは、図１１に示されているように、複数のページ（ここでは、ページ０〜ページｎ）を含む。
ページサイズ（各ページのユーザデータ格納領域）が１６Ｋバイトであり、粒度（Ｇｒａｉｎ）が４ＫＢのサイズであるケースにおいては、このブロックＢＬＫは、４×（ｎ＋１）個の領域に論理的に分割される。
【００８９】
オフセット＋０はページ０の最初の４ＫＢ領域を示し、オフセット＋１はページ０の２番目の４ＫＢ領域を示し、オフセット＋２はページ０の３番目の４ＫＢ領域を示し、オフセット＋３はページ０の４番目の４ＫＢ領域を示す。
オフセット＋４はページ１の最初の４ＫＢ領域を示し、オフセット＋５はページ１の２番目の４ＫＢ領域を示し、オフセット＋６はページ１の３番目の４ＫＢ領域を示し、オフセット＋７はページ１の４番目の４ＫＢ領域を示す。
【００９０】
図１２は、スーパーブロックが使用されるケースにおけるブロックアドレスとオフセットとの関係を示す。
ここでは、図示を簡単化するために、ある一つのスーパーブロックＳＢ＃１が４つのブロックＢＬＫ＃１１、ＢＬＫ＃２１、ＢＬＫ＃３１、ＢＬＫ＃４１から構成されている場合が想定されている。スーパーブロックＳＢ＃１のブロックアドレス（スーパーブロックアドレス）はＳＢ＃１である。４つのブロックＢＬＫ＃１１、ＢＬＫ＃２１、ＢＬＫ＃３１、ＢＬＫ＃４１は、異なる４個のＮＡＮＤ型フラッシュメモリチップからそれぞれ選択されたブロックであってもよい。
【００９１】
コントローラ４は、ブロックＢＬＫ＃１１のページ０、ブロックＢＬＫ＃２１のページ０、ブロックＢＬＫ＃３１のページ０、ブロックＢＬＫ＃４１のページ０、ブロックＢＬＫ＃１１のページ１、ブロックＢＬＫ＃２１のページ１、ブロックＢＬＫ＃３１のページ１、ブロックＢＬＫ＃４１のページ１、…という順序でデータを書き込む。
【００９２】
オフセット＋０はブロックＢＬＫ＃１１のページ０の最初の４ＫＢ領域を示し、オフセット＋１はブロックＢＬＫ＃１１のページ０の２番目の４ＫＢ領域を示し、オフセット＋２はブロックＢＬＫ＃１１のページ０の３番目の４ＫＢ領域を示し、オフセット＋３はブロックＢＬＫ＃１１のページ０の４番目の４ＫＢ領域を示す。
【００９３】
オフセット＋４はブロックＢＬＫ＃２１のページ０の最初の４ＫＢ領域を示し、オフセット＋５はブロックＢＬＫ＃２１のページ０の２番目の４ＫＢ領域を示し、オフセット＋６はブロックＢＬＫ＃２１のページ０の３番目の４ＫＢ領域を示し、オフセット＋７はブロックＢＬＫ＃２１のページ０の４番目の４ＫＢ領域を示す。
【００９４】
同様に、オフセット＋１２はブロックＢＬＫ＃４１のページ０の最初の４ＫＢ領域を示し、オフセット＋１３はブロックＢＬＫ＃４１のページ０の２番目の４ＫＢ領域を示し、オフセット＋１４はブロックＢＬＫ＃４１のページ０の３番目の４ＫＢ領域を示し、オフセット＋１５はブロックＢＬＫ＃４１のページ０の４番目の４ＫＢ領域を示す。
【００９５】
オフセット＋１６はブロックＢＬＫ＃１１のページ１の最初の４ＫＢ領域を示し、オフセット＋１７はブロックＢＬＫ＃１１のページ１の２番目の４ＫＢ領域を示し、オフセット＋１８はブロックＢＬＫ＃１１のページ１の３番目の４ＫＢ領域を示し、オフセット＋１９はブロックＢＬＫ＃１１のページ１の４番目の４ＫＢ領域を示す。
【００９６】
オフセット＋２０はブロックＢＬＫ＃２１のページ１の最初の４ＫＢ領域を示し、オフセット＋２１はブロックＢＬＫ＃２１のページ１の２番目の４ＫＢ領域を示し、オフセット＋２２はブロックＢＬＫ＃２１のページ１の３番目の４ＫＢ領域を示し、オフセット＋２３はブロックＢＬＫ＃２１のページ１の４番目の４ＫＢ領域を示す。
【００９７】
同様に、オフセット＋２８はブロックＢＬＫ＃４１のページ１の最初の４ＫＢ領域を示し、オフセット＋２９はブロックＢＬＫ＃４１のページ１の２番目の４ＫＢ領域を示し、オフセット＋３０はブロックＢＬＫ＃４１のページ１の３番目の４ＫＢ領域を示し、オフセット＋３１はブロックＢＬＫ＃４１のページ１の４番目の４ＫＢ領域を示す。
【００９８】
例えば、あるＬＢＡ（ＬＢＡｘ）を指定するライトコマンドに対応する４Ｋバイトデータをオフセット＋８に対応する位置に書き込む場合には、コントローラ４は、タグ（＝ＬＢＡｘ）、ブロック番号（＝ＳＢ＃１）、オフセット（＝＋８）、長さ（＝１）をこのライトコマンドに対するアドレス記録要求としてホスト２に返してもよい。
【００９９】
図１３は、フラッシュストレージデバイス３によって管理される複数のＱｏＳドメインを示す。
図１３では、ＱｏＳドメイン＃０、ＱｏＳドメイン＃１、ＱｏＳドメイン＃２、…、ＱｏＳドメイン＃ｎ−１が既に作成されている場合が明示されている。図１３では、これらＱｏＳドメインは四角によって表されている。あるＱｏＳドメインを表す四角の縦幅は、このＱｏＳドメインの容量を表している。
【０１００】
ユーザアプリケーション＃０は、ＱｏＳドメイン＃０のＱｏＳドメインＩＤ＃０を含むリード／ライトコマンドを使用して、ＱｏＳドメイン＃０をリード／ライトアクセスすることができる。同様に、ユーザアプリケーション＃ｎ−１は、ＱｏＳドメイン＃ｎ−１のＱｏＳドメインＩＤ＃ｎ−１を含むリード／ライトコマンドを使用して、ＱｏＳドメイン＃ｎ−１をリード／ライトアクセスすることができる。
【０１０１】
図１４は、ホスト２とフラッシュストレージデバイス３とによって実行されるデータ書き込み処理を示す。
（１）ホスト２においては、ホストＦＴＬ７０１が実行される。このホストＦＴＬ７０１は、ＬＢＡのようなタグとフラッシュストレージデバイス３の物理アドレスそれぞれとの間のマッピングをＬＵＴを使用して管理する。あるユーザアプリケーションからのライト要求に応じて、ホストＦＴＬ７０１は、このユーザアプリケーションに対応するＱｏＳドメインのＱｏＳドメインＩＤを指定するライトコマンドをフラッシュストレージデバイス３に送信する。ホストＦＴＬ７０１は、ＱｏＳドメインＩＤのみを指定すればよく、データが書き込まれるべきブロックおよびデータが書き込まれるべきページを指定する必要は無い。このため、ホストＦＴＬ７０１は、フラッシュストレージデバイス３内の不良ブロック、不良ページなどを管理する必要がなくなる。
【０１０２】
（２）フラッシュストレージデバイス３のコントローラ４は、複数のＱｏＳドメイン６０１によって共有される共通ブロック群（フリーブロック群）６０２のうちの一つのブロックを選択する。コントローラ４は、この選択したブロックを、受信されたライトコマンドによって指定されたＱｏＳドメインＩＤを有するＱｏＳドメイン用の書き込み先ブロックとして割り当てる。共通ブロック群（フリーブロック群）６０２においては、不良ブロック以外のフリーブロック群のみが管理されていてもよい。例えば、最小プログラム／イレーズサイクル数を有するブロックが共通ブロック群６０２から選択されてもよい。そして、コントローラ４は、この書き込み先ブロックをデータが書き込まれるべきブロックとして決定し、さらに、データが書き込まれるべき、この書き込み先ブロック内の書き込み先位置を決定する。なお、上述したように、既にこのＱｏＳドメイン用の書き込み先ブロックが割り当てられているならば、コントローラ４は、この既に割り当てられている書き込み先ブロックをデータが書き込まれるべきブロックとして決定すればよく、共通ブロック群６０２から一つのブロックをこのＱｏＳドメイン用の書き込み先ブロックとして割り当てる動作を実行する必要は無い。
【０１０３】
（３）コントローラ４は、決定された書き込み先ブロックを示すブロックアドレスと決定した書き込み先位置を示すオフセットとを含む物理アドレス記録要求をホスト２に送信して、このライトコマンドに関連付けられたライトデータが書き込まれる物理アドレスをホスト２に通知する。
【０１０４】
（４）コントローラ４は、ライトコマンドに含まれるライトバッファアドレスに基づいて、ホスト２のライトバッファ７０２からライトデータを取得する。ライトバッファ７０２からのライトデータの取得はＤＭＡ転送を使用して実行されてもよい。そして、コントローラ４は、ライトデータを書き込み先ブロック内の書き込み先位置に書き込むデータ書き込み動作を実行する。
【０１０５】
（５）ライトデータの書き込みが終了してこのライトデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能になった後、コントローラ４は、このライトデータが格納されているライトバッファ７０２内の領域を解放するための解放要求をホスト２に送出する。この解放要求は、上述したように、書き込みが完了したライトデータに対応するライトコマンドの識別子を含んでいてもよい。あるいは、この解放要求は、このライトデータの格納位置を示すライトバッファアドレス、このライトデータの長さを含んでいてもよい。ホスト２は、この解放要求に応じて、このライトデータが格納されているライトバッファ７０２内の領域を解放する。このライトバッファ７０２内の解放された領域は他のライトデータの格納等のために利用可能となる。
【０１０６】
図１５は、同じライトデータをＮＡＮＤ型フラッシュメモリ５に複数回転送することを含む複数回の書き込みステップによって実行されるデータ書き込み動作を示す。
ここでは、４つのワード線を往復する場合のフォギー・ファイン書き込み動作を例示する。また、ここでは、ＮＡＮＤ型フラッシュメモリ５が、メモリセル当たりに４ビットのデータを格納するＱＬＣ−フラッシュである場合を想定する。ＮＡＮＤ型フラッシュメモリ５内の一つの特定の書き込み先ブロック（ここでは、書き込み先ブロックＢＬＫ＃１）に対するフォギー・ファイン書き込み動作は以下のように実行される。
【０１０７】
（１）まず、４ページ（Ｐ０〜Ｐ３）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ０に接続された複数のメモリセルに、これら４ページ（Ｐ０〜Ｐ３）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１０８】
（２）次いで、次の４ページ（Ｐ４〜Ｐ７）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ１に接続された複数のメモリセルに、これら４ページ（Ｐ４〜Ｐ７）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１０９】
（３）次いで、次の４ページ（Ｐ８〜Ｐ１１）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ２に接続された複数のメモリセルに、これら４ページ（Ｐ８〜Ｐ１１）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１１０】
（４）次いで、次の４ページ（Ｐ１２〜Ｐ１５）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ３に接続された複数のメモリセルに、これら４ページ（Ｐ１２〜Ｐ１５）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１１１】
（５）ワード線ＷＬ３に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ０に戻り、ワード線ＷＬ０に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ０に対するフォギー書き込み動作で使用された４ページ（Ｐ０〜Ｐ３）分のライトデータと同じ４ページ（Ｐ０〜Ｐ３）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ０に接続された複数のメモリセルに、これら４ページ（Ｐ０〜Ｐ３）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ０〜Ｐ３に対するフォギー・ファイン書き込み動作が終了する。この結果、これら４ページ（Ｐ０〜Ｐ３）分のデータの読み出しが可能となる。
【０１１２】
（６）次いで、次の４ページ（Ｐ１６〜Ｐ１９）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ４に接続された複数のメモリセルに、これら４ページ（Ｐ１６〜Ｐ１９）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１１３】
（７）ワード線ＷＬ４に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ１に戻り、ワード線ＷＬ１に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ１に対するフォギー書き込み動作で使用された４ページ（Ｐ４〜Ｐ７）分のライトデータと同じ４ページ（Ｐ４〜Ｐ７）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ１に接続された複数のメモリセルに、これら４ページ（Ｐ４〜Ｐ７）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ４〜Ｐ７に対するフォギー・ファイン書き込み動作が終了する。この結果、４ページ（Ｐ４〜Ｐ７）分のデータの読み出しが可能となる。
【０１１４】
（８）次いで、次の４ページ（Ｐ２０〜Ｐ２３）分のライトデータがこのＮＡＮＤ型フラッシュメモリ５にページ単位で転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ５に接続された複数のメモリセルに、これら４ページ（Ｐ２０〜Ｐ２３）分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【０１１５】
（９）ワード線ＷＬ５に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線ＷＬ２に戻り、ワード線ＷＬ２に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線ＷＬ２に対するフォギー書き込み動作で使用された４ページ（Ｐ８〜Ｐ１１）分のライトデータと同じ４ページ（Ｐ８〜Ｐ１１）分のライトデータがページ単位でＮＡＮＤ型フラッシュメモリ５に再び転送され、この書き込み先ブロックＢＬＫ＃１内のワード線ＷＬ２に接続された複数のメモリセルに、これら４ページ（Ｐ８〜Ｐ１１）分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページＰ８〜Ｐ１１に対するフォギー・ファイン書き込み動作が終了する。この結果、４ページ（Ｐ８〜Ｐ１１）分のデータの読み出しが可能となる。
【０１１６】
図１６は、ホスト２とフラッシュストレージデバイス３とによって実行されるデータ読み出し処理を示す。
（１）ホストＦＴＬ７０１があるユーザアプリケーションからのリード要求を受信した場合、ホストＦＴＬ７０１は、ホストＦＴＬ７０１内のＬＵＴを参照して、このリード要求によって指定されるＬＢＡのようなタグに対応する物理アドレスを取得する。ホストＦＴＬ７０１は、このユーザアプリケーションに対応するＱｏＳドメインのＱｏＳドメインＩＤと、取得した物理アドレス（ブロックアドレスとオフセット）と、長さと、リードバッファアドレスとを指定するリードコマンドを、フラッシュストレージデバイス３に送信する。
【０１１７】
（２）コントローラ４がこのリードコマンドを受信した場合、コントローラ４は、このリードコマンドによって指定されるブロックアドレスとオフセットに基づいて、ＮＡＮＤ型フラッシュメモリ５からデータを読み出す。そして、コントローラ４は、この読み出したデータを、ＤＭＡ転送を使用して、リードバッファアドレスによって指定されるホスト２のリードバッファ７０３内の位置に転送する。
【０１１８】
図１７は、リードコマンドによって指定されたデータの書き込み動作が終了していない場合に、このデータをホスト２のライトバッファから読み出すデータ読み出し処理を示す。
（１）ホストＦＴＬ７０１があるユーザアプリケーションからのリード要求を受信した場合、ホストＦＴＬ７０１は、ホストＦＴＬ７０１内のＬＵＴを参照して、このリード要求によって指定されるＬＢＡのようなタグに対応する物理アドレスを取得する。ホストＦＴＬ７０１は、このユーザアプリケーションに対応するＱｏＳドメインのＱｏＳドメインＩＤと、取得した物理アドレス（ブロックアドレスとオフセット）と、長さと、リードバッファアドレスとを指定するリードコマンドを、フラッシュストレージデバイス３に送信する。
【０１１９】
（２）コントローラ４がこのリードコマンドを受信した場合、コントローラ４は、このリードコマンドによって指定されるブロックアドレスとオフセットと長さとに基づいて、リードコマンドによって指定された読み出し対象データの書き込み動作が終了しているか否かを判定する。指定されるブロックアドレスを有するブロックがクローズ状態のブロックであるならば、リードコマンドによって指定された読み出し対象データの書き込み動作が終了していると判定される。
【０１２０】
一方、指定されるブロックアドレスを有するブロックがオープン状態のブロックであるならば、このブロックの現在の書き込み先ページ範囲に基づいて、読み出し対象データの書き込み動作が終了しているか否かが判定される。読み出し対象データが格納されているこのブロック内の位置が現在の書き込み先ページ範囲よりも先行するページに属しているならば、読み出し対象データの書き込み動作が終了していると判定される。読み出し対象データが格納されているこのブロック内の位置が現在の書き込み先ページ範囲内のいずれかのページに属しているならば、読み出し対象データの書き込み動作が終了していないと判定される。
【０１２１】
読み出し対象データの書き込み動作が終了しておらずこの読み出し対象データをＮＡＮＤ型フラッシュメモリ５から読み出すことができない場合、コントローラ４は、ＤＭＡ転送を使用して、読み出し対象データをホスト２のライトバッファから読み出す。各オープン状態のブロック（書き込み先ブロック）に書き込まれるライトデータ部それぞれに対応するライトバッファ内の位置は、書き込み先ブロック毎に用意されたライトバッファアドレスリストを使用して管理されてもよい。ある書き込み先ブロックに対応するライトバッファアドレスリストにおいては、この書き込み先ブロックに書き込むべきことが決定されたライトデータ毎に、このライトデータが格納されているライトバッファアドレスとこのライトデータに対応する書き込み先位置を示すオフセットとが記録されてもよい。コントローラ４は、リードコマンド内のブロックアドレスを有する書き込み先ブロックに対応するライトバッファアドレスリストを参照することによって、読み出し対象データが格納されているライトバッファアドレスを特定してもよい。
【０１２２】
（３）コントローラ４は、ライトバッファから読み出したデータを、ＤＭＡ転送を使用して、リードバッファアドレスによって指定されるホスト２のリードバッファ７０３内の位置に転送する。
図１８は、フラッシュストレージデバイス３のコントローラ４によって管理される、複数のＱｏＳドメインと共通フラッシュブロックプールとの関係を示す。
【０１２３】
図１８においては、図示の簡単化のために、ＱｏＳドメイン＃０とＱｏＳドメイン＃ｎ−１の２つのＱｏＳドメインのみが例示されている。共通フラッシュブロックプール８０１は、複数のＱｏＳドメインによって共有される上述の共通ブロック群６０２を管理するためのリストである。
【０１２４】
ＱｏＳドメイン＃０のフラッシュブロックプール＃０は、ＱｏＳドメイン＃０に属するアクティブブロックそれぞれを管理するための上述のアクティブブロックリストである。
コントローラ４がＱｏＳドメイン＃０のＱｏＳドメインＩＤ＃０を指定するライトコマンドを受信した場合、コントローラ４は、ＱｏＳドメイン＃０用の書き込み先ブロック（オープンブロック）が割り当て済みであるか否かを判定する。
【０１２５】
書き込み先ブロック（オープンブロック）が割り当て済みでないならば、コントローラ４は、共通フラッシュブロックプール８０１の内のフリーブロックをＱｏＳドメイン＃０用の書き込み先ブロック（オープンブロック）として割り当てる。そして、コントローラ４は、この書き込み先ブロック内の書き込み先位置を決定し、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置に書き込む。
【０１２６】
一方、書き込み先ブロック（オープンブロック）が既に割り当て済みならば、コントローラ４は、この書き込み先ブロック内の書き込み先位置を決定し、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置に書き込む。
【０１２７】
この書き込み先ブロック全体がホストからのデータで満たされると、コントローラ４は、この書き込み先ブロックをフラッシュブロックプール＃０によって管理するとともに（クローズ）、共通フラッシュブロックプール８０１の内のフリーブロックをＱｏＳドメイン＃０用の新たな書き込み先ブロック（オープンブロック）として割り当てる。
【０１２８】
コントローラ４がＱｏＳドメインＩＤ＃０を示すコピー元ＱｏＳドメインと、コピー元ブロックのブロックアドレスと、ＱｏＳドメインＩＤ＃０を示すコピー先ＱｏＳドメインとを指定するコピーコマンドを受信した場合、コントローラ４は、ＱｏＳドメイン＃０用のコピー先ブロック（オープンブロック）が割り当て済みであるか否かを判定する。
【０１２９】
コピー先ブロック（オープンブロック）が割り当て済みでないならば、コントローラ４は、共通フラッシュブロックプール８０１の内のフリーブロックをＱｏＳドメイン＃０用のコピー先ブロック（オープンブロック）として割り当てる。そして、コントローラ４は、コピー元ブロックのブロックアドレスに基づいて、フラッシュブロックプール＃０内のブロックをコピー元ブロックとして選択し、この選択したコピー元ブロック内のデータをコピー先ブロックにコピーする。上述のマップデータがホスト２から受信されている場合には、このマップデータに基づき、コントローラ４は、選択したコピー元ブロック内の有効データそれぞれをコピー先ブロックにコピーする。
【０１３０】
一方、コピー先ブロックが既に割り当て済みならば、コントローラ４は、選択したコピー元ブロック内のデータをこのコピー先ブロックにコピーする。
コピー先ブロック全体がホストからのデータで満たされると、コントローラ４は、このコピー先ブロックをフラッシュブロックプール＃０によって管理するとともに（クローズ）、共通フラッシュブロックプール８０１の内のフリーブロックをＱｏＳドメイン＃０用の新たなコピー先ブロック（オープンブロック）として割り当てる。
【０１３１】
更新データの書き込みまたはデータコピー動作によってＱｏＳドメイン＃０に属する一つのブロック内のデータ全てが無効データになった場合、ホスト２は、このブロックのブロックアドレスを指定するリユースコマンドをフラッシュストレージデバイス３に送信する。
【０１３２】
コントローラ４がこのリユースコマンドをホスト２から受信した場合、コントローラ４は、このリユースコマンドによって指定されるフラッシュブロックプール＃０内のブロックを共通フラッシュブロックプール８０１に返却して、このブロックを任意のＱｏＳドメイン用の新たな書き込み先ブロック（またはコピー先ブロック）として再使用可能な状態にする。
【０１３３】
なお、更新データの書き込みまたはデータコピー動作によってＱｏＳドメイン＃０に属する一つのブロック内のデータ全てが無効データになった場合、ホスト２は、このブロックのブロックアドレスを指定するイレーズコマンドをフラッシュストレージデバイス３に送信してもよい。コントローラ４がこのイレーズコマンドをホスト２から受信した場合、コントローラ４は、このイレーズコマンドによって指定されるフラッシュブロックプール＃０内のブロックに対する消去動作を実行し、且つこのブロックを共通フラッシュブロックプール８０１に返却して、このブロックを任意のＱｏＳドメイン用の新たな書き込み先ブロック（またはコピー先ブロック）として再使用可能な状態にする。
【０１３４】
ＱｏＳドメイン＃ｎ−１においても、コントローラ４は、書き込み先ブロック／コピー先ブロックの割り当て、データで満たされた書き込み先ブロック／コピー先ブロックをフラッシュブロックプール＃ｎ−１によって管理する処理、リユースコマンド／イレーズコマンドによって指定されるブロックを共通フラッシュブロックプール８０１に返却する処理等を実行する。
【０１３５】
図１９は、コントローラ４によって管理される、コマンド数カウンタを含むブロック管理テーブル３２を示す。
例えば、ブロックＢＬＫ＃１に対応するブロック管理テーブル３２においては、ブロックＢＬＫ＃１の状態を管理するためのメタデータとして、コマンド数カウンタ（以下、イン・フライトコマンド数カウンタと称する）が追加されている。
【０１３６】
イン・フライトコマンド数カウンタはライトコマンド毎に用意されていてもよい。この場合、あるライトコマンドＩＤに対応するイン・フライトコマンド数カウンタ値は、このライトコマンドに関連付けられたライトデータが格納されているライトバッファ内の領域が解放可能か否かを判定するために使用される。コントローラ４は、各書き込み先ブロックについてイン・フライトコマンド数カウンタを管理する。
【０１３７】
あるライトコマンドが受信され、このライトコマンドに関連付けられたライトデータを書き込み先ブロックＢＬＫ＃１に書き込む場合を想定する。この場合、書き込み先ブロックＢＬＫ＃１に対応するブロック管理テーブル３２においては、このライトコマンドのライトコマンドＩＤに対応するイン・フライトコマンド数カウンタが管理される。
【０１３８】
コントローラ４は、このイン・フライトコマンド数カウンタ値を、データ書き込み動作に必要な書き込みステップの回数に１を加えた値に初期設定する。このライトコマンドに関連付けられたライトデータを、２回の書き込みステップを含むフォギー・ファイン書き込み動作によって書き込み先ブロックＢＬＫ＃１に書き込むケースにおいては、データ書き込み動作に必要な書き込みステップの回数は２である。なお、書き込みステップの回数に１を加えるのは、書き込みエラーによって再書き込み動作が必要とされる場合があるからである。
【０１３９】
１回の書き込みステップの終了の度に、コントローラ４は、このイン・フライトコマンド数カウンタ値を１減少する。
データ書き込み動作が終了してライトデータが読み出し可能となった場合、コントローラ４は、このイン・フライトコマンド数カウンタ値を１減少する。
【０１４０】
データ書き込み動作の実行中に、このライトデータ（このライトデータの一部分または全て）を読み出し対象データとして指定するリードコマンドがホスト２から受信された場合、コントローラ４は、このイン・フライトコマンド数カウンタ値を１増やす。
リードコマンドによって指定された読み出し対象データをライトバッファから読み出してホスト２に返す読み出し動作が終了した場合、コントローラ４は、このイン・フライトコマンド数カウンタ値を１減少する。
【０１４１】
書き込みエラーによって再書き込み動作が必要となった場合は、コントローラ４は、このイン・フライトコマンド数カウンタ値を、再書き込み動作に必要な書き込みステップの回数だけ増やす。
イン・フライトコマンド数カウンタ値が零になった場合、コントローラ４は、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信する。このライトバッファ解放要求はこのライトコマンドのコマンドＩＤを含む。
【０１４２】
イン・フライトコマンド数カウンタをライトコマンド毎に用意する代わりに、４ＫＢのような最小書き込み単位毎に用意してもよい。イン・フライトコマンド数カウンタが４ＫＢのような最小書き込み単位毎に用意されている場合には、あるライトコマンドに対応するライトデータ全体に対応する複数のイン・フライトコマンド数カウンタ値の全てが零になった時点で、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信してもよい。
【０１４３】
なお、このように、ライトコマンド単位でライトバッファ解放要求をホスト２に送信する代わりに、４ＫＢのような最小書き込み単位でライトバッファ解放要求をホスト２に送信してもよい。
図２０のフローチャートは、コントローラ４によって実行されるイン・フライトコマンド数カウンタ更新処理の手順を示す。
【０１４４】
コントローラ４は、まず、イン・フライトコマンド数カウンタ値を、データ書き込み動作に必要な書き込みステップの回数（つまりデータ転送回数）に設定する（ステップＳ１１）。そして、コントローラ４は、エラーのための再書き込み処理のために、イン・フライトコマンド数カウンタ値を１増やす（ステップＳ１２）。そして、コントローラ４は、受信されたライトコマンドに関連付けられたライトデータを書き込み先ブロックに書き込みための書き込み動作を開始する（ステップＳ１３）。
【０１４５】
このライトデータのための一回の書き込みステップが終了する度（ステップＳ１４のＹＥＳ）、コントローラ４は、イン・フライトコマンド数カウンタ値を１減らし（ステップＳ１５）。そして、コントローラ４は、データ書き込み動作が終了してこの書き込み先ブロックからのライトデータの読み出しが可能になったか否かを判定する（ステップＳ１６）。
【０１４６】
データ書き込み動作が終了してこの書き込み先ブロックからのライトデータの読み出しが可能になった場合（ステップＳ１６のＹＥＳ）、コントローラ４は、イン・フライトコマンド数カウンタ値を１減らす（ステップＳ１７）。
データ書き込み動作の実行中に、このライトデータを読み出し対象データとして指定するリードコマンドが受信されたならば（ステップＳ１８のＹＥＳ）、コントローラ４は、イン・フライトコマンド数カウンタ値を１増やす（ステップＳ１９）。そして、このリードコマンドの実行が完了すると（ステップＳ２０のＹＥＳ）、コントローラ４は、イン・フライトコマンド数カウンタ値を１減らす（ステップＳ２１）。
【０１４７】
もし書き込みエラーが発生したならば（ステップＳ２２のＹＥＳ）、コントローラ４は、このイン・フライトコマンド数カウンタ値を、再書き込み動作に必要な書き込みステップの回数だけ増やす（ステップＳ２３）。
図２１のフローチャートは、データ読み出し動作の手順を示す。
【０１４８】
ホスト２からリードコマンドを受信すると（ステップＳ２１のＹＥＳ）、コントローラ４は、このリードコマンドによって読み出し対象データとして指定されたデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能であるか否かを判定する（ステップＳ２２）。
【０１４９】
ステップＳ２２では、コントローラ４は、リードコマンドによって指定されるブロックアドレスを有するブロックがクローズ状態またはオープン状態のいずれであるかを判定する。このブロックがクローズ状態であるならば、読み出し対象データの書き込み動作は既に終了している。したがって、コントローラ４は、読み出し対象データがＮＡＮＤ型フラッシュメモリ５から読み出し可能であると判定する。
【０１５０】
一方、このブロックがオープン状態であるならば、コントローラ４は、読み出し対象データが格納されているこのブロック内の位置が、このブロックの現在の書き込み先ページ範囲よりも先行するページに属しているか否かを判定する。読み出し対象データが格納されているこのブロック内の位置が、このブロックの現在の書き込み先ページ範囲よりも先行するページに属しているならば、読み出し対象データの書き込み動作は既に終了している。したがって、コントローラ４は、読み出し対象データがＮＡＮＤ型フラッシュメモリ５から読み出し可能であると判定する。
【０１５１】
読み出し対象データが格納されているこのブロック内の位置が、このブロックの現在の書き込み先ページ範囲よりも先行するページに属しておらず、現在の書き込み先ページ範囲内のいずれかのページに属しているならば、読み出し対象データの書き込み動作は終了していない。したがって、コントローラ４は、読み出し対象データがＮＡＮＤ型フラッシュメモリ５から読み出し可能ではないと判定する。
【０１５２】
読み出し対象データがＮＡＮＤ型フラッシュメモリ５から読み出し可能である場合には（ステップＳ２１のＹＥＳ）、コントローラ４は、読み出し対象データをＮＡＮＤ型フラッシュメモリ５から読み出し、読み出したデータをホスト２に返す（ステップＳ２３）。
【０１５３】
読み出し対象データがＮＡＮＤ型フラッシュメモリ５から読み出し可能でない場合には（ステップＳ２１のＮ０）、つまりライトデータの書き込み動作が終了してこのライトデータが読み出し可能となる前にこのライトデータ（このライトデータの一部分又は全て）を読み出し対象データとして指定するリードコマンドが受信された場合には、コントローラ４は、このライトデータが格納されているライトバッファ内の領域の解放を禁止する（ステップＳ２４）。この場合、たとえこのライトデータの書き込み動作が終了してこのライトデータが読み出し可能となっても、コントローラ４は、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信しない。ステップＳ２４では、このライトデータのライトコマンドに対応するこのイン・フライトコマンド数カウンタ値を１増やすことによって、このライトデータが格納されているライトバッファ内の領域の開放を禁止してもよい。
【０１５４】
コントローラ４は、この読み出し対象データをホスト２のライトバッファから読み出し、読み出した読み出し対象データをホスト２に返す（ステップＳ２５）。このステップＳ２５のデータ読み出し動作が終了すると、つまりこのリードコマンドの実行が完了すると、コントローラ４は、このライトデータが格納されているライトバッファ内の領域の開放禁止状態を解除する（ステップＳ２６）。ステップＳ２６では、このライトデータのライトコマンドに対応するこのイン・フライトコマンド数カウンタ値を１減らすことによって、このライトデータが格納されているライトバッファ内の領域の開放禁止状態を解除してもよい。
【０１５５】
図２２のフローチャートは、データ書き込み動作とライトバッファ解放処理の手順を示す。
ライトデータが格納されているライトバッファ内の記憶位置を示す記憶位置情報を指定するライトコマンドをホスト２から受信すると（ステップＳ３１）、コントローラ４は、この記憶位置情報に基づいて、このライトデータをライトバッファから取得する（ステップＳ３２）。コントローラ４は、ＮＡＮＤ型フラッシュメモリ５に含まれる複数のブロックから選択された書き込み先ブロック内の書き込み先位置に書き込む書き込み動作を実行する（ステップＳ３３）。
【０１５６】
この書き込み動作が終了してこのライトデータが読み出し可能になった場合（ステップＳ３４のＹＥＳ）、コントローラ４は、このライトデータ（このライトデータの一部分又は全て）を読み出し対象データとして指定するリードコマンドが既に受信され、且つこの読み出し対象データをライトバッファから読み出す動作とこの読み出した読み出し対象データをホスト２に返す動作とを含む読み出し動作が実行中であるか否かを判定する（ステップＳ３５）。
【０１５７】
この読み出し動作が実行中である場合（ステップＳ３５のＹＥＳ）、コントローラ４は、このライトデータが格納されているライトバッファ内の領域を解放を禁止する。つまり、コントローラ４は、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信せず、ライトバッファ解放要求の発行を、このリードコマンドが完了するまで、つまりこの読み出し動作が終了するまで待機する（ステップＳ３６、Ｓ３７）。
【０１５８】
そして、この読み出し動作が終了した場合（ステップＳ３７のＹＥＳ）、つまりこのリードコマンドの実行が完了した場合、コントローラ４は、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信する（ステップＳ３８）。
【０１５９】
図２３のフローチャートは、リードコマンドによって指定されたデータがフラッシュメモリおよびホストのライトバッファの双方から読み出し可能である場合に実行されるデータ読み出し動作の手順を示す。
ホスト２からリードコマンドを受信すると（ステップＳ４１のＹＥＳ）、コントローラ４は、このリードコマンドによって指定された読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在しているか否かを判定する（ステップＳ４２）。
【０１６０】
例えば、ライトデータを書き込み先ブロックに書き込む書き込み動作が終了してからこのライトデータに対応するライトバッファ解放要求の送信までの期間中に、このライトデータ（このライトデータの一部分または全て）を読み出し対象データとして指定するリードコマンドが受信された場合には、コントローラ４は、この読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在していると判定してもよい。
【０１６１】
この読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在している場合（ステップＳ４２のＹＥＳ）、コントローラ４は、読み出し対象データをライトバッファから読み出す動作と読み出した読み出し対象データをホスト２に返す動作とを含む読み出し動作を実行する（ステップＳ４３）。
【０１６２】
通常、ホスト２とフラッシュストレージデバイス３との間のデータ転送は高速に実行することができる。したがって、読み出し対象データをライトバッファから読み出すことにより、リードレイテンシを低減することが可能となる。
このリードコマンドの実行が管理用するまで、つまりこの読み出し動作が終了するまで、コントローラ３は、このライトデータが格納されているライトバッファ内の領域の解放を禁止する（ステップＳ４４）。すなわち、読み出し動作の実行中は、コントローラ３は、このライトデータが格納されているライトバッファ内の領域を解放するためのライトバッファ解放要求をホスト２に送信しない。これにより、このライトデータの一部分または全てである読み出し対象データの読み出し動作が終了するまで、この読み出し対象データをライトバッファに維持することができる。
【０１６３】
図２４のフローチャートは、リードコマンドによって指定されたデータがフラッシュメモリおよびホストのライトバッファの双方から読み出し可能である場合に実行されるデータ読み出し動作の別の手順を示す。
上述の図２３のフローチャートで説明したデータ読み出し動作は、リードレイテンシの低減を優先するために、読み出し対象データをライトバッファから読み出した。図２４のフローチャートで説明するデータ読み出し動作では、読み出し可能なデータが格納されているライトバッファ内の領域をできるだけ早期に解放することを優先するために、読み出し対象データは、ライトバッファからではなく、以下説明するように、書き込み先ブロックから読み出される。
【０１６４】
ホスト２からリードコマンドを受信すると（ステップＳ５１のＹＥＳ）、コントローラ４は、このリードコマンドによって指定された読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在しているか否かを判定する（ステップＳ５２）。
【０１６５】
例えば、ライトデータを書き込み先ブロックに書き込む書き込み動作が終了してからこのライトデータに対応するライトバッファ解放要求の送信までの期間中に、このライトデータ（このライトデータの一部分または全て）を読み出し対象データとして指定するリードコマンドが受信された場合には、コントローラ４は、この読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在していると判定してもよい。
【０１６６】
この読み出し対象データが書き込み先ブロックから読み出し可能であり且つこの読み出し対象データがライトバッファに存在している場合（ステップＳ５２のＹＥＳ）、コントローラ４は、読み出し対象データを書き込み先ブロックから読み出す動作と読み出した読み出し対象データをホスト２に返す動作とを含む読み出し動作を実行する（ステップＳ５３）。この場合、コントローラ４は、この読み出し対象データとして指定されたライトデータをライトバッファ内に維持する必要は無いので、この読み出し動作の開始の前に、またはこの読み出し動作の実行中に、このライトデータが格納されているライトバッファ内の領域を解放するための解放要求をホスト２に送信することができる。
【０１６７】
本実施形態のフラッシュストレージデバイス３においては、上述のライトコマンドのみならず、以下のタイプのライトコマンドを適用することもできる。
＜ブロックアドレスを指定するライトコマンド＞
このライトコマンドは、コマンドＩＤ、ＱｏＳドメインＩＤ、物理アドレス、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
【０１６８】
コマンドＩＤはこのコマンド（このライトコマンド）の固有の識別子である。ＱｏＳドメインＩＤは、データが書き込まれるべきＱｏＳドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト２から送信されるライトコマンドは、このエンドユーザに対応するＱｏＳドメインを指定するＱｏＳドメインＩＤを含む。
【０１６９】
物理アドレスは、データが書き込まれるべきブロックのブロックアドレスを指定し、このブロック内の位置（例えば、ページアドレスおよびページ内のオフセット）は指定しない。
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、ＬＢＡのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
【０１７０】
長さは、書き込まれるべきライトデータの長さを示す。この長さ（データ長）は、上述の粒度（Ｇｒａｉｎ）の数によって指定されてもよいし、ＬＢＡの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ（ホスト２のライトバッファ）内の位置を示す。ライトバッファアドレスは、データポインタとしても参照される。
【０１７１】
ホスト２からライトコマンドを受信した時、コントローラ４は、ライトコマンドによって指定されたブロックアドレスを有するブロック内の書き込み先位置を決定する。この書き込み先位置は、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ４は、ホスト２からのデータを、ライトコマンドによって指定されたブロックアドレスを有するこのブロック内のこの決定された書き込み先位置に書き込む。
【０１７２】
このタイプのライトコマンドを使用するケースにおいては、ホスト２は、ブロック割り当てコマンドをフラッシュストレージデバイス３に送出することによって、特定のＱｏＳドメイン用のブロックの割り当てをフラッシュストレージデバイス３に要求してもよい。ブロック割り当てコマンドはＱｏＳドメインＩＤを指定する。コントローラ４がブロック割り当てコマンドを受信した場合、コントローラ４は、共通ブロック群６０２内の一つのブロック（フリーブロック）を選択し、選択されたブロックを、このＱｏＳドメインに書き込み先ブロックとして割り当てる。そして、コントローラ４は、この割り当てられたブロックのブロックアドレスをホスト２に通知する。ホスト２は、この割り当てられたブロックのブロックアドレスを指定するライトコマンドをフラッシュストレージデバイス３に送信することができる。
【０１７３】
＜ブロックアドレスおよびオフセットを指定するライトコマンド＞
このライトコマンドは、コマンドＩＤ、ＱｏＳドメインＩＤ、物理アドレス、タグ、長さ、ライトバッファアドレス、等を含んでもよい。
コマンドＩＤはこのコマンド（このライトコマンド）の固有の識別子である。ＱｏＳドメインＩＤは、データが書き込まれるべきＱｏＳドメインを一意に識別可能な識別子である。あるエンドユーザに対応するアプリケーションからのライト要求に応じてホスト２から送信されるライトコマンドは、このエンドユーザに対応するＱｏＳドメインを指定するＱｏＳドメインＩＤを含む。
【０１７４】
物理アドレスは、データが書き込まれるべきブロックのブロックアドレスと、このブロック内書き込み先の位置を示すオフセット（例えば、ページアドレスおよびページ内のオフセット）とを指定する。
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、ＬＢＡのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよいし、このキーのハッシュ値であってもよい。
【０１７５】
長さは、書き込まれるべきライトデータの長さを示す。この長さ（データ長）は、上述の粒度（Ｇｒａｉｎ）の数によって指定されてもよいし、ＬＢＡの数によって指定されてもよいし、あるいはバイトによって指定されてもよい。
ライトバッファアドレスは、書き込まれるべきライトデータが格納されているホストメモリ（ホスト２のライトバッファ）内の位置を示す。
【０１７６】
以上説明したように、本実施形態によれば、リードコマンドによって読み出し対象データとして指定されたデータの書き込み動作が終了しておらず、このデータがＮＡＮＤ型フラッシュメモリ５から読み出す事ができない場合には、ホスト２のライトバッファからこのデータが読み出されてホスト２に返される。したがって、ホスト２は、リードすべきデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能であるか否かをチェックする処理およびライトバッファに向けたリード要求とフラッシュストレージデバイス３に向けたリードコマンドを選択的に発行する処理を行わずとも、フラッシュストレージデバイス３に向けたリードコマンドそれぞれを発行するというシンプルな処理を行うだけで、所望のデータをフラッシュストレージデバイス３から受け取ることができる。
【０１７７】
さらに、このリードコマンドの実行が完了するまで、このライトデータが格納されているライトバッファ内の領域の解放は禁止される。したがって、ライトバッファから読み出すべきことが決定されたデータ、またはライトバッファから読み出し中のデータなどがライトバッファから消失されてしまうという、ライトバッファ解放要求とリードコマンドとの衝突（解放要求／リードコマンド衝突）を回避することができる。そして、このリードコマンドの実行が完了した後に、このライトデータが格納されているライトバッファ内の領域を解放するための解放要求がホストに送信される。したがって、ライトバッファの解放制御のためのホスト側の負担も軽減することができる。
【０１７８】
なお、本実施形態では、ライトデータの書き込み動作が終了してこのライトデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能となる前に、このライトデータを読み出し対象データとして指定するリードコマンドがホスト２から受信された場合、コントローラ４は、ライトバッファからこの読み出し対象データを読み出した。しかし、別の実施形態では、ライトデータの書き込み動作が終了してこのライトデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能となる前に、このライトデータを読み出し対象データとして指定するリードコマンドがホスト２から受信された場合、コントローラ４は、ライトバッファからこの読み出し対象データをリードコマンドに対する応答として返すように要求する転送要求をホスト２に送信してもよい。この転送要求は、読み出し対象データが格納されているライトバッファ内の位置を示す記憶位置情報を含んでいてもよい。
【０１７９】
この転送要求の受信に応じて、ホスト２のホストＦＴＬ７０１は、ライトバッファから読み出し対象データを読み出し、読み出した読み出し対象データをリードバッファに転送する。そして、ホストＦＴＬ７０１は、転送要求に対するレスポンスをフラッシュストレージデバイス３に返す。コントローラ４は、このレスポンスの受信をこのリードコマンドの実行の完了として扱ってもよい。この場合、このレスポンスが受信されるまで、コントローラ４は、このライトデータが格納されているライトバッファ内の領域の解放を禁止する。このレスポンスの受信の後、コントローラ４は、ライトデータが格納されているライトバッファ内の領域を解放するための解放要求をホスト２に送信する。この場合、コントローラ４は、ライトデータの書き込み動作が終了してライトデータがＮＡＮＤ型フラッシュメモリ５から読み出し可能となり、且つこのレスポンスが受信された後、ライトデータが格納されているライトバッファ内の領域を解放するための解放要求をホスト２に送信してもよい。
【０１８０】
また、本実施形態では、不揮発性メモリとしてＮＡＮＤ型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、ＭＲＡＭ（Ｍａｇｎｅｔｏｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＰＲＡＭ（Ｐｈａｓｅ  ｃｈａｎｇｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲｅＲＡＭ（Ｒｅｓｉｓｔｉｖｅ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、又は、ＦｅＲＡＭ（Ｆｅｒｒｏｅｌｅｃｔｒｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）のような他の様々な不揮発性メモリにも適用できる。
【０１８１】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【０１８２】
２…ホスト、３…フラッシュストレージデバイス、４…コントローラ、５…ＮＡＮＤ型フラッシュメモリ、２１…ライト制御部、２２…リード制御部、２３…コピー制御部、２４…ライトバッファ解放制御部。
【図１】
2020123040.tif 000003
【図２】
2020123040.tif 000004
【図３】
2020123040.tif 000005
【図４】
2020123040.tif 000006
【図５】
2020123040.tif 000007
【図６】
2020123040.tif 000008
【図７】
2020123040.tif 000009
【図８】
2020123040.tif 000010
【図９】
2020123040.tif 000011
【図１０】
2020123040.tif 000012
【図１１】
2020123040.tif 000013
【図１２】
2020123040.tif 000014
【図１３】
2020123040.tif 000015
【図１４】
2020123040.tif 000016
【図１５】
2020123040.tif 000017
【図１６】
2020123040.tif 000018
【図１７】
2020123040.tif 000019
【図１８】
2020123040.tif 000020
【図１９】
2020123040.tif 000021
【図２０】
2020123040.tif 000022
【図２１】
2020123040.tif 000023
【図２２】
2020123040.tif 000024
【図２３】
2020123040.tif 000025
【図２４】
2020123040.tif 000026