免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1954 | 回复: 2

[硬件及驱动] linux kernel panic [复制链接]

论坛徽章:
0
发表于 2015-06-02 18:13 |显示全部楼层
本帖最后由 guodeyuan2013 于 2015-06-03 13:47 编辑

添加了一个网卡驱动,然后运行系统,当插上网线并连接后出现如下错误打印:
<1>BUG: unable to handle kernel paging request at ffffd842
IP: [<ffffd842>] 0xffffd842
*pde = 021bd067 *pte = 00000000
Oops: 0000 [#1]
last sysfs file: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/usb_endpoint/usbdev2.2_ep00/dev
Modules linked in: e1000e

Pid: 3, comm: ksoftirqd/0 Not tainted (2.6.30.8 lv6530GV4) IEC-810N6SC
EIP: 0060:[<ffffd842>] EFLAGS: 00010202 CPU: 0
EIP is at 0xffffd842
EAX: c1eb4100 EBX: 00000000 ECX: c1eb4100 EDX: f73d5000
ESI: c1385000 EDI: 00000008 EBP: c1fe2f50 ESP: c13a9fb0
DS: 007b ES: 007b FS: 0000 GS: 0000 SS: 0068
Process ksoftirqd/0 (pid: 3, ti=c13a9000 task=f704c680 task.ti=f7031000)
Stack:
c104293c 00000e39 c1385018 00000001 00000020 00000100 00000004 c10429ef
c102282d 00000000 00000000 00000000 00000000 00000000 00000000 f7031fbc
00000000 c10227d0 00000000 c10048b2
Call Trace:
[<c104293c>] ? __rcu_process_callbacks+0x10c/0x1b0
[<c10429ef>] ? rcu_process_callbacks+0xf/0x20
[<c102282d>] ? __do_softirq+0x5d/0xf0
[<c10227d0>] ? __do_softirq+0x0/0xf0
<IRQ> <0> [<c1022639>] ? ksoftirqd+0x39/0xa0
[<c102eae7>] ? kthread+0x47/0x80
[<c102eaa0>] ? kthread+0x0/0x80
[<c10032b7>] ? kernel_thread_helper+0x7/0x10
Code:  Bad EIP value.
EIP: [<ffffd842>] 0xffffd842 SS:ESP 0068:c13a9fb0
CR2: 00000000ffffd842
---[ end trace 17ce0e6993e02ddc ]---
Kernel panic - not syncing: Fatal exception in interrupt

搞了好长时间了,没有找到原因,请各位有遇到相同问题的解决下。

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
发表于 2015-06-04 09:09 |显示全部楼层
试着回答以下,我觉得这种问题一般都是OOPS问题,在《内核源码剖析》里面有个例子:
  1. ssize_t faulty_read(struct file *filp, char __user *buf, size_t count, loff_t *pos)
  2. {
  3.     int ret;
  4.     char stack_buf[4];

  5.     /* Let's try a buffer overflow */
  6.     memset(stack_buf, 0xff, 20);
  7.     if (count > 4)

  8.         count = 4; /* copy 4 bytes to the user */
  9.     ret = copy_to_user(buf, stack_buf, count);
  10.     if (!ret)

  11.         return count;
  12.     return ret;
  13. }
复制代码
这个方法拷贝一个字串到一个本地变量; 不幸的是, 字串长于目的数组. 当函数返回时导致的缓存区溢出引起一次 oops . 因为返回指令使指令指针到不知何处, 这类的错误很难跟踪, 并且你得到如下的:
EIP: 0010:[<00000000>]
Unable to handle kernel paging request at virtual address ffffffff

printing eip:  
ffffffff  
Oops: 0000 [#5]  
SMP  
CPU:  0  
EIP:  0060:[<ffffffff>]  Not tainted  
EFLAGS: 00010296  (2.6.6)  
EIP is at 0xffffffff  
eax: 0000000c  ebx: ffffffff  ecx: 00000000  edx: bfffda7c  
esi: cf434f00  edi: ffffffff  ebp: 00002000  esp: c27fff78  
ds: 007b  es: 007b  ss: 0068  

Process head (pid: 2331, threadinfo=c27fe000 task=c3226150)
Stack: ffffffff bfffda70 00002000 cf434f20 00000001 00000286 cf434f00 fffffff7 bfffda70 c27fe000 c0150612 cf434f00 bfffda70 00002000 cf434f20 00000000 00000003 00002000 c0103f8f 00000003 bfffda70 00002000 00002000 bfffda70
Call Trace: [<c0150612>] sys_read+0x42/0x70 [<c0103f8f>] syscall_call+0x7/0xb
Code: Bad EIP value.
这个情况, 我们只看到部分的调用堆栈( vfs_read 和 faulty_read 丢失 ), 内核抱怨一个"坏 EIP 值". 这个抱怨和在开头列出的犯错的地址 ( ffffffff ) 都暗示内核堆栈已被破坏.

通常, 当你面对一个 oops, 第一件事是查看发生问题的位置, 常常与调用堆栈分开列出. 在上面展示的第一个 oops, 相关的行是:

EIP is at faulty_write+0x4/0x10 [faulty]
这里我们看到, 我们曾在函数 faulty_write, 它位于 faulty 模块( 在方括号中列出的 ). 16 进制数指示指令指针是函数内 4 字节, 函数看来是 10 ( 16 进制 )字节长. 常常这就足够来知道问题是什么.

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-06-04 10:21 |显示全部楼层
EIP is at 0xffffd842

EIP没有解析出符号,很有可能是你的驱动模块里直接或间接的注册了rcu_callback,然后你的模块没有cancel callback就卸载了,接着rcu框架调用callback,由于callback所在模块已卸载,引起非法内存访问。
跟注册了timer,却没有删除timer就卸载模块,差不多一个道理 。

以上只是一种可能性,缺少更多信息,没法判断。

PS,使用rcu的模块,卸载的时候仅靠synchronize_rcu是不够的,需要使用rcu_barrier()。
参见 lwn.net/Articles/217484/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP