linux版本2.6.30.4
TQ2440开发板
◆环境准备
▲软件
・windows:
jlink驱动及工具包安装
Setup_JLinkARM_V436e.exe
・交叉编译器所在机器(目前是用虚拟机)
arm-linux-gdb
和交叉编译器安装为同一方法(内置于交叉编译工具链)
配置网络
arm-linux-gdb所在机器要能够ping通gdb server所在机器
※目前交叉编译器是用的虚拟机virtual box
如果目前使用的是VMare,建议转到virtual box.
1. cd "C:\Program Files (x86)\VMware\VMware Workstation\OVFTool"
2. ovftool source.vmx export.ovf
3. vbox中Import vm
参考 https://blog.csdn.net/wang010366/article/details/51870601
因为vmware的网络配置有些不顺手,这个看个人喜好
▲重新编译内核
vim scripts/Makefile.lib
给orig_c_flags添加 -gdwarf-2 编译选项(-g是不是也行?)
make clean
make zImage
▲更新内核(此步骤应为非必须,因为在gdb load时,会将elf文件展开到RAM,这么做只是为了脱离JTAG后kernal行为一致)
将编译好的内核zIamge烧到nand
▲硬件
JLINK
连接好JLINK到s3c2440的JTAG口
上电顺序
jlink上电 -> 开发板上电(反过来貌似也可以,不用太关注)
※关电顺序与上电顺序相反 开发板关电 -> JLINK关电
设置JTAG速率
通过J-Link ARM V4.36e快捷方式打开J-Link命令行窗口
J-Link>speed 4000
JTAG speed: 4000 kHz
※话说这个speed太高了貌似是不行,至于设置到多少好尚不明.
设置为8000的话,可以load,可以断,但是断住后,read的时候得到的全是0
寄存器的值都是0,查看pc处的指令也是0,不过x/4x 0倒是能看到非0数据,有点邪门
设置完speed需要重启jlink和板子??
反正speed的设置这块有点糊涂
J-Link命令行可以设置,J-Link Control panel也可以设置,gdb server也可以设置
什么鬼玩意,设置了一个另外的也不同步更新,真的是很不科学.
顺便说下,手头使用的J-Link驱动是V4.36e版本
◆调试内核
▲启动gdb server
找到安装jlink驱动时创建的快捷方式,启动JLinkGDBServer.exe
启动后状态或设定如下
GDB:Waiting for connection
J-Link:Connected
Target:ARM9, Core Id: 0x0032409D
Initial JTAG spped:4000kHz(这个可选,选择和Current JTAG speed一致即可)
Current JTAG spped:4000kHz
电压:3.3V
endian:Little endian
Localhost only 不勾选
show log window 勾选
Init regs on start 勾选
未言及的选项按默认
▲启动arm-linux-gdb
linux-2.6.30.4$ arm-linux-gdb ./vmlinux
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-linux"...
(gdb) target remote wgs:2331
Remote debugging using wgs:2331
0x00000000 in ?? ()
▲通过JTAG向2440加载elf格式的vmlinux
(gdb) load
Loading section .note.gnu.build-id, size 0x24 lma 0x0
Loading section .text.head, size 0x240 lma 0xc0008000
Loading section .init, size 0x3bdc0 lma 0xc0008240
Loading section .text, size 0x449324 lma 0xc0044000
Loading section .init.rodata, size 0x100 lma 0xc048e000
Loading section __ksymtab, size 0x4e10 lma 0xc048e100
Loading section __ksymtab_gpl, size 0x27a0 lma 0xc0492f10
Loading section __ksymtab_strings, size 0x10309 lma 0xc04956b0
Loading section __param, size 0x2644 lma 0xc04a59bc
Loading section .data, size 0x3c4e0 lma 0xc04a8000
Start address 0xc0008000, load size 5093413
Transfer rate: 164 KB/sec, 15916 bytes/write.
▲开始调试内核
(gdb) b start_kernel
Breakpoint 1 at 0xc0008774: file init/main.c, line 541.
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:541
541 smp_setup_processor_id();
(gdb) i r
r0 0xc0007177 3221254519
r1 0xa8 168
r2 0x0 0
r3 0xc0008100 3221258496
r4 0xc0007175 3221254517
r5 0xc04e45c8 3226355144
r6 0xc0020d34 3221359924
r7 0xc04ac4f0 3226125552
r8 0x3001f40c 805434380
r9 0x41129200 1091736064
r10 0x3001f3d8 805434328
r11 0xc04a9ff4 3226116084
r12 0xc04a9ff8 3226116088
sp 0xc04a9fd0 0xc04a9fd0
lr 0x30008034 805339188
pc 0xc0008774 0xc0008774 <start_kernel+16>
fps 0x0 0
cpsr 0x600000d3 1610612947
(gdb) l
536 asmlinkage void __init start_kernel(void)
537 {
538 char * command_line;
539 extern struct kernel_param __start___param[], __stop___param[];
540
541 smp_setup_processor_id();
(gdb) n
557 local_irq_disable();
(gdb) n
559 early_init_irq_lock_class();
(gdb) n
523 set_cpu_online(cpu, true);
(gdb) p cpu
$1 = (struct cpu_table *) 0x0
(gdb) n
524 set_cpu_present(cpu, true);
(gdb) n
525 set_cpu_possible(cpu, true);
(gdb) n
569 printk(KERN_NOTICE "%s", linux_banner);
(gdb) p linux_banner
$2 = 0xc036e638 "Linux version 2.6.30.4-EmbedSky (book@book-desktop) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176) ) #6 Sat Mar 27 18:44:45 CST 2021\n"
(gdb) p boot_command_line
$3 = 0xc0020404 "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"