cpu_idle出现一个奇怪的崩溃信息
最近碰到个奇怪的问题崩溃问题,内核版本是3.4.66,平台是mips下面是崩溃信息
CPU 0 Unable to handle kernel paging request at virtual address 70264f7c, epc == 70264f7c, ra == 80004f1c
Oops[#1]:
Cpu 0
.$ 0 : 00000000 00000000 00000000 01400000
$ 4 : 80310000 00000000 00000000 ffff00fe
$ 8 : 802fffe0 0000ff00 00000000 83dea000
$12 : 10000000 11455c28 77ab5f70 00420000
$16 : 80340000 80340000 80330000 80338686
$20 : 80300000 00000000 83fec000 00000000
$24 : 00000000 80044e8c
$28 : 802fe000 802ffec8 83fec000 80004f1c
................................................Hi : 00000092
.Lo : ba404780
.epc : 70264f7c 0x70264f7c
Tainted: P O
ra : 80004f1c cpu_idle+0x58/0x60
Status: 1100ff03 ....KERNEL EXL IE
Cause : 50800008
BadVA : 70264f7c
PrId: 00019650 (MIPS 24KEc)
Process swapper (pid: 0, threadinfo=802fe000, task=80302940, tls=00000000)
.Stack :. 0000012d. 8030c1f0. 8030c1f0. 80300000. 80300000. 803158ac. 00000000. 80334388.
. 80340000. 0000001f. ffffffff. ffffffff. 803152a8. 00000000. 80338638. 00000000.
. 83fec000. 83fec000. 83fc52d0. 1fffffff. 83fec000. 83fc5ba0. 00000000. 00000000.
. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000.
. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000.
. ...
.Call Trace:.
.[<803158ac>] start_kernel+0x328/0x348
.[<80334388>] _einittext+0x0/0x0
.[<803152a8>] unknown_bootoption+0x0/0x234
..
.
Code:. (Bad address in epc)
.
---[ end trace b3359e796da23b95 ]---
Kernel panic - not syncing: Attempted to kill the idle task!
Rebooting in 3 seconds..Resetting PCI-E controller...
定位到的崩溃地点是80004f1c: cpu_idle+0x58/0x60
反汇编vmlinux,找到位置
80004ec4 <cpu_idle>:
80004ec4: 27bdffe8 addiu sp,sp,-24
80004ec8: afb00010 sws0,16(sp)
80004ecc: afbf0014 swra,20(sp)
80004ed0: 3c108034 lui s0,0x8034
80004ed4: 0c016c3a jal 8005b0e8 <rcu_idle_enter>
80004ed8: 00000000 nop
80004edc: 080013be j 80004ef8 <cpu_idle+0x34>
80004ee0: 8e02b788 lwv0,-18552(s0)
80004ee4: 10400005 beqz v0,80004efc <cpu_idle+0x38>
80004ee8: 00000000 nop
80004eec: 0040f809 jalr v0
80004ef0: 00000000 nop
80004ef4: 8e02b788 lwv0,-18552(s0)
80004ef8: 03801821 move v1,gp
80004efc: 8c640008 lwa0,8(v1)
80004f00: 30840004 andi a0,a0,0x4
80004f04: 1080fff7 beqz a0,80004ee4 <cpu_idle+0x20>
80004f08: 00000000 nop
80004f0c: 0c016b46 jal 8005ad18 <rcu_idle_exit>
80004f10: 00000000 nop
80004f14: 0c098ac3 jal 80262b0c <schedule_preempt_disabled>
80004f18: 00000000 nop
80004f1c: 080013b5 j 80004ed4 <cpu_idle+0x10>
80004f20: 00000000 nop
崩溃的位置是
80004f1c: 080013b5 j 80004ed4 <cpu_idle+0x10>
这里应该是cpu_idle循环的结束的地方
下面是cpu_idle源码void __noreturn cpu_idle(void)
{
int cpu;
/* CPU is going idle. */
cpu = smp_processor_id();
/* endless idle loop with no priority at all */
while (1) {
tick_nohz_idle_enter();
rcu_idle_enter();
while (!need_resched() && cpu_online(cpu)) {
#ifdef CONFIG_MIPS_MT_SMTC
extern void smtc_idle_loop_hook(void);
smtc_idle_loop_hook();
#endif
if (cpu_wait) {
/* Don't trace irqs off for idle */
stop_critical_timings();
(*cpu_wait)();
start_critical_timings();
}
}
#ifdef CONFIG_HOTPLUG_CPU
if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map))
play_dead();
#endif
rcu_idle_exit();
tick_nohz_idle_exit();
schedule_preempt_disabled();
}
}我不太理解为什么会在循环结束的时候产生这个地址访问的问题。不知道有没有人能解答一下。
贴一下cpu_idle的汇编 不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c: 080013b5 j 80004ed4 <cpu_idle+0x10> 这条指零要访问的缺是80004ed4 这个地址。
epc是什么,用来干什么的,70264f7c这个地址就是存载它上面的。
是不是踩内存了? 不了解MIPS
80004f1c: 080013b5 j 80004ed4 <cpu_idle+0x10> 这个j 是跳转吗? super皮波 发表于 2014-11-25 00:12 static/image/common/back.gif
不了解MIPS
80004f1c: 080013b5 j 80004ed4这个j 是跳转吗?
肯定是。 回复 5# Tinnal
Code:. (Bad address in epc)
跳转就是给PC赋值嘛,目测这个跳转指令epc也参与了,epc错误导致的跳转失败
Tinnal 发表于 2014-11-25 00:07 static/image/common/back.gif
不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c: 080013b5 j 80004ed4这条指零 ...
异常程序计数器(exception program counter,EPC)的寄存器
属于CP0寄存器,用于保存造成异常的那条指令的地址
epc应该是产生异常的结果,不是原因吧
会不会是产生异常的点不在这里。 我搞错了
.epc : 70264f7c 0x70264f7c
这是异常产生的地点
ra : 80004f1c cpu_idle+0x58/0x60
是函数返回之后的地址
之前应该是调用的 schedule_preempt_disabled();
80262b0c <schedule_preempt_disabled>:
80262b0c: 27bdffe8 addiu sp,sp,-24
80262b10: afbf0014 swra,20(sp)
80262b14: 0c098a2d jal 802628b4 <schedule>
80262b18: 00000000 nop
80262b1c: 8fbf0014 lwra,20(sp)
80262b20: 03e00008 jrra
80262b24: 27bd0018 addiu sp,sp,24
ra是80004f1c cpu_idle+0x58/0x60的话
那出错位置只能是 80262b1c: 8fbf0014 lwra,20(sp)之后?
页:
[1]