深入理解栈:从CPU和函数的视角看栈的管理

45 阅读1分钟

栈帧本质上是一个函数的活动记录。当某个函数正在执行时,它的活动记录就会存在,当函数执行结束时,活动记录也被销毁。

在一个函数执行的时候,它可以调用其他函数,这个时候它的栈帧还是存在的。例如,A 函数调用 B 函数,此时 A 的栈帧不会被销毁,而是会在 A 栈帧的下方,再去创建 B 函数的栈帧。只有当 B 函数执行完了,B 的栈帧也被销毁了,CPU 才会回到 A 的栈帧里继续执行。

先创建的帧最后才销毁,后创建的帧最先被销毁,这就是先入后出的规律,也是程序执行时的活跃记录要被叫做栈的原因。

执行 callq 指令时,CPU 会把 rip 寄存器中的内容,也就是 call 的下一条指令的地址放到栈上,然后跳转到目标函数处执行。当目标函数执行完成后,会执行 ret 指令,这个指令会从栈上找到刚才存的那条指令,然后继续恢复执行。

在栈空间内使用缓冲区的时候,你必须要十分小心,要避免恶意的输入对缓冲区进行越界读写,破坏栈的结构,从而导致关键数据被修改。


此文章为7月Day4学习笔记,内容来源于极客时间《编程高手必学的内存知识》