热门内容

公众号"MAKE1"

获取行业最新资讯

请扫码添加

专业客服企业微信

"Unable to handle kernel NULL pointer dereference at virtual address 00000021"

简介

"Unable to handle kernel NULL pointer dereference at virtual address 00000021"

"Unable to handle kernel NULL pointer dereference at virtual address 00000021"

这个错误虽然带给了我七八个小时的痛苦,但它却是我中秋节收到的最好礼物。今天早上我在移植触摸屏

驱动时,突然冒出来这样的错误,从网上了解到这是内核引用了空指针导致的。为了找出这个错误着实让我

费力不少。遇到这样的错误的人或许很多,但解决这个错误的方法如此让人啼笑皆非的估计全国也不多。

触摸屏驱动是离不开ADC驱动的所以它们必须被同时添加到内核。注意下面注释掉的那一行,有意思的

就在这里。我把&s3c_device_ts放在了&s3c_device_adc的前面就导致了这个错误。当然解决方法就是

把&s3c_device_adc放在&s3c_device_ts的后面。原因如下:

分享一个有意思的错误 

触摸屏和ADC的平台设备结构体在文件linux/arch/arm/plat-s3c24xx/devs.c中初始化:

struct platform_device s3c_device_ts = {
.name = "s3c2410-ts",
.id = -1,
.dev.parent = &s3c_device_adc.dev,
.num_resources = ARRAY_SIZE(s3c_ts_resource),
.resource = s3c_ts_resource,
};

struct platform_device s3c_device_adc = {
.name = "s3c24xx-adc",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_adc_resource),
.resource = s3c_adc_resource,
};

请看上面红色加粗的那一行,在结构体platform_device s3c_device_ts中引用了

s3c_device_adc.dev。在系统初始化时将数组smdk2440_devices[]中的平台设备

结构体从前到后依次添加到内核,如果把&s3c_device_ts放在了&s3c_device_adc的前面,

当s3c_device_ts被添加到内核时s3c_device_adc.dev还没有被初始化(device_initialize(&pdev->dev))

此时还是NULL,上面的引用就相当于引用&NULL,所以导致了这样的错误。

以前没有人遇到这样的错误是因为以前的linux版本还不支持S3C24xx的触摸屏驱动,

我相信随着移植linux-2.6.36的人的增多遇到这个错误的人也会不少。我在这里贴出来希望对今后遇到

这样错误的人有所帮助。

