问题现象:
Unable to handle kernel NULL pointer dereference at virtual address 00000031
[ 1051.163916] pgd = d6278000
[ 1051.166541] [00000031] *pgd=5629b831, *pte=00000000, *ppte=00000000
[ 1051.172742] Internal error: Oops: 17 [#6] PREEMPT SMP
[ 1051.177763] Modules linked in: led(P) [last unloaded: led]
[ 1051.183242] CPU: 0 Tainted: P D (3.0.15 #4)
[ 1051.188562] PC is at do_sys_open+0xec/0x1a4
[ 1051.192718] LR is at path_openat+0xfc/0x3c4
[ 1051.196877] pc : [<c010ebac>] lr : [<c011ef80>] psr: 00000053
[ 1051.196897] sp : d6087f58 ip : d6087e60 fp : d6087f94
[ 1051.208322] r10: 00000000 r9 : d6086000 r8 : 00000001
[ 1051.213533] r7 : ffffff9c r6 : 00000003 r5 : 00000025 r4 : d6691000
[ 1051.220040] r3 : 00000000 r2 : 00000000 r1 : 00000000 r0 : 00000025
[ 1051.226557] Flags: nzcv IRQs on FIQs off Mode SVC_32 ISA ARM Segment user
[ 1051.233758] Control: 10c5387d Table: 5627804a DAC: 00000015
问题关键:
int led_open(struct inode *node, struct file *filp){
led_config = ioremap(GPL2CON, 4);
writel(0x00000001, led_config);
led_data = ioremap(GPL2DAT, 4);
printk("puzzle is so fun!\n");
printk("因为没有return 0,所以产生NULL pointer\n");
//return 0;
}