armarm32栈推导
Posted BHY_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了armarm32栈推导相关的知识,希望对你有一定的参考价值。
工作中经常需要根据ARM挂死时的栈空间推导函数调用栈情况。我们以kernel4.0为例,进行函数调用栈推导。实验环境是ubuntu1804+qemu+kernel4.0,已经通过交叉编译得到bzImage以及vmlinux符号表,qemu启动进入debug状态,eclipse连接qemu之后,导入符号表,为方便演示,我这里不手动执行挂死,假设已经挂死,直接从当前的寄存器和汇编来推演。
首先我们搞出一个比较深的调用栈,b printk后c几次,我们选定了这个状态进行推演栈。下图就是我们最终要推演出的结果。
1/printk函数堆栈
查看PC和SP。可以看到当前PC处于printk函数内的0xc00c7678,在printk函数入口部分,涉及SP变动的有3条汇编指令,即0xc00c766c,0xc00c7670,0xc00c7674,根据当前的SP值,定位LR存放位置=0xc10b7d10+44(十进制)=0xc10b7d3c,LR的值为0xc0d7caa4,要注意的是SP前面压入5个寄存器,需要再+20才能恢复到调用printk前的状态。我们根据LR的值跳到上一级函数(calculate_mode_totalpages)
2/ calculate_mode_totalpages函数堆栈。
此时SP的值为0xc10b7d10+44(十进制)+20(十进制)=0xc10b7d50
当前PC所在函数起始位置汇编:
当前SP+76即可得到LR存放的地址为0xc10b7d50+76=0xC10B7D9C,LR的值为0xc0d36e08
由于前面push lr,所以SP需要+4恢复到调用calculate_mode_totalpages前的状态。
3/free_area_init_node函数堆栈。以及之后的堆栈推导起来都很容易了,读者可以自行推导。
当前SP=0xC10B7D9C+4=0xC10B7DA0
以上是关于armarm32栈推导的主要内容,如果未能解决你的问题,请参考以下文章
Python 全栈开发:python的推导式(列表推导式字典推导式集合推导式)