我在使用virtualalloc时有一些奇怪的行为。我在c++,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);在调试模式下:工作良好
在发布模式中:旋转的线程接收空作为其输入数据。通过调试验证当我调用createThread时指针是正确的
如果切换VirtualAlloc,以便在数据空间之前分配函数空间,那么调试和发布模式都可以正常工作。
知道为什么吗?我已经验证了我所有的VS构建设置在调试/发布之间是相同的
发布于 2015-01-26 21:19:33
在将程序集代码复制到内存缓冲区后,不能直接跳入该缓冲区。您需要刷新CPU缓存等,否则它将无法工作。您可以使用FlushInstructionCache来完成此操作。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms679350%28v=vs.85%29.aspx
很难确切说明为什么重新排序分配会解决这个问题,但是如果您将指令复制到它们的缓冲区中,然后在跳入缓冲区之前做了大量的工作,这可能会提高“逃脱”的几率,因为CPU缓存将有更多的机会通过其他方式被清除。
https://stackoverflow.com/questions/28158872
复制相似问题