免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3651 | 回复: 7
打印 上一主题 下一主题

[内核入门] cpu_idle出现一个奇怪的崩溃信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-24 17:41 |只看该作者 |倒序浏览
最近碰到个奇怪的问题崩溃问题,内核版本是3.4.66,平台是mips


下面是崩溃信息
[  630.210000] CPU 0 Unable to handle kernel paging request at virtual address 70264f7c, epc == 70264f7c, ra == 80004f1c
[  630.220000] Oops[#1]:
[  630.220000] Cpu 0
[  630.220000] .$ 0   : 00000000 00000000 00000000 01400000
[  630.220000] $ 4   : 80310000 00000000 00000000 ffff00fe
[  630.220000] $ 8   : 802fffe0 0000ff00 00000000 83dea000
[  630.220000] $12   : 10000000 11455c28 77ab5f70 00420000
[  630.220000] $16   : 80340000 80340000 80330000 80338686
[  630.220000] $20   : 80300000 00000000 83fec000 00000000
[  630.220000] $24   : 00000000 80044e8c                  
[  630.220000] $28   : 802fe000 802ffec8 83fec000 80004f1c
[  630.220000] ................................................Hi    : 00000092
[  630.220000] .Lo    : ba404780
[  630.220000] .epc   : 70264f7c 0x70264f7c
[  630.220000]     Tainted: P           O
[  630.220000] ra    : 80004f1c cpu_idle+0x58/0x60
[  630.220000] Status: 1100ff03    ....KERNEL EXL IE
[  630.220000] Cause : 50800008
[  630.220000] BadVA : 70264f7c
[  630.220000] PrId  : 00019650 (MIPS 24KEc)

[  630.220000] Process swapper (pid: 0, threadinfo=802fe000, task=80302940, tls=00000000)
[  630.220000] .Stack :. 0000012d. 8030c1f0. 8030c1f0. 80300000. 80300000. 803158ac. 00000000. 80334388.
[  630.220000]        . 80340000. 0000001f. ffffffff. ffffffff. 803152a8. 00000000. 80338638. 00000000.
[  630.220000]        . 83fec000. 83fec000. 83fc52d0. 1fffffff. 83fec000. 83fc5ba0. 00000000. 00000000.
[  630.220000]        . 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000.
[  630.220000]        . 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000. 00000000.
[  630.220000]        . ...
[  630.220000] .Call Trace:.
[  630.220000] .[<803158ac>] start_kernel+0x328/0x348
[  630.220000] .[<80334388>] _einittext+0x0/0x0
[  630.220000] .[<803152a8>] unknown_bootoption+0x0/0x234
[  630.220000] ..
[  630.220000] .
[  630.220000] Code:. (Bad address in epc)
[  630.220000]
[  630.220000] .
[  630.580000] ---[ end trace b3359e796da23b95 ]---
[  630.590000] Kernel panic - not syncing: Attempted to kill the idle task!
[  630.590000] 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    sw  s0,16(sp)
80004ecc:   afbf0014    sw  ra,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    lw  v0,-18552(s0)
80004ee4:   10400005    beqz    v0,80004efc <cpu_idle+0x38>
80004ee8:   00000000    nop
80004eec:   0040f809    jalr    v0
80004ef0:   00000000    nop
80004ef4:   8e02b788    lw  v0,-18552(s0)
80004ef8:   03801821    move    v1,gp
80004efc:   8c640008    lw  a0,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源码
  1. void __noreturn cpu_idle(void)
  2. {
  3.         int cpu;

  4.         /* CPU is going idle. */
  5.         cpu = smp_processor_id();

  6.         /* endless idle loop with no priority at all */
  7.         while (1) {               
  8.                 tick_nohz_idle_enter();
  9.                 rcu_idle_enter();
  10.                 while (!need_resched() && cpu_online(cpu)) {
  11. #ifdef CONFIG_MIPS_MT_SMTC
  12.                         extern void smtc_idle_loop_hook(void);

  13.                         smtc_idle_loop_hook();
  14. #endif

  15.                         if (cpu_wait) {
  16.                                 /* Don't trace irqs off for idle */
  17.                                 stop_critical_timings();
  18.                                 (*cpu_wait)();
  19.                                 start_critical_timings();
  20.                         }
  21.                 }
  22.                
  23. #ifdef CONFIG_HOTPLUG_CPU
  24.                 if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map))
  25.                         play_dead();
  26. #endif
  27.                 rcu_idle_exit();
  28.                 tick_nohz_idle_exit();
  29.                 schedule_preempt_disabled();
  30.         }
  31. }
复制代码
我不太理解为什么会在循环结束的时候产生这个地址访问的问题。不知道有没有人能解答一下。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
2 [报告]
发表于 2014-11-25 00:01 |只看该作者
贴一下cpu_idle的汇编

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
3 [报告]
发表于 2014-11-25 00:07 |只看该作者
不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c:   080013b5    j   80004ed4 <cpu_idle+0x10> 这条指零要访问的缺是80004ed4 这个地址。
epc  是什么,用来干什么的,70264f7c这个地址就是存载它上面的。

是不是踩内存了?

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
4 [报告]
发表于 2014-11-25 00:12 |只看该作者
不了解MIPS
80004f1c:   080013b5    j   80004ed4 <cpu_idle+0x10> 这个j 是跳转吗?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
5 [报告]
发表于 2014-11-25 00:13 |只看该作者
super皮波 发表于 2014-11-25 00:12
不了解MIPS
80004f1c:   080013b5    j   80004ed4  这个j 是跳转吗?


肯定是。

论坛徽章:
46
2015小元宵徽章
日期:2015-03-06 15:58:18羊年新春福章
日期:2015-04-14 10:37:422015年亚洲杯之阿曼
日期:2015-04-14 10:41:50NBA常规赛纪念章
日期:2015-05-04 22:32:03NBA季后赛大富翁
日期:2015-05-04 22:34:11菠菜明灯
日期:2015-05-04 22:35:49新奥尔良黄蜂
日期:2015-05-04 22:49:2315-16赛季CBA联赛之广夏
日期:2015-12-11 15:02:342015年亚洲杯之巴勒斯坦
日期:2015-03-04 19:56:562015年亚洲杯之阿联酋
日期:2015-03-04 11:19:04休斯顿火箭
日期:2015-03-02 16:32:11纽约尼克斯
日期:2015-03-02 16:09:04
6 [报告]
发表于 2014-11-25 00:17 |只看该作者
回复 5# Tinnal
Code:. (Bad address in epc)
跳转就是给PC赋值嘛,目测这个跳转指令epc也参与了,epc错误导致的跳转失败

   

论坛徽章:
0
7 [报告]
发表于 2014-11-25 09:16 |只看该作者
Tinnal 发表于 2014-11-25 00:07
不了解MIPS,出错的原因是因为访问70264f7c这个地址。
但80004f1c:   080013b5    j   80004ed4  这条指零 ...


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

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

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

论坛徽章:
0
8 [报告]
发表于 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    sw  ra,20(sp)
80262b14:   0c098a2d    jal 802628b4 <schedule>
80262b18:   00000000    nop
80262b1c:   8fbf0014    lw  ra,20(sp)
80262b20:   03e00008    jr  ra
80262b24:   27bd0018    addiu   sp,sp,24

ra是80004f1c cpu_idle+0x58/0x60的话
那出错位置只能是 80262b1c:   8fbf0014    lw  ra,20(sp)之后?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP