2016-03-12 21 views
3

我在做一些尝试,并想知道是否可以在我提供的特定地址创建一个线程,或者至少让线程堆栈只在我可以指定的某个(巨大)虚拟内存区域中产生。我可以使用堆栈在特定地址创建线程吗?

我对此感兴趣的原因是,我想将整个堆栈复制到某个远程进程,并且需要指针保持不变,并且线程堆栈不会相互碰撞。

我知道这可能不是最好/最安全的方式,但这只是一个小小的爱好项目。如果你知道如何在Linux上做到这一点,我也对此感兴趣。

+0

嗯......你知道系统托管的内存(如堆栈)会移动,并且你的指针在线程的生命周期结束时可能无效,对吗?此外,您知道堆栈中的所有内存将在线程退出的时候被释放并回收(因此,在您获得它时,它们都不会有效,并且另一个进程可能会使用它)...对吗? – Myst

+1

太糟糕了,你不在POSIX/Unix/Linux/WhateverBSD上,你可以使用[pthread_attr_setstackaddr(3)](http://linux.die.net/man/3/pthread_attr_setstackaddr)... – 3442

+2

@Myst System不能也不会移动堆栈。如果它确实所有的指针都是无效的。对象在他们整个生活中都有相同的地址。 –

回答

1

只是编译评论所说的内容。

+3

即使在Windows下,您也可以使用您选择的缓冲区作为堆栈,只需在线程创建期间保留最小缓冲区,并在退出时恢复原始堆栈或调用ExitThread。只需使用一个小的程序集封装器来切换堆栈指针并在伪造的堆栈帧上回调到C。您将需要通过结构异常手动处理警戒页/溢出检查,并且还有平台特定的细节(例外展开记录,Itanium双栈,对齐要求等)。再加上自上次尝试以来我一直压制的一些微妙之处。 – doynax

+0

查看该[来自Intel的链接](https://software.intel.com/zh-cn/articles/adjusting-thread-stack-address-to-improve-performance-on-intel-xeonr-processors)该交易在Xeon处理器上调整堆栈地址..我没有看到任何特定于Xeon的'asm',所以它可能在其他x86 Windows平台上工作。 – txtechhelp

相关问题