主题 : [转载]LINUX内核调试过程(使用OpenJtag + OpenOCD) 复制链接 | 浏览器收藏 | 打印
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
楼主  发表于: 2010-05-31 09:54

 [转载]LINUX内核调试过程(使用OpenJtag + OpenOCD)

管理提醒: 本帖被 kasim 执行加亮操作(2010-05-31)
原文由windxiang发表在http://www.100ask.net/showtopic-1624.aspx


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


但是我没有修改过任何文件
附件: LINUX内核调试过程.rar (67 K) 下载次数:257
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 19339
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-04-18
最后登录: 2010-11-26
1楼  发表于: 2010-07-27 11:01
好东西
级别: 侠客
UID: 21258
精华: 1
发帖: 120
金钱: 655 两
威望: 131 点
贡献值: 1 点
综合积分: 260 分
注册时间: 2010-05-13
最后登录: 2023-11-17
2楼  发表于: 2010-07-27 16:45
lLINUX内核调试过程(使用OpenJtag + OpenOCD)好东西,留名
级别: 新手上路
UID: 26120
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
贡献值: 0 点
综合积分: 22 分
注册时间: 2010-08-03
最后登录: 2010-11-04
3楼  发表于: 2010-08-04 10:05
谢谢楼主。
级别: 新手上路
UID: 9283
精华: 0
发帖: 21
金钱: 120 两
威望: 33 点
贡献值: 0 点
综合积分: 42 分
注册时间: 2009-09-24
最后登录: 2010-11-29
4楼  发表于: 2010-08-09 17:32
谢谢lz
级别: 侠客
UID: 35319
精华: 0
发帖: 104
金钱: 530 两
威望: 106 点
贡献值: 0 点
综合积分: 208 分
注册时间: 2010-12-30
最后登录: 2022-02-15
5楼  发表于: 2010-12-30 10:51
好铁
级别: 侠客
UID: 44311
精华: 0
发帖: 138
金钱: 710 两
威望: 142 点
贡献值: 0 点
综合积分: 276 分
注册时间: 2011-04-24
最后登录: 2014-10-14
6楼  发表于: 2011-06-29 00:27
学习!!!!!
级别: 新手上路
UID: 15154
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
贡献值: 0 点
综合积分: 28 分
注册时间: 2010-03-01
最后登录: 2018-02-08
7楼  发表于: 2011-08-03 22:28
参考楼主文章 gdb在单步调试的时候 报错
Could not insert single-step breakpoint at
级别: 侠客
UID: 31364
精华: 0
发帖: 59
金钱: 295 两
威望: 59 点
贡献值: 0 点
综合积分: 118 分
注册时间: 2010-10-29
最后登录: 2017-09-13
8楼  发表于: 2012-01-10 15:26
LINUX内核调试过程(使用OpenJtag + OpenOCD) 好贴 留名
级别: 新手上路
UID: 111455
精华: 0
发帖: 26
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 52 分
注册时间: 2014-12-25
最后登录: 2016-12-17
9楼  发表于: 2016-11-14 22:05
Linux内核驱动开发
https://yunpan.cn/ckbqGDWxKdFKX  访问密码 8192


https://yunpan.cn/ckbqnsAkH3JW9  访问密码 75dc


https://yunpan.cn/ckbqWUNzSDIEd  访问密码 6b14

https://yunpan.cn/cvW6J95tqTwds  访问密码 773e