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 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+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文件里所有的优化选项,就出现了错误。 但是我没有修改过任何文件 |
|