xinghuo456 发表于 2014-11-24 17:41

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();
        }
}我不太理解为什么会在循环结束的时候产生这个地址访问的问题。不知道有没有人能解答一下。

super皮波 发表于 2014-11-25 00:01

贴一下cpu_idle的汇编

Tinnal 发表于 2014-11-25 00:07

不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c:   080013b5    j   80004ed4 <cpu_idle+0x10> 这条指零要访问的缺是80004ed4 这个地址。
epc是什么,用来干什么的,70264f7c这个地址就是存载它上面的。

是不是踩内存了?

super皮波 发表于 2014-11-25 00:12

不了解MIPS
80004f1c:   080013b5    j   80004ed4 <cpu_idle+0x10> 这个j 是跳转吗?

Tinnal 发表于 2014-11-25 00:13

super皮波 发表于 2014-11-25 00:12 static/image/common/back.gif
不了解MIPS
80004f1c:   080013b5    j   80004ed4这个j 是跳转吗?

肯定是。

super皮波 发表于 2014-11-25 00:17

回复 5# Tinnal
Code:. (Bad address in epc)
跳转就是给PC赋值嘛,目测这个跳转指令epc也参与了,epc错误导致的跳转失败

   

xinghuo456 发表于 2014-11-25 09:16

Tinnal 发表于 2014-11-25 00:07 static/image/common/back.gif
不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c:   080013b5    j   80004ed4这条指零 ...

异常程序计数器(exception program counter,EPC)的寄存器
属于CP0寄存器,用于保存造成异常的那条指令的地址

epc应该是产生异常的结果,不是原因吧

会不会是产生异常的点不在这里。

xinghuo456 发表于 2014-11-25 10:28

我搞错了
.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]
查看完整版本: cpu_idle出现一个奇怪的崩溃信息