不揮発性メモリと、メモリ制御部と、リードコマンドに基づいて、当該リードコマンドの識別が可能な識別子、当該識別子に対応する読み出しデータの論理アドレス、および当該識別子に対応する読み出しデータ長を保持するテーブルを管理するテーブル保持部と、前記識別子ごとの前記論理アドレスおよび前記データ長を前記メモリ制御部に発行するリード発行部と、前記メモリ制御部から指示された前記識別子ごとの前記論理アドレスに対応する物理アドレスおよび前記データ長に基づいて前記不揮発性メモリから受信したデータを前記識別子と共に保持するリードバッファと、前記リードバッファに、同一の識別子について前記論理アドレスのデータが受信された場合に、当該データのデータ長に比例した個数の当該識別子を受け付ける識別子キューと、前記識別子キューの先頭の識別子から順に、当該識別子が前記テーブルにおいて読み出しが未完了であるとして保持されている場合に、前記リードバッファに受信されている当該識別子に対応する前記データを外部に転送する転送部と、を具備する記憶装置。前記テーブル保持部は、前記外部に転送した前記データに対応する識別子である転送中識別子と異なる識別子が前記識別子キューの先頭に存在する場合は、前記テーブルが保持する前記転送中識別子に対応する前記論理アドレスおよび前記データ長を書き換える請求項1に記載の記憶装置。前記テーブル保持部は、前記転送中識別子に対応する前記論理アドレスを未転送の読み出しデータの先頭の論理アドレスに書き換え、前記転送中識別子に対応する前記データ長を未転送の読み出しデータのデータ長に書き換える請求項2に記載の記憶装置。前記テーブルは、前記識別子毎に対応する読み出しが完了したか否かを示すフラグを保持する請求項1乃至3のいずれか1項に記載の記憶装置。前記識別子が前記テーブルにおいて読み出しが未完了であるとして保持されている場合とは、当該識別子に対応する前記フラグが読み出し未完了になっている場合である請求項4に記載の記憶装置。前記テーブル保持部は、前記識別子に対応する前記読み出しデータの前記イニシエータへの転送が完了した場合には、前記テーブルから当該識別子及び当該識別子に対応するデータを削除する請求項1乃至3のいずれか1項に記載の記憶装置。前記テーブルは、複数のイニシエータからのリードコマンドを識別可能なコマンド情報を前記識別子ごとにさらに保持する請求項1乃至6のいずれか1項に記載の記憶装置。前記データのデータ長に比例した個数はクラスタ数である請求項1乃至7のいずれか1項に記載の記憶装置。リードコマンドに基づいて、当該リードコマンドの識別が可能な識別子、当該識別子に対応する読み出しデータの論理アドレス、および当該識別子に対応する読み出しデータ長を保持するテーブルを管理するテーブル保持部と、前記識別子ごとの前記論理アドレスに対応する物理アドレスおよび前記データ長に基づいて不揮発性メモリから受信したデータを前記識別子と共に保持するリードバッファと、前記リードバッファに、同一の識別子について前記論理アドレスのデータが受信された場合に、当該データのデータ長に比例した個数の当該識別子を受け付ける識別子キューと、前記識別子キューの先頭の識別子から順に、当該識別子が前記テーブルにおいて読み出しが未完了であるとして保持されている場合に、前記リードバッファに受信されている当該識別子に対応する前記データを外部に転送する転送部と、を具備するコントローラ。不揮発性メモリと、メモリ制御部と、を備えた記憶装置のリードコマンド実行方法であって、リードコマンドに基づいて、当該リードコマンドの識別が可能な識別子、当該識別子に対応する読み出しデータの論理アドレス、および当該識別子に対応する読み出しデータ長をテーブルに保持する工程と、前記識別子ごとの前記論理アドレスに対応する前記不揮発性メモリの物理アドレスからリードバッファにデータを読み出す工程と、前記リードバッファに、同一の識別子について前記論理アドレスのデータが受信され当該識別子が前記テーブルにおいて読み出しが未完了であるとして保持されている場合に、前記リードバッファに受信されている当該識別子に対応する当該データを外部に転送する工程と、を具備するリードコマンド実行方法。しかしながら、リードバッファの規模が大きい場合における従来のリードコマンド処理技術においてはイニシエータから受信した複数のリードコマンドを実行すると、リードバッファに読み出しデータがランダムに格納されていく為、各リードコマンドに対する読み出しデータがリードバッファ上に揃うまではイニシエータへの転送を開始することが出来なかった。その為ファームウェアF/Wは常にNANDフラッシュメモリとリードバッファ間の転送状況を監視する必要があり、このことによりMPUが占有され、他の処理に影響を与えてしまって転送効率の向上が図れないという問題点があった。本発明は、上記に鑑みてなされたものであって、NANDフラッシュメモリからリードバッファへの転送の監視が不要で、一度リードコマンドを登録すると読み出しデータの転送が完了するまでMPUが関与することなく自動的にリードコマンドの実行が可能となる。また、複数のリードコマンドを投入することが出来る為転送効率が向上する。さらに、複数のリードコマンドに対する読み出しデータを格納可能なリードバッファ領域を必要としない為、比較的少ないリードバッファ容量での実装が可能となる。実施形態の記憶装置は、不揮発性メモリと、メモリ制御部と、リードコマンドに基づいて、当該リードコマンドの識別が可能な識別子、当該識別子に対応する読み出しデータの論理アドレス、および当該識別子に対応する読み出しデータ長を保持するテーブルを管理するテーブル保持部と、前記識別子ごとの前記論理アドレスおよび前記データ長を前記メモリ制御部に発行するリード発行部と、前記メモリ制御部から指示された前記識別子ごとの前記論理アドレスに対応する物理アドレスおよび前記データ長に基づいて前記不揮発性メモリから受信したデータを前記識別子と共に保持するリードバッファと、前記リードバッファに、同一の識別子について前記論理アドレスのデータが受信された場合に、当該データのデータ長に比例した個数の当該識別子を受け付ける識別子キューと、を具備する。実施形態の記憶装置は、前記識別子キューの先頭の識別子から順に、当該識別子が前記テーブルにおいて読み出しが未完了であるとして保持されている場合に、前記リードバッファに受信されている当該識別子に対応する前記データを外部に転送する転送部を、さらに具備する。第1の実施形態図1は、第1の実施形態にかかる記憶装置100の構成を示すブロック図である。記憶装置100は、例えばSSDである。記憶装置100にはイニシエータ1が接続されている。イニシエータ1は、例えばSCSI規格により接続された機器にコマンドを発行する装置である。イニシエータ1は、SATA規格におけるホストに相当する。イニシエータ1は接続された例えばSSDなどのストレージ機器ターゲットに対してデータの読み出しなどのコマンドを出す役割を持っている。記憶装置100は、MPU2、EEPROMなどからなるROM3、イニシエータ1からのコマンドを受け付けるコマンドI/Fインタフェース4、後で詳述する予約エクスチェンジテーブル保持部5、読み出しデータのイニシエータ1への転送制御および予約エクスチェンジテーブル保持部5が保持する予約エクスチェンジテーブル50図2、図3の書き換えを実行するエクスチェンジ実行部8、イニシエータ1への読み出しデータの転送を行うデータフレーム生成部10、NANDコマンド発行部リード発行部6、NANDフラッシュメモリ制御部メモリ制御部7、複数個が並列に搭載されたNANDフラッシュメモリ不揮発性メモリ70、71、7n、リードバッファコマンド発行部識別子キュー9、およびリードバッファ11を備える。リードバッファ11を備えることによりNANDフラッシュメモリ70、71、7nからイニシエータ1への読み出しデータの転送を効率よく行うことが出来るようになっている。ROM3に保持されMPU2によって実行されるファームウエアF/W20図2を参照は、コマンドI/F4からのコマンド情報に基づいて、予約エクスチェンジテーブル保持部5およびNANDコマンド発行部6を設定する。ファームウエア20の動作に基づく本実施形態の記憶装置100の動作を説明するために、ファームウエア20を含んだ機能ブロック間の動作関係を概観するための機能ブロック図を図2に示す。図2に示した予約エクスチェンジテーブル保持部5、リードバッファコマンド発行部9、およびエクスチェンジ実行部8の詳細な構成を図3に示す。以下、図1、図2、および図4~図6に示したフローチャートを用いて、記憶装置100におけるイニシエータ1から受け取ったリードコマンドの処理の流れを説明する。イニシエータ1から記憶装置100に対して発行されたリードコマンドは、コマンドI/F4にて受信されると、コマンドI/F4が管理するイニシエータコマンドテーブル40に一旦格納される図4:ステップS101。ファームウエア20はイニシエータコマンドテーブル40に格納されているリードコマンドを解析するステップS102。リードコマンドは、読み出しデータの先頭の論理アドレスとそこからのセクタ単位でのデータ長転送長を含んでいる。論理アドレスとは、イニシエータ1ホストが使用するアドレスであり、例えばLBALogicalBlockAddressingであり、セクタサイズ:例えば512Bに対して0からの通し番号をつけたものである。読み出しデータの先頭の論理アドレスを以下では先頭LBAと呼ぶ。ファームウエア20は、イニシエータ1からコマンドI/F4を介して受け取ったリードコマンドに対して、少なくとも予約エクスチェンジテーブル50に同時にエントリされるリードコマンド間では異なる識別子となるTAGタグを付与する。即ち、イニシエータ1からのリードコマンドに対してタグは一意的に決定される。ファームウエア20は、各リードコマンドに対して、TAG、先頭LBA、転送長、コマンド情報を把握解析する。コマンド情報とは、例えば、どのイニシエータからのコマンドかを識別するSASSerialAttachedSCSIアドレス等である。記憶装置100にエキスパンダーハブを介して複数のイニシエータが接続されている場合、SASアドレスによりどのイニシエータからのコマンドかを識別することができる。上記解析結果に基づいて、ファームウエア20は予約エクスチェンジテーブル保持部5の予約エクスチェンジテーブル50にリードコマンドをエントリする。具体的には、予約エクスチェンジテーブル50に実行する各リードコマンドのTAG、先頭LBA、転送長、コマンド情報をそれぞれのTAG毎に格納ステップS103する。予約エクスチェンジテーブル50は、記憶装置100の中のイニシエータ1に近い側以下、イニシエータ側と呼ぶにある機能ブロックにおけるリードコマンド処理を司る。図3に示すように、予約エクスチェンジテーブル50は、予約エクスチェンジ格納部51および予約エクスチェンジステータス52を備える。予約エクスチェンジ格納部51は、各TAGおよびTAG毎の未転送先頭LBA、未転送長、コマンド情報を管理する。予約エクスチェンジステータス52は予約エクスチェンジ格納部51が管理する各TAGについてTAG毎の予約フラグ、正常終了フラグ、エラー終了フラグを管理する。予約エクスチェンジテーブル50にリードコマンドがエントリされた時点では、ファームウエア20によりTAG、先頭LBA、転送長、コマンド情報が予約エクスチェンジ格納部51に書き込まれると共に当該TAGに対する予約エクスチェンジステータス52の予約フラグがアサートされる。この時点では当該TAGに対する正常終了フラグ、エラー終了フラグは共にアサートされていない。並行してファームウエア20は、NANDコマンド発行部6にも上記と同じリードコマンドを送る。具体的には、上記各リードコマンドのTAG、先頭LBA、転送長を格納するステップS104。NANDコマンド発行部6は、NANDフラッシュメモリ制御部7およびNANDフラッシュメモリ70、71、7nの側以下、NAND側と呼ぶの読み出しデータ転送処理を司る。ステップS103およびステップS104はイニシエータコマンドテーブル40内の全てのリードコマンドに対して実行される。以後の動作にファームウエア20は関与しない。ステップS103の後は、イニシエータ側のコマンド実行処理ステップS105が実行され、ステップS104の後は、NAND側のデータ転送処理ステップS106が実行される。イニシエータ側のコマンド実行処理ステップS105とNAND側のデータ転送処理ステップS106は、それぞれハードウエアでの処理である。図5のフローチャートに基づいて、NAND側のデータ転送処理の流れを説明する。NANDコマンド発行部6は、格納した複数のTAGに対する転送要求をNANDフラッシュメモリ制御部7に行う。NANDフラッシュメモリ制御部7において、NANDコマンド発行部6に格納された先頭LBAはNANDフラッシュメモリ70、71、7nにおける物理アドレスに変換され、転送長と共にNANDコマンドリードコマンドとして、NANDフラッシュメモリ制御部7からNANDフラッシュメモリ70、71、7nへ順次発行される。NANDフラッシュメモリ70、71、7nは指定された読み出しデータをリードバッファ11に格納してゆくステップS201。このときリードバッファ11に格納される読み出しデータは、リードコマンドの発行順序、LBAの順序とは関係なく非同期に格納される。これは、データの書き込み時にはNANDフラッシュメモリ70、71、7nの各チャネルに対して書き込みが並列に行われることにより、データのシーケンシャル連続性が失われてしまうためである。またこのことは、NANDフラッシュメモリ70、71、7nそれぞれのリードアクセス時間の個体差にも起因する。リードバッファ11は、TAG毎に先頭LBAからどの程度読み出しデータをNANDフラッシュメモリ70、71、7nから受信したかについてセクタ単位で把握している。そのために必要なTAG毎のデータ長セクタ数などの管理情報は例えばファームウエア20などから事前に与えられている。リードバッファ11は、あるTAGについての先頭LBAからLBA上連続したセクタ数のデータをNANDフラッシュメモリ70、71、7nから受け取ると、そのセクタ数のTAGをリードバッファコマンド発行部9に順次格納する。例えば、TAG=Aの読み出しが全体でLBA=0~15の場合にLBA=0~3のセクタ数4セクタのデータをNANDフラッシュメモリ707nから受信し、その後、TAG=Bの読み出しデータをNAND707nから受信した場合は、まず、4つのTAG=Aをリードバッファコマンド発行部9に順次格納し、その後、TAG=Bを連続受信セクタ数分リードバッファコマンド発行部9に格納する。その後、TAG=AのLBA=4以降の読み出しデータを連続してNAND707nから受信した場合はTAG=Aを連続受信セクタ数分リードバッファコマンド発行部9に格納する。TAG=Aの先頭LBAのデータを1セクタ分受信し、次にTAG=Bの先頭LBAのデータを1セクタ分受信し、その次にTAG=Aの先頭LBAから1セクタ後のLBAのデータ先に受信したTAG=Aのデータに連続するデータを1セクタ分受信した場合は、リードバッファコマンド発行部9には、TAG=A、B、Aの順にTAGが格納される。一般には、あるTAGについての先頭LBAから連続したデータの受信がNANDフラッシュメモリ70、71、7nからの読み出しデータの最小単位である1クラスタ分例えば8セクタ分完了すると、リードバッファ11は受信した1個のクラスタのセクタの個数例えば8個と同一のTAGをリードバッファコマンド発行部9に順次格納する。例えば、リードバッファ11にTAG=Aの読み出しデータがLBA上連続して8セクタ分格納されている場合は、AというTAGが8個リードバッファコマンド発行部9に順次格納される。リードバッファ11は、あるTAGについての先頭LBAからLBA上連続したセクタ数のデータをNANDフラッシュメモリ70、71、7nから受け取る毎に、連続して受け取ったデータのセクタ数に対応する個数のTAGをリードバッファコマンド発行部9に順次格納する。当該TAGについて、LBA順に連続した読み出しデータのNANDからの受信が中断した場合は、当該TAGの未転送の読み出しデータの先頭LBAの読み出しデータをNANDから受信するまで当該TAGをリードバッファコマンド発行部9に格納しない。従って、後述する機構に従えば、同一TAG間のLBA順の読み出しデータはLBAの順序が守られたままイニシエータ1にリード転送されることになる。リードバッファコマンド発行部9は、例えば図3に示すようなFIFO形式のバッファタグキューであり、先に格納されたTAGから順にTAG毎に予約エクスチェンジテーブル保持部5に本登録要求してゆくステップS202。即ち本登録要求リードバッファコマンドはセクタ単位で要求される。そして、NANDフラッシュメモリ制御部7から発行された全てのNANDコマンドに対するNANDフラッシュメモリ70、71、7nからのデータ読み出しが完了すればステップS203:Yes、NAND側のデータ転送処理は終了となり図4のステップS106が終了する。ステップS203でNANDフラッシュメモリ70、71、7nからのデータ読み出しが完了していない場合ステップS203:Noは、ステップS201に戻る。以上がNAND側のデータ転送動作である。次に、図6のフローチャートに基づいて、イニシエータ側のコマンド実行処理の流れを説明する。まず、予約エクスチェンジテーブル保持部5の予約エクスチェンジステータス52において、予約フラグがアサートされ且つ正常終了フラグ、エラー終了フラグが共にアサートされていないTAG未完了のTAGが存在するか否かが判断される図6、ステップS301。存在しない場合ステップS301:Noはコマンド実行処理終了である。存在する場合ステップS301:Yesは、上述したようにリードバッファコマンド発行部9により本登録要求図5、ステップS202が来るまで待ち続けるステップS302:No。リードバッファコマンド発行部9により予約エクスチェンジテーブル保持部5へ本登録要求があるステップS302:Yesと、すでにエクスチェンジ実行部8が動作中エクスチェンジ実行中か否かが判断されるステップS303。エクスチェンジ実行部8が動作していない場合ステップS303:Noは、コンペア部53が本登録要求されたTAGを予約エクスチェンジテーブル50から検索する。具体的には、コンペア部53は、本登録要求されたTAGが予約エクスチェンジ格納部51にエントリされており、且つ当該TAGの予約エクスチェンジステータス52の正常終了フラグ、エラー終了フラグが共にアサートされていないものを検索する。コンペア部53は、検索されたTAGのコマンド情報をエクスチェンジ実行部8に設定するステップS306。エクスチェンジ実行部8は当該TAGの読み出しデータをリードバッファ11からデータフレーム作成部10に転送させ、設定されたコマンド情報をデータフレーム作成部10に送る。データフレーム作成部10は、リードバッファ11から送られて来た読み出しデータおよびエクスチェンジ実行部8からのコマンド情報に基づいてデータフレームを作成して、イニシエータ1へ転送リードデータ転送するエクスチェンジ実行:ステップS307。エクスチェンジ実行部8が動作している場合ステップS303:Yesは、コンペア部53は、本登録要求のTAGがエクスチェンジ実行中のTAGと同一か否かを判定するステップS304。同一の場合ステップS304:Yesは、実行中のコマンド情報に基づいて同一のTAGのリードデータ転送を引き続き行うステップS307。本登録要求のTAGがエクスチェンジ実行中のTAGと異なる場合ステップS304:Noは、エクスチェンジ実行中のTAGの予約エクスチェンジ格納部51における先頭LBA及び転送長を更新する。具体的には、それまでに転送済みのセクタを除いた未転送のセクタの先頭のLBAに先頭LBAを書き換え、未転送のセクタ数に転送長を書き換える。即ち、実行中のTAGに対するエクスチェンジの中断に伴い予約エクスチェンジテーブル50の書き換えフィードバックを行うステップS305。ステップS305の後は、コンペア部53が、本登録要求のTAGのコマンド情報を予約エクスチェンジ格納部51から検索してエクスチェンジ実行部8に設定しステップS306。当該TAGの読み出しデータをデータフレームとしてイニシエータ1へ転送ステップS307する。ステップS307で各TAGの読み出しデータをセクタ単位でイニシエータ1へ転送するごとに当該TAGの読み出しデータの最終セクタの転送が完了しているか否かが判断されステップS308、まだ完了していない場合ステップS308:Noは、次の本登録要求が来るのを待つステップS302。ステップS308で読み出しデータをイニシエータ1へ転送したTAGの最終セクタの転送が完了した場合、即ち当該TAGの未転送セクタの転送長が0となった場合ステップS308:Yesは、実行中のエクスチェンジを完了し、予約エクスチェンジテーブル50にフィードバックするステップS309。具体的には、予約エクスチェンジステータス52の当該TAGの正常終了フラグをアサートする。或いは、予約エクスチェンジテーブル50から当該TAGのエントリを削除してもよい。また、上記手順のいずれかの過程でエラーが発生した場合、例えば、NANDフラッシュメモリ70、71、7nからのデータ読み出しに失敗した場合やイニシエータ1と記憶装置100の接続が切断されるなどした場合には、当該TAGの予約エクスチェンジステータス52のエラー終了フラグをアサートする。従来のリードコマンド処理技術においては、図2においてイニシエータ1から受信したTAG=A、B、Cで識別される複数のリードコマンドを実行すると、例えばNANDフラッシュメモリ70CH0およびNANDフラッシュメモリ71CH1の2チャンネルからリードバッファ11に読み出しデータがランダムに格納されていく場合、各リードコマンド各TAGに対する読み出しデータがリードバッファ11上に全て揃うまではイニシエータ1への転送を開始することが出来なかった。即ち、各TAGの最後の読み出しデータがリードバッファ11に揃うまでイニシエータ1への転送を開始することが出来なかった。それに対して、本実施形態にかかる記憶装置100のリードコマンド実行方法によると、図7のタイミング図に示すようなイニシエータ1へのリードデータ転送が可能である。即ち、NANDフラッシュメモリ70CH0およびNANDフラッシュメモリ71CH1の2チャンネルからの3種類のTAGのデータ転送が実施されているときに、リードバッファ11からイニシエータ1への送信をTAG=Aの先頭LBAから読み出しデータがリードバッファ11に揃った時点で行うことが出来る。これにより各リードコマンドに対する読み出しデータが全て揃うまでリードバッファ11にバッファリングさせる必要がなくなるので、規模の小さなリードバッファ11にて効率的な読み出しデータの転送が可能となる。即ち、本実施形態にかかる記憶装置100のリードコマンド実行方法によると、最初にファームウエア20がリードコマンドに基づいて予約エクスチェンジテーブル50およびNANDコマンド発行部6を設定することにより、それ以降はハードウエアの動作のみによりリードバッファ11からイニシエータ1への効率的な読み出しデータの転送を実行することが可能である。即ち、予約エクスチェンジテーブル50およびNANDコマンド発行部6への設定後、ファームウエア20がNANDフラッシュメモリ70、71、7nとリードバッファ11の間の転送状況を監視することなしに効率的なリードデータ転送が可能となる。第2の実施形態図8は、第2の実施形態にかかる記憶装置200の構成を示すブロック図である。記憶装置200は複数のポートを備えているので、複数のポートに複数のイニシエータ31、32、3nを接続することが可能である。本実施形態の記憶装置200は、第1の実施形態と同様に複数のイニシエータ31、32、3nそれぞれからのリードコマンドの効率的な実行が可能である。記憶装置200の構成は、各イニシエータ31、32、3nそれぞれに対応したエクスチェンジ実行部81、82、8n、データフレーム生成部61、62、6nを備えているが、それ以外の構成は図1の記憶装置100と同様である。本実施形態においては、予約エクスチェンジテーブル50の予約エクスチェンジ格納部51のコマンド情報であるSASアドレスによりどのイニシエータ31、32、3nからのリードコマンドであるかを識別することができるので第1の実施形態と同様に効率的なリードデータ転送が可能となる。即ち、それぞれのポートイニシエータへのリードコマンドに応じた読み出しデータの転送分配が可能となる。ただし、例えば、いずれかのポートとイニシエータとの接続が中断した場合には、当該ポートに接続されたイニシエータからのリードコマンドに対応するリードバッファコマンド発行部9からの本登録要求リードバッファコマンドに対して、予約エクスチェンジテーブル保持部5は当該本登録要求TAGに対応するコマンド情報SASアドレスに基づいて、当該本登録要求の受付を一時的に停止することで、当該ポート以外のイニシエータからのリードコマンドの処理を問題なく実行することが可能となる。以上説明したとおり、第1および第2の実施形態によれば、ファームウエアがNANDフラッシュメモリとリードバッファの間の転送状況を監視することなしに規模の小さなリードバッファにて効率的な読み出しデータの転送を可能とすることができる。本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。