(57)【要約】【課題】ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送する。【解決手段】ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得し、ＤＭＡ転送制御装置３００が具備するディスクリプタ格納メモリ３０４に予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報をデータの転送に必要な転送情報として記録してからＤＭＡ転送を開始する。ＤＭＡ転送制御装置３００はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をディスクリプタ格納メモリ３０４から取得できるので、ＣＰＵがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。【選択図】図３
2011070372.tif 000002
【特許請求の範囲】
【請求項１】
仮想記憶方式を採用するＯＳ環境下で動作するＤＭＡ転送制御装置であって、
ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得する手段と、
前記ＤＭＡ転送制御装置が具備するメモリに予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を前記データの転送に必要な転送情報として記録してからＤＭＡ転送を開始する手段と、
を備えることを特徴とするＤＭＡ転送制御装置。
【請求項２】
同期読み出しメモリを有し、該同期読み出しメモリに格納されているデータをＰＣＩバスを介してメインメモリに転送するＤＭＡ転送制御装置であって、
前記ＰＣＩバスのターゲットレディ信号（ＴＲＤＹ＃）がアサートされた次の１クロックだけ前記ＰＣＩバスのイニシエータレディ信号（ＩＲＤＹ＃）をディアサートする手段と、
前記イニシエータレディ信号（ＩＲＤＹ＃）をディアサートしている１クロックの間に前記同期読み出しメモリのアドレスを確定しておく手段と、
を備えることを特徴とするＤＭＡ転送制御装置。
【請求項３】
前記データの前記メインメモリへの転送は、前記ＤＭＡ転送制御装置がイニシエータデバイスとして動作し、かつ、前記メインメモリを含むチップセットがターゲットデバイスとして動作することでなされる、
ことを特徴とする請求項２記載のＤＭＡ転送制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）転送制御装置に関し、特にスキャッタギャザ（Ｓｃａｔｔｅｒ  Ｇａｔｈｅｒ）ＤＭＡ転送制御装置に関する。
【背景技術】
【０００２】
メインメモリと周辺機器との間でのデータ転送では、データの受け渡しをＣＰＵの管理下で行うのが一般的である。しかし、データの受け渡しを常にＣＰＵを介して行おうとすると、ＣＰＵの負荷が重くなるため、データ転送に時間を要することになる。
そこで、高速な機器とのデータの受け渡しを行う際には、ＣＰＵを介さずに周辺機器のインターフェース装置に制御権を渡して直接メインメモリとのデータの受け渡しを行う方式、即ちＤＭＡ転送が用いられる。
【０００３】
このＤＭＡ転送において、ＤＭＡ転送制御装置内に転送内容を示す転送情報（ディスクリプタ）を複数格納しておき、この複数の転送情報に基づいて連続的にデータ転送を行うのがチェーンＤＭＡ転送である（特許文献１）。また、このチェーンＤＭＡ転送の一種としてスキャッタギャザＤＭＡ転送が知られている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平１−２６１７６３号公報
【０００５】
スキャッタギャザＤＭＡ転送は図１に示すように、メインメモリ１００上に複数の転送情報を格納しておく転送情報領域１０１を持つ一方、ＤＭＡ転送制御装置１２がメインメモリ１００上の転送情報領域１０１からバス１３を介して転送情報を取得し、この取得した転送情報に基づいてＤＭＡ転送制御装置１２にＤＭＡ開始命令を発行し、バス１３を介してメインメモリ１００にデータを転送し、当該メモリ１００内のデータ領域１０２に書き込む、という動作を繰り返すことによってデータ転送を行うものである。
【０００６】
ここで、データ領域１０３とは、ｍａｌｌｏｃ等の一般的な領域確保の関数でユーザー空間から確保されたメモリ領域であるとする。
Ｗｉｎｄｏｗｓ（登録商標）やＬｉｎｕｘのように、仮想記憶方式を採用するＯＳ環境下では、このメモリ領域は、仮想アドレス空間では連続アドレスにマッピングされるが、物理アドレス空間ではページ単位で離散的にマッピングされる。
ページとは、仮想アドレス空間にマッピングできる物理メモリの最小単位のことをいうが、今日では４Ｋバイトのものが多い。
【０００７】
例えば、ｍａｌｌｏｃで２０Ｋバイトのメモリ領域を確保した場合、その先頭アドレスの下位１２ビットが０、つまり、先頭アドレスが４Ｋバイトのページ境界に割り当てられることは稀であり、大抵の場合はページの途中アドレスに割り当てられ、合計６ページ分のページをまたぐことになる。
【０００８】
一方、ＤＭＡ転送制御装置１２がメインメモリ１００にアクセスするには、転送先アドレスとして、メインメモリ１００の物理アドレスを指定する必要がある。
図２の例では、１ページ目の領域にデータ転送するために、先頭物理アドレス０ｘ１２７９２０４８、転送サイズ０ｘ０ＦＢ８をセットしてＤＭＡ転送制御装置にＤＭＡ開始命令を発行し、１ページ目の転送が完了したら、２ページ目の転送条件である先頭物理アドレス０ｘ１２Ｂ９４０００、転送サイズ０ｘ１０００をセットしてＤＭＡ開始命令を発行し、２ページ目の転送が完了したら、次ページの転送条件をセットして転送を開始して完了を待つ。最終的に６ページ目の転送条件をセットしてＤＭＡ転送を開始し、この転送が完了した時点で全データの転送が完了したことになる。
【０００９】
ここで問題になるのは、ＤＭＡ転送制御装置１２のページ単位の転送完了を知るための手段と、ＤＭＡ転送制御装置１２に次ページの転送情報をどのようなタイミングで与えるか、である。
【００１０】
即ち、ＤＭＡ転送制御装置１２のページ単位の転送完了を一定周期で監視するポーリング手段を適用すると、その分ＣＰＵに負荷がかかるため、ＣＰＵを介さずにデータ転送を行うことでＣＰＵにかかる負荷を軽減するというＤＭＡ転送の利点を享受できなくなるばかりでなく、リアルタイム性に乏しいポーリングでは、ＤＭＡ転送制御装置１２が実際にページ単位の転送を完了してからＣＰＵがそれを認識するまでにはタイムラグが発生し、このタイムラグに伴い、次ページの転送情報をＤＭＡ転送制御装置１２にセットするタイミングも遅れ、さらに、次ページの転送開始命令を発行するタイミングも遅れてしまう。
【００１１】
そこで、ＤＭＡ転送制御装置１２のページ単位の転送完了で割り込みを発生させ、デバイスドライバの割り込みルーチン内で次ページの転送情報をＤＭＡ転送制御装置１２に書き込む方法もあるが、例えばバス１３がＰＣＩバスのように割り込み共有型のバスである場合、割り込みが発生したとしてもその発生源が複数箇所の可能性があるため、割り込み線を共有している全てのハードウェアについて割り込み発生の有無を調べなければならず、転送速度が重要視されるアプリケーションにおいては最適な方法とはいえない。
【発明の概要】
【発明が解決しようとする課題】
【００１２】
本発明は、上記の問題を鑑みてなされたものであり、その課題とするところは、ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送することにある。
【００１３】
また、ＤＭＡ転送制御装置から転送するデータは、ＤＭＡ転送制御装置が備える同期書き込み、同期読み出し方式のメモリに予め格納されているものとして、このデータを、ＰＣＩバスを介してメインメモリにＤＭＡ転送する際のバスプロトコルについても本発明の課題とする。
【課題を解決するための手段】
【００１４】
上記の課題を解決するための手段として、請求項１に記載の発明は、仮想記憶方式を採用するＯＳ環境下で動作するＤＭＡ転送制御装置であって、ユーザー空間でデータの転送先となるメモリ領域を確保した時点でその領域に対応する物理アドレスをカーネル空間で取得する手段と、前記ＤＭＡ転送制御装置が具備するメモリに予め総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を前記データの転送に必要な転送情報として記録してからＤＭＡ転送を開始する手段とを備えることを特徴とする。
これにより、ＤＭＡ転送制御装置はページ単位の転送が完了したタイミングで残りページ数をデクリメントするとともに、次ページの転送情報をＤＭＡ転送制御装置自身が備えるメモリから取得できるので、ＣＰＵがページ単位の転送完了を認識する必要はなく、高速なデータ転送が可能となる。
【００１５】
請求項２に記載の発明は、同期読み出しメモリを有し、該同期読み出しメモリに格納されているデータをＰＣＩバスを介してメインメモリに転送するＤＭＡ転送制御装置であって、前記ＰＣＩバスのターゲットレディ信号（ＴＲＤＹ＃）がアサートされた次の１クロックだけ前記ＰＣＩバスのイニシエータレディ信号（ＩＲＤＹ＃）をディアサートする手段と、前記イニシエータレディ信号（ＩＲＤＹ＃）をディアサートしている１クロックの間に前記同期読み出しメモリのアドレスを確定しておく手段とを備えることを特徴とする。
これにより、アドレスを指定しても次のクロックが来ないと当該アドレスに格納されているデータを取り出すことができない同期読み出しメモリに格納されているデータを取り溢すことなくＰＣＩバスを介してメインメモリに転送することができる。
請求項３に記載の発明は、前記データの前記メインメモリへの転送は、前記ＤＭＡ転送制御装置がイニシエータデバイスとして動作し、かつ、前記メインメモリを含むチップセットがターゲットデバイスとして動作することでなされることを特徴とする。
【発明の効果】
【００１６】
本発明によれば、同期読み出しメモリに格納されているデータを取り溢しなく高速にメインメモリに転送することができる。
【図面の簡単な説明】
【００１７】
【図１】ＤＭＡ転送の概略を説明する図である。
【図２】仮想アドレス空間において連続アドレスにマッピングされたメモリ領域が、物理アドレス空間では離散的にマッピングされることを示す図である。
【図３】本発明のＤＭＡ転送制御装置の構成図である。
【図４】同期書き込み／同期読み出し方式のメモリの動作を示すタイミングチャートである。
【図５】本発明のＤＭＡ転送制御装置の動作フローを示すフローチャートである。
【図６】本発明のＤＭＡ転送制御装置の動作を示すタイミングチャートである。
【図７】本発明のＤＭＡ転送制御装置の動作を示す状態遷移図である。
【発明を実施するための形態】
【００１８】
以下、本発明の実施例を説明する。
図３は、本発明に係るＤＭＡ転送制御装置の構成例を示す図である。
ＤＭＡ転送制御装置３００は、ターゲットシーケンサ３０１と、レジスタインターフェース３０２（コンフィグレーションレジスタ３０２１とＤＭＡコントロール／ステータスレジスタ３０２２を有する）と、イニシエータシーケンサ３０３と、ディスクリプタ格納メモリ３０４と、外部データ格納メモリ３０５と、パリティチェッカ／ジェネレータ３０６とで構成されており、ＰＣＩバス３１０を介して、チップセット３２０内のＩ／Ｏコントロールハブ（ＩＣＨ）３２０２に接続されている。
チップセット３２０は、高速信号を授受するためのメモリコントロールハブ（ＭＣＨ）３２０１と、ＩＣＨ３２０２とで構成されており、ＭＣＨ３２０１は、専用バスを介して、ＣＰＵ３３０と、メインメモリ３４０に接続される。
【００１９】
次に、ＤＭＡ転送制御装置３００の構成要素について説明する。
ターゲットシーケンサ３０１は、ＣＰＵ３３０がＰＣＩバス３１０の制御権を有するイニシエータデバイス、ＤＭＡ転送制御装置３００がターゲットデバイスとして動作するためのステートマシンであって、イニシエータが発行するコンフィグレーションサイクルやメモリサイクルに応対する。
【００２０】
レジスタインターフェース３０２は、コンフィグレーションレジスタ３０２１と、ＤＭＡコントロール／ステータスレジスタ３０２２とで構成されている。
コンフィグレーションレジスタ３０２１は、ＤＭＡ転送制御装置３００が使用するメモリアドレス、割り込み線等のシステムハードウェアリソースを決定したり、ＰＣＩエージェントとしての各種機能のイネーブル／ディセーブルを決定したり、ＰＣＩエージェントとしての現在のステータスを示したり、デバイス固有の特性についての初期設定を行なったりする。
ＤＭＡコントロール／ステータスレジスタ３０２２は、ＤＭＡ転送制御装置３００に対して、ＤＭＡ転送開始のコントロールをしたり、ＤＭＡ転送制御装置３００のＤＭＡ転送完了ステータスを示したり、ＣＰＵ３３０から、ＰＣＩバス３１０を介して渡されるＤＭＡ転送情報を後述するディスクリプタ格納メモリ３０４に格納したりする。
【００２１】
イニシエータシーケンサ３０３は、ＤＭＡ転送制御装置３００がＰＣＩバス３１０の制御権を有するイニシエータデバイスとして動作するためのステートマシンである。詳細については後述する。
【００２２】
ディスクリプタ格納メモリ３０４は、ＤＭＡ転送制御装置３００がハードマクロとして備える同期書き込み／同期読み出し方式のメモリであって、データ転送先となるメインメモリの先頭物理アドレス、および、転送サイズについての情報を格納する。
本実施の形態では、ディスクリプタ格納メモリ３０４が、特許請求の範囲のＤＭＡ転送制御装置が具備するメモリを構成している。
【００２３】
外部データ格納メモリ３０５は、ＤＭＡ転送制御装置３００がハードマクロとして備える同期書き込み／同期読み出し方式のメモリであって、外部からのデータをバッファリングし、イニシエータシーケンサ３０３から出力されるアドレスに基づき、バッファリングしてあるデータをＰＣＩバス３１０に出力する。なお、外部データ格納メモリ３０５のデータビット幅は３２ビットとし、１つのアドレスに４バイトのデータを格納することができる。
本実施の形態では、外部データ格納メモリ３０５が、特許請求の範囲の同期読み出しメモリを構成している。
【００２４】
ここで、同期書き込み／同期読み出し方式のメモリについて、図４を用いて説明する。
同期書き込みとは、図４（ａ）に示すように、クロックの立ち上がりにおけるアドレスバスの値をアドレスとして、このアドレスに、同クロックの立ち上がりにおけるデータバスの値がデータとして書き込まれる。
同期読み出しとは、図４（ｂ）に示すように、アドレスを指定して、指定したアドレスのデータを読み出すことができるのは、次のクロックが来てからのものをいう。
なお、非同期読み出しとは、図４（ｃ）に示すように、アドレスを指定して、次のクロックが来る前に指定したアドレスのデータを読み出すことができるものである。
したがって、あるタイミングで同期読み出し方式のメモリからデータを読み出す場合には、少なくともその１クロック前のタイミングで当該データが格納されているアドレスを確定しておく必要がある。
【００２５】
パリティチェッカ／ジェネレータ３０６は、ＤＭＡ転送制御装置３００がターゲットデバイスとして振る舞う際のライトサイクル応答時、または、イニシエータデバイスとして振る舞う際のリードサイクル応答時、つまり、ＤＭＡ転送制御装置３００が受信側となる場合に送信側が生成するパリティをチェックし、パリティ異常検出時にはコンフィグレーションレジスタ３０２１にその旨を書き込むと共に、ＰＥＲＲ＃（パリティエラー信号）をアサートする一方、ＤＭＡ転送制御装置３００がターゲットデバイスとして振る舞う際のリードサイクル応答時、または、イニシエータデバイスとして振る舞う際のライトサイクル応答時、つまり、ＤＭＡ転送制御装置３００が送信側となる場合にパリティを生成してＰＡＲ（パリティ信号）として出力する。
【００２６】
次に、ＤＭＡ転送制御装置３００の動作について、図５に示すフローチャートを用いて説明する。
【００２７】
ステップＳ１では、ｍａｌｌｏｃでデータ転送先となるメインメモリ領域を確保する。具体例を示すため、ここでは２０Ｋバイトの領域を確保したものとする。
【００２８】
ステップＳ２では、ステップＳ１で確保した領域がスワップアウトされないようにデバイスドライバに要求する。つまり、カーネル空間においてノンページドプールメモリを割り当てる。
【００２９】
ステップＳ３では、ステップＳ１で確保した領域に対応する物理アドレスを取得する。物理アドレスはユーザー空間では取得できないため、カーネル空間で動作するデバイスドライバにアクセスすることによって取得される。
【００３０】
ステップＳ４では、ステップＳ３で取得した物理アドレスに基づいて、ディスクリプタを生成する。このステップで、総ページ数、各ページの先頭物理アドレス、各ページの転送サイズ情報を含む図２に示すようなディスクリプタ（転送情報）が生成される。
図中の数値は発明者のテスト環境において実際に得られた例である。
この例では、ユーザー空間で確保したメモリ領域の先頭仮想アドレスが０ｘ００９０００４８であり、ページ境界から０ｘ４８だけオフセットしているため、１ページ目における転送サイズは４Ｋバイト（０ｘ１０００）から０ｘ４８を差し引いた０ｘ０ＦＢ８となる。続く２ページ目から５ページ目までは、転送サイズは４Ｋバイト（０ｘ１０００）であり、最後の６ページ目における転送サイズは０ｘ４８となる。
また、各ページの先頭仮想アドレス０ｘ００９０００４８、０ｘ００９０１０００、０ｘ００９０２０００、０ｘ００９０３０００、０ｘ００９０４０００、０ｘ００９０５０００に対応する先頭物理アドレスとして、０ｘ１２７９２０４８、０ｘ１２Ｂ９４０００、０ｘ１２Ｃ５５０００、０ｘ１２４９６０００、０ｘ１２６２１０００、０ｘ１２９２２０００が得られた。
【００３１】
ステップＳ５では、ステップＳ４で生成したディスクリプタをＤＭＡ制御装置３００のディスクリプタ格納メモリ３０４に書き込み、また、総ページ数をDMAコントロール／ステータスレジスタ３０２２に書き込む。
このとき、ＰＣＩバス３１０の制御権はＣＰＵ３３０が有しており、ＤＭＡ制御装置３００はターゲットデバイスとして振る舞う。即ち、ＣＰＵ３３０がイニシエータデバイスとして発行するメモリライトサイクルに対し、ターゲットシーケンサ３０１が応答することになる。
【００３２】
ステップＳ６では、ステップＳ５でＣＰＵ３３０により発行されたメモリライトサイクルにターゲットシーケンサ３０１が応答することにより、図２に示したディスクリプタ（転送情報）がディスクリプタ格納メモリ３０４に書き込まれ、また、総ページ数がDMAコントロール／ステータスレジスタ３０２２に書き込まれる。
【００３３】
ステップＳ７では、ＣＰＵ３３０がDMAコントロール／ステータスレジスタ３０２２にＤＭＡ開始命令を書き込む。
【００３４】
ステップＳ８において、イニシエータシーケンサ３０３に対してＤＭＡ開始命令が発行され、ＤＭＡ制御装置３００はＰＣＩバス３１０の制御権を要求、獲得してイニシエータデバイスとして振る舞うようになる。
図５のステップＳ８からステップＳ１５までが、本発明のＤＭＡ転送制御装置のメインとなる部分である。そこで以下、図５のステップＳ８からステップＳ１５までの詳細について、図６のタイミングチャートを用いて説明する。
【００３５】
まず、図６（ａ）のクロックａでＤＭＡ開始命令を示すＤＭＡ＿ＳＴＡＲＴがアサートされる。
【００３６】
クロックｂでは、ＰＣＩバス３１０の制御権を要求するためにＲＥＱ＃（リクエスト信号）をアサートすると共に、外部データ格納メモリ３０５に対してアドレス（ＭＥＭ＿ＡＤＤＲ）０ｘ０番地を、残り転送サイズとして１ページ目の転送サイズである０ｘＦＢ８を、残りページとして総ページ数である０ｘ６をセットする。また、ＤＭＡ＿ＳＴＡＲＴをディアサートする。
【００３７】
外部データ格納メモリ３０５の０ｘ０番地のデータは、クロックｃ以降から出力される。
【００３８】
クロックｄでは、バスアービタによってＧＮＴ＃（グラント信号）がアサートされ（バスの使用が許可され）、ＤＭＡ制御装置３００はＰＣＩバス３１０の制御権を獲得する。
【００３９】
クロックｅでは、既にＧＮＴ＃がアサートされているので、ＰＣＩバス３１０の制御権を要求するＲＥＱ＃をディアサートする。
また、１ページ目のアドレスフェーズを発行するために、ＦＲＡＭＥ＃（フレーム信号）をアサートすると共に、ＡＤバスに１ページ目の先頭物理アドレス０ｘ１２７９２０４８を出力し、Ｃ／ＢＥ＃にメモリライトコマンド０ｘ７を出力する。
【００４０】
クロックｆでは、イニシエータ（ＤＭＡ制御装置３００）のデータ転送準備は整っているため、ＩＲＤＹ＃（イニシエータレディ信号）をアサートすると共に、外部データ格納メモリ３０５の０ｘ０番地から読み出したデータＤ（０）をＡＤバスに出力する。
【００４１】
クロックｇでは、クロックｆでＡＤバスに出力したアドレスをデコードして自分が選択されていることを認識したターゲットデバイス（つまり、チップセット３２０）がＤＥＶＳＥＬ＃（デバイスセレクション信号）をアサートする。
【００４２】
クロックｈでは、データの受信準備が完了したターゲットデバイスがＴＲＤＹ＃（ターゲットレディ信号）をアサートする。
【００４３】
そして、クロックｉにおいて初めてＩＲＤＹ＃とＴＲＤＹ＃が共にアサートされてデータ転送が成立し、ＡＤバスのデータＤ（０）がターゲットデバイスに渡される。
【００４４】
続くクロックｊのタイミングで外部データ格納メモリ３０５のアドレス０ｘ１番地に格納されているデータＤ（１）をターゲットデバイスに渡したいのであるが、外部データ格納メモリ３０５のアドレス０ｘ１番地のデータを読み出すためには、クロックｊよりも前のタイミングでアドレス０ｘ１を確定しておく必要がある。
しかし、イニシエータであるＤＭＡ制御装置３００としては、ターゲットデバイスがデータの受信準備を完了するタイミングを前もって知ることは不可能である。ターゲットデバイスが常にクロックｈのタイミングでデータの受信準備を完了するとは限らない。したがって、クロックｊよりも前のタイミングでアドレス０ｘ１を確定しておくことも不可能である。
【００４５】
そこで、クロックｉでＩＲＤＹ＃をディアサートしてデータ転送が成立しないようにする一方で、外部データ格納メモリ３０５のアドレス０ｘ１番地を指定する。
【００４６】
すると、クロックｊのタイミングでアドレス０ｘ１が確定するので、クロックｋのタイミングで外部データ格納メモリ３０５の０ｘ１番地に格納されたデータＤ（１）が読み出し可能となる。
【００４７】
よって、クロックｉでディアサートしたＩＲＤＹ＃を、クロックｊで再びアサートすることで、クロックｋのタイミングにてデータＤ（１）をＡＤバスに出力することができる。
つまり、ＴＲＤＹ＃が初めてアサートされた次の１クロック分だけＩＲＤＹ＃をディアサートしておくことによって、同期読み出し方式の外部データ格納メモリ３０５に格納されているデータを適切なタイミングでＡＤバスに出力できるようになる。
【００４８】
また、イニシエータシーケンサ３０３が、外部データ格納メモリ３０５のアドレスＭＥＭ＿ＡＤＤＲをインクリメントする条件は、ＦＲＡＭＥ＃とＴＲＤＹ＃がアサートされていることとすればよい。
【００４９】
さらに、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを（１回当たりのデータ転送容量である）４バイトずつデクリメントするための条件としては、ＩＲＤＹ＃とＴＲＤＹ＃がアサートされていることとすればよい。
【００５０】
そして、クロックｏでは、次のクロックｐでデータフェーズが終了するのでＦＲＡＭＥ＃をディアサートする。次のクロックｐでデータフェーズが終了することは、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥが８になっていることでわかる。
【００５１】
クロックｐでは、ＦＲＡＭＥ＃をハイインピーダンスにし、ＩＲＤＹ＃をディアサートする。ターゲットデバイスにより、ＤＥＶＳＥＬ＃、ＴＲＤＹ＃もディアサートされ、データフェーズが完了する。
つまり、１ページ目の転送が完了するので、次のページの転送情報をディスクリプタ格納メモリ３０４から要求するため、ＮＥＸＴ＿ＰＡＧＥをアサートする。
もちろん、残りページ数ＲＥＭＡＩＮ＿ＰＡＧＥが１より大きいことをＮＥＸＴ＿ＰＡＧＥをアサートするための条件に含む。
さらに、ディスクリプタ格納メモリ３０４の、次ページの転送情報が格納されているアドレスを指定しておく。これにより、次のクロックｑでアドレスが確定し、その次のクロックｒから次ページの転送情報を読み出すことが可能となる。
なお、ここでは、ＦＲＡＭＥ＃がディアサートされているので外部データ格納メモリ３０５のアドレスＭＥＭ＿ＡＤＤＲはインクリメントしない（０ｘ３ＥＥのまま）。
【００５２】
クロックｑでは、ＩＲＤＹ＃をハイインピーダンスにし、ＮＥＸＴ＿ＰＡＧＥをディアサートする。
【００５３】
クロックｒでは、ＮＥＸＴ＿ＰＡＧＥのアサート、つまり、全ページ分のＤＭＡ転送が完了していないことを認識し、ディスクリプタ格納メモリ３０４から読み出される２ページ目の転送サイズ０ｘ１０００を残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥにセットし、残りページ数ＲＥＭＡＩＮ＿ＰＡＧＥを６から５にデクリメントする。また、ＲＥＱ＃をアサートしてＰＣＩバス３１０の制御権を要求する。
【００５４】
クロックｓ、ｔでは、ＧＮＴ＃のアサートを待つ。
【００５５】
クロックｕで、ＧＮＴ＃のアサートを認識し、２ページ目のアドレスフェーズを発行するためにＦＲＡＭＥ＃をアサートすると共に、ディスクリプタ格納メモリ３０４から読み出される２ページ目の先頭物理アドレス０ｘ１２Ｂ９４０００をＡＤバスに出力し、Ｃ／ＢＥ＃にメモリライトコマンド０ｘ７を出力する。
【００５６】
クロックｐにおいて、外部データ格納メモリ３０５のアドレスＭＥＭ＿ＡＤＤＲをインクリメントせず、０ｘ３ＥＥのままにしておいたので、０ｘ３ＥＥに格納されているデータＤ（３ＥＥ）は、クロックｑから読み出し可能となる。
つまり、１ページ目の場合と同様に、最初のデータ転送が成立するＩＲＤＹ＃とＴＲＤＹ＃の両方が初めてアサートされるタイミングで、最初に転送するべきデータＤ（３ＥＥ）は前もってＡＤバスに出力する準備はできているが、その次のクロックで次のデータＤ（３ＥＦ）をＡＤバスに出力することはできないので、ＴＲＤＹ＃が初めてアサートされた次の１クロックだけＩＲＤＹ＃をディアサートし、その間にＭＥＭ＿ＡＤＤＲに０ｘ３ＥＦを書き込んでおくようにする。
【００５７】
以上が、１ページ目のデータ転送開始から１ページ目のデータ転送終了まで、また、１ページ目のデータ転送終了から２ページ目のデータ転送開始までのバスプロトコルの詳細である。
【００５８】
続いて、最後の６ページ目のデータ転送についてのバスプロトコルについて、図６（ｂ）を用いて説明する。
【００５９】
クロックＡでは、ＮＥＸＴ＿ＰＡＧＥのアサート、つまり、全ページ分のＤＭＡ転送が完了していないことを認識し、ディスクリプタ格納メモリ３０４から読み出される６ページ目の転送サイズ０ｘ００４８を残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥにセットし、残りページ数ＲＥＭＡＩＮ＿ＰＡＧＥを２から１にデクリメントする。また、ＲＥＱ＃をアサートしてＰＣＩバス３１０の制御権を要求する。
【００６０】
クロックＢ、Ｃでは、ＧＮＴ＃のアサートを待つ。
【００６１】
クロックＤで、ＧＮＴ＃のアサートを認識し、６ページ目のアドレスフェーズを発行するためにＦＲＡＭＥ＃をアサートすると共に、ディスクリプタ格納メモリ３０４から読み出される６ページ目の先頭物理アドレス０ｘ１２９２２０００をＡＤバスに出力し、Ｃ／ＢＥ＃にメモリライトコマンド０ｘ７を出力する。
【００６２】
クロックＥからクロックＱまでは説明が重複するので割愛する。
【００６３】
クロックＲで、最後のページの、最後のデータ転送が完了する。ここでは、残りページ数ＲＥＭＡＩＮ＿ＰＡＧＥが１なので、ＮＥＸＴ＿ＰＡＧＥがアサートされることはなく、ディスクリプタ格納メモリ３０４に格納された全ページ分のデータ転送が完了したことを示すＤＭＡ＿ＤＯＮＥをアサートすると共に、図示しないＩＮＴＡ＃（インタラプトＡ信号）をアサートする（図５ではステップＳ１５）。
【００６４】
以上がＤＭＡ制御装置３００の、イニシエータとしてのバスプロトコルの説明であり、図５のステップＳ８からステップＳ１５までの詳細である。
【００６５】
図５のステップＳ１６は、ディスクリプタ格納メモリ３０４に格納された全ページ分のＤＭＡ転送が完了したことをＣＰＵ３３０が認識するためのステップであり、ソフトウェアフローとしては、ＤＭＡ＿ＤＯＮＥの値を定期的に監視してもよいし、ＩＮＴＡ＃のアサートに対応する割り込みルーチンをデバイスドライバに記述してもよい。
ソフトウェアの開発負荷の観点からは、ＤＭＡ＿ＤＯＮＥの値を定期的に監視する方が簡便であるが、ＤＭＡ制御装置３００がＤＭＡ転送のためにＰＣＩバス３１０の制御権を獲得している最中に、ＣＰＵ３３０がＰＣＩバス３１０の制御権を定期的に要求することになるので、ＤＭＡ制御装置３００のデータ転送速度が遅くなる可能性がある。
よって、ＤＭＡ＿ＤＯＮＥの値を定期的に監視する方法は、ＤＭＡ制御装置３００のロジックのテスト、デバッグを簡便に行なうための非機能要件として捉えるのが妥当である。
転送速度が重要視されるアプリケーションでは、ＩＮＴＡ＃のアサートに対応する割り込みルーチンをデバイスドライバに記述しておく方が好ましい。
【００６６】
ステップＳ１７では、全ページ分のデータがステップＳ１で確保したメインメモリ領域に格納されている。
ＣＰＵ３３０は、このメインメモリ領域に適宜アクセスすることで、所定のアプリケーションソフトウェア処理を行うことができる。
【００６７】
ところで、図６の最下行には「図７のステート」と記しているが、ここで、イニシエータシーケンサ３０３の状態遷移図である図７について説明する。
【００６８】
イニシエータシーケンサ３０３は、パワーＯＮリセットを受けて（１）ＩＤＬＥステートに初期化される。
（１）ＩＤＬＥステートは、ＤＭＡ転送開始、あるいは、再開の命令を待ち、これらの命令を検出したらトランザクションを開始する。トランザクションを開始するには、コンフィグレーションレジスタのコマンドレジスタに割り当てられているマスタイネーブルビットが有効であることと、バスの制御権が獲得できている（ＧＮＴ＃がアサートされている）ことと、バスがアイドル状態（ＦＲＡＭＥ＃とＩＲＤＹ＃が共にディアサート）であることの確認が必要となる。
ＧＮＴ＃のアサート、ＦＲＡＭＥ＃とＩＲＤＹ＃のディアサートを確認できた場合には、（３）ＡＤＤＲＥＳＳ＿ＦＡＳＥステートに遷移するが、確認できない場合にはバスの制御権を要求するＲＥＱ＃をアサートして（２）ＷＡＩＴ＿ＧＮＴステートに遷移する。
さらに、ＤＭＡ転送開始、あるいは、再開の命令を検出していないにもかかわらずＧＮＴ＃がアサートされた場合には、バスパーキング処理を行う。
バスパーキング処理では、どんな値でもかまわないので、ＡＤバスやＣ／ＢＥ＃信号を出力状態にしてバスを安定させる。ＧＮＴ＃がディアサートされたら、信号のドライブを解放し、バスパーキング処理を終了する。さらに、エラー処理として、マスタイネーブルビットが無効であるにもかかわらずＤＭＡ転送開始、あるいは、再開の命令を検出した場合には、（５）ＭＳＴ＿ＴＵＲＮ＿ＡＲＯＵＮＤステートに遷移する。
【００６９】
ＤＭＡ転送開始、あるいは、再開の命令には、以下の場合があり得る。
即ち、（Ａ）最初の１ページ目のＤＭＡ開始命令を示すＤＭＡ＿ＳＴＡＲＴがアサートされた場合、（Ｂ）２ページ目以降のＤＭＡ開始命令を示すＮＥＸＴ＿ＰＡＧＥがアサートされた場合、（Ｃ）リトライ（ターゲットデバイスが何らかの理由でトランザクションに対して一時的に対応できない場合に要求される処理）、または、ディスコネクト（何度かデータ転送が成立した後に、何らかの理由でデータ転送が継続できない場合、後でトランザクションを再開してほしいときに要求される処理）により、ＤＭＡ転送がページ途中で打ち切られ、ページ途中からＤＭＡ転送を再開する場合である。
【００７０】
（Ａ）、（Ｂ）の場合、ディスクリプタ格納メモリ３０４からページ単位の転送情報を読み出してセットする。
【００７１】
（Ｃ）の場合、残り転送サイズとしては、ＲＥＭＡＩＮ＿ＳＩＺＥの値をそのままセットし、残りページとしてはＲＥＭＡＩＮ＿ＰＡＧＥの値をそのままセットする。
しかし、ページ途中からＤＭＡ転送を再開することになるので、転送先メインメモリの物理アドレスについては、ディスクリプタ格納メモリ３０４の情報をそのまま使うことはできない。
【００７２】
データ転送が１回成立する毎に転送先メインメモリの物理アドレスは０ｘ４だけインクリメントされるはずなので、ディスクリプタ格納メモリ３０４から読み出した転送サイズと、現在の残り転送サイズであるＲＥＭＡＩＮ＿ＳＩＺＥの差を取ることで、転送先メインメモリの物理アドレスを求めることができる。
例えば、ディスクリプタ格納メモリ３０４から読み出した先頭物理アドレスが０ｘ１０００００００、転送サイズが０ｘ１０００バイトで、ＲＥＭＡＩＮ＿ＳＩＺＥが０ｘ４００バイトであるなら、０ｘ１０００−０ｘ４００＝０ｘＣ００バイト分のデータ転送が成立した時点でＤＭＡ転送が打ち切られたことになる。
したがって、ＤＭＡ転送再開時の転送先メインメモリの物理アドレスは、０ｘ１０００００００＋０ｘＣ００＝０ｘ１００００Ｃ００となる。この値をアドレスフェーズでＡＤバスに出力できるようにＤＭＡコントロール／ステータスレジスタ３０２２に記録しておけばよい。
【００７３】
（２）ＷＡＩＴ＿ＧＮＴステートでは、ＧＮＴ＃がアサートされるのを待つステートである。但し、直前のトランザクションが完全には終わっていない場合があるため、ＧＮＴ＃がアサートされたからといって、直ちにＦＲＡＭＥ＃信号などのアサートを開始することはできない。
そこで、このステートでは、ＧＮＴ＃のアサートだけではなく、ＦＲＡＭＥ＃とＩＲＤＹ＃が共にディアサートされていてバスがアイドル状態にあることを条件に含めている。
この条件が成立したら、ＲＥＱ＃をディアサートし、ＦＲＡＭＥ＃、ＡＤ、Ｃ／ＢＥ＃のドライブを開始して（３）ＡＤＤＲＥＳＳ＿ＦＡＳＥステートに遷移する。
【００７４】
（３）ＡＤＤＲＥＳＳ＿ＦＡＳＥステートは、アドレスフェーズを発行するステートである。
最後のデータ転送が成立する１クロック前にＦＲＡＭＥ＃をディアサートする必要があるので、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを参照し、この値が０ｘ４以下の場合にはＦＲＡＭＥ＃をディアサートする。
また、ＩＲＤＹ＃をアサートして（４）ＭＳＴ＿ＤＡＴＡ＿ＦＡＳＥに遷移する。
また、本発明の主旨から外れるが、データ転送方向がリード（メインメモリが転送元、ＤＭＡ制御装置３００が転送先）の場合には、ＡＤバスのドライブを解放しておく。
【００７５】
（４）ＭＳＴ＿ＤＡＴＡ＿ＦＡＳＥは、データフェーズを発行するステートである。
残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを参照し、この値が０ｘ４以下の場合には、ＦＲＡＭＥ＃をハイインピーダンスにし、さらに、ＤＥＶＳＥＬ＃、ＴＲＤＹ＃のアサートを確認した場合にはＩＲＤＹ＃をディアサートし、ＡＤ、Ｃ／ＢＥ＃のドライブを解放して（５）ＭＳＴ＿ＴＵＲＮ＿ＡＲＯＵＮＤステートに遷移する。
【００７６】
ＤＥＶＳＥＬ＃（デバイスセレクション信号）はアサート、ＴＲＤＹ＃はディアサートである場合には、ＳＴＯＰ＃（ストップ信号）の値を確認し、ＳＴＯＰ＃がアサートされていたら、ＦＲＡＭＥ＃をディアサートして（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートに遷移する。ＳＴＯＰ＃がディアサートであれば、このステートでＴＲＤＹ＃のアサートを待つ。
【００７７】
ＤＥＶＳＥＬ＃がディアサートの場合には、ＤＥＶＳＥＬ＃応答のタイムアウトを検出するためのカウンタ値（初期値は（１）ＩＤＬＥステートで０ｘ３にセットしておく）を確認し、この値が０ｘ０になっていれば、ＤＥＶＳＥＬ＃応答タイムアウトと判断して、マスタアボートビットを有効にし、ＦＲＡＭＥ＃をディアサートして（７）ＡＢＯＲＴステートに遷移する。
カウンタ値が０ｘ０よりも大きければ、カウンタを０ｘ１だけデクリメントして、このステートでＤＥＶＳＥＬ＃のアサートを待つ。
【００７８】
残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを参照し、この値が０ｘ４よりも大きい場合で、ＤＥＶＳＥＬ＃、ＴＲＤＹ＃がアサートされていて、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥが０ｘ８である場合には、次のクロックでデータ転送が完了するのでＦＲＡＭＥ＃をディアサートすると共に、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを０ｘ４だけデクリメントし、外部データ格納メモリ３０５のアドレスＭＥＭ＿ＡＤＤＲを０ｘ１だけインクリメントする。
さらに、ＴＲＤＹ＃の初めてのアサート状態である可能性を確認し、もしそうである場合にはＩＲＤＹ＃をディアサートする。
ＴＲＤＹ＃が初めてアサートされたことを確認するためには、ＴＲＤＹ＃の立ち下がりエッジを検出すればよい。
ＳＴＯＰ＃がアサートされている場合には、ＦＲＡＭＥ＃をディアサートして（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートに遷移する。
ＤＥＶＳＥＬ＃はアサート、ＴＲＤＹ＃はディアサートされている場合においても、ＳＴＯＰ＃がアサートされていたら、ＦＲＡＭＥ＃をディアサートして（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートに遷移する。
【００７９】
ＤＥＶＳＥＬ＃がディアサートの場合、ＴＲＤＹ＃がディアサートでＳＴＯＰ＃がアサートされていたら、ターゲットアボートビットを有効にし、ＦＲＡＭＥ＃をディアサートして（７）ＡＢＯＲＴステートに遷移する。
ＳＴＯＰ＃がディアサートされていたら、ＤＥＶＳＥＬ＃応答のタイムアウトを検出するためのカウンタ値を確認し、この値が０ｘ０になっていれば、ＤＥＶＳＥＬ＃応答タイムアウトと判断して、マスタアボートビットを有効にし、ＦＲＡＭＥ＃をディアサートして（７）ＡＢＯＲＴステートに遷移する。
カウンタ値が０ｘ０よりも大きければ、カウンタを０ｘ１だけデクリメントして、このステートでＤＥＶＳＥＬ＃のアサートを待つ。
【００８０】
残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを参照し、この値が０ｘ４よりも大きい場合で、ＤＥＶＳＥＬ＃、ＴＲＤＹ＃がアサートされていて、残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥが０ｘ８でない場合には、外部データ格納メモリ３０５のアドレスＭＥＭ＿ＡＤＤＲを０ｘ１だけインクリメントする。
さらに、ＴＲＤＹ＃の初めてのアサート状態である可能性を確認し、もしそうである場合にはＩＲＤＹ＃をディアサートする。
そうではない場合には残り転送サイズＲＥＭＡＩＮ＿ＳＩＺＥを０ｘ４だけデクリメントする。
また、ＳＴＯＰ＃がアサートされている場合には、ＦＲＡＭＥ＃をディアサートして（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートに遷移する。
ＳＴＯＰ＃がディアサートされている場合には、このステートに留まる。
【００８１】
ＤＥＶＳＥＬ＃はアサート、ＴＲＤＹ＃はディアサートされている場合に、ＳＴＯＰ＃がアサートされていたら、ＦＲＡＭＥ＃をディアサートして（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートに遷移する。
【００８２】
ＤＥＶＳＥＬ＃がディアサートの場合、ＴＲＤＹ＃がディアサートでＳＴＯＰ＃がアサートされていたら、ターゲットアボートビットを有効にし、ＦＲＡＭＥ＃をディアサートして（７）ＡＢＯＲＴステートに遷移する。
ＳＴＯＰ＃がディアサートされていたら、ＤＥＶＳＥＬ＃応答のタイムアウトを検出するためのカウンタ値を確認し、この値が０ｘ０になっていれば、ＤＥＶＳＥＬ＃応答タイムアウトと判断して、マスタアボートビットを有効にし、ＦＲＡＭＥ＃をディアサートして（７）ＡＢＯＲＴステートに遷移する。
カウンタ値が０ｘ０よりも大きければ、カウンタを０ｘ１だけデクリメントして、このステートでＤＥＶＳＥＬ＃のアサートを待つ。
【００８３】
（５）ＭＳＴ＿ＴＵＲＮ＿ＡＲＯＵＮＤステートでは、ＩＲＤＹ＃をハイインピーダンスにし、（１）ＩＤＬＥステートに遷移する。
また、リトライ、または、ディスコネクトによってこのステートに遷移してきたわけではない、つまり、ページ単位の転送を完了することによってこのステートに遷移してきた場合には、残りページＲＥＭＡＩＮ＿ＰＡＧＥを参照し、０ｘ１よりも大きければ、次ページの転送情報を要求するためにＰＡＧＥ＿ＮＥＸＴをアサートすると共に、ＲＥＭＡＩＮ＿ＰＡＧＥを０ｘ１だけデクリメントする。
なお、ＰＡＧＥ＿ＮＥＸＴは（１）ＩＤＬＥステートでディアサート状態にセットされる。
ＲＥＭＡＩＮ＿ＰＡＧＥが０ｘ１であれば、最後のページのデータ転送が完了したことになるので、全ページ分のＤＭＡ転送完了を示すＤＭＡ＿ＤＯＮＥをアサートする。また、ＩＮＴＡ＃をアサートする。
【００８４】
（６）ＲＥＴＲＹ＿ＯＲ＿ＤＩＳＣＯＮＮＥＣＴステートでは、ＦＲＡＭＥ＃をハイインピーダンス、ＩＲＤＹ＃をディアサート、ＡＤバス、Ｃ／ＢＥ＃のドライブを解放する。
そして、リトライ、または、ディスコネクトにより、ページ途中でデータ転送が打ち切られたことを識別できるようにしておくため、所定の内部レジスタにその旨を記録して、（５）ＭＳＴ＿ＴＵＲＮ＿ＡＲＯＵＮＤステートに遷移する。
【００８５】
（７）ＡＢＯＲＴステートでは、ＲＡＭＥ＃をハイインピーダンス、ＩＲＤＹ＃をディアサート、ＡＤバス、Ｃ／ＢＥ＃のドライブを解放し、（５）ＭＳＴ＿ＴＵＲＮ＿ＡＲＯＵＮＤステートに遷移する。
【００８６】
以上のように、本発明のＤＭＡ転送制御装置によれば、同期読み出し方式のメモリに格納されているデータを、ＰＣＩバスを介して、ユーザー空間で確保されたメインメモリ領域であって、物理アドレス空間においては離散的にマッピングされるメインメモリ領域に高速に取り溢しなくデータを転送することができる。
【符号の説明】
【００８７】
１００……メインメモリ、１０１……転送情報領域、１０２……データ領域、１２……ＤＭＡ転送制御装置、１３……バス、３００……ＭＡ転送制御装置、３０１……ターゲットシーケンサ、３０２……レジスタインターフェース、３０２１……コンフィグレーションレジスタ、３０２２……ＭＡコントロール／ステータスレジスタ、３０３……イニシエータシーケンサ、３０４……ディスクリプタ格納メモリ、３０５……外部データ格納メモリ、３０６……パリティチェッカ／ジェネレータ、３１０……ＰＣＩバス、３２０……チップセット、３２０１……モリコントロールハブ（ＭＣＨ）、３２０２……／Ｏコントロールハブ（ＩＣＨ）、３３０……ＣＰＵ、３４０……メインメモリ。
【図１】
2011070372.tif 000003
【図２】
2011070372.tif 000004
【図３】
2011070372.tif 000005
【図４】
2011070372.tif 000006
【図５】
2011070372.tif 000007
【図６】
2011070372.tif 000008
【図７】
2011070372.tif 000009