进程堆栈区的内容

进程堆栈区的内容

我翻阅了一些Unix教科书,但无法清楚地了解进程的堆栈区域的内容。谁能解释一下或指出一些参考资料?

答案1

ld.so只有当内核将其交给动态链接器时,您才能清楚地了解堆栈。你可以找到一个基本图片在这里。这显示了C 程序的传统 3 个参数argcargv和。envpint main(int argc, char **argv, char **envp)

这种观点有些简单化。一个ELF 辅助向量存在于堆栈上,也传达了很多信息ld.so

运行后ld.so,libc 运行时介入并使事情变得复杂。 C++ 构造函数可以运行,各种疯狂的东西都可以在堆栈上结束。这取决于程序的编译方式。即使是简单的 C 程序也可以根据以下内容执行不同的操作什么图书馆他们编译为

答案2

维基百科文章相当简洁。如果你用谷歌搜索“堆栈与堆”,你会发现很多东西;一般来说,它们是相互关联地解释的。

如果您不进行任何编程,那么理解这对您来说并不是特别有用或重要的事情。如果你这样做了,那就是;大多数人首先遇到堆栈意义的一个地方就是WRT递归的来电;与此相关的更详细的维基百科文章调用栈。调用堆栈占据“进程的堆栈区域”;它保存函数调用的本地数据,嵌套或递归函数调用的数据“堆叠”在彼此之上后进先出排序

如果您还没有使用允许直接内存寻址的语言(例如 C/C++)进行过任何编程,那么了解内存地址如何映射内存区域非常重要,希望您的教科书已经介绍过这一点。

答案3

程序通常将函数参数压入堆栈,然后使用 asm CALL 指令调用函数,这会将返回地址压入堆栈,以便 RET 指令稍后可以将其弹出并知道返回到哪里。函数通常也会将其局部变量放在堆栈上。调用函数还可以在调用之前将其正在使用的任何寄存器压入堆栈,以便在被调用函数将这些寄存器用于其他用途后将其弹出。

函数 A 调用函数 B 的堆栈上的单词的可视化表示可能如下所示:

local1
arg1
functionA+12
local1
local2

这里 functionA 有一个局部变量,然后将参数传递给 functionB,并存储返回地址( functionA 开始后的 12 个字节)。然后 functionB 将它自己的两个局部变量放入堆栈中。如果 functionB 调用 functionC,那么堆栈会继续增长,然后随着函数返回而再次缩小。

相关内容