Linux 内核调用栈解析
1.pushl和popl
pushl和popl指令来说操作的是栈,栈的基地址由%ebp来指定,栈顶元素由%esp来指定,%esp指向的就是栈顶元素。将一个双字压入栈中,首先要将%esp减4,然后将双字写入%esp指向的栈顶位置;弹出一个双字,首先要将%esp加4,然后将%esp指向的栈顶元素取出
2.call和ret指令
call lable //函数调用,会把call指令下一条指令push到栈
leave //函数调用返回前的准备,也就是movl %ebp, %esp; popl %ebp
ret//从栈中pop出地址,并跳转到这个地址继续执行
从以上可以看出每个函数栈顶保存上一级函数的栈顶值,
从进程栈中解析backtrace,也可以根据ebp解析出局部变量