LINUX内核调试过程
LINUX内核调试过程,使用openjlink
多谢南方,让我能够顺利进入内核的调试界面,此教程也是请教南方的,我整理了一下发布上来,我想应该还有地方有错误,不过运行是正常了,希望大家指点。
1、
通过uboot下载linux内核 nfs 0x32000000
192.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 debug
request, current mode: Supervisor
cpsr: 0x40000053 pc: 0x
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-
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: e
c
c
c
c00086cc: e
c00086d0: e
c00086d4: e
c0008060 <__turn_mmu_on>:
c0008060: e
c0008064: ee
c0008068: ee
c
c0008070: e
c0008074: e
//置断点为30008074好像在
//openOCD中不可以设置虚拟地址,
现在的问题就是我取消了顶层目录makefile文件里所有的优化选项,就出现了错误。
但是我没有修改过任何文件