一、原理介绍:
操作系统内部会对中断、异常等进行处理,其中有一类异常是未定义指令异常undefined instruction,
意思是CPU执行到一个未知的指令,CPU下一步不知该如何处理, 此时会触发kernel panic重启,重启时
会产生mrdump,将问题时的栈信息和相关的寄存器信息保存下来提供分析。
产生undefined instruction情况有如下几种:
(1)执行CPU不支持的指令,如部分CPU不支持浮点运算,但代码中做了浮点运行的操作;
(2)CPU和cache进行数据传输时发生bitflip(位翻转)导致执行的指令发生变化;
(3)存放在ROM中的代码段被踩坏导致执行的命令不能被CPU识别;
二、问题案例分析:
1、下面介绍出现此类问题时如何debug,如下重启的dump信息:
//KE0
[ 4028.614712] -(4)[178:chre_kthread]chre_kthread[178]: undefined instruction: pc=ffffff80080ef3c4
[ 4028.614774] -(4)[178:chre_kthread]Code: 91010021 92407c4a d360fc42 f8425c21 (db217d62)
从上面的log中可以看出出问题的PC地址(pc=ffffff80080ef3c4)、未定义的指令(db217d62),
2、下一步去符号表(vmlinux)中看对应PC位置的代码指令:
(1)../shell/aarch64-linux-android-objdump -d vmlinux > vmlinux.dis
可以看到代码段的指令应该为:0x9b017d4a