guodeyuan2013 发表于 2015-06-02 18:13

linux kernel panic

本帖最后由 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

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

九阳神功爱喝茶 发表于 2015-06-04 09:09

试着回答以下,我觉得这种问题一般都是OOPS问题,在《内核源码剖析》里面有个例子:ssize_t faulty_read(struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
    int ret;
    char stack_buf;

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

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

      return count;
    return ret;
}这个方法拷贝一个字串到一个本地变量; 不幸的是, 字串长于目的数组. 当函数返回时导致的缓存区溢出引起一次 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: 0000000cebx: ffffffffecx: 00000000edx: bfffda7c
esi: cf434f00edi: ffffffffebp: 00002000esp: c27fff78
ds: 007bes: 007bss: 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_write, 它位于 faulty 模块( 在方括号中列出的 ). 16 进制数指示指令指针是函数内 4 字节, 函数看来是 10 ( 16 进制 )字节长. 常常这就足够来知道问题是什么.

nswcfd 发表于 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/
页: [1]
查看完整版本: linux kernel panic