在64位Windows上用C ++编写JIT编译器,生成的代码有时需要调用用C ++编写的运行时函数。目前我正在分配内存,用VirtualAlloc(0, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE)
放置生成的代码;最后一个标志很重要,因为分配的内存不可执行。
VirtualAlloc
可能会在64位地址空间的任何地方返回内存,这对于数据来说很好(通常需要超过4 GB,因此它确实需要64位寻址),但是x64 call
指令的最有效形式需要32位IP相对偏移量,并且由于生成的代码量将小于4千兆字节,因此最好将其定位在32位位移内从C ++编译的代码。
有没有办法安排这个?
答案 0 :(得分:1)
您可以指定要在其附近进行分配的虚拟地址作为第一个参数。为了增加在边界内获得分配的机会,您可以先保留虚拟内存区域,然后在需要时从保留空间请求已提交的内存。 默认情况下,分配发生在底部,除非指定了MEM_TOP_DOWN或系统配置为自上而下执行内存布局以捕获指针截断问题。要点是你只能增加在边界内进行分配的机会,但是当分配超出边界时应该有代码来处理。