gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:49:59 24 4
gpt4 key购买 nike

我在使用 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 build设置在 DEBUG/RELEASE 之间都是相同的

最佳答案

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

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

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

关于c++ - VirtualAlloc 的顺序似乎很重要 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com