none
AllocateUserPhysicalPages及びVirtualAlloc関数の使用方法について RRS feed

  • 質問

  • 1プロセスにて2G以上のメモリを割り当てたいと考えています。

     

    色々調べたところ、AWEというものを使用すると実現できる可能性があるらしく、MSDNにあるサンプルソース(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/awe_example.asp)をベースにして、試しているのですが上手くいきません。

     

    メモリを2G積んでいるPCにて、最初にHeapAlloc関数を使用して1.5Gほどメモリを確保したのにち、AllocateUserPhysicalPages関数を使用して1.5Gほどメモリを確保すると、タスクマネージャー上で見る限りでは使用メモリ量が3.0G近くになっており、確保そのものはできているのかなと思うのですが、その領域を使用するために、VirtualAlloc関数を用いるとNULLで返ってきてしまいます。(なお、その際のエラーコードは「0x00000008 このコマンドを実行するのに十分な記憶域がありません。」でした。)

     

    上記のような手法にて、2G以上のメモリを使用する事はできるのでしょうか?できるのであれば、どのようにすれば可能なのかご教授いただけないでしょうか?

     

    なお、OSはWindowsXP、PGにはVisualStudio.Netを使用しており、CPUは32Bitです。

    2006年6月22日 8:15

回答

  • 他のフォーラムに投稿した結果、多数の方よりヒントを頂きまして

    2G以上のメモリを使用する事ができました。

     

    AllocateUserPhysicalPageで分割してメモリを取得し

    VirtualAllocを使用して取得したメモリを使用する土台を用意し(第1引数はNULLで問題ありませんでした。)

    MapUserPhysicalPagesを用いて

    マップ⇒マップ解除⇒マップ⇒マップ解除⇒マップ・・・

    を繰り返す事で2G以上のメモリを使用できました。

     

    皆様ありがとうございました。

    2006年6月28日 6:55

すべての返信

  • 追記です。

    どうやら仮想メモリの確保上限が2Gになっているらしく、その上限にひっかかってしまうため、VirtualAlloc関数が失敗してしまうようです。

     

    そこで、仮想アドレスに分割して物理メモリを割り当てる事で、この問題を回避しようとしているのですが、分割して物理メモリに割り当てる手法が分かりません。

     

    VirtualAllocの第1引数を利用すれば、上記の分割して「物理メモリに割り当てる」という事ができそうなのですが、どういった値を設定してあげればよいのでしょうか?

    2006年6月27日 9:07
  • 他のフォーラムに投稿した結果、多数の方よりヒントを頂きまして

    2G以上のメモリを使用する事ができました。

     

    AllocateUserPhysicalPageで分割してメモリを取得し

    VirtualAllocを使用して取得したメモリを使用する土台を用意し(第1引数はNULLで問題ありませんでした。)

    MapUserPhysicalPagesを用いて

    マップ⇒マップ解除⇒マップ⇒マップ解除⇒マップ・・・

    を繰り返す事で2G以上のメモリを使用できました。

     

    皆様ありがとうございました。

    2006年6月28日 6:55