> 调用栈解析概念:
任意体系结构的CPU,都设计了一套通用寄存器、状态寄存器及其他控制寄存器,用以维系系统的正常运行。函数调用过程中,CPU一般都需要处理几件事情:保存母函数现场(寄存器值),将被调用函数的返回地址存储到相应的寄存器中(MIPS ra寄存器,ARM的LR寄存器),以确保被调用函数执行结束后,系统可重新跳转回正确的位置,并可拥有正确的执行环境继续运行。由于CPU通用寄存器甚至状态寄存器在不同的函数间是复用的,这就决定了在函数调用过程中需要将当前的CPU状态临时保存到一段存储空间里,并在被调用函数返回后从存储空间取出相应的数据恢复CPU状态上下文。
用于存储CPU状态的空间为堆栈stack,函数调用过程中用来保存CPU状态的存储空间就叫调用栈。
ARM体系结构对64位的支持从ARMV8开始,V7及以前的版本并不支持。V8的寄存器及指令集都发生了较大的变化,导致V7之前版本的调用栈解析工具不再可用,需要或从新设计实现一套。
Ø 调用栈Q&A
Q1: 收否所有函数都有调用栈?
并非所有函数都有调用栈,例如层次关系最深的函数,就可以直接使用CPU状态,而不需要关心调用栈。可以把有调用栈的函数称为非叶子函数,而无调用栈的则称为叶子函数
Q2:正常情况下是否需要感知函数调用栈
不需要。调用栈无处不在,但一般情况下程序员不感知其存在。
Q3:调用栈的内存管理是怎样的的
调用栈位于系统的栈section内,一般大多数系统里栈都是低地