Linux内核BUG

内核调试方法
内核空指针错误
Unable to handle kernel NULL pointer dereference at virtual address 00000000
[    1.155000] pgd = c0004000
[    1.155000] [00000000] *pgd=00000000
[    1.160000] Internal error: Oops: 805 [#1] PREEMPT SMP ARM
[    1.165000] Modules linked in:
[    1.170000] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.14.0 #33
[    1.175000] task: ee8a0000 ti: ee8a4000 task.ti: ee8a4000
[    1.180000] PC is at s5pv210_led_init+0x18/0x180 //定义是否是行和列
[    1.185000] LR is at do_one_initcall+0x30/0x144
[    1.190000] pc : [<c0222f5c>]    lr : [<c00087b4>]    psr: 60000153
[    1.190000] sp : ee8a5ef8  ip : c0527350  fp : 00000000
[    1.200000] r10: c04be4fc  r9 : c04f3470  r8 : c0222f44
[    1.205000] r7 : c052eec0  r6 : c04e07f4  r5 : 00000000  r4 : ee8a4000
[    1.210000] r3 : 000000ff  r2 : c0459148  r1 : 00000001  r0 : 1f400000
[    1.220000] Flags: nZCv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
[    1.225000] Control: 10c5387d  Table: 4000404a  DAC: 00000015
[    1.230000] Process swapper/0 (pid: 1, stack limit = 0xee8a4240)
[    1.240000] Stack: (0xee8a5ef8 to 0xee8a6000)

查找PC寄存器的地址

这里是:0xc0222f5c

arm-none-linux-gnueabi-addr2line 0xc0222f5c -e vmlinux -f //通过该命令可以定位到问题在内核中的哪个文件及行号

arm-none-linux-gnueabi-objdump -D vmlinux > err.dis
(objdump是反汇编命令 因此必须加交叉编译工具,addr2line则不需要)
err.dis 文件中查找 PC寄存器的值
后面的汇编指令
str r3,[r5]
r3 : 000000ff  r5 : 00000000

去源代码中查找c0222f44 <s5pv210_led_init>:
0xff 就定位到了问题


内核移植
移植思想:
1、确定架构arm 单板exynos-fs4412
2、交叉编译
3、选配(支持NFS 网络等) 编译
4、烧写测试 查看串口是否正常输出
5、设备树移植
具体操作:
1、cp arch/arm/configs/exynos_defconfig .config
2、最优做法:将ARCH=arm  CROSS_COMPILE=arm-none-linux-gnueabi- 写入Makefile

也可以make menuconfig ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
3、make menuconfig
选配:
NFS支持
IPV4支持
DM9000支持
4、make uImage
5、烧写测试
6、clk_ignore_unused = true (drivers/clk/clk.c中修改)

设备树 (网卡驱动移植)
查看原理图查找网络DM9000 中断gpx0_6
总线 SROMC 地址0x5000000



你可能感兴趣的:(linux,kernel,指针,bug,内核,调试)