Last Updated 2002/10/11
Windows
メモリ管理
2002/10/11

GlobalAlloc にて 268MByte ほど確保しようとするとエラーとなってしまう.
(正確には 268,435,352Byte)

これは GlobalAlloc が内部エラーとしているからである.
( 0x0FFFFF98 より大きい場合はエラー)

Windows95 などはヒープ管理に DWORD の上位 4bit を使用している.
よって,サイズは 28bit(0x0FFFFFFF) までである.その値から管理データなどを引いた値が 0x0FFFFF98 と想像される.


メモリマップドファイルはアドレスの 2G 〜 3G の領域に確保される.
この領域は Win32 カーネル(KERNEL32, GDI32, USER32 等)や Win16 モジュール(KERNEL, USER, GDI 等や Win16 プログラム)が配置される.
よってメモリマップドファイルの制限は
1G - モジュールサイズ
となる.
Ring3/Ring0 といったカーネルもこの領域を使用するので,あまり負荷をかけるのは得策ではない.


一方,VirtualAlloc は Win32 カーネルのヒープ管理対象外である.
4M 〜 2G のプライベート領域からページ単位でメモリを確保する.
(ページ単位なので 4KByte のバウンダリ)
だから仮想メモリの上限まで確保できるはずである.


参照
GlobalLockとGlobalFree
メモリ確保
前後のTips
メモリ管理

DSS ProgrammingTipsCGI Ver1.02