Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VirtualAlloc的顺序似乎很重要(c++)_C++_Virtualalloc - Fatal编程技术网

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

VirtualAlloc的顺序似乎很重要(c++),c++,virtualalloc,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_READWRI

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

如果我切换VirtualAlloc,在数据空间之前分配函数空间,那么调试和发布模式都可以正常工作


你知道为什么吗?我已经验证了我的所有VS构建设置在调试/发布之间是相同的

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


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

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


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

顺便说一句,我替换了链接到更好的参考。旧的链接更多的是发现案件而不是解决问题。你能不能也把你的另一个链接放回去?所以我可以读到关于检测和解决它的书?谢谢同样在阅读链接时,我发现在x86或x64 CPU体系结构上不需要FlushInstructionCache,因为它们具有透明缓存@WithoutMeItJustAweso:文档中未显示此选项。其他用户的评论很可能是错误的。官方声明是,如果应用程序在内存中生成或修改代码,它们应该调用FlushinStructureCache。我在生成线程之前添加了对FlushinStructureCache的调用,它似乎可以工作。这很好,但让我困惑。VirtualAlloc在堆中分配空间,我认为这不会有缓存问题。我可以理解修改虚拟内存空间中可能缓存的内容。但是,我认为任何对堆的引用都会得到更新,因为堆需要经常修改?顺便说一句,我将我的链接替换为更好的引用。旧的链接更多的是发现案件而不是解决问题。你能不能也把你的另一个链接放回去?所以我可以读到关于检测和解决它的书?谢谢同样在阅读链接时,我发现在x86或x64 CPU体系结构上不需要FlushInstructionCache,因为它们具有透明缓存@WithoutMeItJustAweso:文档中未显示此选项。其他用户的评论很可能是错误的。官方声明是,如果应用程序在内存中生成或修改代码,它们应该调用FlushinStructureCache。我在生成线程之前添加了对FlushinStructureCache的调用,它似乎可以工作。这很好,但让我困惑。VirtualAlloc在堆中分配空间,我认为这不会有缓存问题。我可以理解修改虚拟内存空间中可能缓存的内容。但是,我认为任何对堆的引用都会得到更新,因为堆需要经常修改?