主题 : 卸载platfrom_device时提示Unable to handle kernel NULL pointer 复制链接 | 浏览器收藏 | 打印
sxq
级别: 新手上路
UID: 52321
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2011-07-16
最后登录: 2014-04-01
楼主  发表于: 2011-12-15 22:20

 卸载platfrom_device时提示Unable to handle kernel NULL pointer

inmod radio_plat_dev.ko之后在remod radio_plat_dev就提示
rmmod radio_plat_dev
kernel BUG at mm/slub.c:2969!
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c39a8000
[00000000] *pgd=339c0031, *pte=00000000, *ppte=00000000
Internal error: Oops: 817 [#1]
last sysfs file: /sys/devices/platform/soc-audio/sound/card0/mixer/dev
Modules linked in: radio_plat_dev(-)
CPU: 0    Not tainted  (2.6.32.2-FriendlyARM #1)
PC is at __bug+0x20/0x2c
LR is at release_console_sem+0x188/0x1e4
pc : [<c0034ff0>]    lr : [<c004a6d8>]    psr: 60000013
sp : c39c3e30  ip : c39c3d48  fp : c39c3e3c
r10: 00000000  r9 : c39c2000  r8 : c39c3f40
r7 : c39c2000  r6 : c3952460  r5 : bf000138  r4 : c04a5000
r3 : 00000000  r2 : c0459638  r1 : 00004abc  r0 : 00000024
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: c000717f  Table: 339a8000  DAC: 00000015
Process rmmod (pid: 667, stack limit = 0xc39c2270)
Stack: (0xc39c3e30 to 0xc39c4000)
3e20:                                     c39c3e64 c39c3e40 c009a6f8 c0034fe0
3e40: c3951600 c046c340 c3952460 c39c2000 c39c3f40 c39c2000 c39c3e7c c39c3e68
3e60: c01885c0 c009a568 c39536c0 c046c340 c39c3e94 c39c3e80 c0183a2c c01885b0
3e80: c3951610 c046c340 c39c3eb4 c39c3e98 c014b688 c0183a14 c395162c c014b638
3ea0: bf000170 c39c2000 c39c3ecc c39c3eb8 c014c4ac c014b648 c3951610 00000880
3ec0: c39c3eec c39c3ed0 c014b578 c014c464 c0184464 c018345c c3951600 c3951600
3ee0: c39c3efc c39c3ef0 c0183468 c014b558 c39c3f0c c39c3f00 c01885e8 c018345c
3f00: c39c3f24 c39c3f10 c01886fc c01885dc bf000290 00000880 c39c3f3c c39c3f28
3f20: bf000024 c01886f0 00000000 00000880 c39c3fa4 c39c3f40 c00701b8 bf000010
3f40: 69646172 6c705f6f 645f7461 c3007665 c009ea90 c009e904 c39c3f84 c39c3f68
3f60: c009b5e8 c009ea6c 00000004 c394a9c0 c39bc280 00000006 009c3fa4 00000000
3f80: c009b6b0 001d9018 00000000 bed38e45 00000081 c00310c8 00000000 c39c3fa8
3fa0: c0030f20 c007003c 001d9018 00000000 bed38e45 00000880 00000000 001e1038
3fc0: 001d9018 00000000 bed38e45 00000081 00000001 bed38d48 00000000 bed38d44
3fe0: 00000000 bed389e0 0002bc74 0000948c 20000010 bed38e45 04220102 c9060000
Backtrace:
[<c0034fd0>] (__bug+0x0/0x2c) from [<c009a6f8>] (kfree+0x1a0/0x1b4)
[<c009a558>] (kfree+0x0/0x1b4) from [<c01885c0>] (platform_device_release+0x20/0x2c)
r9:c39c2000 r8:c39c3f40 r7:c39c2000 r6:c3952460 r5:c046c340
r4:c3951600
[<c01885a0>] (platform_device_release+0x0/0x2c) from [<c0183a2c>] (device_release+0x28/0x84)
r5:c046c340 r4:c39536c0
[<c0183a04>] (device_release+0x0/0x84) from [<c014b688>] (kobject_release+0x50/0x84)
r5:c046c340 r4:c3951610
[<c014b638>] (kobject_release+0x0/0x84) from [<c014c4ac>] (kref_put+0x58/0x88)
r7:c39c2000 r6:bf000170 r5:c014b638 r4:c395162c
[<c014c454>] (kref_put+0x0/0x88) from [<c014b578>] (kobject_put+0x30/0x64)
r5:00000880 r4:c3951610
[<c014b548>] (kobject_put+0x0/0x64) from [<c0183468>] (put_device+0x1c/0x20)
r4:c3951600
[<c018344c>] (put_device+0x0/0x20) from [<c01885e8>] (platform_device_put+0x1c/0x20)
[<c01885cc>] (platform_device_put+0x0/0x20) from [<c01886fc>] (platform_device_unregister+0x1c/0x20)
[<c01886e0>] (platform_device_unregister+0x0/0x20) from [<bf000024>] (cleanup_module+0x24/0x40 [radio_plat_dev])
r5:00000880 r4:bf000290
[<bf000000>] (cleanup_module+0x0/0x40 [radio_plat_dev]) from [<c00701b8>] (sys_delete_module+0x18c/0x248)
r5:00000880 r4:00000000
[<c007002c>] (sys_delete_module+0x0/0x248) from [<c0030f20>] (ret_fast_syscall+0x0/0x28)
r8:c00310c8 r7:00000081 r6:bed38e45 r5:00000000 r4:001d9018
Code: e1a01000 e59f000c eb0c14b6 e3a03000 (e5833000)
---[ end trace 8e75d34e2f0e80c3 ]---
Segmentation fault
想不通啊,那位大哥指点一下,加载platfrom_device之后,再加载platform_driver,一切都正常,资源也可以获取到,就是在卸载platfrom_device的时候就出问题了
代码如下
#define GPIO_F_BASE_ADDR 0X56000050
#define GPIO_F_SIZE 0X0c
#define GPIO_G_BASE_ADDR 0X56000060
#define GPIO_G_SIZE 0X0c

struct platform_device *pf_dev_rdo;
struct resource pf_dev_rdo_res[] =
{
     [0] = {
             .start = GPIO_F_BASE_ADDR,
             .end    = GPIO_F_BASE_ADDR + GPIO_F_SIZE- 1,
             .flags = IORESOURCE_MEM,
     },
     [1] = {
             .start = GPIO_G_BASE_ADDR,
             .end    = GPIO_G_BASE_ADDR + GPIO_G_SIZE- 1,
             .flags = IORESOURCE_MEM,
     }
};
char radio_pf_dev_init(void)
{
    int ret = 0;
    pf_dev_rdo = platform_device_alloc("pf_rad_dev", -1);
//    pf_dev_rdo->name="pf_rad_dev";
//    pf_dev_rdo->id=-1;
    pf_dev_rdo->num_resources=ARRAY_SIZE(pf_dev_rdo_res);
    pf_dev_rdo->resource=pf_dev_rdo_res;
    ret =  platform_device_add(pf_dev_rdo);
    if(ret)
    {
        printk("add platform device fail!\n");
        platform_device_put(pf_dev_rdo);
    }
    return ret;
}

char radio_pf_dev_exit(void)
{
    if(NULL==pf_dev_rdo)
    {
        printk("unregister platform device fail!\n");        
    }
    platform_device_unregister(pf_dev_rdo);
    return 0;
}
MODULE_LICENSE("GPL");
module_init(radio_pf_dev_init);
module_exit(radio_pf_dev_exit);
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2011-12-16 12:36
crash时候的call stack已经很清楚了,从下往上顺着查

[<c0034fd0>] (__bug+0x0/0x2c) from [<c009a6f8>] (kfree+0x1a0/0x1b4)
[<c009a558>] (kfree+0x0/0x1b4) from [<c01885c0>] (platform_device_release+0x20/0x2c)
r9:c39c2000 r8:c39c3f40 r7:c39c2000 r6:c3952460 r5:c046c340
r4:c3951600
[<c01885a0>] (platform_device_release+0x0/0x2c) from [<c0183a2c>] (device_release+0x28/0x84)
r5:c046c340 r4:c39536c0
[<c0183a04>] (device_release+0x0/0x84) from [<c014b688>] (kobject_release+0x50/0x84)
r5:c046c340 r4:c3951610
[<c014b638>] (kobject_release+0x0/0x84) from [<c014c4ac>] (kref_put+0x58/0x88)
r7:c39c2000 r6:bf000170 r5:c014b638 r4:c395162c
[<c014c454>] (kref_put+0x0/0x88) from [<c014b578>] (kobject_put+0x30/0x64)
r5:00000880 r4:c3951610
[<c014b548>] (kobject_put+0x0/0x64) from [<c0183468>] (put_device+0x1c/0x20)
r4:c3951600
[<c018344c>] (put_device+0x0/0x20) from [<c01885e8>] (platform_device_put+0x1c/0x20)
[<c01885cc>] (platform_device_put+0x0/0x20) from [<c01886fc>] (platform_device_unregister+0x1c/0x20)
[<c01886e0>] (platform_device_unregister+0x0/0x20) from [<bf000024>] (cleanup_module+0x24/0x40 [radio_plat_dev])
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
sxq
级别: 新手上路
UID: 52321
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2011-07-16
最后登录: 2014-04-01
2楼  发表于: 2011-12-17 15:43

 回 1楼(kasim) 的帖子

版主,分析内核代码目前对我来说还是太难了 ,凭版主的经验看,程序代码上那个地方写得不对,导致这个错误,就直接加载后,再卸载就出错。谢谢了