遇到的kernel panic:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 1.965699] pgd = c0404000[ 1.968487] [00000000] *pgd=00000000
[ 1.972593] Internal error: Oops: 80000007 [#1] PREEMPT SMP
[ 1.978167] CPU: 0 Not tainted (3.0.36+ #36)
[ 1.982784] PC is at 0x0
[ 1.985324] LR is at hdmi_sys_parse_edid+0x70/0x7e8
[ 1.990202] pc : [<00000000>] lr : [<c06452dc>] psr: 60000013
[ 1.990209] sp : eebcfec8 ip : 00000000 fp : 00000089
[ 2.001688] r10: 00000003 r9 : c0432a00 r8 : c0c4d28c
[ 2.006913] r7 : eebbcc10 r6 : eebbccc8 r5 : 00000000 r4 : ee974800
[ 2.013439] r3 : 00000000 r2 : 00000000 r1 : ee974800 r0 : 00000000
[ 2.019967] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
[ 2.027276] Control: 10c5387d Table: 8e42004a DAC: 00000015
当出现kernel panic的时候,会出现上面所示的堆栈信息。我们可以看到 [ 1.985324] LR is at hdmi_sys_parse_edid+0x70/0x7e8,就会知道在hdmi_sys_parse_edid函数这边出现问题的。找到当看到Unable to handle kernel NULL pointerdereference at virtual address 00000000时,就知道这个函数应用了一个非法地址,在linux中, 将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间),现在内核非法使用了用户空间的地址故存在问题。