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

时间:2015-01-26 21:12:59

标签: c++ virtualalloc

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

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

1 - 用于保存x86汇编代码缓冲区的空格
2 - 用于保存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模式下:spun up线程接收null作为其输入数据。通过调试验证,当我调用createThread时,指针是正确的

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

任何想法为什么?我已经验证了我的所有VS构建设置在DEBUG / RELEASE

之间是相同的

1 个答案:

答案 0 :(得分:4)

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

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

很难说完全为什么重新排序分配会解决问题,但是如果你将指令复制到缓冲区然后在进入缓冲区之前做了很多工作,那么可能会有所改善“远离它”的可能性,因为CPU缓存将有更多的机会通过其他方式冲刷出来。