IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 東芝メモリ株式会社の特許一覧

(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-03-29
(45)【発行日】2024-04-08
(54)【発明の名称】メモリシステム
(51)【国際特許分類】
   G06F 12/00 20060101AFI20240401BHJP
   G06F 12/06 20060101ALI20240401BHJP
【FI】
G06F12/00 560B
G06F12/06 525A
【請求項の数】 9
(21)【出願番号】P 2023077290
(22)【出願日】2023-05-09
(62)【分割の表示】P 2022106938の分割
【原出願日】2018-04-25
(65)【公開番号】P2023090896
(43)【公開日】2023-06-29
【審査請求日】2023-05-09
(73)【特許権者】
【識別番号】318010018
【氏名又は名称】キオクシア株式会社
(74)【代理人】
【識別番号】110001737
【氏名又は名称】弁理士法人スズエ国際特許事務所
(72)【発明者】
【氏名】菅野 伸一
(72)【発明者】
【氏名】吉田 英樹
(72)【発明者】
【氏名】江坂 直紀
(72)【発明者】
【氏名】西村 裕史
【審査官】松平 英
(56)【参考文献】
【文献】特開2017-162068(JP,A)
【文献】特開2018-5655(JP,A)
【文献】米国特許出願公開第2018/0018267(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 3/06-3/08
12/00-12/128
13/16-13/18
(57)【特許請求の範囲】
【請求項1】
ホストに接続可能なメモリシステムであって、
不揮発性メモリと、
前記不揮発性メモリに電気的に接続されたコントローラと、を具備し、
前記コントローラは、
第1のデータが格納されている前記ホストのメモリ上の位置を少なくとも指定するライトコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから取得し、
前記第1のデータを前記ホストの前記メモリから取得した後に前記第1のデータの読み出しを要求するリードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返すように構成されている、
メモリシステム。
【請求項2】
前記コントローラは、
前記ライトコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから取得した後に、前記第1のデータを前記不揮発性メモリに送信し、
前記第1のデータを前記不揮発性メモリに送信した後に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返すように構成されている、
請求項1記載のメモリシステム。
【請求項3】
バッファをさらに具備し、
前記コントローラは、
前記ライトコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから取得し前記バッファに格納し、前記第1のデータを前記バッファから前記不揮発性メモリに送信し、
前記第1のデータを前記不揮発性メモリに送信した後に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータが前記バッファにまだ格納されているか否かを判断し、前記第1のデータが前記バッファに格納されていない場合、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記バッファに格納し、前記第1のデータを前記バッファから前記ホストに返すように構成されている、
請求項1記載のメモリシステム。
【請求項4】
前記コントローラは、
前記第1のデータを前記不揮発性メモリに送信した後に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータが前記バッファにまだ格納されているか否かを判断し、前記第1のデータが前記バッファに格納されている場合、前記第1のデータを前記ホストの前記メモリから再度取得することなく、前記第1のデータを前記バッファから前記ホストに返すように構成されている、
請求項3記載のメモリシステム。
【請求項5】
前記コントローラは、
前記ライトコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから取得した後に、前記第1のデータを前記不揮発性メモリに送信し、
前記第1のデータを前記不揮発性メモリに送信した後、前記第1のデータの書き込みを前記不揮発性メモリに指示し、
前記第1のデータの書き込みを前記不揮発性メモリに指示した後、前記第1のデータがまだ前記不揮発性メモリから読み出し可能となっていない期間に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返すように構成されている、
請求項1記載のメモリシステム。
【請求項6】
前記不揮発性メモリは、メモリセルアレイを含み、
前記不揮発性メモリは、
前記第1のデータを、少なくとも第1段階の書き込み動作と第2段階の書き込み動作とを含む複数段階の書き込み動作により前記メモリセルアレイに書き込むように構成され、
前記コントローラは、
前記第1のデータを前記不揮発性メモリに送信し、前記不揮発性メモリに前記第1のデータに対する前記第1段階の書き込み動作を指示した後、前記不揮発性メモリに前記第1のデータに対する前記第2段階の書き込み動作を指示する前に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返すように構成されている、
請求項5記載のメモリシステム。
【請求項7】
前記不揮発性メモリは、メモリセルアレイを含み、
前記不揮発性メモリは、
前記第1のデータを、少なくとも第1段階の書き込み動作と第2段階の書き込み動作とを含む複数段階の書き込み動作により前記メモリセルアレイに書き込むように構成され、
前記コントローラは、
前記第1のデータを前記不揮発性メモリに送信し、前記不揮発性メモリに前記第1のデータに対する前記第1段階の書き込み動作を指示した後、前記不揮発性メモリが前記第1のデータに対する前記第2段階の書き込み動作を完了する前に前記リードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返すように構成されている、
請求項5記載のメモリシステム。
【請求項8】
前記メモリセルアレイは、閾値電圧に応じてデータを不揮発に記憶するメモリセルを含み、
前記第2段階の書き込み動作は、前記第1段階の書き込み動作により設定された前記メモリセルの前記閾値電圧を調整する動作である、
請求項6又は請求項7に記載のメモリシステム。
【請求項9】
前記不揮発性メモリは、各々がデータ消去動作の単位である複数のブロックを含み、
前記ライトコマンドは、前記第1のデータが書き込まれるべき前記複数のブロックのいずれかを示す識別子をさらに指定し、
前記コントローラは、前記第1のデータを、前記識別子で示される前記複数のブロックのうちの一つのブロックに書き込むように構成されている、
請求項1に記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、不揮発性メモリを制御する技術に関する。
【背景技術】
【0002】
近年、不揮発性メモリを備えるメモリシステムが広く普及している。このようなメモリシステムの一つとして、NANDフラッシュ技術ベースのソリッドステートドライブ(SSD)が知られている。
データセンターのサーバにおいても、ストレージデバイスとしてSSDが使用されている。
【0003】
サーバのようなホスト計算機システムにおいて利用されるストレージデバイスにおいては、高いI/O性能が求められている。
このため、最近では、ホストとストレージデバイスとの間の新たなインタフェースが提案され始めている。
また、最近のストレージデバイスにおいては、異なる種類のデータを異なる書き込み先ブロックに書き込むことを可能にすることが求められる場合がある。
【先行技術文献】
【非特許文献】
【0004】
【文献】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 >
【発明の概要】
【発明が解決しようとする課題】
【0005】
このため、複数の書き込み先ブロックを同時に利用可能にするための新たな技術の実現が要求される。
本発明が解決しようとする課題は、複数の書き込み先ブロックを同時に利用することができるメモリシステムを提供することである。
【課題を解決するための手段】
【0006】
実施形態によれば、ホストに接続可能なメモリシステムは、不揮発性メモリと、前記不揮発性メモリに電気的に接続されたコントローラと、を具備する。前記コントローラは、第1のデータが格納されている前記ホストのメモリ上の位置を少なくとも指定するライトコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから取得する。前記コントローラは、前記第1のデータを前記ホストの前記メモリから取得した後に前記第1のデータの読み出しを要求するリードコマンドを前記ホストから受信したことに応じ、前記第1のデータを前記ホストの前記メモリから再度取得し、前記再度取得された第1のデータを前記ホストに返す。
【図面の簡単な説明】
【0007】
図1】ホストと実施形態に係るメモリシステム(フラッシュストレージデバイス)との関係を示すブロック図。
図2】同実施形態のメモリシステムの構成例を示すブロック図。
図3】同実施形態のメモリシステムにおいて使用される複数のチャンネルと複数のNAND型フラッシュメモリチップとの関係を示すブロック図。
図4】同実施形態のメモリシステムにおいて使用される、あるスーパーブロックの構成例を示す図。
図5】ホストに含まれるライトデータバッファおよびフラッシュトランスレーション部と同実施形態のメモリシステムに含まれるライト制御部、DMACおよび内部バッファとの関係を示すブロック図。
図6】同実施形態のメモリシステムによって実行されるI/Oコマンド処理を説明するためのブロック図。
図7】同実施形態のメモリシステムによって実行される複数段階の書き込み動作を説明するための図。
図8】同実施形態のメモリシステム内のある書き込み先ブロックへのデータの書き込み順序を説明するための図。
図9】不揮発性メモリのデータ書き込み単位と同じサイズの単位でライトデータをホストから同実施形態のメモリシステムに転送する動作を説明するための図。
図10】同実施形態のメモリシステムによって実行されるデータ書き込み処理の手順を示すフローチャート。
図11】ホストによって実行されるライトデータ破棄処理の手順を示すフローチャート。
図12】最後のライトコマンドが受信されてから閾期間、次のライトコマンドが受信されない場合に、同実施形態のメモリシステムによって実行されるダミーデータ書き込み処理を説明するための図。
図13】同実施形態のメモリシステムによって実行されるダミーデータ書き込み処理の手順を示すフローチャート。
図14】内部バッファを使用して同実施形態のメモリシステムによって実行されるデータ転送動作を示すブロック図。
図15】内部バッファを使用して同実施形態のメモリシステムによって実行される書き込み処理と内部バッファ内のライトデータを破棄する処理とを説明するための図。
図16】内部バッファに空き領域がない場合に同実施形態のメモリシステムによって実行される内部バッファ内のライトデータを破棄する処理を説明するための図。
図17】内部バッファを使用して同実施形態のメモリシステムによって実行されるデータ書き込み処理の手順を示すフローチャート。
図18】同実施形態のメモリシステムによって実行されるデータ読み出し処理の手順を示すフローチャート。
図19】ホストが書き込み先ブロックを指定し且つ同実施形態のメモリシステムが書き込み先ページを決定するデータ書き込み処理と、ホストがブロックアドレスとページアドレスとを指定するデータ読み出し処理とを説明するための図。
図20】同実施形態のメモリシステムに適用されるブロックアロケートコマンド(ブロック割り当て要求)を説明するための図。
図21】ブロックアロケートコマンドに対するレスポンスを説明するための図。
図22】同実施形態のメモリシステムに適用されるライトコマンドを説明するための図。
図23】ライトコマンドのコマンド完了を示すレスポンスを説明するための図。
図24】同実施形態のメモリシステムに適用されるリードコマンドを説明するための図。
【発明を実施するための形態】
【0008】
以下、図面を参照して、実施形態を説明する。
まず、図1を参照して、本実施形態に係るメモリシステムとホストとの関係を説明する。
このメモリシステムは、不揮発性メモリにデータを書き込み、不揮発性メモリからデータを読み出すように構成された半導体ストレージデバイスである。このメモリシステムは、NANDフラッシュ技術ベースのフラッシュストレージデバイス3として実現されている。
【0009】
ホスト(ホストデバイス)2は、複数のフラッシュストレージデバイス3を制御するように構成されている。ホスト2は、複数のフラッシュストレージデバイス3によって構成されるフラッシュアレイをストレージとして使用するように構成された情報処理装置によって実現される。この情報処理装置はパーソナルコンピュータであってもよいし、サーバコンピュータであってもよい。
【0010】
なお、フラッシュストレージデバイス3は、ストレージアレイ内に設けられる複数のストレージデバイスの一つとして利用されてもよい。ストレージアレイは、サーバコンピュータのような情報処理装置にケーブルまたはネットワークを介して接続されてもよい。ストレージアレイは、このストレージアレイ内の複数のストレージ(例えば複数のフラッシュストレージデバイス3)を制御するコントローラを含む。フラッシュストレージデバイス3がストレージアレイに適用された場合には、このストレージアレイのコントローラが、フラッシュストレージデバイス3のホストとして機能してもよい。
【0011】
以下では、サーバコンピュータのような情報処理装置がホスト2として機能する場合を例示して説明する。
ホスト(サーバ)2と複数のフラッシュストレージデバイス3は、インタフェース50を介して相互接続される(内部相互接続)。この相互接続のためのインタフェース50としては、これに限定されないが、PCI Express(PCIe)(登録商標)、NVM Express(NVMe)(登録商標)、Ethernet(登録商標)、NVMe over Fabrics(NVMeOF)等を使用し得る。
【0012】
ホスト2として機能するサーバコンピュータの典型例としては、データセンター内のサーバコンピュータ(以下、サーバと称する)が挙げられる。
ホスト2がデータセンター内のサーバによって実現されるケースにおいては、このホスト(サーバ)2は、ネットワーク60を介して複数のエンドユーザ端末(クライアント)61に接続されてもよい。ホスト2は、これらエンドユーザ端末61に対して様々なサービスを提供することができる。
【0013】
ホスト(サーバ)2によって提供可能なサービスの例には、(1)システム稼働プラットフォームを各クライアント(各エンドユーザ端末61)に提供するプラットホーム・アズ・ア・サービス(PaaS)、(2)仮想サーバのようなインフラストラクチャを各クライアント(各エンドユーザ端末61)に提供するインフラストラクチャ・アズ・ア・サービス(IaaS)、等がある。
【0014】
複数の仮想マシンが、このホスト(サーバ)2として機能する物理サーバ上で実行されてもよい。ホスト(サーバ)2上で走るこれら仮想マシンの各々は、この仮想マシンに対応するクライアント(エンドユーザ端末61)に各種サービスを提供するように構成された仮想サーバとして機能することができる。各仮想マシンにおいては、対応するエンドユーザ端末61によって使用される、オペレーティングシステムおよびユーザアプリケーションが実行される。各仮想マシンに対応するオペレーティングシステムは、I/Oサービスを含む。このI/Oサービスは、論理ブロックアドレス(LBA)ベースのブロックI/Oサービスであってもよいし、あるいは、キー・バリュー・ストアサービスであってもよい。I/Oサービスは、アクセス対象のデータを識別するためのタグそれぞれとフラッシュストレージデバイス3の物理アドレスそれぞれとの間のマッピングを管理するアドレス変換テーブルを含んでいてもよい。タグは、LBAのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよい。
【0015】
各仮想マシンに対応するオペレーティングシステムにおいては、I/Oサービスは、ユーザアプリケーションからのライト/リード要求に応答して、I/Oコマンド(ライトコマンド、リードコマンド)を発行する。これらI/Oコマンドはコマンドキューを介してフラッシュストレージデバイス3に送出される。
【0016】
フラッシュストレージデバイス3は、NAND型フラッシュメモリのような不揮発性メモリを含む。フラッシュストレージデバイス3は、不揮発性メモリ内の複数のブロックから割り当てられた複数の書き込み先ブロックを管理する。書き込み先ブロックとは、データが書き込まれるべきブロックを意味する。ホスト2からフラッシュストレージデバイス3に送出されるライトコマンドは、書き込むべきライトデータが存在するホスト2のメモリ上の位置と、このライトデータの長さと、このライトデータが書き込まれるべきブロックを示す識別子とを指定する。したがって、ホスト2は、データが書き込まれるべき特定の書き込み先ブロックを指定することができる。この結果、例えば、ホスト2は、あるエンドユーザ端末61(クライアント)に対応するユーザアプリケーションのデータが1以上の特定の書き込み先ブロックに書き込まれ、他のエンドユーザ端末61(クライアント)に対応するユーザアプリケーションのデータが別の1以上の特定の書き込み先ブロックに書き込まれる、といったデータ配置を実現することができる。
【0017】
ライトデータが書き込まれるべきブロックを示す識別子は、特定の書き込み先ブロックを指定するブロックアドレス(ブロック番号)によって表されてもよい。フラッシュストレージデバイス3が複数のNAND型フラッシュメモリチップを含むケースにおいては、このブロックアドレスは、ブロックアドレスとチップ番号との組み合わせによって表されてもよい。
【0018】
フラッシュストレージデバイス3がストリーム書き込みをサポートしているケースにおいては、ライトデータが書き込まれるべきブロックを示す識別子は、複数のストリーム内の一つのストリームの識別子(ストリームID)であってもよい。ストリーム書き込みにおいては、複数の書き込み先ブロックが複数のストリームにそれぞれ関連付けられる。換言すれば、フラッシュストレージデバイス3があるストリームIDを含むライトコマンドをホスト2から受信した場合、このフラッシュストレージデバイス3は、このストリームIDに対応するストリームに関連づけられた書き込み先ブロックにデータを書き込む。フラッシュストレージデバイス3が別のストリームIDを含むライトコマンドをホスト2から受信した場合、このフラッシュストレージデバイス3は、この別のストリームIDに対応する別のストリームに関連づけられた別の書き込み先ブロックにデータを書き込む。フラッシュストレージデバイス3においては、ストリームIDそれぞれとブロックアドレスそれぞれとの間のマッピングを管理するための管理テーブルが使用されてもよい。
【0019】
フラッシュストレージデバイス3は、以下のタイプ#1-ストレージデバイス、タイプ#2-ストレージデバイス、タイプ#3-ストレージデバイスのうちの任意のストレージデバイスとして実現されうる。
タイプ#1-ストレージデバイスは、ホスト2が、データが書き込まれるべきブロックとこのデータが書き込まれるべきページアドレスの双方を指定するタイプのストレージデバイスである。タイプ#1-ストレージデバイスに適用されるライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。ブロックアドレスは、ホスト2から受信されるライトデータが書き込まれるべきブロックを指定する。ページアドレスは、このライトデータが書き込まれるべきこのブロック内のページを指定する。データポインタは、このライトデータが存在するホスト2内のメモリ上の位置を示す。長さは、このライトデータの長さを示す。
【0020】
タイプ#2-ストレージデバイスは、ホスト2がデータが書き込まれるべきブロックを指定し、ストレージデバイスがこのデータが書き込まれるべきこのブロック内の位置(ページ)を指定するタイプのストレージデバイスである。タイプ#2-ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ(例えば、LBA、キー)、ブロックアドレス、データポインタ、長さを含む。さらに、ライトコマンドは、QoSドメインIDを含んでもよい。QoSドメインIDは、NAND型フラッシュメモリを論理的に分割することによって得られる複数の領域の一つを指定する。複数の領域の各々は、複数のブロックを含む。タイプ#2-ストレージデバイスは、不良ページ、ページ書き込み順序の制約を考慮して、データが書き込まれるべきページを決定することができる。
【0021】
つまり、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ブロックをホスト2にハンドリングさせつつ、ページ書き込み順序制約、バッドページ、ページサイズ等を隠蔽することができる。この結果、ホスト2は、ブロック境界を認識でき、且つページ書き込み順序制約、バッドページ、ページサイズについては意識することなく、どのユーザデータがどのブロックに存在するかを管理することができる。
【0022】
タイプ#3-ストレージデバイスは、ホスト2がデータを識別するタグ(例えばLBA)を指定し、ストレージデバイスがこのデータが書き込まれるべきブロックおよびページの双方を決定するタイプのストレージデバイスである。タイプ#3-ストレージデバイスに適用されるライトコマンドは、書き込まれるべきライトデータを識別するためのタグ(例えば、LBA、キー)、ストリームID、データポインタ、長さを含む。ストリームIDは、このライトデータに関連付けられたストリームの識別子である。フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ストリームIDそれぞれとブロックアドレスそれぞれとの間のマッピングを管理する管理テーブルを参照して、このライトデータが書き込まれるべきブロックを決定する。さらに、フラッシュストレージデバイス3は、論理物理アドレス変換テーブルと称されるアドレス変換テーブルを使用して、タグ(LBA)それぞれとNAND型フラッシュメモリの物理アドレスそれぞれとの間のマッピングを管理する。
【0023】
フラッシュストレージデバイス3はタイプ#1-ストレージデバイス、タイプ#2-ストレージデバイス、またはタイプ#3-ストレージデバイスのいずれであってもよいが、フラッシュストレージデバイス3は、NAND型フラッシュメモリに含まれる複数のブロックから割り当てられる複数の書き込み先ブロックを管理し、あるライトコマンドに関連付けられたライトデータを、このライトコマンドによって指定される書き込み先ブロックに書き込む。
【0024】
タイプ#1-ストレージデバイスにおいては、書き込み先ブロック内のページ書き込み順序はホスト2によって指定される。したがって、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ホスト2からのライトコマンドそれぞれによって指定されるページアドレスに対応する順序で、書き込み先ブロック内のページそれぞれにデータを書き込む。
【0025】
タイプ#2-ストレージデバイスにおいては、書き込み先ブロックはホスト2からのライトコマンドに含まれるブロックアドレスによって指定されるが、この書き込み先ブロック内の書き込み先ページはフラッシュストレージデバイス3によって決定される。したがって、フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、ライトコマンドに含まれるブロックアドレスによって指定される書き込み先ブロックの先頭のページから最後のページの順序でデータが書き込まれるように書き込み先ページを決定する。
【0026】
タイプ#3-ストレージデバイスにおいては、フラッシュストレージデバイス3は、ライトコマンドに含まれるストリームIDに関連付けられたブロックを書き込み先ブロックとして選択し、この書き込み先ブロック内の書き込み先ページを決定する。したがって、フラッシュストレージデバイス3がタイプ#3-ストレージデバイスとして実現されているケースにおいては、フラッシュストレージデバイス3は、例えば、この書き込み先ブロックの先頭のページから最後のページの順序でデータが書き込まれるように書き込み先ページを決定する。
【0027】
フラッシュストレージデバイス3によって管理される複数の書き込み先ブロックは、このフラッシュストレージデバイス3を共有する複数のエンドユーザ(クライアント)によってそれぞれ使用され得る。この場合、フラッシュストレージデバイス3においては、フラッシュストレージデバイス3を共有するエンドユーザの数と同数の、またはそれ以上の数の書き込み先ブロックが同時にオープンされる。
【0028】
図2は、フラッシュストレージデバイス3の構成例を示す。
フラッシュストレージデバイス3は、コントローラ4および不揮発性メモリ(NAND型フラッシュメモリ)5を備える。フラッシュストレージデバイス3は、ランダムアクセスメモリ、例えば、DRAM6も備えていてもよい。
【0029】
NAND型フラッシュメモリ5は、マトリクス状に配置された複数のメモリセルを含むメモリセルアレイを含む。NAND型フラッシュメモリ5は、2次元構造のNAND型フラッシュメモリであってもよいし、3次元構造のNAND型フラッシュメモリであってもよい。
【0030】
NAND型フラッシュメモリ5のメモリセルアレイは、複数のブロックBLK0~BLKm-1を含む。ブロックBLK0~BLKm-1の各々は複数のページ(ここではページP0~Pn-1)を含む。ブロックBLK0~BLKm-1は、消去単位として機能する。ブロックは、「消去ブロック」、「物理ブロック」、または「物理消去ブロック」と称されることもある。ページP0~Pn-1は、データ書き込み動作およびデータ読み込み動作の単位である。
【0031】
コントローラ4は、ToggleNANDフラッシュインタフェース、オープンNANDフラッシュインタフェース(ONFI)のようなNANDインタフェース13を介して、不揮発性メモリであるNAND型フラッシュメモリ5に電気的に接続されている。コントローラ4は、NAND型フラッシュメモリ5を制御するように構成されたメモリコントローラとして動作する。このコントローラ4は、System-on-a-chip(SoC)のような回路によって実現されてもよい。
【0032】
NAND型フラッシュメモリ5は、図3に示すように、複数のNAND型フラッシュメモリチップ(NAND型フラッシュメモリダイ)を含んでいてもよい。個々のNAND型フラッシュメモリチップは独立して動作可能である。このため、NAND型フラッシュメモリチップは、並列動作可能な単位として機能する。図3においては、NANDインタフェース13に16個のチャンネルCh.1~Ch.16が接続されており、16個のチャンネルCh.1~Ch.16の各々に2つのNAND型フラッシュメモリチップが接続されている場合が例示されている。この場合、チャンネルCh.1~Ch.16に接続された16個のNAND型フラッシュメモリチップ#1~#16がバンク#0として編成されてもよく、またチャンネルCh.1~Ch.16に接続された残りの16個のNAND型フラッシュメモリチップ#17~#32がバンク#1として編成されてもよい。バンクは、複数のメモリモジュールをバンクインタリーブによって並列動作させるための単位として機能する。図3の構成例においては、16チャンネルと、2つのバンクを使用したバンクインタリーブとによって、最大32個のNAND型フラッシュメモリチップを並列動作させることができる。
【0033】
消去動作は、一つのブロック(物理ブロック)の単位で実行されてもよいし、並列動作可能な複数の物理ブロックの集合を含む並列単位(スーパーブロック)の単位で実行されてもよい。一つの並列単位、つまり複数の物理ブロックの集合を含む一つのスーパーブロックは、これに限定されないが、NAND型フラッシュメモリチップ#1~#32から一つずつ選択される計32個の物理ブロックを含んでいてもよい。なお、NAND型フラッシュメモリチップ#1~#32の各々はマルチプレーン構成を有していてもよい。例えば、NAND型フラッシュメモリチップ#1~#32の各々が、2つのプレーンを含むマルチプレーン構成を有する場合には、一つのスーパーブロックは、NAND型フラッシュメモリチップ#1~#32に対応する64個のプレーンから一つずつ選択される計64個の物理ブロックを含んでいてもよい。
【0034】
図4には、32個の物理ブロック(ここでは、NAND型フラッシュメモリチップ#1内の物理ブロックBLK2、NAND型フラッシュメモリチップ#2内の物理ブロックBLK3、NAND型フラッシュメモリチップ#3内の物理ブロックBLK7、NAND型フラッシュメモリチップ#4内の物理ブロックBLK4、NAND型フラッシュメモリチップ#5内の物理ブロックBLK6、…、NAND型フラッシュメモリチップ#32内の物理ブロックBLK3)を含む一つのスーパーブロック(SB)が例示されている。
【0035】
書き込み先ブロックは一つの物理ブロックであってもよいし、一つのスーパーブロックであってもよい。なお、一つのスーパーブロックが一つの物理ブロックのみを含む構成が利用されてもよく、この場合には、一つのスーパーブロックは一つの物理ブロックと等価である。
【0036】
次に、図2のコントローラ4の構成について説明する。
コントローラ4は、ホストインタフェース11、CPU12、NANDインタフェース13、およびDRAMインタフェース14、直接メモリアクセスコントローラ(DMAC)15、ECCエンコード/デコード部16等を含む。これらホストインタフェース11、CPU12、NANDインタフェース13、DRAMインタフェース14、DMAC15、ECCエンコード/デコード部16は、バス10を介して相互接続される。
【0037】
このホストインタフェース11は、ホスト2との通信を実行するように構成されたホストインタフェース回路である。このホストインタフェース11は、例えば、PCIeコントローラ(NVMeコントローラ)であってもよい。あるいは、フラッシュストレージデバイス3がEthernet(登録商標)を介してホスト2に接続される構成においては、ホストインタフェース11は、NVMe over Fabrics(NVMeOF)コントローラであってもよい。
【0038】
ホストインタフェース11は、ホスト2から様々なコマンドを受信する。これらコマンドには、ライトコマンド、リードコマンド、他の様々なコマンドが含まれる。
CPU12は、ホストインタフェース11、NANDインタフェース13、DRAMインタフェース14を制御するように構成されたプロセッサである。CPU12は、フラッシュストレージデバイス3の電源オンに応答してNAND型フラッシュメモリ5または図示しないROMから制御プログラム(ファームウェア)をDRAM6にロードし、そしてこのファームウェアを実行することによって様々な処理を行う。なお、ファームウェアはコントローラ4内の図示しないSRAM上にロードされてもよい。このCPU12は、ホスト2からの様々なコマンドを処理するためのコマンド処理等を実行することができる。CPU12の動作は、CPU12によって実行される上述のファームウェアによって制御される。なお、コマンド処理の一部または全部は、コントローラ4内の専用ハードウェアによって実行してもよい。
【0039】
CPU12は、ライト制御部21およびリード制御部22として機能することができる。なお、これらライト制御部21およびリード制御部22の各々一部または全部も、コントローラ4内の専用ハードウェアによって実現されてもよい。
ライト制御部21は、NAND型フラッシュメモリ5の複数のブロックから割り当てられた複数の書き込み先ブロックを管理する。現代のNAND型フラッシュメモリの多くにおいては、プログラムディスターブを低減するための複雑な書き込み動作が実行される場合が多い。このため、現代のNAND型フラッシュメモリの多くにおいては、たとえブロック内のあるページにデータが書き込まれても、このページに書き込まれたデータは、その書き込み直後には正常に読み出すことができず、このページに後続する1以上のページへのデータ書き込みの完了後に、このページからのデータの読み出しが可能となるケースがある。
【0040】
また、現代のNAND型フラッシュメモリにおいては、同じライトデータをNAND型フラッシュメモリに複数回転送することを伴う複数段階の書き込み動作が適用されるケースもある。このような複数段階の書き込み動作の例の一つとしては、フォギー・ファイン書き込み動作が挙げられる。
【0041】
複数段階の書き込み動作は、少なくとも、フォギー書き込み動作のような第1段階の書き込み動作とファイン書き込み動作のような第2段階の書き込み動作とを含む。フォギー書き込み動作は各メモリセルの閾値分布を荒く設定する書き込み動作であり、ファイン書き込み動作は各メモリセルの閾値分布を調整する書き込み動作である。さらに、フォギー書き込み動作とファイン書き込み動作との間に、中間の書き込み動作が実行されてもよい。
【0042】
ライト制御部21は、フォギー・ファイン書き込み動作のように同じライトデータをNAND型フラッシュメモリ5に複数回転送することを伴う書き込み動作(複数段階の書き込み動作)によってこのライトデータを書き込み先ブロックに書き込んでもよいし、フル・シーケンス書き込み動作または他の様々な種類の書き込み動作のようにライトデータをNAND型フラッシュメモリ5に1回転送することを伴う書き込み動作によってこのライトデータを書き込み先ブロックに書き込んでもよい。
【0043】
ライト制御部21は、ライトコマンドそれぞれをホスト2から受信する。これら各ライトコマンドは、書き込むべきライトデータが存在するホスト2のメモリ上の位置と、ライトデータの長さと、ライトデータが書き込まれるべきブロックを示す識別子とを指定する。
【0044】
ライトデータの長さは、個々のライトコマンド毎に異なる。例えば、あるライトコマンドは例えば1Mバイト程度の大きなサイズのライトデータの書き込みを要求するかもしれないし、他のライトコマンドは例えば4Kバイト程度の小さなサイズのライトデータの書き込みを要求するかもしれない。このため、もしフラッシュストレージデバイス3が個々のライトコマンドによって指定されたサイズのライトデータそのものをホスト2からフラッシュストレージデバイス3の内部バッファに単純に転送するという方法が使用されたならば、ある特定の書き込み先ブロックへ書き込むべき大きなサイズのライトデータによって内部バッファが長い時間専有されてしまい、他の各書き込み先ブロックへのデータ書き込み動作が実行できなくなる可能性がある。この結果、複数の書き込み先ブロックを同時に利用することが困難となる。
【0045】
そこで、ライト制御部21は、個々のライトコマンドによって指定されたサイズとは関係なく、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位で、ホスト2からライトデータを取得する。NAND型フラッシュメモリ5のデータ書き込み単位とは、NAND型フラッシュメモリ5へのデータ書き込みのためのデータ転送サイズを意味する。NAND型フラッシュメモリ5のデータ書き込み単位の典型例は、ページサイズ(例えば16Kバイト)である。あるいは、複数ページに対応するデータサイズ(ページサイズの数倍のサイズ)がデータ書き込み単位として使用されてもよい。
【0046】
ある書き込み先ブロックを指定するライトコマンドに関連付けられたライトデータのサイズがNAND型フラッシュメモリ5のデータ書き込み単位よりも小さい場合には、ライト制御部21は、この書き込み先ブロックを指定する次のライトコマンドを待つ。この書き込み先ブロックを指定する幾つかのライトコマンドに関連付けられた幾つかのライトデータの総サイズがNAND型フラッシュメモリ5のデータ書き込み単位以上になると、ライト制御部21は、これらライトデータを結合することによって得られる、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズのデータを、ホスト2から取得する。例えば、同じ書き込み先ブロックを指定する4つのライトコマンドが4つの4Kバイトライトデータの書き込みをそれぞれ要求するケースにおいては、ライト制御部21は、これら4つの4Kバイトライトデータを互いに結合することによって得られる16Kバイトのライトデータをホスト2から取得してもよい。この場合、ライト制御部21は、4回のDMA転送によってこれら4つの4Kバイトライトデータをホスト2から順次取得してもよい。そして、ライト制御部21は、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有する、この取得したライトデータを、NAND型フラッシュメモリ5に転送し、このライトデータをNAND型フラッシュメモリ5のこの書き込み先ブロックに書き込む。
【0047】
一方、ある書き込み先ブロックを指定するライトコマンドに関連付けられたライトデータのサイズがNAND型フラッシュメモリ5のデータ書き込み単位よりも大きい場合には、ライト制御部21は、このライトデータを複数のライトデータ(複数のデータ部)に分割することによって得られる、データ書き込み単位と同じサイズを有する1つ以上のライトデータを得る。そして、ライト制御部21は、データ書き込み単位と同じサイズを有する、得られた一つのライトデータをホスト2から取得する。この場合、ライト制御部21は、1回のDMA転送によってこの得られたライトデータをホスト2から取得してもよい。そして、ライト制御部21は、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有する、この取得したライトデータを、NAND型フラッシュメモリ5に転送し、このライトデータをNAND型フラッシュメモリ5のこの書き込み先ブロックに書き込む。
【0048】
このように、ライト制御部21は、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドを受信した後、受信されたライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータ(複数のデータ部)に分割、または受信されたライトコマンド内の2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有するライトデータを、ホスト2から取得する。
【0049】
ここで、ライトデータの分割/結合とは、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドの各々によってそれぞれ指定されるデータポインタおよび長さに基づいて、これら一つ以上のライトコマンドに関連付けられたライトデータの集合を、その先頭からNAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有する境界で区切り、各境界に対応するホストメモリ内の位置を特定する動作を意味する。
【0050】
したがって、個々のライトコマンドによって指定されるライトデータのサイズとは関係なく、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位でホスト2からライトデータを取得できるので、この取得したライトデータをNAND型フラッシュメモリ5に即座に転送することができる。よって、たとえある書き込み先ブロックへの大きなサイズのライトデータの書き込みを要求するライトコマンドが受信されても、これによって他の書き込み先ブロックへのデータ書き込み動作が滞ることを防ぐことができる。
【0051】
また、内部バッファがフラッシュストレージデバイス3内に存在しない、または内部バッファの容量がほぼゼロに近い、というバッファレスの構成をフラッシュストレージデバイス3に適用することが可能となる。
なお、複数の書き込み先ブロックが異なるNAND型フラッシュメモリチップにそれぞれ属している場合においては、ライトデータをNAND型フラッシュメモリ5に転送する動作は、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップにこのライトデータを転送することを意味する。
【0052】
また、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位でホスト2からライトデータを取得するという上述の処理は、個々の書き込み先ブロックに対する書き込み動作の進行に合わせて実行される。
つまり、ライト制御部21は、書き込み先ブロック毎に書き込み動作の進行を管理する。そして、ライト制御部21は、例えば、ある書き込み先ブロックの次の書き込み先ページへのデータ転送が可能となる度に、この書き込み先ブロック内の書き込み先ページの位置を進め、次の書き込み先ページに書き込むべきライトデータをホストメモリから取得し、この取得したライトデータを書き込み先ブロックに書き込む。
【0053】
さらに、ライト制御部21は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送する書き込み動作)の全てが終了した場合、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
【0054】
例えば、一つのライトコマンドに関連付けられた大きなサイズのライトデータが、複数のライトデータ部に分割された場合には、これら複数のライトデータ部の全ての書き込みに必要な全てのデータ転送および全ての書き込み動作が終了した場合に、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返される。この結果、コマンド完了をライトコマンドの単位でホスト2に正しく通知することができる。よって、一つのライトコマンドによって書き込みが要求された大きなサイズのライトデータが複数のライトデータ部に分割されて処理された場合であっても、ホスト2は、この一つのライトコマンドのコマンド完了を示す一つのレスポンスのみをフラッシュストレージデバイス3から正しく受け取ることができる。よって、ホスト2は、コマンド完了が通知されたライトコマンドに対応するライトデータをホストメモリから破棄するという単純な処理を行うだけでよい。
【0055】
また、ライト制御部21は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能になった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
【0056】
例えば、ある書き込み先ブロックのあるページに書き込まれたデータが、後続の1以上のページにデータが書き込まれた後に読み出し可能となるケースを想定する。この場合、ライト制御部21は、一つのライトコマンドに関連付けられた大きなサイズのライトデータを分割する事によって得られた複数のライトデータ部の全ての書き込みに必要な全てのデータ転送および全ての書き込み動作が終了した時点では、コマンド完了を示すレスポンスをホスト2に返さない。そして、後続の1以上のページにデータが書き込まれた後に、ライト制御部21は、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
【0057】
これにより、ホスト2は、コマンド完了が通知されたライトコマンドに対応するライトデータをホストメモリから破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータが読み出し可能になるまでこのライトデータをホストメモリ内に維持することができる。
【0058】
リード制御部22は、ホスト2からリードコマンドを受信し、この受信されたリードコマンドによって指定されたデータをNAND型フラッシュメモリ5または内部バッファ31から読み出す。
リードコマンドによって指定されたデータ(第1のデータ)が、書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了していないデータ、または書き込み動作の全てが終了しているがNAND型フラッシュメモリ5からまだ読み出し可能となっていないデータである場合、リード制御部22は、この第1のデータが内部バッファ31に存在するか否かを判定する。第1のデータが内部バッファ31に存在しない場合、リード制御部22は、この第1のデータをホストメモリから取得し、この取得した第1のデータを内部バッファ31に格納し、この取得した第1のデータを内部バッファ31からホスト2に返す。これにより、ホスト2は、リードしたいデータがNAND型フラッシュメモリ5から読み出し可能な状態であるか否かを管理するための複雑な処理を行うことなく、リードしたいデータを指定するリードコマンドをフラッシュストレージデバイス3に送出するという単純な処理を行うだけで、リードしたいデータをフラッシュストレージデバイス3から受け取ることができる。
【0059】
NANDインタフェース13は、CPU12の制御の下、NAND型フラッシュメモリ5を制御するように構成されたメモリ制御回路である。
DRAMインタフェース14は、CPU12の制御の下、DRAM6を制御するように構成されたDRAM制御回路である。DRAM6の記憶領域の一部は、内部バッファ(共有キャッシュ)31として利用されてもよい。この内部バッファ(共有キャッシュ)31は複数の書き込み先ブロックによって共有され、ホスト2から受信される任意のライトコマンドに関連付けられたライトデータを一時的に格納するために使用される。なお、上述したように、内部バッファ(共有キャッシュ)31がフラッシュストレージデバイス3内に存在しない、または内部バッファ(共有キャッシュ)31の容量がほぼゼロに近い、というバッファレス構成がフラッシュストレージデバイス3に適用されてもよい。
【0060】
また、DRAM6の記憶領域の他の一部は、ブロック管理テーブル32、不良情報管理テーブル33の格納のために使用されてもよい。ブロック管理テーブル32は、NAND型フラッシュメモリ5内の複数のブロックそれぞれに対応する複数の管理テーブルを含む。各管理テーブルは、この管理テーブルに対応するブロックに含まれている複数のデータにそれぞれ対応する複数の有効/無効管理情報を含む。各有効/無効管理情報は、この有効/無効管理情報に対応するデータが有効データまたは無効データのいずれであるかを示す。不良情報管理テーブル33は、不良ブロックのリストを管理する。
【0061】
これら内部バッファ(共有キャッシュ)31、ブロック管理テーブル32、不良情報管理テーブル33は、コントローラ4内の図示しないSRAMに格納されてもよい。
DMAC15は、CPU12の制御の下、ホストメモリと内部バッファ(共有キャッシュ)31との間のデータ転送を実行する。ホストメモリから内部バッファ(共有キャッシュ)31にライトデータを転送すべき場合には、CPU12は、ホストメモリ上の位置を示す転送元アドレス、データサイズ、内部バッファ(共有キャッシュ)31上の位置を示す転送先アドレスをDMAC15に対して指定する。
【0062】
ECCエンコード/デコード部16は、NAND型フラッシュメモリ5にデータをライトすべき時、データ(書き込むべきデータ)をエンコード(ECCエンコード)することによってこのデータにエラー訂正コード(ECC)を冗長コードとして付加する。NAND型フラッシュメモリ5からデータがリードされた時、ECCエンコード/デコード部16は、リードされたデータに付加されたECCを使用して、このデータのエラー訂正を行う(ECCデコード)。
【0063】
図5は、ホスト2に含まれるライトデータバッファ51およびフラッシュトランスレーション部52とフラッシュストレージデバイス3に含まれるライト制御部21、DMAC15および内部バッファ(共有キャッシュ)31との関係を示す。
ホスト2は、ライトデータをホストメモリ上のライトデータバッファ51に格納し、そしてライトコマンドをフラッシュストレージデバイス3に発行する。このライトコマンドは、このライトデータが存在するライトデータバッファ51上の位置を示すデータポインタと、このライトデータを識別するタグ(例えばLBA)と、このライトデータの長さと、ライトデータが書き込まれるべきブロックを示す識別子(ブロックアドレス、またはストリームID)とを含んでいてもよい。
【0064】
フラッシュストレージデバイス3においては、ライト制御部21の制御の下、このブロックの識別子によって指定される書き込み先ブロックの書き込み動作の進行に合わせて、ライトデータバッファ51から内部バッファ(共有キャッシュ)31へのデータ転送がDMAC15によって実行される。このデータ転送は、上述したように、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位で実行される。ライト制御部21の制御の下、書き込むべきライトデータが、内部バッファ(共有キャッシュ)31から、この書き込み先ブロックを含むNAND型フラッシュメモリチップに転送され、そして、ライト制御部21からこのNAND型フラッシュメモリチップに書き込み指示用のNANDコマンドが送出される。
【0065】
フラッシュストレージデバイス3がタイプ#2-ストレージデバイスとして実現されている場合には、ライト制御部21は、ホスト2から受信されるブロック割り当て要求に応答して、フリーブロックの一つを書き込み先ブロックとしてホスト2に割り当てる処理も実行する。ブロック割り当て要求は、QoSドメインIDを含んでいてもよい。ライト制御部21は、このQoSドメインIDに属するフリーブロックの一つを書き込み先ブロックとして決定し、この書き込み先ブロックのブロックアドレスをホスト2に通知する。これにより、ホスト2は、このブロックアドレスと、データポインタと、タグ(例えばLBA)と、長さとを指定するライトコマンドを発行することができる。このライトデータがこの書き込み先ブロックに書き込まれた後、ライト制御部21は、このライトデータが書き込まれた書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれたこの書き込み先ブロック内のページを示すページアドレスと、このライトデータのタグ(例えばLBA)とをホスト2に通知する。ホスト2のフラッシュトランスレーション部52は、タグ(例えばLBA)それぞれとNAND型フラッシュメモリ5の物理アドレス(ブロックアドレス、ページアドレス、等)それぞれとの間のマッピングを管理するアドレス変換テーブルであるLUT404Aを含む。ブロックアドレス、ページアドレス、およびタグ(例えばLBA)がフラッシュストレージデバイス3から通知された場合、フラッシュトランスレーション部52は、LUT404Aを更新し、通知されたタグ(例えばLBA)に、通知された物理アドレス(ブロックアドレス、ページアドレス)をマッピングする。フラッシュトランスレーション部52は、LUT404Aを参照することによって、リード要求に含まれるタグ(例えばLBA)を物理アドレス(ブロックアドレス、ページアドレス)に変換することができ、これによって物理アドレスを含むリードコマンドをフラッシュストレージデバイス3に発行することができる。
【0066】
図6は、フラッシュストレージデバイス3によって実行されるI/Oコマンド処理を示す。
上述したように、本実施形態では、フラッシュストレージデバイス3はタイプ#1-ストレージデバイス、タイプ#2-ストレージデバイス、タイプ#3-ストレージデバイスのいずれであってもよいが、図6では、フラッシュストレージデバイス3がタイプ#1-ストレージデバイスである場合を例示する。
【0067】
ホスト2によって発行される各ライトコマンドは、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各ライトコマンドはI/Oコマンドキュー42に入れられる。ホスト2によって発行される各リードコマンドも、ブロックアドレス、ページアドレス、データポインタ、長さを含む。発行された各リードコマンドもI/Oコマンドキュー42に入れられる。
【0068】
ホスト2がライトデータの書き込みをフラッシュストレージデバイス3に要求することを望む場合、ホスト2は、まず、このライトデータをホストメモリ上のライトデータバッファ51に格納し、そして、ライトコマンドをフラッシュストレージデバイス3に発行する。このライトコマンドは、このライトデータが書き込まれるべき書き込み先ブロックを示すブロックアドレスと、このライトデータが書き込まれるべきこの書き込み先ブロック内のページを示すページアドレスと、このライトデータが存在するライトデータバッファ51内の位置を示すデータポインタと、このライトデータの長さとを含む。
【0069】
フラッシュストレージデバイス3は、プログラム/リードシーケンサ41を含む。このプログラム/リードシーケンサ41は、上述のライト制御部21およびリード制御部22によって実現される。プログラム/リードシーケンサ41は、I/Oコマンドキュー42に入れられたコマンドそれぞれを任意の順序で実行することができる。
【0070】
プログラム/リードシーケンサ41が、ある同じ書き込み先ブロックを指定する1以上のライトコマンドをI/Oコマンドキュー42から取得した後、プログラム/リードシーケンサ41は、この書き込み先ブロックの書き込み動作の進行に合わせて、この書き込み先ブロックに書き込むべき次のライトデータ(例えば、1ページサイズ分のライトデータ)を内部バッファ(共有キャッシュ)31またはライトデータバッファ51から取得するための転送要求を内部バッファ(共有キャッシュ)31に送出する。この転送要求は、データポインタと長さとを含んでいてもよい。この転送要求に含まれるデータポインタは、1つのライトコマンドに関連付けられたライトデータを分割、または同じ書き込み先ブロックを指定する2以上のライトコマンドに関連付けられた2以上のライトデータを結合する処理によって算出される。つまり、プログラム/リードシーケンサ41は、同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドに関連付けられたライトデータの集合を、その先頭からNAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有する境界で区切り、各境界に対応するホストメモリ内の位置を特定する。これによって、プログラム/リードシーケンサ41は、書き込み単位と同じサイズの単位でライトデータをホスト2から取得することができる。
【0071】
この転送要求に含まれるデータポインタは、この1ページサイズ分のライトデータが存在するライトデータバッファ51上の位置を示す。この1ページサイズ分のライトデータは、この書き込み先ブロックを指定する複数のライトコマンドに関連付けられた複数の小さなサイズのライトデータの集合であってもよいし、この書き込み先ブロックを指定する一つのライトコマンドに関連付けられた大きなサイズのライトデータの一部分であってもよい。
【0072】
さらに、プログラム/リードシーケンサ41は、この1ページサイズ分のライトデータが書き込まれるべき書き込み先ブロックのブロックアドレスと、この1ページサイズ分のライトデータが書き込まれるべきページのページアドレスとを内部バッファ(共有キャッシュ)31に送出する。
【0073】
フラッシュストレージデバイス3のコントローラ4は内部バッファ(共有キャッシュ)31を制御するキャッシュコントローラを含んでいてもよい。この場合、このキャッシュコントローラは内部バッファ(共有キャッシュ)31をあたかも制御ロジックであるかのように動作させることができる。内部バッファ(共有キャッシュ)31と複数の書き込み先ブロック#0、#1、#2、…、#nとの間には、複数のフラッシュコマンドキュー43が存在する。これらフラッシュコマンドキュー43は、複数のNAND型フラッシュメモリチップにそれぞれ対応づけられている。
【0074】
内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する。
この転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在するならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、この1ページサイズ分のライトデータを、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに転送する。さらに、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のNANDコマンド(フラッシュライトコマンド)を、フラッシュコマンドキュー43を介して送出する。フラッシュコマンドキュー43は、NAND型フラッシュメモリチップ毎に設けられている。このため、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータが書き込まれるべき書き込み先ブロックを含むNAND型フラッシュメモリチップに対応するフラッシュコマンドキュー43に、この書き込み先ブロックのブロックアドレス、このライトデータが書き込まれるべきページアドレス、書き込み指示用のNANDコマンド(フラッシュライトコマンド)を入れる。
【0075】
なお、内部バッファ(共有キャッシュ)31からNAND型フラッシュメモリチップへのこの1ページサイズ分のライトデータの転送が、このライトデータをNAND型フラッシュメモリチップに書き込むために必要な最終回のデータ転送であるならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、このライトデータを内部バッファ(共有キャッシュ)31から破棄し、このライトデータが格納されていた領域を空き領域として確保する。NAND型フラッシュメモリチップにデータを一回転送することを伴う書き込み動作(例えば、フル・シーケンス書き込み動作、等)によってライトデータを書き込み先ブロックに書き込むケースにおいては、NAND型フラッシュメモリチップへの初回のデータ転送が最終回のデータ転送となる。一方、NAND型フラッシュメモリチップにデータを複数回転送することを伴う書き込み動作(例えば、フォギー・ファイン書き込み動作)によってライトデータを書き込み先ブロックに書き込むケースにおいては、最後のファイン書き込みのために必要なNAND型フラッシュメモリチップへのデータ転送が最終回のデータ転送となる。
【0076】
次に、転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合について説明する。
この転送要求によって指定されたこの1ページサイズ分のライトデータが内部バッファ(共有キャッシュ)31に存在しないならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、この転送要求(データポインタ、長さ)をDMAC15に送出する。この転送要求(データポインタ、長さ)に基づいて、DMAC15は、この1ページサイズ分のライトデータをホストメモリ上のライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送する。このデータ転送が終了すると、DMAC15は、転送完了(Done)と、このデータポインタ、この長さとを、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラに通知する。
【0077】
内部バッファ(共有キャッシュ)31に空き領域が存在するならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、DMA転送によってライトデータバッファ51から取得されたライトデータを、この空き領域に格納する。
内部バッファ(共有キャッシュ)31に空き領域が存在しないならば、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、内部バッファ(共有キャッシュ)31内の最も古いライトデータを内部バッファ(共有キャッシュ)31から破棄し、最も古いライトデータが格納されていた領域を空き領域として確保する。そして、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、DMA転送によってライトデータバッファ51から取得されたライトデータを、この空き領域に格納する。
【0078】
フォギー・ファイン書き込み動作のような多段階の書き込み動作が使用されるケースにおいては、キャッシュコントローラは、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータのうちで、最も古いライトデータを破棄する。
【0079】
データ書き込み量の少ない書き込み先ブロックへのデータ書き込み動作の進行速度に比べ、データ書き込み量の多い書き込み先ブロックへのデータ書き込み動作の進行速度は速くなる傾向がある。このため、データ書き込み量の多い書き込み先ブロックに書き込まれるべきライトデータは頻繁にライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送される。この結果、この最も古いライトデータは、ホスト2から書き込まれるデータ量が比較的少ない書き込み先ブロックへのライトデータである可能性が高い。したがって、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータのうちで最も古いライトデータを破棄するという方法を使用することにより、ホスト2とフラッシュストレージデバイス3との間のデータトラフィックを効率よく低減することが可能となる。
【0080】
なお、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータの中から破棄すべきライトデータを選択するためのアルゴリズムは、最も古いデータを選択するファースト・イン・ファースト・アウトに限定されず、LRU、ランダムのような他のアルゴリズムを使用してもよい。
【0081】
プログラム/リードシーケンサ41は、各NAND型フラッシュメモリチップからステータス、つまり、書き込み完了(Done)、書き込み失敗(Error)、ブロックアドレス、ページアドレス、を受信する。そして、これらステータスに基づいて、プログラム/リードシーケンサ41は、ライトコマンド毎に、このライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリチップに同じデータを1回または複数回転送する書き込み動作)の全てが終了したか否かを判定する。あるライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了したならば、プログラム/リードシーケンサ41は、このライトコマンドのコマンド完了を示すレスポンス(Done)をホスト2に送信する。このコマンド完了を示すレスポンス(Done)は、このライトコマンドを一意に識別するコマンドIDを含む。
【0082】
次に、リードコマンドの処理について説明する。
リードコマンドは、リードすべきデータが格納されているブロックを示すブロックアドレスと、このデータが格納されているページを示すページアドレスと、このデータが転送されるべきホストメモリ上のリードデータバッファ53内の位置を示すデータポインタと、このデータの長さとを含む。
【0083】
プログラム/リードシーケンサ41は、リードコマンドによって指定されたブロックアドレスおよびページアドレスを内部バッファ(共有キャッシュ)31に送出し、リードコマンドによって指定されたデータの読み出しを内部バッファ(共有キャッシュ)31に要求する。
【0084】
内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、NAND型フラッシュメモリチップに、このブロックアドレスと、このページアドレスと、リード指示用のNANDコマンド(フラッシュリードコマンド)を、フラッシュコマンドキュー43を介して送出する。NAND型フラッシュメモリチップから読み出されたデータは、DMAC15によってリードデータバッファ53に転送される。
【0085】
なお、リードコマンドによって指定されたデータが、書き込み動作が終了していないデータ、または書き込み動作の全てが終了しているがNAND型フラッシュメモリ5からまだ読み出し可能となっていないデータである場合、内部バッファ(共有キャッシュ)31、つまりキャッシュコントローラは、内部バッファ(共有キャッシュ)31にこのデータが存在するか否かを判定してもよい。内部バッファ(共有キャッシュ)31にこのデータが存在するならば、このデータが内部バッファ(共有キャッシュ)31から読み出され、そしてDMAC15によってリードデータバッファ53に転送される。
【0086】
一方、内部バッファ(共有キャッシュ)31にこのデータが存在しないならば、このデータは、まず、DMAC15によってライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送される。そして、このデータが内部バッファ(共有キャッシュ)31から読み出され、そしてDMAC15によってリードデータバッファ53に転送される。
【0087】
図7は、フラッシュストレージデバイス3によって実行される複数段階の書き込み動作を示す。
ここでは、4つのワード線を往復する場合のフォギー・ファイン書き込み動作を例示する。また、ここでは、NAND型フラッシュメモリ5が、メモリセル当たりに4ビットのデータを格納するQLC-フラッシュである場合を想定する。NAND型フラッシュメモリ5内の一つの特定の書き込み先ブロック(ここでは、書き込み先ブロックBLK#1)に対するフォギー・ファイン書き込み動作は以下のように実行される。
【0088】
(1)まず、4ページ(P0~P3)分のライトデータがページ単位でNAND型フラッシュメモリ5に転送され、この書き込み先ブロックBLK#1内のワード線WL0に接続された複数のメモリセルに、これら4ページ(P0~P3)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0089】
(2)次いで、次の4ページ(P4~P7)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL1に接続された複数のメモリセルに、これら4ページ(P4~P7)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0090】
(3)次いで、次の4ページ(P8~P11)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL2に接続された複数のメモリセルに、これら4ページ(P8~P11)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0091】
(4)次いで、次の4ページ(P12~P15)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL3に接続された複数のメモリセルに、これら4ページ(P12~P15)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0092】
(5)ワード線WL3に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL0に戻り、ワード線WL0に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL0に対するフォギー書き込み動作で使用された4ページ(P0~P3)分のライトデータと同じ4ページ(P0~P3)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL0に接続された複数のメモリセルに、これら4ページ(P0~P3)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP0~P3に対するフォギー・ファイン書き込み動作が終了する。
【0093】
(6)次いで、次の4ページ(P16~P19)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL4に接続された複数のメモリセルに、これら4ページ(P16~P19)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0094】
(7)ワード線WL4に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL1に戻り、ワード線WL1に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL1に対するフォギー書き込み動作で使用された4ページ(P4~P7)分のライトデータと同じ4ページ(P4~P7)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL1に接続された複数のメモリセルに、これら4ページ(P4~P7)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP4~P7に対するフォギー・ファイン書き込み動作が終了する。
【0095】
(8)次いで、次の4ページ(P20~P23)分のライトデータがこのNAND型フラッシュメモリ5にページ単位で転送され、この書き込み先ブロックBLK#1内のワード線WL5に接続された複数のメモリセルに、これら4ページ(P20~P23)分のライトデータを書き込むためのフォギー書き込み動作が実行される。
【0096】
(9)ワード線WL5に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、書き込み対象のワード線はワード線WL2に戻り、ワード線WL2に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。そして、ワード線WL2に対するフォギー書き込み動作で使用された4ページ(P8~P11)分のライトデータと同じ4ページ(P8~P11)分のライトデータがページ単位でNAND型フラッシュメモリ5に再び転送され、この書き込み先ブロックBLK#1内のワード線WL2に接続された複数のメモリセルに、これら4ページ(P8~P11)分のライトデータを書き込むためのファイン書き込み動作が実行される。これにより、ページP8~P11に対するフォギー・ファイン書き込み動作が終了する。
【0097】
図8は、書き込み先ブロックBLK#1へのデータの書き込み順序を示す。
ここでは、図7と同様に、4つのワード線を往復する場合のフォギー・ファイン書き込み動作が実行される場合を想定する。
図8の左部に示されるデータd0、データd1、データd2、データd3、データd4、データd5、データd6、データd7、…、データd252、データd253、データd254、データd255は、書き込み先ブロックBLK#1を指定する複数のライトコマンドそれぞれに対応する複数のライトデータを示している。ここでは、図示の簡単化のために、全てのライトデータが同じサイズを有している場合が想定されている。
【0098】
図8の右部は、書き込み先ブロックBLK#1へのデータの書き込み順序を示している。書き込み動作は、ワード線WL0に接続された複数のメモリセルへのデータd0の書き込み(フォギー書き込み)、ワード線WL1に接続された複数のメモリセルへのデータd1の書き込み(フォギー書き込み)、ワード線WL2に接続された複数のメモリセルへのデータd2の書き込み(フォギー書き込み)、ワード線WL3に接続された複数のメモリセルへのデータd3の書き込み(フォギー書き込み)、ワード線WL0に接続された複数のメモリセルへのデータd0の書き込み(ファイン書き込み)、ワード線WL4に接続された複数のメモリセルへのデータd4の書き込み(フォギー書き込み)、ワード線WL1に接続された複数のメモリセルへのデータd1の書き込み(ファイン書き込み)、ワード線WL5に接続された複数のメモリセルへのデータd5の書き込み(フォギー書き込み)、ワード線WL2に接続された複数のメモリセルへのデータd2の書き込み(ファイン書き込み)、…という順序で実行される。
【0099】
図9は、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズの単位でライトデータをホスト2からフラッシュストレージデバイス3に転送する動作を示す。
図9の左部に示されるデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10、…は、書き込み先ブロックBLK#1を指定する10個のライトコマンドにそれぞれ対応する10個のライトデータを示している。ライトデータの長さ(サイズ)は、個々のライトコマンド毎に異なる。図9では、データd1、データd2、データd3、データd4の各々が4Kバイトのサイズを有し、データd5が8Kバイトのサイズを有し、データd6が40Kバイトのサイズを有し、データd7が16Kバイトのサイズを有し、データd8、データd9の各々が8Kバイトのサイズを有し、データd10が1Mバイトのサイズを有する場合が想定されている。
【0100】
ホスト2から受信される各ライトコマンドはデータポインタ、長さ、ブロック識別子(例えばブロックアドレス)を含むので、フラッシュストレージデバイス3のコントローラ4は、ホスト2から受信されるライトコマンドを、複数の書き込み先ブロックにそれぞれ対応する複数のグループに分類することができる。上述のデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10、…は、書き込み先ブロックBLK#1に対応するグループに分類された10個のライトコマンドにそれぞれ対応している。これら10個のライトコマンドは、書き込み先ブロックBLK#1を示すブロック識別子(例えばブロックアドレス)を含むライトコマンドである。
【0101】
フラッシュストレージデバイス3のコントローラ4は、書き込み先ブロックBLK#1を指定するこれらライトコマンド内のデータポインタおよび長さに基づいて、データd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10がそれぞれ存在するライトデータバッファ51上の位置、およびデータd1、データd2、データd3、データd4、データd5、データd6、データd7、データd8、データd9、データd10それぞれの長さを管理する。そして、コントローラ4は、一つのライトコマンドに関連付けられた大きなサイズのライトデータを複数のライトデータ(複数のデータ部)に分割、または2以上のライトコマンドにそれぞれ関連付けられた小さなサイズの2以上のライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有するライトデータを、ホスト2から取得する。
【0102】
図9では、コントローラ4は、最初に、各々が4Kバイトのサイズを有するデータd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、4回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd1の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd1の先頭位置を指定する転送元アドレスは、データd1に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd2の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd2の先頭位置を指定する転送元アドレスは、データd2に対応するライトコマンド内のデータポインタによって表される。3回目のDMA転送では、データd3の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd3の先頭位置を指定する転送元アドレスは、データd3に対応するライトコマンド内のデータポインタによって表される。4回目のDMA転送では、データd4の先頭位置を指定する転送元アドレスと、データ長=4KBがDMAC15にセットされてもよい。データd4の先頭位置を指定する転送元アドレスは、データd4に対応するライトコマンド内のデータポインタによって表される。
【0103】
そして、コントローラ4は、DMA転送によって取得されるこの16Kバイトライトデータ(d1、d2、d3、d4)を、書き込み先ブロックBLK#1のページP0に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP1に変更し、8Kバイトのサイズを有するデータd3と、データd6内の先頭の8Kバイトデータd6-1とを互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、2回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd5の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd5の先頭位置を指定する転送元アドレスは、データd5に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd6-1の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd6-1の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタによって表される。
【0104】
そして、コントローラ4は、この16Kバイトライトデータ(d5、d6-1)を、書き込み先ブロックBLK#1のページP1に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP2に変更し、データd6の残りの32Kバイトデータのうちの最初の16Kバイトデータd6-2をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd6-2の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd6-2の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタの値に8KB分のオフセットを加算することによって求めることができる。
【0105】
そして、コントローラ4は、この16Kバイトライトデータ(d6-2)を、書き込み先ブロックBLK#1のページP2に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP3に変更し、データd6の残りの16Kバイトデータd6-3をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd6-3の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd6-3の先頭位置を指定する転送元アドレスは、データd6に対応するライトコマンド内のデータポインタの値に24KB分のオフセットを加算することによって求めることができる。
【0106】
そして、コントローラ4は、この16Kバイトライトデータ(d6-3)を、書き込み先ブロックBLK#1のページP3に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
そして、コントローラ4は、フォギー書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
【0107】
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP4に変更し、16Kバイトのサイズを有するデータd7をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd7の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データ7の先頭位置を指定する転送元アドレスは、データd7に対応するライトコマンド内のデータポインタによって表される。
【0108】
そして、コントローラ4は、この16Kバイトライトデータ(d7)を、書き込み先ブロックBLK#1のページP4に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP5に変更し、8Kバイトのサイズを有するデータd8と、8Kバイトのサイズを有するデータd9とを互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、2回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。最初のDMA転送では、データd8の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd8の先頭位置を指定する転送元アドレスは、データd8に対応するライトコマンド内のデータポインタによって表される。2回目のDMA転送では、データd9の先頭位置を指定する転送元アドレスと、データ長=8KBがDMAC15にセットされてもよい。データd9の先頭位置を指定する転送元アドレスは、データd9に対応するライトコマンド内のデータポインタによって表される。
【0109】
そして、コントローラ4は、この16Kバイトライトデータ(d8、d9)を、書き込み先ブロックBLK#1のページP5に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP6に変更し、データd10内の先頭の16Kバイトデータd10-1をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd10-1の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd10-1の先頭位置を指定する転送元アドレスは、データd10に対応するライトコマンド内のデータポインタによって表される。
【0110】
そして、コントローラ4は、この16Kバイトライトデータ(d10-1)を、書き込み先ブロックBLK#1のページP6に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP7に変更し、データd10内の次の16Kバイトデータd10-2をホスト2のライトデータバッファ51から取得する。この場合、コントローラ4は、これに限定されないが、例えば、1回のDMA転送によって、この16Kバイトライトデータをホスト2のライトデータバッファ51から内部バッファ31に転送してもよい。このDMA転送では、データd10-2の先頭位置を指定する転送元アドレスと、データ長=16KBがDMAC15にセットされてもよい。データd10-2の先頭位置を指定する転送元アドレスは、データd10に対応するライトコマンド内のデータポインタの値に16KB分のオフセットを加算することによって求めることができる。
【0111】
そして、コントローラ4は、この16Kバイトライトデータ(d10-2)を、書き込み先ブロックBLK#1のページP7に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。
そして、コントローラ4は、フォギー書き込み動作によって4ページ分のデータ(P4~P7)を書き込み先ブロックBLK#1のワード線WL1に接続された複数のメモリセルに書き込む。
【0112】
このように、コントローラ4は、書き込み先ブロックBLK#1の書き込み動作の進行に合わせて、書き込み先ブロックBLK#1の書き込み先ページに転送すべき16Kバイトデータをホスト2から取得する。
そして、ワード線WL3に接続された複数のメモリセルに対するフォギー書き込み動作が終了すると、ワード線WL0に接続された複数のメモリセルに対するファイン書き込み動作の実行が可能となる。コントローラ4は、書き込み先ブロックBLK#1の次の書き込み先ページをページP1に変更し、上述と同様の手順で、ライトデータ(P0~P3)をページ単位でNAND型フラッシュメモリ5に再び転送し、そしてファイン書き込み動作によってこれら4ページ分のライトデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
【0113】
これにより、最初の6つのライトコマンド、つまりデータd1に対応するライトコマンド、データd2に対応するライトコマンド、データd3に対応するライトコマンド、データd4に対応するライトコマンド、データd5に対応するライトコマンド、データd6に対応するライトコマンドの各々に関しては、各ライトコマンドに関連付けせけたライトデータ全体に対するフォギー・ファイン書き込み動作の全てが終了し、且つデータd1~d6の各々はNAND型フラッシュメモリ5から読み出し可能となる。このため、コントローラ4は、最初の6つのライトコマンドにそれぞれに対応する6つのコマンド完了レスポンスをホスト2に返す。
【0114】
なお、図9では、書き込み先ブロックBLK#1を指定するライトコマンドそれぞれに関連づけられたライトデータを、書き込み先ブロックBLK#1の書き込み動作の進行に合わせて16Kバイトの単位でホスト2からフラッシュストレージデバイス3に転送する動作を説明したが、他の各書き込み先ブロックBLK#に関しても、図9で説明した動作と同様の動作が実行される。
【0115】
図10のフローチャートは、フラッシュストレージデバイス3によって実行されるデータ書き込み処理の手順を示す。
フラッシュストレージデバイス3のコントローラ4は、データポインタ、長さ、ブロック識別子(例えばブロックアドレス)を各々が含むライトコマンドそれぞれをホスト2から受信する(ステップS11)。
【0116】
次いで、コントローラ4は、特定の書き込み先ブロックを指定する一つのライトコマンドに対応する大きなサイズのライトデータを2以上のデータ部に分割、またはこの特定の書き込み先ブロックを指定する2以上のライトコマンドに対応する2以上のライトデータを結合し、これによってNAND型フラッシュメモリ5の書き込み単位(データ転送サイズ)と同じサイズの単位でデータをホスト2からフラッシュストレージデバイス3に転送する(ステップS12)。ステップS12では、図9で説明したように、例えば、小さなサイズを有する幾つかのライトデータ部を互いに結合することによって得られる一つの16Kバイトデータ、あるいは大きなサイズを有するライトデータを分割することによって得られる幾つかの16Kバイトデータの一つが、ホスト2からフラッシュストレージデバイス3に転送される。フラッシュストレージデバイス3が内部バッファ31を含む構成であるケースにおいては、ホスト2からフラッシュストレージデバイス3に転送される各16バイトライトデータは内部バッファ31に格納される。また、ステップS12では、小さなサイズを有する幾つかのライトデータ部を互いに結合するために、コントローラ4は、ある書き込み先ブロックを指定する識別子を有する先行するライトコマンドに関連付けられたライトデータのサイズが書き込み単位(例えば16Kバイト)よりも小さい場合、この書き込み先ブロックを指定する識別子を有する後続のライトコマンドの受信を待つ。
【0117】
コントローラ4は、ホスト2から転送された16KバイトデータをNAND型フラッシュメモリ5に転送し、この16Kバイトデータを、この特定の書き込み先ブロックに書き込む(ステップS13)。
そして、コントローラ4は、この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能になったか否かを判定する(ステップS14)。
【0118】
この特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作の全てが終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能になったならば、コントローラ4は、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップS15)。
【0119】
なお、フォギー・ファイン書き込み動作のように、NAND型フラッシュメモリ5に同じデータを複数回転送することを伴う書き込み動作が使用されるケースにおいては、コントローラ4は、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(複数段階の書き込み動作)の全てが終了した場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返してもよい。フォギー・ファイン書き込み動作では、あるデータのファイン書き込み動作が終了すると、このデータを正しくNAND型フラッシュメモリ5から読み出すことが可能となるからである。
【0120】
また、あるページに対するデータのファイン書き込み動作が終了してもこのデータを読み出すことができず、後続の1以上のページへのデータの書き込みの終了後にこのデータを正しく読み出すことが可能となる、というタイプのNAND型フラッシュメモリが用いられてもよい。この場合には、特定の書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(複数段階の書き込み動作)の全てが終了し、且つ後続の1以上のページへのデータの書き込みによってこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返してもよい。
【0121】
このように、本実施形態では、あるライトコマンドに関連付けられたライトデータがホスト2からフラッシュストレージデバイス3に転送された時点でこのライトコマンドのコマンド完了を示すレスポンスがホスト2に返されるのではなく、あるライトコマンドに関連付けられたライトデータ全体の書き込みに必要な書き込み動作全てが終了するか、またはこのライトデータ全体の書き込み動作全てが終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返される。
【0122】
これにより、ホスト2は、コマンド完了が通知されたライトコマンドに対応するライトデータをライトデータバッファ51から破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータがフラッシュストレージデバイス3から読み出し可能になるまで、このライトデータをライトデータバッファ51に維持することができる。
【0123】
図11のフローチャートは、ホスト2によって実行されるライトデータ破棄処理の手順を示す。
ホスト2は、ライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス3から受信したか否かを判定する(ステップS21)。あるライトコマンドのコマンド完了を示すレスポンスをフラッシュストレージデバイス3から受信した場合(ステップS22)、ホスト2は、このライトコマンドに関連付けられたライトデータをライトデータバッファ51から破棄する(ステップS22)。
【0124】
図12は、ある書き込み先ブロックを指定する最後のライトコマンドが受信されてから閾期間、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合に、フラッシュストレージデバイス3によって実行されるダミーデータ書き込み処理を示す。
【0125】
図12の左部に示されるデータd1、データd2、データd3、データd4は、書き込み先ブロックBLK#1を指定する4個のライトコマンドそれぞれに対応する4個のライトデータを示している。図12では、データd1、データd2、データd3、データd4の各々が4Kバイトのサイズを有する場合が想定されている。
【0126】
(1)コントローラ4は、データd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをホスト2のライトデータバッファ51から取得する。そして、コントローラ4は、この16Kバイトライトデータを、書き込み先ブロックBLK#1のページP0に書き込まれるべきデータとしてNAND型フラッシュメモリ5に転送する。書き込み先ブロックBLK#1を指定する最後のライトコマンド、つまりデータd4の書き込みを要求したライトコマンド、が受信されてから閾期間、書き込み先ブロックBLK#1を指定する後続のライトコマンドが受信されない場合、コントローラ4は、最後のライトコマンドのコマンド完了を示すレスポンスを所定時間内にホスト2に返すことを可能にするために、書き込み先ブロックBLK#1内の1以上のページにダミーデータを書き込み、次のライトデータが書き込まれるべき書き込み先ブロックBLK#1内の書き込み先ページの位置を進める。例えば、コントローラ4は、ページP1~P3に対応する3ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。
【0127】
(2)次いで、コントローラ4は、ページP4~P7に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P4~P7)を書き込み先ブロックBLK#1のワード線WL1に接続された複数のメモリセルに書き込む。
【0128】
(3)次いで、コントローラ4は、ページP8~P11に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P8~P11)を書き込み先ブロックBLK#1のワード線WL2に接続された複数のメモリセルに書き込む。
【0129】
(4)次いで、コントローラ4は、ページP12~P15に対応する4ページ分のダミーデータをページ単位でNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によって4ページ分のデータ(P12~P15)を書き込み先ブロックBLK#1のワード線WL3に接続された複数のメモリセルに書き込む。
【0130】
(5)次いで、コントローラ4は、データd1、データd2、データd3、データd4を互いに結合することによって得られる16Kバイトライトデータをライトデータバッファ51または内部バッファ31からNAND型フラッシュメモリ5に転送し、さらに、WL0のフォギー書き込み動作で使用した3ページ分のダミーデータ(P0~P3)と同じ3ページ分のダミーデータ(P0~P3)をページ単位でNAND型フラッシュメモリ5に転送する。そして、コントローラ4は、ファイン書き込み動作によって4ページ分のデータ(P0~P3)を書き込み先ブロックBLK#1のワード線WL0に接続された複数のメモリセルに書き込む。これにより、データd1、データd2、データd3、データd4の複数段階の書き込み動作が全て完了し、データd1、データd2、データd3、データd4がNAND型フラッシュメモリ5読み出し可能となる。コントローラ4は、データd1の書き込みを要求した最初のライトコマンドのコマンド完了を示すレスポンスと、データd2の書き込みを要求した2番目のライトコマンドのコマンド完了を示すレスポンスと、データd3の書き込みを要求した3番目のライトコマンドのコマンド完了を示すレスポンスと、データd4の書き込みを要求した4番目のライトコマンドのコマンド完了を示すレスポンスとをホスト2に返す。
【0131】
本実施形態では、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位でライトデータがホスト2からフラッシュストレージデバイス3に転送され、あるライトコマンドのライトデータ全体の書き込み動作の全てが終了した時点で、またはこのライトデータ全体の書き込み動作の全てが終了し且つこのライトデータ全体が読み出し可能となった時点で、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返される。このため、例えば、小さなライトデータをある書き込み先ブロックに書き込むことを要求するライトコマンドがホスト2からフラッシュストレージデバイス3に発行された後にしばらくの間、この書き込み先ブロックを指定する後続のライトコマンドがホスト2から発行されない場合には、このライトコマンドのタイムアウトエラーが起こる可能性がある。本実施形態では、コントローラ4は、あるブロック識別子を有する最後のライトコマンドがホスト2から受信されてから閾期間このブロック識別子を有する次のライトコマンドが受信されない場合、ダミーデータを、このブロック識別子に対応する書き込み先ブロック内の次の1以上の未書き込みページに書き込む。したがって、必要に応じて、この書き込み先ブロックの書き込み動作を進行させることができるので、ライトコマンドのタイムアウトエラーが起こることを防止することができる。
【0132】
図13のフローチャートは、フラッシュストレージデバイス3によって実行されるダミーデータ書き込み処理の手順を示す。ここでは、フォギー・ファイン書き込み動作のような複数段階の書き込み動作によってデータが書き込み先ブロックに書き込まれる場合を想定する。
【0133】
フラッシュストレージデバイス3のコントローラ4は、ある書き込み先ブロックを指定する最後のライトコマンドに関連付けられたライトデータをフォギー書き込み動作のような第1段階の書き込み動作によってこの書き込み先ブロックに書き込む。この最後のライトコマンドの受信から閾期間(Th)、この書き込み先ブロックを指定する次のライトコマンドが受信されない場合(ステップS31のYES)、コントローラ4は、最後のライトコマンドに関連付けられたライトデータが書き込まれた書き込み先ブロック内のページに後続する1以上のページにダミーデータを書き込み、これによって、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める(ステップS32)。この書き込み先ブロックへのダミーデータの書き込みによって書き込み先ページの位置が進み、これによって最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作(第2段階の書き込み動作)が実行可能となると、コントローラ4は、最後のライトコマンドに関連付けられたライトデータをライトデータバッファ51または内部バッファ(共有キャッシュ)31からNAND型フラッシュメモリ5に再び転送し、このライトデータのファイン書き込み動作を実行する(ステップS33)。
【0134】
最後のライトコマンドに関連付けられたライトデータのファイン書き込み動作が終了すると、つまりこのライトデータ全体の複数段階の書き込み動作の全てが終了すると、コントローラ4は、この最後のライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップS34)。
【0135】
このように、複数段階の書き込み動作によってライトデータを書き込み先ブロックに書き込むケースにおいては、コントローラ4は、最後のライトコマンドに関連付けられたライトデータの第2段階の書き込み動作が実行可能になるように、ダミーデータをこの書き込み先ブロック内の1以上のページに書き込み、次のライトデータが書き込まれるべきこの書き込み先ブロック内の書き込み先ページの位置を進める。
【0136】
図14は、内部バッファ(共有キャッシュ)31を使用してコントローラ4によって実行されるデータ転送動作を示す。
内部バッファ(共有キャッシュ)31は、複数の書き込み先ブロックBLK#1、BLK#2、…、BLK#nによって共有される。フラッシュストレージデバイス3のコントローラ4は、書き込み先ブロックBLK#1、BLK#2、…、BLK#nの各々について以下の処理を実行する。
【0137】
以下では、書き込み先ブロックBLK#1を例示して説明する。
コントローラ4が、書き込み先ブロックBLK#1を指定する1以上のライトコマンドを受信した後、コントローラ4は、書き込み先ブロックBLK#1を指定する一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または書き込み先ブロックBLK#1を指定する2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ51から取得する。そして、コントローラ4は、ライトデータバッファ51から取得される、各々がNAND型フラッシュメモリ5の書き込み単位と同じサイズを有する複数のライトデータを内部バッファ(共有キャッシュ)31に格納する。
【0138】
ライトデータバッファ51は、必ずしも、ホストメモリ上の連続する一つの領域から構成される必要は無く、図14に示されているように、複数のライトデータバッファ51-1、51-2、…、51-nによって実現されてもよい。
コントローラ4は、書き込み先ブロックBLK#1に次に書き込むべきライトデータ(第1のライトデータ)を内部バッファ(共有キャッシュ)31から取得し、第1のライトデータをNAND型フラッシュメモリ5に転送し、フォギー書き込み動作のような第1段階の書き込み動作によってこのライトデータを書き込み先ブロックBLK#1に書き込む。
【0139】
内部バッファ(共有キャッシュ)31にホスト2からのライトデータを効率よく蓄積できるようにするため、ホスト2から取得されるライトデータを格納するための空き領域が内部バッファ(共有キャッシュ)31に無い場合には、コントローラ4は、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータ(フォギーステートのライトデータ)を破棄して、空き領域を内部バッファ(共有キャッシュ)31に確保する。
【0140】
例えば、内部バッファ(共有キャッシュ)31に空き領域がない状態でホスト2から任意の書き込み先ブロックを指定する新たなライトコマンドを受信した場合に、コントローラ4は、フォギー書き込み動作のような第1段階の書き込み動作が終了している内部バッファ(共有キャッシュ)31内のライトデータ(フォギーステートのライトデータ)を破棄して、新たなライトコマンドに対応するライトデータを格納可能な空き領域を内部バッファ(共有キャッシュ)31に確保してもよい。
【0141】
例えば、内部バッファ(共有キャッシュ)31全体が多数のフォギーステートのライトデータで満たされている状態でホスト2から新たなライトコマンドを受信した場合には、コントローラ4は、これらフォギーステートのライトデータの中から破棄すべき特定のライトデータを選択してもよく、この選択したライトデータを破棄してもよい。これにより、制限された容量を有する内部バッファ(共有キャッシュ)31を、複数の書き込み先ブロック間で効率よく共有することができる。
【0142】
コントローラ4は、第1のライトデータのファイン書き込み動作のような第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合には、第1のライトデータを取得するための要求(転送要求:DMA転送要求)をホスト2に送信することによってホスト2のライトデータバッファ51から再び取得する。この取得された第1のライトデータは内部バッファ(共有キャッシュ)31に格納されてもよい。そして、コントローラ4は、取得された第1のライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作のような第2段階の書き込み動作によってこの第1のライトデータを書き込み先ブロックBLK#1に書き込む。
【0143】
第1のライトデータのファイン書き込み動作のような第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在している場合には、コントローラ4は、この内部バッファ(共有キャッシュ)31から第1のライトデータを取得し、取得された第1のライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作のような第2段階の書き込み動作によってこの第1のライトデータを書き込み先ブロックBLK#1に書き込む。
【0144】
NAND型フラッシュメモリ5への第1のライトデータの最終回のデータ転送(ここでは、ファイン書き込み動作のためのデータ転送)を行った後、コントローラ4は、この第1のライトデータを内部バッファ(共有キャッシュ)31から破棄することによって内部バッファ(共有キャッシュ)31に空き領域を確保する。あるいは、コントローラ4はこの第1のライトデータのファイン書き込み動作が終了した場合に、この第1のライトデータを内部バッファ(共有キャッシュ)31から破棄してもよい。
【0145】
さらに、コントローラ4は、あるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了した場合、あるいはこのライトデータ全体のファイン書き込み動作が終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
【0146】
内部バッファ(共有キャッシュ)31はある限られた容量を有しているが、書き込み先ブロックの数がある一定数以下であるならば、第2段階の書き込み動作を実行すべき時点において第1のライトデータが内部バッファ(共有キャッシュ)31に存在する確率(ヒット率)は比較的高い。したがって、同じライトデータをホスト2からフラッシュストレージデバイス3に複数回転送すること無く、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を実行することができる。これにより、ホスト2とフラッシュストレージデバイス3との間のデータトラフィックを削減できるので、データ書き込みの度に同じライトデータをホスト2からフラッシュストレージデバイス3に複数回転送する場合に比し、フラッシュストレージデバイス3のI/O性能を向上することができる。
【0147】
書き込み先ブロックの数は、ホスト2を利用するクライアントの数と同数であってよい。この場合、あるクライアントに対応するデータはこのクライアントに対応する書き込み先ブロックに書き込まれ、他のクライアントに対応するデータは別の書き込み先ブロックに書き込まれる。したがって、ホスト2を利用するクライアントの数が増えるにつれて、内部バッファ(共有キャッシュ)31のヒット率は低下する。しかし、第1のライトデータが内部バッファ(共有キャッシュ)31に存在しない場合(ミス)には、コントローラ4はこの第1のライトデータをホスト2から取得する。したがって、クライアントの数が増加しても、フォギー・ファイン書き込み動作のような複数段階の書き込み動作を正常に実行することができる。
【0148】
よって、フラッシュストレージデバイス3は、フラッシュストレージデバイス3を共有するクライアントの数の増加(つまり、同時に利用可能な書き込み先ブロックの数の増加)に柔軟に対応でき且つホスト2とフラッシュストレージデバイス3との間のデータトラフィックを削減することができる。
【0149】
ここでは、書き込み先ブロックBLK#1にデータを書き込むための書き込み処理について説明したが、他の全ての書き込み先ブロックの各々に対しても同様の書き込み処理が実行される。
図15は、内部バッファ(共有キャッシュ)31を使用してコントローラ4よって実行される書き込み処理と内部バッファ(共有キャッシュ)31内のライトデータを破棄する処理とを示す。
【0150】
図15においては、図示の簡単化のために、内部バッファ(共有キャッシュ)31が、領域101~109を含む場合が例示されている。また、図15においては、NAND型フラッシュメモリ5がQLC-フラッシュとして実現されており、4ページ分のデータサイズの単位でライトデータを破棄する処理を例示する。しかし、本実施形態は、これに限定されず、例えば1ページ分のデータサイズの単位でライトデータをライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送する処理が実行されてもよく、例えば1ページ分のデータサイズの単位でライトデータを破棄する処理が実行されてもよい。また、図15においては、3つのワード線WLを往復しながら、フォギー・ファイン書き込み動作が実行される場合を想定する。
【0151】
内部バッファ(共有キャッシュ)31の領域101、102にそれぞれ格納されたライトデータD1、D2の各々は、書き込み先ブロックBLK#11を指定する1以上のライトコマンドに関連付けられている。ライトデータD1、D2の各々は、例えば、4ページ分のサイズを有していてもよい。コントローラ4は、(1)4ページ分のライトデータD1をフォギー書き込み動作によって書き込み先ブロックBLK#11のページP0-P3(ワード線WL0に接続された複数のメモリセル)に書き込み、そして、(2)4ページ分のライトデータD2をフォギー書き込み動作によって書き込み先ブロックBLK#11のページP4-P7(ワード線WL1に接続された複数のメモリセル)に書き込む。
【0152】
内部バッファ(共有キャッシュ)31の領域103、104、105にそれぞれ格納されたライトデータD11、D12、D13の各々は、書き込み先ブロックBLK#101を指定する1以上のライトコマンドに関連付けられている。ライトデータD11、D12、D13の各々は、例えば、4ページ分のサイズを有していてもよい。コントローラ4は、(3)4ページ分のライトデータD11をフォギー書き込み動作によって書き込み先ブロックBLK#101のページP0-P3(ワード線WL0に接続された複数のメモリセル)に書き込み、(4)4ページ分のライトデータD12をフォギー書き込み動作によって書き込み先ブロックBLK#101のページP4-P7(ワード線WL1に接続された複数のメモリセル)に書き込み、(5)4ページ分のライトデータD13をフォギー書き込み動作によって書き込み先ブロックBLK#101のページP8-P11(ワード線WL2に接続された複数のメモリセル)に書き込む。
【0153】
書き込み先ブロックBLK#101のワード線WL2に対する4ページ分のライトデータD13のフォギー書き込み動作が終了した後、コントローラ4は、(6)4ページ分のライトデータD11をファイン書き込み動作によって書き込み先ブロックBLK#101のページP0-P3(ワード線WL0に接続された複数のメモリセル)に書き込む。ライトデータD11のファイン書き込み動作が終了すると、あるいは書き込み先ブロックBLK#101を含むNAND型フラッシュメモリチップへのライトデータD11のファイン書き込み動作のための転送(最終回の転送)が終了すると、このライトデータD11のステートはフォギーステートからファインステートに変わる。そして、コントローラ4は、(7)ファイン書き込み動作が終了したこのライトデータD11(ファインステートのライトデータ)を内部バッファ(共有キャッシュ)31から破棄して領域103を空き領域にする。
【0154】
図16は、内部バッファ(共有キャッシュ)31に空き領域がない場合にコントローラ4によって実行される内部バッファ(共有キャッシュ)31内のライトデータを破棄する処理を示す。
図16の上部は、内部バッファ(共有キャッシュ)31全体が、フォギー書き込み動作(第1段階の書き込み動作)が終了しているフォギーステートのライトデータ(D21~D23、D31~D33、D41~D43)で満たされており、内部バッファ(共有キャッシュ)31に空き領域がない状態を示している。
【0155】
この状態でライトデータバッファ51から内部バッファ(共有キャッシュ)31へライトデータを転送することが必要とされた場合、例えばホスト2から新たなライトコマンドを受信した場合、コントローラ4は、図16の中部に示すように、フォギー書き込み動作(第1段階の書き込み動作)が終了しているライトデータ(フォギーステートのライトデータ)の中から最も古いライトデータ(ここではライトデータD11)を破棄すべきライトデータとして選択し、この最も古いライトデータ(ここではライトデータD11)を内部バッファ(共有キャッシュ)31から破棄する。
【0156】
そして、フラッシュストレージデバイス3のコントローラ4は、図16の下部に示すように、ライトデータD11を破棄することによって空き領域となった領域101に、ライトデータバッファ51から受信される新たなライトデータ(ここではライトデータD51)を格納する。
【0157】
なお、フォギー書き込み動作が終了しているライトデータ(フォギーステートのライトデータ)のうちで最も古いライトデータを破棄する代わりに、フォギー書き込み動作が終了しているライトデータ(フォギーステートのライトデータ)のうちで、NAND型フラッシュメモリ5への残りデータ転送回数が最も少ないライトデータを破棄してもよい。この場合、例えば、NAND型フラッシュメモリ5に同じデータを3回転送することを伴う複数段階の書き込み動作が使用されるケースにおいては、NAND型フラッシュメモリ5への2回の転送が既に実行済みのデータが、NAND型フラッシュメモリ5への1回の転送のみが実行済みのデータよりも優先して、破棄すべきデータとして選択される。
【0158】
図17のフローチャートは、内部バッファ(共有キャッシュ)31を使用してコントローラ4によって実行されるデータ書き込み処理の手順を示す。
コントローラ4は、データポインタと、ライトデータの長さと、複数の書き込み先ブロックのいずれか一つを指定する識別子(例えばブロックアドレス)とを各々が含む1つ以上のライトコマンドをホスト2から受信する(ステップS101)。同じ書き込み先ブロックを示す識別子を有する一つ以上のライトコマンドを受信した後、コントローラ4は、これらライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータに分割、または同じ書き込み先ブロックを示す識別子を有する2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5の書き込み単位と同じサイズを有するライトデータを、ライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送する(ステップS102)。
【0159】
コントローラ4は、この書き込み先ブロックに次に書き込むべきライトデータを内部バッファ(共有キャッシュ)31から取得し、このライトデータをNAND型フラッシュメモリ5に転送し、フォギー書き込み動作によってこの第1のライトデータをこの書き込み先ブロックに書き込む(ステップS103、S104)。NAND型フラッシュメモリ5がQLC-フラッシュとして実現されている場合には、ステップS103では、4ページ分のライトデータがページ単位でNAND型フラッシュメモリ5に転送され、ステップS104では、4ページ分のライトデータがフォギー書き込み動作によってこの書き込み先ブロック内の書き込み対象の一つのワード線に接続された複数のメモリセルに書き込まれる。
【0160】
なお、ライトデータバッファ51から内部バッファ(共有キャッシュ)31へのライトデータの転送は、各書き込み先ブロックの書き込み動作の進行に合わせて実行される。例えば、ある書き込み先ブロックのあるページに書き込むべきライトデータをNAND型フラッシュメモリチップに転送する動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31へ転送されてもよい。あるいは、ある書き込み先ブロックのあるページに書き込むべきライトデータをこの書き込み先ブロックを含むNAND型フラッシュメモリチップに転送する動作が終了し、且つこのライトデータをこの書き込み先ブロックに書き込む動作が終了した場合に、この書き込み先ブロックの次のページに書き込むべきライトデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31へ転送されてもよい。
【0161】
フォギー書き込み動作が行われたこのライトデータのファイン書き込み動作を開始すべき時点において、コントローラ4は、このライトデータが、内部バッファ(共有キャッシュ)31に存在するか否かを判定する。
このライトデータが内部バッファ(共有キャッシュ)31に存在するならば(ステップS106のYES)、コントローラ4は、このライトデータを内部バッファ(共有キャッシュ)31から取得し、このライトデータをNAND型フラッシュメモリ5に転送し、ファイン書き込み動作によってこのライトデータをこの書き込み先ブロックに書き込む(ステップS107、S108、S109)。これにより、このライトデータはNAND型フラッシュメモリ5から読み出し可能となる。
【0162】
コントローラ4は、ライトコマンド毎に、そのライトデータ全体のフォギー・ファイン書き込み動作が終了し且つそのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能となったか否かを判定する。そして、コントローラ4は、フォギー・ファイン書き込み動作が終了し且つNAND型フラッシュメモリ5から読み出し可能となったライトデータに対応するライトコマンドのコマンド完了を示すレスポンスをホスト2に返す(ステップS110)。もしステップS109の処理によってあるライトコマンドに関連付けられたライトデータ全体のファイン書き込み動作が終了したならば、ステップS110では、このライトコマンドのコマンド完了を示すレスポンスがホスト2に返されてもよい。
【0163】
図18のフローチャートは、コントローラ4によって実行されるデータ読み出し処理の手順を示す。
上述したように、コントローラ4は、ホスト2から受信されるリードコマンドによって指定されたデータが、その書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送する書き込み動作)の全てが終了していないデータ、またはその書き込み動作の全てが終了しているがNAND型フラッシュメモリ5からまだ読み出し可能となっていないデータである場合、このデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する。このデータが内部バッファ(共有キャッシュ)31に存在しない場合、コントローラ4は、このデータをライトデータバッファ51から取得し、このデータを内部バッファ(共有キャッシュ)31に格納し、このデータを内部バッファ(共有キャッシュ)31からホスト2に返す。
【0164】
具体的には、以下のデータ読み出し処理が実行される。
コントローラ4がホスト2からリードコマンドを受信した場合(ステップS121のYES)、コントローラ4は、このリードコマンドによって指定されたデータが、その書き込み動作の全てが終了し、且つNAND型フラッシュメモリ5から読み出し可能なデータであるか否かを判定する(ステップS122)。
【0165】
このデータがNAND型フラッシュメモリ5から読み出し可能であるならば(ステップS122のYES)、コントローラ4は、このデータをNAND型フラッシュメモリ5から読み出し、読み出されたデータをホスト2に返す(ステップS126)。ステップS126では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。
【0166】
このデータがNAND型フラッシュメモリ5から読み出し可能でないならば(ステップS122のNO)、コントローラ4は、このデータが内部バッファ(共有キャッシュ)31に存在するか否かを判定する(ステップS123)。
このデータが内部バッファ(共有キャッシュ)31に存在するならば(ステップS123のYES)、コントローラ4は、このデータを内部バッファ(共有キャッシュ)31から読み出し、この読み出したデータをホスト2に返す(ステップS124)。
【0167】
ステップS124では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。
このデータが内部バッファ(共有キャッシュ)31に存在しないならば(ステップS123のNO)、コントローラ4は、このデータをライトデータバッファ51から取得し、内部バッファ(共有キャッシュ)31に格納する(ステップS125)。ステップS125では、DMAC15によってこのデータがライトデータバッファ51から内部バッファ(共有キャッシュ)31の空き領域に転送される。内部バッファ(共有キャッシュ)31の空き領域が無い場合には、内部バッファ(共有キャッシュ)31の空き領域を確保する処理が実行される。そして、コントローラ4は、このデータを内部バッファ(共有キャッシュ)31から読み出し、この読み出したデータをホスト2に返す(ステップS124)。ステップS124では、コントローラ4は、この読み出されたデータを、リードコマンドに含まれるデータポインタによって指定されるリードデータバッファ53内の位置に転送する。
【0168】
図19は、タイプ#2-ストレージデバイスとして実現されたフラッシュストレージデバイス3に適用されるデータ書き込み動作およびデータ読み出し動作を示す。
このデータ書き込み動作では、ホスト2が書き込み先ブロックを指定し、且つフラッシュストレージデバイス3が書き込み先ページを決定する。また、このデータ読み出し動作では、ホスト2がブロックアドレスとページアドレスとを指定する。
【0169】
ホスト2はフラッシュストレージデバイス3を管理するストレージ管理部404を含む。ストレージ管理部404はフラッシュストレージデバイス3にブロック割り当てコマンドおよびライトコマンドをフラッシュストレージデバイス3に送出する。
フラッシュストレージデバイス3のコントローラ4は、ブロック割り当て部701、およびページ割り当て部702を含む。ブロック割り当て部701、およびページ割り当て部702は、図2で説明したライト制御部21に含まれていてもよい。
【0170】
データ書き込み動作は以下の手順で実行される。
(1)ホスト2のストレージ管理部404がフラッシュストレージデバイス3にデータ(ライトデータ)を書き込むことが必要な時、ストレージ管理部404は、書き込み先ブロックとして使用可能なフリーブロックを割り当てるようにフラッシュストレージデバイス3に要求してもよい。ブロック割り当て部701がこの要求(ブロック割り当てコマンド)を受信した時、ブロック割り当て部701は、フリーブロック群の一つのフリーブロックを書き込み先ブロックとしてホスト2に割り当て、割り当てられた書き込み先ブロックのブロックアドレス(BLK#)をホスト2に通知する。
【0171】
(2)ホスト2のストレージ管理部404は、割り当てられた書き込み先ブロックを指定するブロックアドレスと、ライトデータを識別するタグと、このライトデータのデータ長と、データポインタとを含むライトコマンドを、フラッシュストレージデバイス3に送信する。また、ストレージ管理部404は、ライトデータをライトデータバッファ51に格納する。
【0172】
(3)ページ割り当て部702がライトコマンドを受信した時、ページ割り当て部702は、ライトコマンドによって指定されたブロックアドレスを有するブロック(書き込み先ブロック)内の書き込み先ページを示すページアドレスを決定する。コントローラ4は、ライトデータを、例えばページサイズの単位で、ライトデータバッファ51から内部バッファ(共有キャッシュ)31に転送し、書き込み先ブロック内のこの決定された書き込み先ページにこのライトデータを書き込む。
【0173】
(4)コントローラ4は、この書き込み先ページを示すページアドレスを、このライトコマンドのコマンド完了を示すレスポンスとしてホスト2に通知してもよい。あるいは、コントローラ4は、このライトコマンドに含まれているタグと、このライトコマンドに含まれているブロックアドレスと、決定されたページアドレスとの組を、このライトコマンドのコマンド完了を示すレスポンスとしてホスト2に通知してもよい。ホスト2においては、ライトデータが書き込まれた物理記憶位置を示す物理アドレス(ブロックアドレス、ページアドレス)が、このライトデータのタグにマッピングされるように、LUT404Aが更新される。
【0174】
データリード動作は以下の手順で実行される。
(1)’ホスト2がフラッシュストレージデバイス3からデータをリードすることが必要な時、ホスト2は、LUT404Aを参照することによって、リードすべきデータのタグに対応する物理アドレス(ブロックアドレス、ページアドレス)をLUT404Aから取得する。
【0175】
(2)’ホスト2は、取得されたブロックアドレスおよびページアドレスを指定するリードコマンドをフラッシュストレージデバイス3に送出する。フラッシュストレージデバイス3のコントローラ4がこのリードコマンドをホスト2から受信した時、コントローラ4は、ブロックアドレスおよびページアドレスに基づいて、データを、リード対象のブロック内のリード対象の物理記憶位置からリードする。
【0176】
図20は、タイプ#2-ストレージデバイスとして実現されたフラッシュストレージデバイス3に適用されるブロックアロケートコマンドを示す。
ブロックアロケートコマンドは、フラッシュストレージデバイス3に書き込み先ブロック(フリーブロック)の割り当てを要求するコマンド(ブロック割り当て要求)である。ホスト2は、ブロックアロケートコマンドをフラッシュストレージデバイス3に送信することによって、書き込み先ブロックを割り当てるようにフラッシュストレージデバイス3に要求し、これによってブロックアドレス(割り当てられた書き込み先ブロックのブロックアドレス)を取得することができる。
【0177】
図21は、ブロックアロケートコマンドに対するレスポンスを示す。
ブロックアロケートコマンドをホスト2から受信した時、フラッシュストレージデバイス3のコントローラ4は、フリーブロックリストから、ホスト2に割り当てるべきフリーブロックを選択し、選択したフリーブロックを書き込み先ブロックとして割り当て、そしてこの書き込み先ブロックのブロックアドレスを含むレスポンスをホスト2に返す。
【0178】
図22は、タイプ#2-ストレージデバイスとして実現されたフラッシュストレージデバイス3に適用されるライトコマンドを示す。
ライトコマンドは、フラッシュストレージデバイス3にデータの書き込みを要求するコマンドである。このライトコマンドは、コマンドID、ブロックアドレス、タグ、長さ、等を含んでもよい。
【0179】
コマンドIDはこのコマンドがライトコマンドであることを示すID(コマンドコード)であり、ライトコマンドにはライトコマンド用のコマンドIDが含まれる。
ブロックアドレスは、データが書き込まれるべき書き込み先ブロックを指定する物理アドレスである。
【0180】
タグは、書き込まれるべきライトデータを識別するための識別子である。このタグは、上述したように、LBAのような論理アドレスであってもよいし、キー・バリュー・ストアのキーであってもよい。タグがLBAのような論理アドレスである場合には、このライトコマンドに含まれる論理アドレス(開始LBA)は、ライトデータが書き込まれるべき、論理アドレス空間内の論理位置(最初の論理位置)を示す。
【0181】
長さは、書き込まれるべきライトデータの長さを示す。
ライトコマンドは、さらに、ライトデータが格納されているライトデータバッファ51内の位置を示すデータポインタを含む。
ホスト2からライトコマンドを受信した時、コントローラ4は、ライトコマンドによって指定されたブロックアドレスを有する書き込み先ブロック内の書き込み先位置(書き込み先ページ)を決定する。この書き込み先ページは、ページ書き込み順序の制約およびバッドページ等を考慮して決定される。そして、コントローラ4は、このライトコマンドに関連付けられたライトデータを、この書き込み先ブロック内のこの書き込み先位置(書き込み先ページ)に書き込む。
【0182】
図23は、図22のライトコマンドに対するレスポンスを示す。
このレスポンスは、ページアドレス、長さを含む。ページアドレスは、データが書き込まれた、書き込み先ブロック内の物理記憶位置を示す物理アドレスである。この物理アドレスは、ブロック内オフセット(つまりページアドレスとページ内オフセットとの組)によって表されてもよい。長さは、書き込まれたデータの長さを示す。
【0183】
あるいは、このレスポンスは、ページアドレス(ブロック内オフセット)および長さだけでなく、タグ、ブロックアドレスをさらに含んでいてもよい。タグは、図22のライトコマンドに含まれていたタグである。ブロックアドレスは、図22のライトコマンドに含まれていたブロックアドレスである。
【0184】
図24は、タイプ#2-ストレージデバイスとして実現されたフラッシュストレージデバイス3に適用されるリードコマンドを示す。
リードコマンドは、フラッシュストレージデバイス3にデータの読み出しを要求するコマンドである。このリードコマンドは、コマンドID、タグ、ブロックアドレス、ページアドレス、長さを含む。
【0185】
コマンドIDはこのコマンドがリードコマンドであることを示すID(コマンドコード)であり、リードコマンドにはリードコマンド用のコマンドIDが含まれる。
ブロックアドレスは、リードすべきデータが格納されているブロックを指定する。ページアドレスは、リードすべきデータが格納されているページを指定する。このページアドレスは、リードすべきデータが格納されているブロック内の物理記憶位置を示すブロック内オフセット(つまりページアドレスとページ内オフセットとの組)によって表されてもよい。長さは、リードすべきデータの長さを示す。
【0186】
さらに、リードコマンドは、リードコマンドによって指定されたデータが転送されるべきリードデータバッファ53内の位置を示すデータポインタを含む。
以上説明したように、本実施形態によれば、コントローラ4は、同じ書き込み先ブロックを示す第1の識別子を有する一つ以上のライトコマンドを受信した後、受信されたライトコマンド内の一つのライトコマンドに関連付けられたライトデータを複数のライトデータ(複数のデータ部)に分割、または受信されたライトコマンド内の2以上のライトコマンドにそれぞれ関連付けられたライトデータを互いに結合することによって得られる、NAND型フラッシュメモリ5のデータ書き込み単位と同じサイズを有するライトデータを、ホスト2から取得する。そして、コントローラ4は、同じデータを一回または複数回転送することを伴う第1の書き込み動作によって、この取得したライトテータを、第1の識別子によって指定される書き込み先ブロックに書き込む。
【0187】
したがって、個々のライトコマンドによって指定されるライトデータのサイズとは関係なく、NAND型フラッシュメモリ5のデータ書き込み単位と同じデータサイズの単位でホスト2からライトデータを取得でき、このライトデータをNAND型フラッシュメモリ5に転送することができる。よって、たとえある書き込み先ブロックへの大きなサイズのライトデータの書き込みを要求するライトコマンドが受信されても、これによって他の書き込み先ブロックへのデータ書き込み動作が滞ることを防ぐことができる。よって、複数の書き込み先ブロックの任意の一つをそれぞれ指定する複数のライトコマンドそれぞれを効率よく処理することが可能となり、大容量の内部バッファ31をデバイス側に設けずとも、あるいは内部バッファ31の容量がほぼゼロに近いバッファレスの構成であっても、複数の書き込み先ブロックを同時に利用することが可能となる。
【0188】
つまり、このようにホストメモリ(ライトデータバッファ51)をデバイス側で流用することにより、大容量の内部バッファ31をデバイス側に設けることなく、書き込み先ブロックの増加つまりフラッシュストレージデバイス3を共有するクライアントの数の増加に柔軟に対応できるようになり、フラッシュストレージデバイス3の限られたリソースで、同時に利用可能な書き込み先ブロックの数を上限を最大化することができる。
【0189】
また、コントローラ4は、ある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送する書き込み動作)の全てが終了した場合、またはある書き込み先ブロックを指定する一つのライトコマンドに関連付けられたライトデータ全体に対する書き込み動作(NAND型フラッシュメモリ5に同じデータを1回または複数回転送することを伴う書き込み動作)の全てが終了し且つこのライトデータ全体がNAND型フラッシュメモリ5から読み出し可能になった場合に、このライトコマンドのコマンド完了を示すレスポンスをホスト2に返す。
【0190】
これにより、ホスト2は、コマンド完了が通知されたライトコマンドに対応するライトデータをライトデータバッファ51から破棄するという単純な処理を行うだけで、各ライトコマンドのライトデータが読み出し可能になるまでこのライトデータをライトデータバッファ51内に維持することができる。
【0191】
また、コントローラ4は、ファイン書き込み動作のような第2段階の書き込み動作を実行すべき時点において、ライトすべきデータが内部バッファ31に存在しない場合にのみ、このライトデータをホスト2のライトデータバッファ51から内部バッファ31に再度転送する。したがって、データ書き込みの度に、同じデータをライトデータバッファ51から内部バッファ31に複数回転送する必要が無くなる。このように、ホスト2のライトデータバッファ51をデバイス側で流用することにより、複数段階の書き込み動作のために大容量の内部バッファ31をデバイス側に設けることなく、書き込み先ブロックの増加つまりフラッシュストレージデバイス3を共有するクライアントの数の増加に柔軟に対応でき、且つホスト2とフラッシュストレージデバイス3との間のデータトラフィックを削減することができる。
【0192】
また、本実施形態では、各ライトコマンドによって指定されたサイズのライトデータそのものをホスト2からフラッシュストレージデバイス3に転送し且つこのライトデータの転送が終了した時点でコマンド完了のレスポンスをホスト2に返すのではなく、フラッシュの書き込み単位と同じサイズの単位でホスト2からフラッシュストレージデバイス3にライトデータを転送し且つライトコマンド毎にコマンド完了のレスポンスをホスト2に返す構成であるので、NVMeのような標準規格を利用しつつ、書き込み先ブロックの増加つまりフラッシュストレージデバイス3を共有するクライアントの数の増加に柔軟に対応できる。
【0193】
なお、ライトデータバッファ51はホスト2上で実行される各仮想マシンからアクセスできる領域として実現することができる。また、ホスト2とフラッシュストレージデバイス3とがEthernetのようなネットワークを介して接続されるケースにおいては、ライトデータバッファ51と内部バッファ31との間のDMA転送は、リモートDMA転送によって実行されてもよい。
【0194】
また、本実施形態では、不揮発性メモリとしてNAND型フラッシュメモリを例示した。しかし、本実施形態の機能は、例えば、MRAM(Magnetoresistive
Random Access Memory)、PRAM(Phase change
Random Access Memory)、ReRAM(Resistive Random Access Memory)、又は、FeRAM(Ferroelectric Random Access Memory)のような他の様々な不揮発性メモリにも適用できる。
【0195】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0196】
2…ホスト、3…フラッシュストレージデバイス、4…コントローラ、5…NAND型フラッシュメモリ、21…ライト制御部、22…リード制御部、31…内部バッファ、51…ライトデータバッファ、53…リードデータバッファ。
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24