内核调试方法
内核空指针错误
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
内核空指针错误
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