前言
如龙芯(MIPS)的内核栈与用户栈所述,用户态进程栈空间存在于进程的虚拟地址空间,而内核栈存在于内核地址空间。每个CPU上的内核任务共享本CPU上的内核栈。用户态进程异常后不会引起系统崩。内核态任务异常后常常引起系统级别崩溃,所以内核在崩溃前尽最大力量打印出足够多的信息,比如栈信息,寄存器信息,以方便问题定位。如果在内核崩溃时能知道内核崩溃的执行路径,是一件很幸福的事情。手撕内核栈实验
在common_hrtimer_rearm函数中增加WARN_ON(1),使运行这个函数时打印内核堆栈。如下:
怎么从一堆binary数据中找出call trace信息?
龙芯(MIPS)的栈布局
龙芯(MIPS)函数调用栈图解分析
通过上面的文章我们了解到,MIPS架构函数汇编结构如下:
daddiu sp, sp, xx --- 开辟栈空间sd ra, xx(sp) --- 保存ra,即返回地址xxxx --- 函数主体ld ra, xx(sp) --- 从保存ra的地方再把ra取回来daddiu sp, sp, xx --- 恢复栈空间