linux oops分析

杨六 2014-02-14 12:52:58
平台是ARM,出现如下的OOPS,请大牛给点思路可能的原因是什么
> root@HSAN:/tmp#Internal error: Oops - undefined instruction: 0 [#1]
last sysfs file: /sys/devices/virtual/misc/CAPTURE/dev
Modules linked in: sdt alg(P) wal hmac(P) dmac(P) hal(P) frw(P) oam oal(P) capture(P) demo_ioctl demo_adapter multicast gponmac hi_klowpower(P) hi_kploam(P) hi_kadapt(P) hi_kmisc(P) hi_kbasic(P) hi_linux_optical hi_linux_port_mgr hi_linux_mdio_mgr sysinit hi_ioctl_interface(P) hi_ioctl_dp(P) hi_dp(P) hi_uart(P) hi_hw(P) hi_dma(P) hi_spi(P) hi_timer(P) hi_i2c(P) hi_gpio_int(P) hi_gpio(P) hi_tunnel_process delivery hi_pie hi_mdio(P) flash(P) hi_ioctl_sysctl(P) hi_sysctl(P)
CPU: 0 Tainted: P (2.6.34.10_sd5115h_v100f #46)
PC is at sdt_drv_add_head+0x20/0xbc [sdt]
LR is at sdt_drv_add_pkt_head+0x8c/0x1ac [sdt]
pc : [<bf3f1064>] lr : [<bf3f187c>] psr: 20000113
sp : c03c7dd0 ip : c4c539c0 fp : 00000004
r10: c4d6be28 r9 : c510d038 r8 : c4c53e40
r7 : 00000002 r6 : 00000004 r5 : 61715c48 r4 : c4c539c0
r3 : 00000017 r2 : 00000004 r1 : 00000000 r0 : c4d6b600
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 10c53c7d Table: 87390059 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc03c6268)
Stack: (0xc03c7dd0 to 0xc03c8000)
7dc0: 0000000e bf24a7ec bf24a7ec c510d02a
7de0: 0000000e bf24a7ec c510d02a c4c53e40 0000fff8 bf247a44 00000002 00000006
7e00: bf3af3c4 00000002 bf37fa24 00000003 c4ff4a80 00000008 bf31f5b0 bf31f5a4
7e20: 00000008 bf397624 00000002 00000003 bf3af3c4 00000000 00000000 00000000
7e40: c03c7e9c 00000000 bf3af6f4 00000000 00000000 00000000 bf375060 00000000
7e60: 00000003 00000002 bf31f5c4 bf31f5bc bf31f5b0 bf31f5a4 00000008 bf248c1c
7e80: 00000002 00000003 bf3af6f4 c4ff4a80 00000000 00000000 bf37fa24 00000008
7ea0: bf31f5b0 bf31f5a4 00000008 bf398498 00000002 00000003 bf3af6f4 bf31ef04
7ec0: bf1fe04c bf31ef04 bf31ef04 bf31f5c4 bf31f5bc bf31a50c 20018e04 414fc091
7ee0: bf33997c bf33b778 00000005 00000003 bf33997c c03cb260 c03ef240 00000000
7f00: 00000000 c03cb098 00000100 c03ef240 00000000 c003dd78 00000018 00000001
7f20: c03ef240 c03c6000 c03cb098 c003e3f8 00000000 bf1f6010 00000006 0000000a
7f40: 00000000 c03da7b0 0000005b 00000000 c03c9fa0 80e204a4 414fc091 0000001f
7f60: 00000000 c0025040 ffffffff f1180100 0000005b c0025ab8 c70f9d80 00000000
7f80: c03c7fc0 00000000 c03c6000 c03ea624 c03c9fa8 c03c9fa0 80e204a4 414fc091
7fa0: 0000001f 00000000 00000000 c03c7fc0 c0026f08 c0026f0c 60000013 ffffffff
7fc0: c03c6000 c00273f4 c03f3c18 c0022010 c002200c c0008948 c00084b4 00000000
7fe0: 00000000 c0022010 00000000 10c53c7d c03ea6e0 80e08034 00000000 00000000
Unable to handle kernel paging request at virtual address 5171a3a3
pgd = c0004000
[5171a3a3] *pgd=00000000
Internal error: Oops: 5 [#2]
last sysfs file: /sys/devices/virtual/misc/CAPTURE/dev
Modules linked in: sdt alg(P) wal hmac(P) dmac(P) hal(P) frw(P) oam oal(P) capture(P) demo_ioctl demo_adapter multicast gponmac hi_klowpower(P) hi_kploam(P) hi_kadapt(P) hi_kmisc(P) hi_kbasic(P) hi_linux_optical hi_linux_port_mgr hi_linux_mdio_mgr sysinit hi_ioctl_interface(P) hi_ioctl_dp(P) hi_dp(P) hi_uart(P) hi_hw(P) hi_dma(P) hi_spi(P) hi_timer(P) hi_i2c(P) hi_gpio_int(P) hi_gpio(P) hi_tunnel_process delivery hi_pie hi_mdio(P) flash(P) hi_ioctl_sysctl(P) hi_sysctl(P)
CPU: 0 Tainted: P (2.6.34.10_sd5115h_v100f #46)
PC is at unwind_frame+0x90/0x418
LR is at unwind_frame+0x4c/0x418
pc : [<c002ba30>] lr : [<c002b9ec>] psr: 20000193
sp : c03c7c38 ip : 000015f0 fp : c03c7cc4
r10: c03c6000 r9 : c0025b44 r8 : bf3f1064
r7 : 60000193 r6 : c03ca000 r5 : c03c7dd0 r4 : c03c7ca8
r3 : 5171a3a3 r2 : 5171a3a3 r1 : 8e8ea303 r0 : c03ca258
Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 10c53c7d Table: 87390059 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc03c6268)
...全文
521 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wenxy1 2014-02-18
  • 打赏
  • 举报
回复
内核配置菜单里把地址解析成符号加上。 然后根据调用栈来初步定位。
杨六 2014-02-14
  • 打赏
  • 举报
回复
有个小的疑问,查看objdump文件发现这个文件的逻辑被改了;在中途就偏移到最后,后续再偏移时应该会越界;但这个问题并不是必现,不知道这个是什么原理了 pc_ptr = (oal_int8 *)pst_buf; pc_ptr = pc_ptr + us_lenth; 64: e08ca003 add sl, ip, r3 oal_int32 sdt_drv_add_head(oal_uint8 *pst_buf, oal_uint8 uc_ftype, oal_uint8 uc_dtype, oal_uint16 us_lenth) { 48: e92d4ff0 push {r4, r5, r6, r7, r8, r9, sl, fp, lr} 4c: e1a0b001 mov fp, r1 50: e24dd014 sub sp, sp, #20 oal_int8 *pc_ptr; oal_uint16 us_len; if (OAL_PTR_NULL == pst_buf) 54: 0a00001a beq c4 <sdt_drv_add_head+0x80> { SDT_DRV_ERR_LOG(0, "pst_buf is null!"); return -OAL_EFAIL; } gst_kernelglobal.sn_num++; 58: e59f4094 ldr r4, [pc, #148] ; f4 <sdt_drv_add_head+0xb0> pc_ptr = (oal_int8 *)pst_buf; *pc_ptr = PACKET_START_SIGNAL; 5c: e1a0100c mov r1, ip 60: e3a0507e mov r5, #126 ; 0x7e *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len); pc_ptr++; *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len); pc_ptr = (oal_int8 *)pst_buf; pc_ptr = pc_ptr + us_lenth; 64: e08ca003 add sl, ip, r3 *pc_ptr = (oal_int8)uc_ftype; pc_ptr++; *pc_ptr = (oal_int8)uc_dtype; pc_ptr++; *pc_ptr = RESERVE; 68: e3a08000 mov r8, #0 us_len = us_lenth; pc_ptr++; *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len); pc_ptr++; *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len); 6c: e1a09423 lsr r9, r3, #8 { SDT_DRV_ERR_LOG(0, "pst_buf is null!"); return -OAL_EFAIL; } gst_kernelglobal.sn_num++; 70: e1d462bc ldrh r6, [r4, #44] ; 0x2c *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len); pc_ptr = (oal_int8 *)pst_buf; pc_ptr = pc_ptr + us_lenth; pc_ptr = pc_ptr - OAL_SIZEOF(OAM_END_STUR); *pc_ptr = PACKET_END_SIGNAL; 74: e1a00008 mov r0, r8 { SDT_DRV_ERR_LOG(0, "pst_buf is null!"); return -OAL_EFAIL; } gst_kernelglobal.sn_num++; 78: e2866001 add r6, r6, #1 7c: e1c462bc strh r6, [r4, #44] ; 0x2c pc_ptr = (oal_int8 *)pst_buf; *pc_ptr = PACKET_START_SIGNAL; 80: e4c15001 strb r5, [r1], #1 pc_ptr++; *pc_ptr = (oal_int8)uc_ftype; pc_ptr++; 84: e2817001 add r7, r1, #1 *pc_ptr = (oal_int8)uc_dtype; pc_ptr++; 88: e2876001 add r6, r7, #1 pc_ptr = (oal_int8 *)pst_buf; *pc_ptr = PACKET_START_SIGNAL; pc_ptr++; *pc_ptr = (oal_int8)uc_ftype; 8c: e5ccb001 strb fp, [ip, #1] *pc_ptr = (oal_int8)uc_dtype; pc_ptr++; *pc_ptr = RESERVE; us_len = us_lenth; pc_ptr++; 90: e286c001 add ip, r6, #1 pc_ptr++; *pc_ptr = (oal_int8)uc_ftype; pc_ptr++; *pc_ptr = (oal_int8)uc_dtype; 94: e5c12001 strb r2, [r1, #1] pc_ptr++; *pc_ptr = RESERVE; 98: e5c78001 strb r8, [r7, #1] us_len = us_lenth; pc_ptr++; *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len); pc_ptr++; 9c: e28c2001 add r2, ip, #1 *pc_ptr = RESERVE; us_len = us_lenth; pc_ptr++; *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len); a0: e5c63001 strb r3, [r6, #1] pc_ptr++; *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len); a4: e5cc9001 strb r9, [ip, #1] us_len = gst_kernelglobal.sn_num; a8: e1d432bc ldrh r3, [r4, #44] ; 0x2c pc_ptr++; *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len); ac: e5c23001 strb r3, [r2, #1] pc_ptr++; *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len); b0: e1a03423 lsr r3, r3, #8 b4: e5c23002 strb r3, [r2, #2] pc_ptr = (oal_int8 *)pst_buf; pc_ptr = pc_ptr + us_lenth; pc_ptr = pc_ptr - OAL_SIZEOF(OAM_END_STUR); *pc_ptr = PACKET_END_SIGNAL; b8: e54a5001 strb r5, [sl, #-1] return OAL_SUCC; }
杨六 2014-02-14
  • 打赏
  • 举报
回复
其中PC is at sdt_drv_add_head+0x20/0xbc [sdt] LR is at sdt_drv_add_pkt_head+0x8c/0x1ac [sdt]为自研代码 sdt_drv_add_head实现
oal_int32  sdt_drv_add_head(oal_uint8 *pst_buf,
                                 oal_uint8  uc_ftype,
                                 oal_uint8  uc_dtype,
                                 oal_uint16 us_lenth)
{
    oal_int8        *pc_ptr;
    oal_uint16       us_len;

    if (OAL_PTR_NULL == pst_buf)
    {
        SDT_DRV_ERR_LOG(0, "pst_buf is null!");
        return -OAL_EFAIL;
    }

    gst_kernelglobal.sn_num++;

    pc_ptr  = (oal_int8 *)pst_buf;
    *pc_ptr = PACKET_START_SIGNAL;
    pc_ptr++;

    *pc_ptr = (oal_int8)uc_ftype;
    pc_ptr++;

    *pc_ptr = (oal_int8)uc_dtype;
    pc_ptr++;
    *pc_ptr = RESERVE;

    us_len  = us_lenth;
    pc_ptr++;

    *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len);
    pc_ptr++;
    *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len);

    us_len  = gst_kernelglobal.sn_num;
    pc_ptr++;
    *pc_ptr = (oal_int8)LEN_LOW_BYTE(us_len);
    pc_ptr++;
    *pc_ptr = (oal_int8)LEN_HIGH_BYTE(us_len);

    pc_ptr = (oal_int8 *)pst_buf;
    pc_ptr = pc_ptr + us_lenth;
    pc_ptr = pc_ptr - OAL_SIZEOF(OAM_END_STUR);
    *pc_ptr = PACKET_END_SIGNAL;

    return OAL_SUCC;
}
linux内核调试分析指南 linux内核调试分析指南--上篇 本文档已经转到下面的网址,位于zh-kernel.org的文档停止更新,请访问新网址 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 skyeye的使用 UML的使用 vmware的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环境的建立 gdb基础 基本命令 gdb之gui gdb技巧 gdb宏 汇编基础--X86篇 用户手册 AT&T汇编格式 内联汇编 汇编与C函数的相互调用 调用链形成和参数传递 C难点的汇编解释 优化级别的影响 汇编基础--ARM篇 用户手册 调用链形成和参数传递 源码浏览工具 调用图生成工具 find + grep wine + SI global Source-Navigator vim + cscope/ctags kscope lxr SI等与gdb的特点 调用链、调用树和调用图 理想调用链 函数指针调用 调用链的层次 非理想调用链 调用树与调用图 穿越盲区 穿越gdb的盲区 穿越交叉索引工具的盲区 工程方法 bug 与 OOPS linux内核调试分析指南--下篇 ***第二部分:内核分析*** 内核组织层次和复杂度 内核层次 内核复杂度 复杂度隔离 gdb在内核分析中的用途 数据验证 界面剥离 参数记忆 路径快照 长程跟踪 整理思路 内核编码的艺术 信息聚集 数据聚集 关系聚集 操作聚集 松散聚集 顺序聚集 链表聚集 哈希聚集 树形聚集 分层聚集 分块聚集 对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq oprofile kprobes 驱动分析 载入模块符号 ***第三部分:其他工具*** kexec strace ltrace SystemTap MEMWATCH YAMD Magic SysRq 附录:社区交流相关 补丁提交相关文档 补丁制作与提交示范 多补丁发送工具 git使用 Git公共库创建及使用 附录:内核参考书籍文章 内核git库 书籍 子系统官方网站 必看网站 参考文章 私人备忘

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