以下、本発明の実施の形態について、図1から図44を参照して説明する。
第1の参考例
本発明の第1の参考例であるデータ記録装置101の構成を図1に示す。データ記録装置101は、PC(パーソナルコンピュータ)102により構成される。PC102は、少なくともメモリカード100を装填するためのメモリカードスロット190を有する。但し、メモリカードスロット190の代わりに外付けドライブ191を接続しても良い。PC102は、ディスプレイ192や入力装置193を有するがこれらはなくともよい。
データ記録装置101は、図2に示すように、少なくともCPU181、メモリ182、プログラムやオペレーションシステム(以下OS)を格納するハードディスク等の記憶デバイス183、それらを接続する内部バス184、メモリカード100を接続するためのバスコントローラ185から構成される。メモリカード100の接続形態としては、例えばATA(AT Attachment)、USB(Universal Serial Bus)がある。また多くの場合、データ記録装置101は、ディスプレイ192を接続するためのグラフィックコントローラや、入力装置193を接続するための入力デバイスコントローラ186を備える。オペレーションシステム(以下、OSと略す)としては、例えばWindows(登録商標)やMac OS(登録商標)などの汎用OSを用いることができる。
データ記録装置101において、OSのプログラム250、デバイスドライバのプログラム110、ファイルシステムドライバのプログラム200、アプリケーションプログラム300は記憶デバイス183に記録されている。データ記録装置101の電源が起動されると、記憶デバイス183に格納されたOS250が起動する。デバイスドライバのプログラム110、ファイルシステムドライバのプログラム200は、OS250の起動時もしくはメモリカード100の装填時にメモリ182上にロードされる。デバイスドライバ110及びファイルシステムドライバ200は、メモリカード100に対してファイル入出力を行うのに必要な機能を有する。但しこれらドライバ110、200は、メモリカード100だけでなく、ハードディスクや光ディスクなどの記録媒体へのファイル入出力に用いても良い。
ユーザがメモリカード100をデータ記録装置101に接続すると、OS250はプラグアンドプレイ機能によりメモリカード100を認識し、デバイスドライバ110をメモリ182上にロードする。ファイルシステムドライバ200は、デバイスドライバ110を経由してメモリカード100上のファイルフォーマットを認識し、論理ドライブとしてマウントする。ユーザはOS250上でアプリケーションプログラム300を起動して入力装置193を操作することにより、メモリカード100にデータを読み書きすることができる。
デバイスドライバ110の処理の全体構成を、図3に示す。デバイスドライバの処理111は、要求の受付処理124、ロード処理170、アンロード処理179、要求処理スレッド155、タイマーライト起動スレッド160から構成される。
ロード処理170およびアンロード処理179は、OS250がデバイスドライバ110をメモリ182上にロードまたはアンロードする際に、それぞれ実行される。スレッドとは、OS250がマルチタスクを並行して処理する際の1個のプログラムの流れである。デバイスドライバにおけるスレッドは、ロード処理170の実行時に起動され、アンロード処理179の実行時に削除される。
要求の受付処理124は、デバイスドライバ110がOS250から何らかの要求を受けた際に実行される。要求の受付処理124では、要求が受け付けられた(ステップ125)のち、受け付けた要求に対応するデータをキューに挿入して(ステップ126)終了する。これにより、デバイスドライバ110が要求を処理中に受けた新たな要求は、キューに挿入されて処理の順番になるまで待たされる。
要求処理スレッド155は、キューに挿入された要求を逐次処理するためのスレッドである。最初に、スレッドを終了すべきかどうかを判定し(ステップ156)、終了すべきであれば終了(ステップ159)する。終了すべきでない場合は、1個の要求と対応するデータをキューから取得する(ステップ157)。次に要求が第2のライト要求122かどうかを判定する(ステップ158)。第2のライト要求122とは、ファイルシステムドライバ200からデバイスドライバ110に送信するデータのライト要求であって、請求項における要求データを構成する。なお、後述するように、アプリケーション300からファイルシステムドライバ200に送信するデータのライト要求を第1のライト要求121と呼ぶため、ファイルシステムドライバ200からデバイスドライバ110に送信するデータのライト要求を第2のライト要求122と呼ぶ。
ステップ158で第2のライト要求122でないと判定すればライト以外の操作(ステップ150)を行う。第2のライト要求122であれば、タイマーライトの要求かどうかを判断し(ステップ158B)、タイマーライトの要求であればタイマーライト操作(ステップ166)を、そうでなければライト操作(ステップ130)を行う。以上で1個の要求の処理を終了し、スレッド終了判定操作(ステップ156)に戻る。なお、タイマーライトの要求(ステップ158B)は、後述するタイマーライト起動スレッド(ステップ160)で作成されたライト要求を示す。
デバイスドライバ110におけるいくつかの処理は、複数のスレッドによって同時並行して実行され得る。即ち、要求の受付処理124、要求処理スレッド155、タイマーライト起動スレッド160は同時並行で行われる可能性がある。しかし、要求とデータを挿入するキューは1個であり、複数の要求の受付処理124が並行して動作した場合でも、各受付処理124におけるキューへの挿入操作(ステップ126)は逐次処理で行われる。
デバイスドライバのロード処理170を図4のフローチャートを参照して説明する。最初にデバイスドライバ110のインスタンスをメモリ182上にロードする(ステップ171)。これにより、デバイスドライバのプログラム110をメモリ182上から利用可能にする。次に、ロードしたデバイスドライバの初期化操作を行う(ステップ172)。これには、OS250にデバイスのインスタンスを登録したり、使用する関数やハンドラを登録する操作が含まれる。
次に消去ブロックサイズを決定する(ステップ173)。消去ブロックサイズの決定方法としては、デバイスドライバ110内部で固定値を指定する方法や、メモリカード内部に用意されたレジスタに値を設定しておき、デバイスドライバ110がコマンドを発行してレジスタ上の値を読み込んで値に応じた消去ブロックサイズを設定する方法がある。
消去ブロックサイズが決定された後、メモリ182上にライト処理用のバッファ263を確保する(ステップ174)。このバッファ263は、一時保持器として機能するものであり、少なくとも消去ブロックサイズの連続した領域としてメモリ182上に確保される。この例を図5に示す。OSのメモリ空間260において、カーネル空間261上にライト処理のバッファ263を確保する。この例では、消去ブロックサイズを128Kバイトとしている。バッファ263は、デバイスドライバ110のアンロード処理179において解放される。デバイスドライバ110のロード処理170及びアンロード処理179は、それぞれメモリカード100をデータ記録装置101に接続/取り外しするタイミングで行うのが望ましい。
メモリカード100に対するファイルのリード/ライト動作を図6を参照して説明する。アプリケーションプログラム300がファイルのリード/ライトを行う際、カーネル空間プログラムであるファイルシステムドライバ200がアプリケーション300からのI/O要求を処理する。
ファイルシステムドライバ200は図47を参照して従来例で説明したようなファイルシステムフォーマットに記録するための独自のI/O要求をデバイスドライバ110に発行する。デバイスドライバ110がバスコントローラ185を介してメモリカードコントローラ109にコマンドとデータを送ることで、記録媒体(メモリカード100)へのリード/ライト動作が実行される。
デバイスドライバ110とメモリカードコントローラ109との間のデータの受け渡しの方法は、DMA(Direct Memory Access)とPIO(Programmed I/O)がある。高速性が要求されるデータのリード/ライトにはDMAを用いる。DMAは、データ記録装置101上のメモリ182にメモリカードコントローラ109が直接アクセスすることでデータの転送を行う。デバイスドライバ110は、メモリ182上のアドレスとメモリカード100上のアドレス、及びデータ長などの転送情報のみをメモリカードコントローラ109に指定する。メモリカードコントローラ109が転送を行うため、CPU181の処理能力を有効に活用できる。
次に、本参考例の特徴となるメモリカード100への記録処理を、図7を参照して説明する。アプリケーションプログラム300は、ファイル310をメモリカード100に記録するためのライト要求(以下、このライト要求を第1のライト要求と呼ぶ)121を実行する。ファイルシステムドライバ200は、図47を参照して従来例で説明した処理手順に従って、ファイルをクラスタ210の単位で記録する。ファイルシステムドライバ200は、ファイル310を記録するために必要なクラスタ210や管理情報を、新たないくつかのライト要求(以下、このライト要求は、前述した第2のライト要求である)122としてデバイスドライバ110に送信する。なお、図7の例は、4個のクラスタ210のデータを1個の第2のライト要求122として送信する状態を示している。
第2のライト要求122は、元のファイル310の記録に必要なデータであっても良いし、同時刻に記録すべき他のファイルのデータを含んでいても良い。
第2のライト要求122を受けたデバイスドライバ110は、ライト処理130を開始する。ライト処理130では、デバイスドライバ110は、今回メモリカード100に記録する記録用データを消去ブロック105で区切ることで複数の部分データに分割し、消去ブロック105に一致する部分データはそのまま消去ブロック105で、また消去ブロックに満たない部分データはメモリカード100から不足分を読み出して消去ブロック105の大きさにする。このとき、メモリカード100から読み出すデータのアドレスは、メモリカード100に書き込むアドレス位置と同一とする。具体的には、次のようにして記録用データを設定する。すなわち、消去ブロック105の整数倍の大きさを有するとともに今回の記録処理でメモリカード100に記録する記録予定データのアドレス領域が全て含有される最小限の大きさを有するもう一つのアドレス領域をメモリカード100上に設定する。そのうえで、このもう一つのアドレス領域から、記録するデータのアドレス領域を差し引いた残余のアドレス領域に該当する記録済データをメモリカード100から読み出して残余のアドレス領域に複写することで消去ブロック105の境界に一致する記録用データを設定する。
このようにしてすべての記録予定データを消去ブロック105にしてから、そのデータをメモリカード100に書き込む。デバイスドライバ110は、ライト処理130を消去ブロック105にするために図4のステップ174で確保したバッファ(一時保持器)263を用いる。
デバイスドライバ110によるライト処理130の詳細を、図8のフローチャートを参照して説明する。なお、図8のフローチャートでは、互いにステップ位置の異なるステップ140Aとステップ140Bとが設けられているが、これらのステップの操作内容自体は基本的には同一であって、以降の説明および図面において同一の処理として取り扱われて説明される際にはステップ140と記載される。
今回のデータを記録する際のメモリカード100上のアドレス領域の先頭アドレスと、既にバッファ263内にあるデータを記録する際のメモリカード100上のアドレス領域の終端アドレスとが連続するかどうかを判定する(ステップ132)。ここでバッファ263内にあるデータとは、デバイスドライバ110がキャッシュしているデータであり、以前のライト処理130によってバッファ263に一時保持されたもののまだメモリカード100にライトされていないデータである。またアドレスとは、メモリカード100上の論理アドレス又は物理アドレスである。アドレスが連続しない場合は、バッファ263内のデータの消去ブロック105のライト操作を行う(ステップ140A)。連続する場合は、バッファ263内で以前のデータと今回のデータとを連結させるため、消去ブロック105内の部分データをバッファ263にコピーする(ステップ134)。
次に、コピーした部分データがバッファ263の終端に到達したかどうかを判定し(ステップ135)、到達していなければ終了する。到達していればバッファ263内のデータの消去ブロック105のライト操作(ステップ140B)を行う。なお、前述したように、ステップ140Aとステップ140Bとは基本的に同一の処理である。
今回の要求データにおいてまだ処理を終了していない残余のデータがあるかどうかを判定し(ステップ136)、残っていればステップ134に戻る。残っていなければ終了する。
以上説明したデバイスドライバのライト処理130の具体例を説明する。図9〜図13を参照して説明する。これらの例においてバッファ263は、図5で予め確保した領域のアドレスであり、0x20000バイト即ち128Kバイトの消去ブロックサイズ分の領域としている。
バッファ263内にデータがない場合のライト処理130の例を図9に示す。第2のライト要求122が、ターゲットアドレス0x82000、レングス0xD000であるとする。ここでターゲットアドレスとは、メモリカード100上のアドレスを指す。消去ブロックは0x20000の倍数であるから、ターゲットアドレスを含む消去ブロックの先頭アドレスは0x80000となる。バッファ263を0x80000から0xA0000までの消去ブロック105の1個に対応させて、0x82000から0xD000分のデータをバッファ263にコピーする(ステップ134参照)。この場合、データはバッファ263の終端に到達していないので(ステップ135参照)、この第2のライト要求122に対応するライト処理130を終了する。
今回の第2のライト要求122がバッファ263内のデータと連続する場合の例を図10に示す。バッファ263にはターゲットアドレス0x80000からレングス0x2000の書き込むべきデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x82000でレングスが0xD000の場合、その要求データはバッファ263内のデータと連続するので、ターゲットアドレス0x80000からレングス0x10000の書き込むべきデータに更新する(ステップ134)。
今回の第2のライト要求122がバッファ263内のデータと連続しない場合の例を図11に示す。バッファ263にはターゲットアドレス0x6C000からレングス0x8000のデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x82000でレングスが0xD000の場合、バッファ263内のデータと今回の要求のアドレス0x82000とは連続しないので、バッファ263内のデータを消去ブロック105のライト操作(ステップ140A)で先に読み出してメモリカード100に書き込んでから、バッファ263に今回の要求122をコピーする。
今回の第2のライト要求122がバッファ263内のデータと連続し、消去ブロック105の境界を跨ぐ場合の例を図12に示す。この場合、バッファ263にはターゲットアドレス0x90000からレングス0xA000の読み出すべきデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x9A000でレングスが0xD000の場合、バッファ263内のデータと連続するが、すべてのデータをバッファ263にコピーすると消去ブロック105の境界を跨ぐためバッファ263にはデータを0x6000だけしか挿入できない。この場合、図8のステップ134で、消去ブロック105内に収まるレングス0x6000の部分データだけをバッファ263にコピーする。コピーしたデータはバッファ263の終端に到達するので(ステップ135)、バッファ263内のデータの消去ブロック105のライト操作(ステップ140B)を行う。次に残りのレングス0x8000の部分データを新たにバッファ263にコピーする(ステップ134)が、データはバッファ263の終端に達しないので終了する。
今回の第2のライト要求122がバッファ263内のデータと連続せず、消去ブロック105の境界を跨ぐ場合の例を図13に示す。この場合、バッファ263にはターゲットアドレス0x6C000からレングス0x8000の読み出すべきデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x9A000でレングスが0xD000の場合、そのデータはバッファ263内のデータと連続しないので、バッファ263内のデータを消去ブロック105のライト操作(ステップ140A)で先にバッファ263から読み出してメモリカード100に書き込む。そのうえで、今回の第2のライト要求122を実行する。ここで、今回の第2のライト要求122のターゲットアドレスのデータ量では、バッファ263の消去ブロック105のブロック境界によってその第2のライト要求122は規制されてしまって全てのデータを消去ブロック105に挿入することはできず、この場合には、レングス0x6000だけしか消去ブロック105に挿入できない。この場合、図8のステップ134で、消去ブロック105の境界以内のレングス0x6000の部分データだけがバッファ263にコピーされる。コピーされたデータはバッファ263の消去ブロック105の終端に到達するので(ステップ135)、バッファ263内のデータの消去ブロック105のライト操作(ステップ140B)を行う。次に残りのレングス0x8000の部分データを新たにバッファ263にコピーする(ステップ134)。コピーしたデータはバッファ263の終端に達しないので終了する。
バッファ263内のデータの消去ブロック105のライト操作(ステップ140A、140B)を、図14のフローチャートと前述した図8のフローチャートとを参照して説明する。なお、両ライト操作(ステップ140A,140B)は、前述したように、基本的には同一の操作(ステップ140)である。
最初の状態では、バッファ263内にデータが全く存在しない。そのため、この状態(図9の例参照)では、次のように判定する。すなわち、ライト処理130(図8参照)において第1のライト操作(ステップ140A)の前操作に位置するステップ132の判定においてNO(今回のデータの先頭アドレスと既にバッファ263内にあるデータの終端アドレスとは連続しない)と判断する。
このような判定を下すため、第1のライト操作(ステップ140A)に移行する。しかしながら、第1のライト操作(ステップ140A)では、ステップ141の判断(バッファ263内にデータは存在するか否かの判断)においてデータは存在しないと判断する。そのため、第1のライト操作140Aを実施することなく、ステップ134,135を実施する。第2のライト操作140Bが実施されるかどうかは、今回のデータがバッファの終端に到達したかどうかの判断(ステップ135)による。図9の例では、データはバッファの終端(0xA0000)に到達していないため、第2のライト操作140Bは実施されない。
次に、バッファ263内にデータが存在している場合の消去ブロック105のライト操作140を説明する。この場合、ステップ141でバッファ263内にデータが存在することを確認したのち、バッファ263内の有効なデータの先頭アドレスが消去ブロック105のブロック境界に合致しているか否かを判定する(ステップ142)。一致していない場合は、先頭アドレスを消去ブロック105のブロック境界に一致させるためのリード操作を行う(ステップ143)。一方、一致している場合は、ステップ143を実施しない。
ここでいうリード操作とは、次の操作をいう。まず、書き込み対象となっているメモリカード100の消去ブロック105において、書き込み対象データの先頭アドレスと消去ブロック105のブロック境界との間のデータ領域に格納されたデータをメモリカード100から読み出す。読み出したデータを、バッファ263においてデータ格納場所となっている消去ブロック105の対応アドレス位置にコピーする。これによりバッファ263の消去ブロック105において残余のデータ領域に、メモリカード100から読み出したデータをコピーすることで埋め込む。このような一連の操作がここでいうリード操作である。
ステップ142,143の操作が実施されたのち、次に、バッファ263内の有効なデータの終端アドレスが消去ブロック105のブロック境界に一致しているか否かを判定する(ステップ144)。一致していない場合は、終端アドレスを消去ブロック境界に合わせるためのリード操作を行う(ステップ145)。一致している場合は、ステップ145を実施しない。
ここでいうリード操作とは、次の操作をいう。まず、書き込み対象となっているメモリカード100の消去ブロック105において、書き込み対象データの終端アドレスと消去ブロック105のブロック境界との間のデータ領域に格納されたデータをメモリカード100から読み出す。読み出したデータを、バッファ263においてデータ格納場所となっている消去ブロック105の対応アドレス位置にコピーする。これにより、バッファ263の消去ブロック105において残余のデータ領域に、メモリカード100から読み出したデータをコピーすることで埋め込む。このような一連の操作がここでいうリード操作である。
ステップ144、ステップ145を実施することにより、データの端が消去ブロック105のブロック境界に一致したことを確認する。境界一致を確認したのち、消去ブロックサイズのライト操作130(ステップ146)を行う。ライト操作130とは、データをバッファ263から読み出してメモリカード100に書き込む操作をいう。
以上のようにして消去ブロックサイズのライト処理130を実行する。
バッファ263内のデータの消去ブロックのライト操作140の例を、図15を参照して説明する。バッファ263内にターゲットアドレス0x6C000、レングス0x8000のデータが存在するとする。この場合、ステップ142にてバッファ263の先頭アドレスが消去ブロック境界0x60000に一致していないことが確認される。そこで、デバイスドライバ110はターゲットアドレス0x60000、レングス0xC000のリード要求127をメモリカードコントローラ109に発行することで前述したリード操作を実施する。これにより、バッファ263の消去ブロック105内のデータにおいて、その先頭アドレスはブロック境界0x60000に一致する。
次にステップ144にてバッファ263の終端アドレスが消去ブロック境界0x80000に合致していないことが確認される。そこで、デバイスドライバ110はターゲットアドレス0x74000、レングス0xC000のリード要求127をメモリカードコントローラ109に発行することで前述したリード操作を実施する。これにより、バッファ263の消去ブロック105内のデータにおいて、その終端アドレスは消去ブロック境界に一致する。
最後にターゲットアドレス0x60000、レングス0x20000のデータをバッファ263から読み出して(リードして)メモリカード100に書き込む(ライトする)。
なお、デバイスドライバ110におけるライト操作140以外の操作150では、図16のフローチャートに示すように、バッファ263内のデータを消去ブロック105でライト操作(ステップ140)したのちライト以外の操作を実行する(ステップ152)。このような処理手順を踏むことによりバッファ263内のデータをメモリカード100に確実に反映させてデータの整合性を確保することができる。ライト以外の操作(ステップ152)としては、リード要求(デバイスドライバ110がファイルシステムドライバ200から受けるリード要求であり、デバイスドライバ110がライト処理中に生成するリード要求127は含まない)やデバイス制御の要求がある。
デバイスドライバ110におけるタイマーライト起動スレッド160を、図17のフローチャートを参照して説明する。図8のライト処理130における特徴的な操作は、バッファ263内にデータを残したうえで、次の第2のライト要求122のアドレスが先の第2のライト要求122のアドレスに連続するかを判断することである。これにより、両アドレスが連続する場合には次の要求122を先の要求122に連結させることが可能となる。
しかし、次の第2のライト要求122が来ない時にデータがバッファ263に滞留してしまうことがある。このような不具合を解消するため、図17のタイマーライト起動スレッドを行う。以下説明する。
当該スレッド160が終了していない(継続中である)ことを確認したうえで(ステップ161)、最近のライト要求終了(又は開始)からの経過時間を判定する(ステップ162)。ステップ162の判定において、前記経過時間が閾値Thより大きければ、新たなライト要求を作成したうえで(ステップ163)、その要求とデータとをキューに挿入する(ステップ164)。そのうえでステップ161に戻る。一方、ステップ162において閾値Th以下の場合は、ステップ163、164の操作(ライト要求・キュー挿入)を実施せずにステップ161に戻る。そして、ステップ161でスレッドが終了したことを確認したら、一連のタイマーライト起動スレッド160を終了する。なお、ここでいう閾値Thは、次の要求122が来るまでの期間においてデータがバッファ263に滞留するか否かの判定を下す際の識別値となる期間の値を示し、予め、設定されて記憶デバイス183等に記憶されている。
ステップ163で作成したライト要求は、図3に示した要求処理スレッド155のステップ157においてキューから取り出され、タイマーライト処理166で実際にライトされる。
タイマーライト処理166は、図18のフローチャートに示されるように、図14に示したバッファ263内のデータの消去ブロック105のライト操作140により実行される。この場合、並行して動作する処理のタイミングによっては、ステップ141において、バッファ263内にデータが存在しない場合もあり得る。バッファ263内にデータが存在する場合のみ、消去ブロック105のライト処理140(ステップ146)が実行される。このタイマーライト処理166により、メモリカード100のデータをバッファ263でキャッシュしながらも、閾値Thの時間以内にはメモリカード100にデータが反映されることを保証する。これにより、メモリカード100が取り外される場合でも、データの整合性を保つことができる。
本発明の利点は、メモリカード100に対して必ず消去ブロック105で一回の第3のライト要求123を行うので、メモリカード100内に論理アドレスと物理アドレスとの関連付けが細かな単位で分散して記録時の転送レートを低下させる問題を回避できる点である。これにより、本発明のデータ記録装置101でデータを記録したメモリカード100を他の機器で利用する場合でも、転送レートを保証することができる。
以下、本発明の構成が、記録時の転送レートを低下させる問題を回避できる理由を説明する。まず、従来の構成では転送記録時の転送レートが低下する理由を説明する。図19に示すように、初期状態では、メモリカード100の論理アドレスと物理アドレスとは、互いに正確に対応付けされた状態となっている。なお、図19では、次の状態とする。
・リザーブ用の領域を2個(YとZ)とする。
・論理/物理アドレスは、それぞれ記録最小単位である記録ブロックAn,Bn,〜Znから構成する。
・記録ブロックAn,Bn,〜Znは、論理アドレス上の論理記録ブロックAn,Bn,〜Znと、物理アドレス上の物理記録ブロックAn,Bn,〜Znとを有する。
・論理/物理アドレス上の消去ブロック(以下、論理/物理消去ブロックA,B,〜Zという)を、複数の論理記録ブロックAn,Bn,〜Znのグループから構成する。なお、図19の例では、論理/物理消去ブロックA,B,〜Zそれぞれを4つの論理/物理記録ブロックAn,Bn,〜Znから構成し、同一の論理/物理消去ブロックA,B,〜Zを構成する論理/物理記録ブロックを、論理/物理記録ブロックA1〜4,B1〜4,〜Z1〜4と称する。
・初期状態では、論理消去ブロックA,B,〜Zと物理消去ブロックA,B,〜Zとは、1対1(A−A,B−B,C−C)に対応付けられており、さらには、対応付けられた論理消去ブロックと物理消去ブロックとの間において、論理記録ブロックAn,Bn,〜Znは、1対1(A1〜Z1−A1〜Z1、A2〜Z2−A2〜Z2、…)に対応付けられている。
なお、論理消去ブロックA〜Zに記録されるデータは、次のようにして生成される。メモリカード100とアプリケーションプログラム300との間にバッファ263を中間記録媒体として配置したうえで、バッファ263とアプリケーションプログラム300との間やバッファ263とメモリカード100との間で、データの読み/書き操作を実施する。このような操作の実施を通じてバッファ263上に論理消去ブロックA〜Zのデータを生成してメモリカード100に供給する。
従来の構成での記録操作を図20に示す。1回目の記録操作において論理記録ブロックA1にデータが書き込まれたとする。その際、物理記録ブロックA1にデータが存在しない。そのため、論理記録ブロックA1に書き込まれたデータは、そのまま、物理記録ブロックA1に記録される。
2回目の記録操作において論理記録ブロックA3にデータが書き込まれたとする。その際、1回目の記録操作により論理記録ブロックAに対応付けされている物理消去ブロックAの物理記録ブロックA1には既にデータが格納されている。そのために、物理記録ブロックA1を消去せずに物理記録ブロックA3をオーバーライトすることはできない。したがって、論理記録ブロックA3に書き込まれたデータは、リザーブ用の領域として確保されている物理消去ブロックYを構成する物理記録ブロックY1に記録される。
このとき、論理記録ブロックA3に対応付けられる物理記録ブロックは、物理記録ブロックY1に変更される。さらには、リザーブ用の領域を確保するために、次の処置が施される。
論理記録ブロックY1をリザーブの領域から解放したうえで、任意の他の論理記録ブロック(図20では、論理記録ブロックX1)を新たにリザーブ用の領域として確保する。
3回目の記録操作において論理記録ブロックA2にデータが書き込まれたとする。その際、1回目の記録操作により論理記録ブロックAに対応付けされている物理消去ブロックAの物理記録ブロックA1には既にデータが格納されている。そのために、物理記録ブロックA1を消去せずに物理記録ブロックA2をオーバーライトすることはできない。したがって、論理記録ブロックA2に書き込まれたデータは、リザーブ用の領域として確保されている物理消去ブロックZを構成する物理記録ブロックZ1に記録される。
このとき、論理記録ブロックA2に対応付けられる物理記録ブロックは、物理記録ブロックZ1に変更される。さらには、リザーブ用の領域を確保するために、次の処置が施される。
論理記録ブロックZ1をリザーブの領域から解放したうえで、任意の他の論理記録ブロックを新たにリザーブ用の領域として確保する。
以上の記録操作が実施されたうえで、論理消去ブロックAにデータに上書きする場合を想定する。この場合、物理消去ブロックA,Y,Zは全て消去しなければならなくなり、転送レートは低下してしまう。このように記録ブロックで記録を行うために、メモリカード100内でデータが分散してしまって、そのために転送レートが低下する。
なお、メモリカード100に対するライト処理の時間間隔や、ターゲットとするアドレスの相違や、メモリカード100のコントローラの相違や、さらにはメモリカード100の内部の状態の相違等に基づいて転送レートの低下の程度は変動する。しかしながら、記録領域に記録ブロックと消去ブロックとが設定された状態で読み書きが実施されるメモリカード100において転送レートの低下は共通の課題となっている。
次に、本発明を実施することで、転送レートの低下を抑制できる理由を説明する。図21は本発明の構成での記録操作を示す。
1回目の記録操作において論理消去ブロックAの論理記録ブロックA1にデータが書き込まれたとする。1回目のデータは一旦バッファ263にキャッシュされる。2回目の記録操作において論理記録ブロックA3にデータが書き込まれたとする。バッファ263にあるA1に書き込むべきデータと今回のA3は連続しないので、次の処理を行う。まず、バッファ263内を論理消去ブロックAに対応させて、物理消去ブロックAの物理記録ブロックA2、A3、A4に格納されているデータを、バッファ263内の論理記録ブロックA2、A3、A4に対応した位置に読み出す。これにより、バッファ263内のデータ内容は、論理消去ブロックAのデータを反映したものであると同時に物理消去ブロックAのデータを反映したものとなって、メモリカードのコントローラは、デバイスドライバから受けた論理消去ブロックAに対するライト要求をそのままの状態で物理消去ブロックAに書き込み可能となる。
2回目の記録操作において論理記録ブロックA3に書き込まれたデータが後にライトされる際においても、まず、バッファ263内を論理消去ブロックAに対応させて、物理消去ブロックAの物理記録ブロックA1、A2、A4に格納されているデータを、バッファ263内の論理記録ブロックA1、A2、A4に対応した位置に読み出す。これにより、バッファ263内のデータ内容は、論理消去ブロックAのデータを反映したものであると同時に物理消去ブロックAのデータを反映したものとなって、メモリカードのコントローラは、デバイスドライバから受けた論理消去ブロックAに対するライト要求をそのままの状態で物理消去ブロックAに書き込み可能となる。
これにより、本発明では、論理アドレスと物理アドレスとの間の対応付けが所期状態のままで変動することなく維持されることとなり、その結果、転送レートの低下を低減することができる。
本参考例は、図6に示したプログラム構成に基づいているが、図22に示すように、デバイス独自のI/O処理のみデバイスドライバで行い、本参考例で説明したデバイスドライバのライト処理110をデバイスドライバの上位に位置するフィルタドライバ115で実行することも可能である。フィルタドライバ115を用いた構成の場合、メモリカード100の種類やメモリカードのインターフェースなどハードウェアに依存する部分をデバイスドライバ110が吸収するので、本発明の記録処理はより汎用的に利用できる。
本参考例では、図8のライト処理130において、今回のデータとバッファ263内のデータとが連続するかどうかを判定するステップ132の操作は、図10に示すように、バッファ263内のデータの終端アドレスと第2のライト要求122のターゲットアドレスとが完全に一致するか否かで、両データの連続性を判定している。
しかしながら、ターゲットアドレスがバッファ263内のデータの終端アドレスより小さく、先頭アドレスより大きい場合にも連続していると判定することができる。例えば図10の例の場合、ターゲットアドレスが0x81000のような場合でも、バッファ263内のデータの0x81000以降を上書きしてコピーすることができる。この場合、最終的なバッファ263内のデータの終端アドレスは0x8F000となる。
本参考例では、図15に示すようにデータの先頭アドレス及び終了アドレスが消去ブロック105の境界に合っていない要求の場合、バッファ263内のデータを消去ブロック105にしてからメモリカード100に書き込む例を示した。しかしながら、この場合、そのデータをバッファ263にコピーする前に、消去ブロック105のデータをメモリカード100から読み出してバッファ263にコピーする処理(リード処理)を行って、バッファ263全体を消去ブロック105サイズのデータで埋める処理を行い、その上から前記要求のデータをバッファ263にコピーすることもできる。この処理は、将来、ライト操作140において行うべきリード操作を、前もって行うものである
このようなバッファ263上の上書き処理を行った場合、前記連続性の判定を変更することにより、バッファ263内に存在する消去ブロック105の範囲内のターゲットアドレス(及びレングスを加えて求められる終端のターゲットアドレス)を持つライト要求が到着し続けている間は第2のライト要求122を行わなくて済む。そのため、ファイルシステムドライバ200からの一連の第2のライト要求122をより高速に処理することが可能となる。
本実施形態では消去ブロック105でライト処理を行う例を示したが、消去ブロック105の整数倍の単位でライト処理を行っても同様の効果を得ることができる。メモリカード100をRAIDディスク状にL個(Lは自然数)だけ並列に接続した記憶媒体として使用する場合には、消去ブロック105のL倍のサイズでライト処理を行うことで本発明を適用できる。
本参考例では、メモリカード100を別のメモリカード100'に差し替えた場合、消去ブロックサイズを可変とすることが可能である。メモリカード100を抜いた際にデバイスドライバ110のアンロード処理179が行われ、別のメモリカード100'を差した際にデバイスドライバ110のロード処理170が行われる。ロード処理170(図4参照)のステップ173で、別のメモリカード100'に対する消去ブロックサイズを新たに決定することができる。また、ロード処理170においてメモリカード固有の情報を用いることで、消去ブロックサイズと異なるブロックサイズを用いることも可能である。
本参考例では、常に一定の消去ブロックサイズでメモリカード100に書き込む例を示したが、論理アドレスの領域毎に異なるブロックサイズで書き込むことも可能である。例えば、ファイルシステムのシステム領域に相当するアドレスの場合は、より小さいブロックサイズでライト処理を行うことができる。この場合、メモリ182上に割り当てるバッファ263は、可変となるサイズの最大値を割り当てておけば良い。
ファイルを記録するアプリケーションは、データ記録装置のOS上で動作するものであれば、利用することができる。アプリケーションプログラム300がファイルシステムドライバ200の処理やデバイスドライバ110の処理を包含する構成も可能である。また、ユーザ空間とカーネル空間の処理を区別しないOS上でも、本発明を実施できる。FATファイルシステムを例にとって説明したが、ファイルをクラスタのような一定のサイズに分割して記録するものであれば、他のファイルシステムにも適用できる。クラスタの境界と消去ブロックの境界が一致しない場合を例にとって説明したが、それらが一致する場合にも適用できるのは明らかである。
本参考例では、図1のようなデータ記録装置101に適用する例を示したが、OSが搭載されたデータ記録装置であれば、この形態に限るものではない。
本参考例では半導体メモリカードに適用する例を説明したが、半導体メモリカード以外の記録デバイスの場合でも、オーバーライト動作ができず、記録の際に消去動作が必要となるような記録デバイスに適用することが可能である。
第2の参考例
本参考例は、第1の参考例において、データ記録装置101のメモリ182上に確保された複数の物理メモリ領域を1つのメモリ記述子リストとして記述でき、かつ2つ以上のメモリ記述子リストを連結できる場合に適用できる例である。本参考例は、デバイスドライバ110'が第1の参考例と異なり、データ記録装置101の構成は第1の参考例と同じである。
メモリ記述子リストを図23を参照して説明する。ターゲットアドレス0x42000、レングス0x6000の第2のライト要求122がある場合、通常レングス0x6000のデータは、OSのメモリ空間260上に格納されている。仮想記憶ではメモリ領域をページ単位に分割するため、データを連続領域に確保せずに図23のように分散した領域に格納する。メモリ記述子リスト270は、この分散した領域を記述するためのリストである。図23ではメモリアドレスがカーネル空間にある例を示しているが、ユーザ空間にあってもよい。
本参考例のデバイスドライバ110'におけるロード処理170Cを図24に示す。最初にデバイスドライバ110のインスタンスをメモリ182上にロードする(ステップ171C)。次に、デバイスドライバ110'の初期化操作を行う(ステップ172C)。次に消去ブロックサイズを決定する(ステップ173C)。ここで、第1の参考例とは異なり、バッファ263を確保する代わりにライト処理用のバッファリストの領域を確保する(ステップ176C)。バッファリストは、図23のメモリ記述子リスト270と同様のリストであり、リストの行数の上限を設定し、情報の格納に十分な量のバッファリストの領域を確保すれば良い。バッファリストは、アンロード時に解放される。
本参考例のデバイスドライバ110'におけるライト処理130Cを図25に示す。なお、本参考例のライト処理130Cは、図8を参照して説明した第1の参考例のライト処理130と同様の構成を備える。そのため、図25のライト処理130Cにおいて、図8のライト処理と同一の操作には同一の符号を付し、それらについての説明は省略して、ライト処理130Cの特徴となる操作のみ説明する。
まず、今回のデータの先頭アドレスとバッファリスト内にあるデータの終端アドレスとが連続するかどうかを判定する(ステップ132C)。アドレスが連続しない場合は、バッファリストのデータの消去ブロックの第1のライト操作を行う(ステップ140C)。連続する場合は、バッファ263内で以前のデータと今回のデータとを連結させるため、消去ブロック境界以内の部分データのメモリ記述子リストをバッファリストにコピーする(ステップ134C)。
ここで、今回のライト要求270Aが、バッファリスト280Aと連続する場合、図26に示すように、リストをコピーして拡張することで、バッファリスト280Aをバッファリスト280Bに更新する。
図25のフローチャートに戻って説明する。ステップ134Cの操作を実施したのち、データがバッファ263の終端に到達したかどうかを判定し(ステップ135)、到達していなければ終了する。到達していればバッファリストのデータの消去ブロック105のライト処理(ステップ140D)を行う。
最後に、今回の要求データが残っているかどうかを判定し(ステップ136)、残っていればステップ134Cに戻る。残っていなければ操作を終了する。
但し、バッファリスト内にあるメモリアドレスの範囲は、データがバッファ263内で有効な間、ロックしておく必要がある。以上のようにして、デバイスドライバのライト処理130Cを行う。
以上説明したように、本参考例の消去ブロックのライト処理140Cにおいては、バッファ263がバッファリストで置き換わった以外は、第1の参考例における消去ブロックのライト操作140と同様の処理を行う。
本参考例におけるデバイスドライバのライト以外の処理150とタイマーライト起動スレッド160とは、第1の参考例と同様である。
本参考例は、データを連結させるためにリスト上でデータのリストを連結させている。そのため、メモリ182上でデータのコピーを行う必要がなくなり、複数の物理メモリ領域を1つのメモリ記述子リストとして記述できる。さらには、2つ以上のメモリ記述子リストを連結できる条件下においては、第1の参考例より高速なライト処理を行うことができる。
第3の参考例
本参考例の基本構成は、図1に示す第1の参考例と同じであるため、それらについての説明は省略する。本参考例では、図27に示すように、データ記録装置は撮像記録装置101Bとして構成される。レンズ194から入力された映像信号とマイク195から入力された音声信号を、メモリカード100に記録する。
本参考例の撮像記録装置101Bの動作も基本的には第1の参考例のデータ記録装置101と同様である。しかしながら、本参考例では、デバイスドライバのロード処理170(図4参照)において、メモリ182上にライト処理用のバッファ263を確保する操作(ステップ174)が、第1の参考例と異なる。第1の参考例との相違点を図28を参照して説明する。
図28に示すように、OSのメモリ空間260において、カーネル空間261上にライト処理のバッファ263を1個以上確保する。本参考例では、1個のバッファ263のサイズを256Kバイトとしており、128Kバイトとした第1の参考例と異なる。
バッファ263は、デバイスドライバ110のアンロード処理179において解放される。デバイスドライバ110のロード処理170及びアンロード処理179は、それぞれメモリカード100をデータ記録装置101に接続/取り外しするタイミングで行うのが望ましい。
次に本参考例の特徴となるメモリカード100への記録処理を、図29を参照して説明する。ファイルシステムドライバ200は、アプリケーションプログラム300からファイルをメモリカード100に記録するための第1のライト要求121を受けると、図47を参照して従来例で説明した手順に従って、ファイルをクラスタ210の単位で記録する。ファイルシステムドライバ200は、ファイル310を記録するために必要なクラスタのデータ221や管理データ220を、新たないくつかの第2のライト要求122としてデバイスドライバ110に送信する。
第2のライト要求122の列には、今回のファイル310の記録に必要なデータだけでなく、同時刻に記録すべき他のファイルのデータや管理データを含んでいても良い。
第2のライト要求122を受けたデバイスドライバ110は、ライト処理130を開始する。ライト処理130では、デバイスドライバ110はメモリカード100に記録される全てのデータを複数のピンポンバッファ113によりキャッシュする。このキャッシュ動作は、メモリカード100上の論理アドレスが連続する複数の第2のライト要求122を連結するように行われる。このキャッシュ動作によりメモリカード100に対する第3のライト要求123の数を減らすことができる。またピンポンバッファ113を用いることにより、第2のライト要求122のピンポンバッファ113へのコピー動作とピンポンバッファ113からメモリカード100への転送動作を同時並行して行うことが可能となる。さらにデータの整合性保証のため、一定時間間隔でピンポンバッファ113のフラッシュ動作を行う。ピンポンバッファ113は、バッファ263を複数用いて構成される。図29に示すように、2つのピンポンバッファ113(#1)、113(#2)を備え、さらに各ピンポンバッファ113を二つのバッファ263から構成する場合、図28に示すバッファ263を4個確保すれば良い。
ピンポンバッファ113の詳細を、図30を参照して説明する。図30は、K個(Kは自然数)のピンポンバッファ113を示している。各ピンポンバッファ113(#1〜#K)は、図29の構成と同様、2つのバッファ263を備える。以下、ピンポンバッファ113(#1〜#K)を構成するバッファ263は、#1−A、#1−B、#2−A、#2−B、…#K−A、#K−Bと記す。
ピンポンバッファ113(#1〜#K)の構成要素は、実際にバッファ領域が確保されるメモリ182上の論理アドレス264と、メモリカード100にライトすべきデータのターゲットアドレス265、及びレングス266とを有する。ピンポンバッファ113(#1)は、バッファ#1−Aにターゲットアドレス0x20000、レングス0x8000のデータが入っている。このように、ピンポンバッファ113を構成するバッファの少なくとも一つにデータが入っている時、「ピンポンバッファ113内にデータが入っている」と表現することにする。したがって、図30の状態では、ピンポンバッファ113(#1)、ピンポンバッファ113(#2)にはデータが入っており、ピンポンバッファ113(#3)にはデータが入っていないことになる。
また、ピンポンバッファ113(#1〜#K)にデータが入っている状態としては、バッファ113#(1〜K)−Aとバッファ113#(1〜K)−Bとの一方にデータが入っている場合もあれば、バッファ113#(1〜K)−Aとバッファ113#(1〜K)−Bとの両方にデータが入っている場合もある。両バッファにデータが入っている場合は片方のバッファ(例えば113#K−A)がライト中であり無効となる。そのため、この場合には実際に有効なデータはもう一方のバッファ(例えば113#K−B)のみとなる。
デバイスドライバ110によるライト処理130Bの詳細を、図31のフローチャートを参照して説明する。ピンポンバッファ113(#1〜#K)は、図30に示すように、K個(Kは自然数)確保するとする。
まず、要求データと連続するアドレスのデータを持つピンポンバッファ113#k(kは自然数、1≦k≦K)が存在するかどうかを判定する(ステップ231)。ここでアドレスとは、メモリカード100上の論理アドレス又は物理アドレスである。要求データと連続するアドレスのデータを持つピンポンバッファ113#kが存在する場合は、そのピンポンバッファ113#kを、要求データをコピーするターゲットバッファwとする(ステップ232)。存在しない場合は、要求データをコピーするターゲットバッファwを任意に決定する(ステップ233)。この決定方法は、メモリカード100上のデータが矛盾しない範囲で任意の方法が考えられる。例えば、ピンポンバッファ113#n(1≦n≦K)の中で、要求データとデータのアドレス領域が重複するn=N1が存在する場合にはw=N1とし、N1が存在しない場合にデータが入っていないピンポンバッファn=N2が存在する場合にはw=N2とする。いずれも存在しない場合にはwを任意のnとする方法がある。ターゲットバッファwが決定されると、ターゲットバッファw内のデータをメモリカード100に書き込むライト操作を行う(ステップ234A)。但し、バッファw内にデータが入っていない場合には、ライト操作を行わない。
次に、バッファ境界以内の部分データを、要求データからピンポンバッファwにコピーする(ステップ235)。バッファ境界以内とは、図30に示したピンポンバッファ113の終端アドレス以内に収まることを意味する。例えばピンポンバッファ113(#1)を構成するバッファ#1−Aをターゲットバッファwとする場合、システムファイルドライバ200が、合計のレングスが0x40000以内となる部分データをバッファ#1−Aにコピーすることを意味する。その際、ターゲットバッファwには、ステップ231でYESが選択された場合にはデータが入っており、NOが選択された場合にはデータが入っていない。そこで、ステップ231でYESが選択された場合にはデータを連続させるようにバッファ境界以内の部分データをターゲットバッファwにコピーし、NOが選択されていた場合にはピンポンバッファwの先頭から部分データをコピーする。
次に、コピーしたデータがピンポンバッファwの終端に到達したかどうかを判定し(ステップ236)、到達していなければ終了する。到達していればピンポンバッファw内のデータをメモリカード100に書き込むライト操作(ステップ234B)を行う。そのうえで、今回の要求データが残っているかどうかを判定し(ステップ237)、残っていればステップ135に戻る。残っていなければ終了する。
以上説明したデバイスドライバのライト処理130Bの効果を示す具体例を、図32と図33を参照して説明する。ここでは、2個のピンポンバッファ113(#1)、113(#2)が設けられ、さらには、各ピンポンバッファ113(#1)、113(#2)は、それぞれ2個のバッファ#1−A、#1−B、または、バッファ#2−A、#2−Bを備えているとする。さらには、デバイスドライバ110は、図32に示す4個の第2のライト要求122を連続して受信し、その結果、図31のフローチャートに示すライト処理130Bが4回実施されるとする。その際、2個のピンポンバッファ113(#1)、113(#2)には、最初は両方ともデータが入っていないものとする。
この場合、図32に示す処理では、到着順1の第2のライト要求122は、ピンポンバッファ113(#1)を構成するバッファ#1−Aにコピーされて(ステップ233、235)、終了する。到着順2の第2のライト要求122は、バッファ#1−Aに入っているデータとアドレスが連続しない。そのため、この第2のライト要求122は、ピンポンバッファ113(#2)を構成するバッファ#2−Aにコピーされて(ステップ233、235)、終了する。到着順3の第2のライト要求122は、バッファ#1−Aに入っているデータとアドレスが連続するので、バッファ#1−Aにコピーされて(ステップ232、235)、終了する。到着順4の第2のライト要求122は、ピンポンバッファ113(#1)を構成するバッファ#1−Aに入っているデータとはアドレスが連続しないが、ピンポンバッファ113(#2)を構成するバッファ#2−Aに入っているデータとアドレスが連続する。そのため、この第2のライト要求122は、バッファ#2−Aにコピーされて(ステップ232、235)、終了する。
以上の処理により、ピンポンバッファ113(#1)、113(#2)にライトすべきデータがキャッシュされる。
次に図33に示す到着順5の第2のライト要求122を受けた場合、この第2のライト要求122はピンポンバッファ113(#1)を構成するバッファ#1−Aに格納されているデータにも、ピンポンバッファ113(#2)を構成するバッファ#2−Aに格納されているデータにも、そのアドレスが連続しない。そのため、図31のステップ233において任意のピンポンバッファ113が選択される。この例では、ピンポンバッファ113(#1)が選択されたとする。この場合、バッファ#1−Aに格納されているデータを読み出してメモリカード100に書き込むライト操作を行ったうえで(ステップ234A)、到着順5のデータをバッファ#1−Bにコピーする(ステップ235)。
このとき、複数のバッファを備えたピンポンバッファ113を設けているため、バッファ#1−Aに格納されたデータのライト操作(ステップ234A)の完了を待つことなく、バッファ#1−Bにデータをコピーする操作(ステップ235)を行うことができる。バッファ#1−A内のデータは、ライト操作(ステップ234A)が完了すればクリアされる。これによりピンポンバッファ113(#1)における有効なデータの格納場所(バッファ)は、バッファ#1−Aからバッファ#1−Bに変更される。そのため、次に到着順6の第2のライト要求122を受ける場合、ステップ231の操作においてデータが連続するかどうかを比較する対象となるバッファは、バッファ#1−Bとバッファ#2−Aとに変更される。
以上、図32と図33とを参照して説明したように、デバイスドライバ110が受ける第2のライト要求122を、ピンポンバッファ113(#1〜#K)を用いてキャッシュすることで、メモリカード100へ送る第3のライト要求123の数を減らすことができ、ライトの転送レートを向上させることができることがわかる。
デバイスドライバ110のライト処理130Bを、具体例を参照して詳しく説明する。図31のライト処理130Bでは、ステップ232もしくはステップ233にてターゲットバッファw(113)を決定した後は、ターゲットバッファwに関する動作のみを考えれば良い。よってライト処理130Bは、ターゲットバッファwと要求データとの関係から、図34から図38に示す5つの場合に代表させることができる。
まず、ターゲットバッファw(113)内にデータがない場合のライト処理130Bの例を図34に示す。ターゲットバッファw(113)は、図28で予め確保したバッファ263領域のアドレスであり、0x20000バイト、即ち128Kバイトの領域としている。
第2のライト要求122が、ターゲットアドレス0x82000、レングス0xD000であるとした場合、0x82000から0xD000分のデータを、ターゲットバッファwを構成するバッファ#w−Aにコピーする(ステップ235)。このとき、バッファ#w−Aを0x82000から0xA2000までのメモリカード100上の領域に対応させる。
コピーしたデータはバッファ#w−Aの終端に到達していないので(ステップ236)、この第2のライト要求122の処理を終了する。なお、この例ではバッファ#w−Aにコピーする例を示したが、ターゲットバッファwの状態によりバッファ#w−Bにコピーする場合もある。これは、以下に示す他の場合の例でも同じである。
今回の要求がターゲットバッファw内のデータと連続する場合の例を図35に示す。ターゲットバッファwにはターゲットアドレス0x80000からレングス0x2000のデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x82000でレングスが0xD000の場合、このデータはターゲットバッファw内のデータと連続する。そのため、ターゲットバッファwにおいてターゲットアドレス0x80000からレングス0x10000までのデータ領域を、今回の第2のライト要求122で指定されるデータに更新して(ステップ235)、終了する。
今回の要求がターゲットバッファw内のデータと連続しない場合の例を図36に示す。ターゲットバッファwを構成するバッファ#w−Aにはターゲットアドレス0x6C000からレングス0x8000のデータが入っている。このデータと今回の第2のライト要求122のアドレス0x82000とは連続しない。そのため、バッファ#w−A内のデータを先に読み出してメモリカード100に書き出してから(ステップ234A)、バッファ#w−Bに今回の要求をコピーして(ステップ235)、終了する。
今回の要求がピンポンバッファw内のデータと連続し、ピンポンバッファの境界を跨ぐ場合の例を図37に示す。ターゲットバッファwを構成するバッファ#w−Aにはターゲットアドレス0x80000からレングス0x1A000のデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x9A000でレングスが0xD000の場合、バッファ#w−A内のデータと連続するが、バッファ境界のためバッファ#w−Aにはデータを0x6000だけしか挿入できない。この場合、バッファ境界以内のレングス0x6000の部分データだけをバッファ#w−Aにコピーする(ステップ235)。この場合、データのコピーにより、ピンポンバッファw(バッファ#w−A)では、格納したデータがバッファ終端に到達するので(ステップ236)、ピンポンバッファw内のデータを読み出してメモリカード100に書き込むライト操作を行う(234A)。ライト操作を実施しても、第2のライト要求122の要求データは残っているので(ステップ237)、残りのレングス0x8000の部分データを、ターゲットバッファwを構成するバッファ#w−Bにコピーする(ステップ235)。今回のコピー処理でデータはターゲットバッファwの終端に達しない(ステップ236)ので終了する。
今回の要求がピンポンバッファw内のデータと連続せず、ピンポンバッファの境界を跨ぐ場合の例を図38に示す。ターゲットバッファwを構成するバッファ#w−Aにはターゲットアドレス0x6C000からレングス0x8000のデータが入っている。今回の第2のライト要求122のターゲットアドレスが0x9A000でレングスが0x28000の場合、この第2のライト要求122で指定されるデータはバッファ#w−A内のデータと連続しない。そのため、バッファ#w−A内のデータを先に読み出してメモリカード100に書き込む(ステップ234A)。
次にターゲットバッファwの境界のため、ターゲットバッファwを構成するバッファ#w−Bにはデータを0x20000だけしか挿入できない。この場合、バッファ境界以内のレングス0x20000の部分データだけをバッファ#w−Bにコピーする(ステップ235)。コピーしたデータはターゲットバッファwの終端に到達するので(ステップ236)、ターゲットバッファw内のデータのライト処理を行う(ステップ234B)。
以上の操作を実施したのちであっても、第2のライト要求122の要求データは残っているので(ステップ237)、残りのレングス0x8000の部分データを、ターゲットバッファwを構成するもう一つのバッファ#w−Aにコピーする(ステップ235)。この際、バッファ#w−Aが使用できる状態になっているか確認する必要がある。コピーされたデータはバッファ#w−Aの終端に達しないので終了する。
以上説明したライト処理130Bの5つの場合において、図37と図38に示すように、コピーするデータがバッファ境界を跨ぐ場合は、ピンポンバッファ113を構成するバッファのサイズを十分大きく確保しておけば良い。そうすれば、コピーするデータがバッファ境界を跨ぐことがほとんどなくなる。ファイルシステムドライバ200からの要求は、いくつかの要求をキャッシュすると次に連続したアドレスの要求が来る確率が高いため、第2のライト要求122を連結して一つの要求にできる確率は高くなる。
デバイスドライバ110におけるライト以外の処理150Bを、図39のフローチャートを参照して説明する。最初に、ピンポンバッファ113(#k)(1≦k≦K)内のデータを読み出してメモリカード100に書き込むライト操作を実行する(ステップ151)。これは、K個全てのピンポンバッファ113(#k)内のデータをライトする操作である。この操作によりピンポンバッファ113(#k)内のデータをメモリカード100に確実に反映させてデータの整合性を確保する。その後ライト以外の操作を実行し(152)、終了する。ライト以外の操作には、リード要求(デバイスドライバ110がファイルシステムドライバ200から受けるリード要求)やデバイス制御の要求がある。
デバイスドライバ110におけるタイマーライト起動スレッド160は、図17を参照して説明した第1の参考例におけるタイマーライト起動スレッド160と同様であるのでその説明は省略する。
本参考例のタイマーライト処理166Bを図40のフローチャートを参照して説明する。タイマーライト処理166Bでは、図39のステップ151の操作であるピンポンバッファ113(#k)(1≦k≦K)内のデータのライト操作を実行する。並行して動作する処理のタイミングによっては、ステップ151において、ピンポンバッファ113(#k)内にデータが存在しない場合もあり得る。ピンポンバッファ113(#k)内にデータが存在する場合のみ、メモリカード100へのライトが実行される。このタイマーライト処理166Bにより、メモリカード100のデータをピンポンバッファ113(#k)でキャッシュしながらも、閾値Thの時間以内にはメモリカード100にデータが反映されることを保証する。メモリカード100が取り外される場合でも、データの整合性を保つことができる。
本参考例により、メモリカード100へのライト要求をキャッシュし、連続したアドレスの要求を連結することで、メモリカード100へ送られるライト要求の数を減らすことができる。本発明のデバイスドライバを用いることで、汎用のファイルシステムと汎用のメモリカードを用いる場合でも、ライトの転送レートを向上させることが可能となる。
本参考例は、図6に示したプログラム構成に基づいているが、図22に示すプログラム構成においても、第1の参考例と同様に実施することができる。
本参考例では、図31のライト処理130Bにおいて、今回のデータとピンポンバッファ113内のデータとが連続するかどうかを判定するステップ231の操作は、図35のようにターゲットバッファw内のデータの終端アドレスと第2のライト要求122のターゲットアドレスとが完全に一致するか否かで、両データの連続性を判定している。
しかしながら、ターゲットアドレスがターゲットバッファw内のデータの終端アドレスより小さく、先頭アドレスより大きい場合にも連続と判定することができる。例えば図35の場合、ターゲットアドレスが0x81000のような場合でも、バッファ#w−A内のデータの0x81000以降を上書きしてコピーすることができる。この場合、最終的なバッファ#w−A内のデータの終端アドレスは0x8F000となる。以上の連続性の判定を変更する場合には、図31のステップ233において、先述したバッファn=N1を選択する際の判定条件から、ターゲットアドレスがターゲットバッファw内のデータの終端アドレスより小さく、先頭アドレスより大きい場合を除外する必要がある。
本参考例では、図34のようにターゲットバッファw内にデータがない場合、ターゲットバッファwの先頭から第2のライト要求122のデータをコピーする例を示したが、例えばターゲットバッファwの先頭のターゲットアドレスを0x20000の倍数である0x80000と決定し、先頭から0x2000だけ後ろの位置からデータをコピーしても良い。その場合、最終的に図31のステップ234にてターゲットバッファw内のデータをライトする前に、0x80000から0x2000だけのデータをメモリカード100からターゲットバッファwにリードすることで、常にターゲットアドレスが0x20000の倍数であるライトを行うことができる。さらに、ステップ234にてライトする前にターゲットバッファw内のデータの終端アドレスが0xA0000に合っていない場合は、実際のターゲットバッファw内のデータの終端から0xA0000までのデータをメモリカード100からリードすることで、常にレングスが0x20000のライトを行うこともできる。これは、NAND型フラッシュメモリのようにブロックでデータをライトすることが効率的な記録デバイスに適している。ブロックとしては、記録ブロック、消去ブロック、またはそれらの整数倍の単位を用いることができる。
本参考例では、メモリカード100を別のメモリカード100'に差し替えた場合、ピンポンバッファ113(#1〜#K)の数K(Kは自然数)やピンポンバッファ113(#1〜#K)のサイズを可変とすることが可能である。メモリカード100を抜いた際にデバイスドライバ110のアンロード処理179が行われ、別のメモリカード100'を差した際にデバイスドライバ110のロード処理170が行われる。ロード処理170のステップ174で、別のメモリカード100'に対するピンポンバッファ113(#1〜#K)を新たに確保することができる。また、ロード処理170においてメモリカード固有の情報を用いることで、ピンポンバッファ113(#1〜#K)の数Kを決定することも可能である。
本参考例では、図30のピンポンバッファ113(#1〜#K)、即ち2*K個のバッファを用いる例を示したが、m*K個(mは自然数)のバッファを用いても良い。mをバッファの並列数と呼ぶことにする。並列数mの値により、デバイスドライバ110が並列して行える処理の数が変化する。m=1の場合、例えば図29において、ファイルシステムドライバ200からの第2のライト要求122をデバイスドライバ110がバッファにコピーする処理と、デバイスドライバ110がメモリカード100に第3のライト要求123を行う処理とは、双方の処理が同一のバッファ#k(kは自然数、1≦k≦K)を用いていると同時に行うことができない。つまり図31のフローチャートにおいて、ライト操作234A、234Bの完了は必ず待たなければならないことになる。m=2の場合、1回まではライト処理234A、234Bの完了を待たずに次の処理へ進める。一般的にm=M(Mは自然数、1≦M≦m)の場合、M−1回のライト処理234A、234Bまではメモリカード100に対するライトの待ち行列に挿入することができることになる。
ピンポンバッファ113(#1〜#K)の数Kとバッファの並列数mは、デバイスドライバ110が確保できるメモリ182の容量、データ記録装置101で許容できる書き込み遅延時間、メモリカード100の物理転送レート、使用するファイルシステムドライバ200の種類などに応じて最適な値を用いることができる。例えばFATファイルシステムを用いた場合、K=2〜5、m=2を用いることができる。
ファイルを記録するアプリケーションは、データ記録装置のOS上で動作するものであれば、利用することができる。アプリケーションプログラム300がファイルシステムドライバ200の処理やデバイスドライバ110の処理を包含する構成も可能である。また、ユーザ空間とカーネル空間の処理を区別しないOS上でも、本実施形態を実施できる。FATファイルシステムを例にとって説明したが、デバイスドライバ110の処理はファイルシステムフォーマットには依存していないため、他のファイルシステムにも適用できる。
本参考例では、図27のような撮像記録装置101Bに適用する例を示したが、OSが搭載されたデータ記録装置であれば、この形態に限るものではない。例えば撮像記録装置101Bに本発明を適用した場合、より高い記録レートを想定した装置にすることが可能である。つまり、レンズ194を通して撮影した映像データと、マイク195を通して集めた音声データとを、高いビットレートで高品質にメモリカード100にリアルタイム記録することが可能となる。
本参考例では半導体メモリカードに適用する例を説明したが、半導体メモリカード以外の記録デバイスに対しても適用できることは明らかである。
第4の参考例
本参考例は、第3の参考例において、データ記録装置101のメモリ182上に確保された複数の物理メモリ領域を1つのメモリ記述子リストとして記述でき、かつ2つ以上のメモリ記述子リストを連結できる場合に適用できる例である。データ記録装置101の構成は第1の実施の形態と同じであり、デバイスドライバ110のみが異なる。
メモリ記述子リストは、第2の参考例において図23を用いて説明したものと同じである。
デバイスドライバ110におけるロード処理170Dを図41に示す。最初にデバイスドライバ110のインスタンスをメモリ182上にロードする(171D)。次に、デバイスドライバ110の初期化処理を行う(172D)。ここで、第3の参考例とは異なり、バッファ263を確保する代わりにライト処理用のバッファリストの領域を確保する(176D)。バッファリストは、図23のメモリ記述子リスト270と同様のリストであり、リストの行数の上限を設定し、情報の格納に十分な量のバッファリストの領域を確保すれば良い。バッファリストを用いてライト中に新しいリストで上書きされるのを防ぐため、第1の実施の形態と同様にピンポンバッファリストにしても良い。バッファリスト(又はピンポンバッファリスト)の個数はK個(Kは自然数)に限定する。バッファリストは、アンロード時に解放される。
デバイスドライバ110におけるライト処理を、図42のフローチャートを参照して説明する。バッファリストは、K個(Kは自然数)確保するとする。まず、要求データと連続するアドレスのデータを持つバッファリストk(kは自然数、1≦k≦K)が存在するかどうかを判定する(ステップ231D)。ここでアドレスとは、メモリカード100上の論理アドレス又は物理アドレスである。第2のライト要求122と連続するアドレスのデータを持つバッファリストkが存在する場合は、要求データのリストをコピーするターゲットバッファwをバッファkとする(232D)。存在しない場合は、要求データのリストをコピーするターゲットバッファリストwを任意に決定する(233D)。この決定方法は、第3の参考例と同様である。ターゲットバッファリストwが決定されると、バッファリストw内のデータのライト処理を行う(234D−1)。但し、ターゲットバッファリストw内にデータが入っていない場合には、ライトを行わない。
次に、データの長さが上限に収まるように部分データのリストをバッファリストwにコピーする(235D)。データの長さの上限は、デバイスドライバ110の初期化処理172Dなどで予め設定した値を使用する。この値としては、例えばメモリカード100が受け付けるライト要求の長さの最大値を用いることができる。バッファリストwにコピーするデータの長さが上限に到達したかどうかを判定し(236D)、到達していなければ終了する。到達していればバッファリストw内のデータのライト処理(234D−2)を行う。今回の要求のデータが残っているかどうかを判定し(237D)、残っていればステップ235Dに戻る。残っていなければ終了する。以上のようにして、デバイスドライバ110のライト処理130Dを行う。
今回の要求データがバッファリストwに連続する場合のコピー処理は、第2の参考例において図26を参照して説明した通りである。
デバイスドライバ110のライト以外の処理150、タイマーライト起動スレッド160は、基本的に第3の参考例と同様である。また、デバイスドライバ110の処理111も基本的に第3の参考例と同様である。
本参考例は、データを連結させるためにリスト上でデータのリストを連結させている。そのため、メモリ182上でデータのコピーを行う必要がなくなり、複数の物理メモリ領域を1つのメモリ記述子リストとして記述できる。さらには、2つ以上のメモリ記述子リストを連結できる条件下においては、第3の参考例より高速なライト処理を行うことができる。
実施の形態
本実施形態は、第1,2,3,4の参考例において、ライトの遅延時間が極めて小さいことが要求されるデータがある場合、そのライト要求のみをキャッシュせずに即座にライトする機構を設けることができるものである。
本実施形態におけるデバイスドライバの処理112を図43に示す。図43において、、第1,2,3,4の参考例と異なる点は、ライト操作130を行う前に、制約条件に当てはまるかどうかを判定するステップ231を設け、当てはまる場合には制約時のライト操作230を行うようにしたものである。この制約条件は、任意の条件で良い。例えば、メモリカードへライトするターゲットアドレスの範囲や、データのレングス、又はそれらの組み合わせなどの条件で決定することができる。この制約条件の設定方法は、デバイスドライバ110の初期化操作(図4のステップ172参照、図24のステップ172C、図42のステップ172D参照)にて設定する方法や、要求の受付処理125にて要求毎に設定する方法などがある。
制約時のライト操作230について、図44のフローチャートを参照して説明する。まず、要求データと重複するアドレスのデータを持つピンポンバッファ113が存在するかどうかを判定する(ステップ232)。存在する場合には、ピンポンバッファ113内のデータのライト操作を行う(ステップ134)。ステップ134の操作は、次の理由により実施する。要求データをライトするメモリカード100のアドレス領域と重なるライト要求がピンポンバッファ113にキャッシュされていると、後でそのピンポンバッファ113内のデータがライトされてメモリカード100上のデータに矛盾が生じるためである。ステップ232の操作を実施したのち、要求データのライト操作を行い(ステップ233)、終了する。
本実施形態は、ライトの遅延時間が極めて小さいことが要求されるデータ、例えばファイルシステムの管理データ等に対して、ライト要求をキャッシュせずに即座にライトすることができる。リアルタイムにライトするデータとキャッシュして高速にライトするデータを区別することができるため、ライトの転送レートを高めつつも高い信頼性を持つデータ記録装置を構成することが可能となる。