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);