启动时的错误信息如下:

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Linux version 2.6.36-rc4 (root@chenyg) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #17 Thu Sep 23 21:55:35 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: SMDK2440
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60464k/60464k available, 5072k reserved, 0K highmem
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.init : 0xc0008000 - 0xc002a000 ( 136 kB)
.text : 0xc002a000 - 0xc03ed000 (3852 kB)
.data : 0xc0406000 - 0xc04290e0 ( 141 kB)
Hierarchical RCU implementation.
RCU-based detection of stalled CPUs is disabled.
Verbose stalled-CPUs detection is disabled.
NR_IRQS:85
irq: clearing pending ext status 00080000
irq: clearing subpending status 00000003
irq: clearing subpending status 00000002
Console: colour dummy device 80x30
console [ttySAC0] enabled
Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
gpiochip_add: gpios 288..303 (GPIOK) failed to register
gpiochip_add: gpios 320..334 (GPIOL) failed to register
gpiochip_add: gpios 352..353 (GPIOM) failed to register
NET: Registered protocol family 16
------------[ cut here ]------------
WARNING: at lib/kref.c:34 kref_get+0x1c/0x40()
Modules linked in:
[<c00304ac>] (unwind_backtrace+0x0/0xec) from [<c003f164>] (warn_slowpath_common+0x48/0x60)
[<c003f164>] (warn_slowpath_common+0x48/0x60) from [<c003f194>] (warn_slowpath_null+0x18/0x1c)
[<c003f194>] (warn_slowpath_null+0x18/0x1c) from [<c01759a4>] (kref_get+0x1c/0x40)
[<c01759a4>] (kref_get+0x1c/0x40) from [<c0174afc>] (kobject_get+0x10/0x18)
[<c0174afc>] (kobject_get+0x10/0x18) from [<c01bc08c>] (get_device+0x14/0x1c)
[<c01bc08c>] (get_device+0x14/0x1c) from [<c01bd024>] (device_add+0x74/0x468)
[<c01bd024>] (device_add+0x74/0x468) from [<c01c0644>] (platform_device_add+0x104/0x15c)
[<c01c0644>] (platform_device_add+0x104/0x15c) from [<c01c0918>] (platform_add_devices+0x1c/0x60)
[<c01c0918>] (platform_add_devices+0x1c/0x60) from [<c000d644>] (smdk2440_machine_init+0x54/0x6c)
[<c000d644>] (smdk2440_machine_init+0x54/0x6c) from [<c000b258>] (customize_machine+0x18/0x24)
[<c000b258>] (customize_machine+0x18/0x24) from [<c002a408>] (do_one_initcall+0xd0/0x1a4)
[<c002a408>] (do_one_initcall+0xd0/0x1a4) from [<c000857c>] (kernel_init+0x98/0x148)
[<c000857c>] (kernel_init+0x98/0x148) from [<c002be5c>] (kernel_thread_exit+0x0/0x8)
---[ end trace 1b75b31a2719ed1c ]---
Unable to handle kernel NULL pointer dereference at virtual address 00000021
pgd = c0004000
[00000021] *pgd=00000000
Internal error: Oops: 5 [#1]
last sysfs file:
Modules linked in:
CPU: 0 Tainted: G W (2.6.36-rc4 #17)
PC is at sysfs_create_dir+0x28/0xec
LR is at kobject_add_internal+0xb8/0x18c
pc : [<c00d929c>] lr : [<c0174c18>] psr: a0000013
sp : c3819ee8 ip : c3819f3c fp : c040aa10
r10: 00000000 r9 : 00000000 r8 : c040ad70
r7 : 00000000 r6 : 00000000 r5 : c040aa10 r4 : c040aa10
r3 : c383fcc0 r2 : c040aa14 r1 : c040ad70 r0 : c040aa10
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: c000717f Table: 30004000 DAC: 00000017
Process swapper (pid: 1, stack limit = 0xc3818270)
Stack: (0xc3819ee8 to 0xc381a000)
9ee0: 2719ed1c c003f168 c038fd54 00000000 2719ed1c c040aa10
9f00: c040aa08 00000002 00000000 c0174c18 c040aa00 c040aa08 00000002 00000000
9f20: c000b240 c0174e60 c040aa10 c3819f3c 00000000 c01bd050 00000000 00000001
9f40: c3819f78 c040ad68 00000000 c040aa10 00000000 c0174d8c c040aa00 c040aa00
9f60: 00000038 00000002 00000008 c000b240 00000000 00000000 00000000 c01c0644
9f80: 00000006 c0025a74 00000000 00000008 c000b240 c01c0918 c00232bc c00084e4
9fa0: c002be5c 00000013 c000b240 c000d644 c00232bc c000b258 c00232bc c002a408
9fc0: c00084e4 30383d80 00000000 00000000 00000013 c00232bc c00084e4 c002be5c
9fe0: 00000013 00000000 00000000 c000857c 00000000 c002be5c 37c832c9 32cc33cc
[<c00d929c>] (sysfs_create_dir+0x28/0xec) from [<c0174c18>] (kobject_add_internal+0xb8/0x18c)
[<c0174c18>] (kobject_add_internal+0xb8/0x18c) from [<c0174e60>] (kobject_add+0x4c/0x5c)
[<c0174e60>] (kobject_add+0x4c/0x5c) from [<c01bd050>] (device_add+0xa0/0x468)
[<c01bd050>] (device_add+0xa0/0x468) from [<c01c0644>] (platform_device_add+0x104/0x15c)
[<c01c0644>] (platform_device_add+0x104/0x15c) from [<c01c0918>] (platform_add_devices+0x1c/0x60)
[<c01c0918>] (platform_add_devices+0x1c/0x60) from [<c000d644>] (smdk2440_machine_init+0x54/0x6c)
[<c000d644>] (smdk2440_machine_init+0x54/0x6c) from [<c000b258>] (customize_machine+0x18/0x24)
[<c000b258>] (customize_machine+0x18/0x24) from [<c002a408>] (do_one_initcall+0xd0/0x1a4)
[<c002a408>] (do_one_initcall+0xd0/0x1a4) from [<c000857c>] (kernel_init+0x98/0x148)
[<c000857c>] (kernel_init+0x98/0x148) from [<c002be5c>] (kernel_thread_exit+0x0/0x8)
Code: e595100c e3510000 059f60b8 15916018 (e5d60021)
---[ end trace 1b75b31a2719ed1d ]---
Kernel panic - not syncing: Attempted to kill init!
[<c00304ac>] (unwind_backtrace+0x0/0xec) from [<c02fff74>] (panic+0x54/0x178)
[<c02fff74>] (panic+0x54/0x178) from [<c0042114>] (do_exit+0x64/0x580)
[<c0042114>] (do_exit+0x64/0x580) from [<c002e9c4>] (die+0x198/0x1c4)
[<c002e9c4>] (die+0x198/0x1c4) from [<c00311e0>] (__do_kernel_fault+0x64/0x84)
[<c00311e0>] (__do_kernel_fault+0x64/0x84) from [<c00313b8>] (do_page_fault+0x1b8/0x1cc)
[<c00313b8>] (do_page_fault+0x1b8/0x1cc) from [<c002a2d4>] (do_DataAbort+0x34/0x94)
[<c002a2d4>] (do_DataAbort+0x34/0x94) from [<c002aa00>] (__dabt_svc+0x40/0x60)
Exception stack(0xc3819ea0 to 0xc3819ee8)
9ea0: c040aa10 c040ad70 c040aa14 c383fcc0 c040aa10 c040aa10 00000000 00000000
9ec0: c040ad70 00000000 00000000 c040aa10 c3819f3c c3819ee8 c0174c18 c00d929c
9ee0: a0000013 ffffffff
[<c002aa00>] (__dabt_svc+0x40/0x60) from [<c00d929c>] (sysfs_create_dir+0x28/0xec)
[<c00d929c>] (sysfs_create_dir+0x28/0xec) from [<c0174c18>] (kobject_add_internal+0xb8/0x18c)
[<c0174c18>] (kobject_add_internal+0xb8/0x18c) from [<c0174e60>] (kobject_add+0x4c/0x5c)
[<c0174e60>] (kobject_add+0x4c/0x5c) from [<c01bd050>] (device_add+0xa0/0x468)
[<c01bd050>] (device_add+0xa0/0x468) from [<c01c0644>] (platform_device_add+0x104/0x15c)
[<c01c0644>] (platform_device_add+0x104/0x15c) from [<c01c0918>] (platform_add_devices+0x1c/0x60)
[<c01c0918>] (platform_add_devices+0x1c/0x60) from [<c000d644>] (smdk2440_machine_init+0x54/0x6c)
[<c000d644>] (smdk2440_machine_init+0x54/0x6c) from [<c000b258>] (customize_machine+0x18/0x24)
[<c000b258>] (customize_machine+0x18/0x24) from [<c002a408>] (do_one_initcall+0xd0/0x1a4)
[<c002a408>] (do_one_initcall+0xd0/0x1a4) from [<c000857c>] (kernel_init+0x98/0x148)
[<c000857c>] (kernel_init+0x98/0x148) from [<c002be5c>] (kernel_thread_exit+0x0/0x8)

0
 条评论
相关内容推荐