首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VirtualAlloc的顺序似乎很重要(c++)

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

Stack Overflow用户
提问于 2015-01-26 21:12:58
回答 1查看 415关注 0票数 1

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

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

1-容纳x86程序集代码缓冲区的空间

2-保存x86代码所需的数据结构的空间

在我的代码中,我正在做:

代码语言:javascript
复制
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构建设置在调试/发布之间是相同的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 21:19:33

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28158872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档