0

64ビットWindows上のC++でJITコンパイラを作成すると、生成されたコードは、C++で作成されたランタイム関数を呼び出す必要がある場合があります。現時点では、生成されたコードを配置するためのメモリを割り当てていVirtualAlloc(0, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE)ます。割り当てられたメモリは他の方法では実行できないため、最後のフラグは重要です。

VirtualAllocおそらく64ビットアドレス空間のどこにでもメモリを返すことができます。これはデータには問題ありませんが(一般に4ギガバイト以上が必要になるため、64ビットアドレス指定が必要です)、x64call命令の最も効率的な形式です。 32ビットのIP相対オフセットが必要であり、生成されるコードの量は4ギガバイト未満になるため、C++からコンパイルされたコードの32ビットの変位内に配置することが望ましいでしょう。

これを手配する方法はありますか?

4

1 に答える 1

1

最初の引数として、割り当てを実行する近くの仮想アドレスを指定できます。必要な境界内で割り当てを取得する可能性を高めるために、最初に仮想メモリ領域を予約してから、必要に応じて予約済みスペースからコミットされたメモリを要求できます。デフォルトでは、MEM_TOP_DOWNが指定されていない限り、またはシステムがメモリレイアウトをトップダウンで実行してポインタの切り捨ての問題をキャッチするように構成されていない限り、割り当てはボトムで行われます。要点は、境界内に割り当てられる可能性を高めることしかできませんが、割り当てが境界外にある場合に処理するコードが必要であるということです。

于 2013-03-19T18:20:48.047 に答える