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