1

使用 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 模式下工作正常:旋转的线程接收 null 作为其输入数据。通过调试验证,当我调用 createThread 时指针是正确的

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

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

4

1 回答 1

4

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

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

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

于 2015-01-26T21:19:33.473 回答