我认为这个问题很有可能是重复的或者已经在这里得到了解答,但由于“堆栈分配”和相关术语的干扰,搜索答案很困难。
我有一个玩具编译器,用于一种脚本语言。为了能够在脚本执行过程中暂停并返回到主程序,它有自己的堆栈:一个简单的内存块,带有一个“堆栈指针”变量,使用正常的 C 代码操作进行增量等等。到目前为止都不那么有趣。
目前我编译成 C 代码。但我也有兴趣研究编译成机器码 - 同时保留第二个堆栈和在预定义控制点返回到主程序的能力。
所以...我想我的代码中使用传统的堆栈寄存器可能不会有问题,我假设在那里发生的寄存器情况是我的事情,只要完成时恢复所有内容即可(如果我在这一点上错了,请纠正我)。但是...如果我希望脚本代码调用一些其他库代码,离开这个“虚拟堆栈”安全吗?还是必须为此目的交还原始堆栈?
编辑:抱歉,当然,我应该说的是。我正在使用x86(32位为我的机器),Windows和Ubuntu。没有什么特别的。
我有一个玩具编译器,用于一种脚本语言。为了能够在脚本执行过程中暂停并返回到主程序,它有自己的堆栈:一个简单的内存块,带有一个“堆栈指针”变量,使用正常的 C 代码操作进行增量等等。到目前为止都不那么有趣。
目前我编译成 C 代码。但我也有兴趣研究编译成机器码 - 同时保留第二个堆栈和在预定义控制点返回到主程序的能力。
所以...我想我的代码中使用传统的堆栈寄存器可能不会有问题,我假设在那里发生的寄存器情况是我的事情,只要完成时恢复所有内容即可(如果我在这一点上错了,请纠正我)。但是...如果我希望脚本代码调用一些其他库代码,离开这个“虚拟堆栈”安全吗?还是必须为此目的交还原始堆栈?
答案中的 this one 和 this one 表明栈不是传统的内存块,而是依赖于特殊的、与页面错误有关的系统行为。
所以:
- 将堆栈指针移动到其他内存区域是否安全?堆栈内存并不是“特别的”吗?我想线程库一定会做类似的事情,因为它们创建更多的堆栈……
- 假设使用堆栈寄存器和指令操纵任何内存区域都是安全的,只要已知调用深度的任何函数都可以调用,(即没有递归、没有函数指针),只要虚拟堆栈上有足够的空间,这会有什么问题吗?对吗?
- 在正常代码中,堆栈溢出显然是一个问题,但是在这样一个系统中,堆栈溢出是否会产生任何额外灾难性的后果?
编辑:抱歉,当然,我应该说的是。我正在使用x86(32位为我的机器),Windows和Ubuntu。没有什么特别的。