全部博文(573)
分类: 嵌入式
2015-12-04 10:15:33
struct pt_regs {
long uregs[18];
};
#define ARM_cpsr uregs[16] //当前程序状态寄存器
#define ARM_pc uregs[15] //程序计数器 指令计数器,下一条将要执行的指令
#define ARM_lr uregs[14] //链接link寄存器,是退出时要装载到pc中的值,返回回来时就是到这个里面去执行之前的代码
#define ARM_sp uregs[13] //栈指针
#define ARM_ip uregs[12] //指令指针,指向下一指令
#define ARM_fp uregs[11] //帧指针
#define ARM_r10 uregs[10]
#define ARM_r9 uregs[9]
#define ARM_r8 uregs[8]
#define ARM_r7 uregs[7]
#define ARM_r6 uregs[6]
#define ARM_r5 uregs[5]
#define ARM_r4 uregs[4]
#define ARM_r3 uregs[3]
#define ARM_r2 uregs[2]
#define ARM_r1 uregs[1]
#define ARM_r0 uregs[0]
#define ARM_ORIG_r0 uregs[17]
回溯结构是:
高地址
保存代码指针 [fp] fp指向这里
返回lr值 [fp, #-4]
返回sp值 [fp, #-8]
返回fp值 [fp, #-12] 指向下一个结构
…
低地址
long fp, nextfp;
fp = regs->ARM_fp;
long lr;
for(XXX;XXX;XXX) //循环多少,可以自己决定
{
lr = *(( long *)(fp - 4));
nextfp = *(( long *) fp - 12));
fp = nextfp;
printk(“call address: 0x%lx ”, lr- current->mm->start_code - 4);
}
call address: 0x2849cc
call address: 0x3b8b70
call address: 0x2c270
call address: 0x2c5ec
call address: 0x2b298
call address: 0x283934
call address: 0x3c41a8
#define start_thread(regs,pc,sp)
({
unsigned long *stack = (unsigned long *)sp;
set_fs(USER_DS);
memzero(regs->uregs, sizeof(regs->uregs));