• LINUX内核调试过程


    LINUX内核调试过程,使用openjlink

    多谢南方,让我能够顺利进入内核的调试界面,此教程也是请教南方的,我整理了一下发布上来,我想应该还有地方有错误,不过运行是正常了,希望大家指点。

    1、  通过uboot下载linux内核 nfs 0x32000000 192.168.0.10:/mnt/disk2/uImage

    192.168.0.10linux内核的IP地址

    /mnt/disk2/uImage   是内核所在目录

    2、  使用openJTAT telnet上去,

    执行以下命令

    > halt       暂停开发板,显示如下:

    target state: halted

    target halted in ARM state due to debug request, current mode: Supervisor

    cpsr: 0x40000053 pc: 0x33f9e2f8

    MMU: disabled, D-Cache: disabled, I-Cache: enabled

    > bp          查看是否有断点,有的话就rbp删除

    > arm7_9 sw_bkpts enable    使能软中断,占用1个断点,openOCD中只能有两个断点

    software breakpoints enabled

    > bp 0x30008000 4 hw  设置30008000处断点

    breakpoint added at address 0x30008000

    > bp            查看断点是否设置成功

    0x30008000, 0x4, 0

    > resume          恢复到uboot中继续运行

    >  

     

    3、在uboot中执行命令   bootm 0x32000000

       看见内核停止在这里

       Hx> bootm 32000000

    ## Booting image at 32000000 ...

       Image Name:   Linux-2.6.22.6

       Created:      2009-02-21  10:53:25 UTC

       Image Type:   ARM Linux Kernel Image (uncompressed)

       Data Size:    1849468 Bytes =  1.8 MB

       Load Address: 30008000

       Entry Point:  30008000

       Verifying Checksum ... OK

    OK

     

    Starting kernel ...               停止在这里不动了。

     

    4、进入openOCD telnet输入命令:

    > resume

    target state: halted

    target halted in ARM state due to breakpoint, current mode: Supervisor

    cpsr: 0x400000d3 pc: 0x30008000

    MMU: disabled, D-Cache: disabled, I-Cache: enabled

    > 

       这时linux kernel输出信息:

           Uncompressing Linux............................................................ done, booting the kernel.

    依然在TELNET中输入命令:

    > halt

    > rbp 0x30008000   删除断点,因为只能有两个断点,前面已经开了一个软件断点

    > bp                查看

    > bp 0x30008074 4 hw设置断点,这个断点是根据vmlinux的反汇编代码找到的,

                                       是根据反汇编代码,得知此处是开启MMU

    breakpoint added at address 0x30008074

    > resume          恢复运行

    target state: halted           

    target halted in ARM state due to breakpoint, current mode: Supervisor

    cpsr: 0x200000d3 pc: 0x30008074

    MMU: enabled, D-Cache: enabled, I-Cache: enabled    

    > 

    这时已经开启了MMU,如果没有显示MMU: enabled,可以输入step命令,似乎不显示的原因是:信息没有得到更新,输入STEP后,命令可以得到更新。

    开启MMU接下来就可以在eclipse中调试linux内核的第二阶段代码了。

     

     

     

    target remote localhost:3333

    monitor halt

    monitor step

    monitor rbp 0x30008074

    break start_kernel

    continue

     

     

     

    以下是我根据vmlinux生成的部分反汇编代码,一共生存了342M

    LINUX中执行arm-elf-objdump -D -m arm vmlinux > vmlinux.dis  命令即可生成反汇编代码。

    c00086bc <start_kernel>:           //这个是start_kernel的地址,是虚拟地址,

    c00086bc:      e1a0c00d       mov ip, sp

    c00086c0:      e92dd870       stmdb      sp!, {r4, r5, r6, fp, ip, lr, pc}

    c00086c4:      e24cb004       sub  fp, ip, #4 ; 0x4

    c00086c8:      e24dd008       sub  sp, sp, #8 ; 0x8

    c00086cc:       e59f326c       ldr   r3, [pc, #620] ; c0008940 <.init+0x720>

    c00086d0:      e1a0e00f        mov lr, pc

    c00086d4:      e1a0f003       mov pc, r3

     

     

     

     

    c0008060 <__turn_mmu_on>:

    c0008060:      e1a00000       nop                (mov r0,r0)

    c0008064:      ee010f10       mcr  15, 0, r0, cr1, cr0, {0}

    c0008068:      ee103f10       mrc  15, 0, r3, cr0, cr0, {0}

    c000806c:      e1a03003       mov r3, r3

    c0008070:      e1a03003       mov r3, r3

    c0008074:      e1a0f00d       mov pc, sp     //这个是开启MMU的函数,最早前面我设

    //置断点为30008074好像在

    //openOCD中不可以设置虚拟地址,

    现在的问题就是我取消了顶层目录makefile文件里所有的优化选项,就出现了错误。

    但是我没有修改过任何文件





  • 相关阅读:
    Centos7:mariadb替换mysql
    CentOS5 部署 戴尔OMSA
    《Zero MQ》
    可扩展的Web架构和分布式系统
    队列实现
    超级好用的正则表达式网站
    <转>undefined与null的区别
    JS事件
    sublime text 3 快捷键
    设置className的方式(不使用setAttribute)
  • 原文地址:https://www.cnblogs.com/superit/p/3838681.html
Copyright © 2020-2023  润新知