jtag调试linux内核,[转载]LINUX内核调试过程(使用OpenJtag OpenOCD) Linux交流...

LINUX内核调试过程LINUX内核调试过程,

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

1、

通过uboot下载linux内核 nfs 0x32000000192.168.0.10:/mnt/disk2/uImage

192.168.0.10是linux内核的IP地址

/mnt/disk2/uImage

是内核所在目录

2、

使用openJTAT telnet上去,

执行以下命令

> halt

暂停开发板,显示如下:

target state: halted

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

cpsr: 0x40000053 pc: 0x33f9e2f8

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

> bp

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

> arm7_9 sw_bkptsenable

使能软中断,占用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 KernelImage (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 tobreakpoint, current mode: Supervisor

cpsr: 0x400000d3 pc: 0x30008000

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

>

这时linux kernel输出信息:

UncompressingLinux............................................................ done, bootingthe kernel.

依然在TELNET中输入命令:

> halt

> rbp 0x30008000

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

> bp

查看

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

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

breakpointadded at address 0x30008074

> resume

恢复运行

target state:halted

target haltedin 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内核的第二阶段代码了。

[img=554,187]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image002.jpg[/img]

[img=553,341]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image004.jpg[/img]

[img=554,340]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image006.jpg[/img]

target remote localhost:3333

monitor halt

monitor step

monitor rbp 0x30008074

break start_kernel

continue

[img=554,383]file:///C:/DOCUME%7E1/ADMINI%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image008.jpg[/img]

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

在LINUX中执行arm-elf-objdump -D -m arm vmlinux > vmlinux.dis

命令即可生成反汇编代码。

c00086bc :

//这个是start_kernel的地址,是虚拟地址,

c00086bc:

e1a0c00d

mov

ip,sp

c00086c0:

e92dd870

sb

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>

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文件里所有的优化选项,就出现了错误。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值