利用jlink调试linux kernel

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"

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值