2016-03-12 84 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

相關問題