VirtualAlloc 的顺序似乎很重要 (c++)

the order of VirtualAlloc appears to matter (c++)

我在使用 virtualalloc 时有一些奇怪的行为。我在 c++,Visual Studio 2010.

我有两件事要分配,我正在使用VirtualAlloc(我有我的理由,与问题无关)

1 - Space 保存 x86 汇编代码的缓冲区
2 - Space 保存 x86 代码想要的数据结构

在我的代码中我正在做:

thread_data_t * p_data = (thread_data_t*)VirtualAlloc(NULL, sizeof(thread_data_t), MEM_COMMIT, PAGE_READWRITE);
//set up all the values in the structure
unsigned char* p_function = (unsigned char*)VirtualAlloc(NULL, sizeof(buffer), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(p_function, buffer, sizeof(buffer));
CreateThread( 0, (LPTHREAD_START_ROUTINE)p_function, p_data, 0, NULL);

在 DEBUG 模式下:工作正常
在 RELEASE 模式下:旋转起来的线程接收一个 null 作为其输入数据。通过调试验证我调用createThread时指针是正确的

如果我切换 VirtualAlloc,以便在数据 space 之前分配函数 space,那么 DEBUG 和 RELEASE 模式都可以正常工作。

知道为什么吗?我已经验证了我所有的 VS 构建设置在 DEBUG/RELEASE

之间是相同的

将汇编代码复制到内存缓冲区后,您不能直接跳入该缓冲区。您需要刷新 CPU 缓存等,否则它将无法工作。您可以使用 FlushInstructionCache 来执行此操作。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms679350%28v=vs.85%29.aspx

很难确切地说为什么重新排序分配会解决这个问题,但是如果你将指令复制到他们的缓冲区然后在跳入缓冲区之前做了很多工作,这可能会提高 "getting away with it," 的几率,因为 CPU 缓存将有更多机会通过其他方式被清除。