当前位置:  技术问答>linux和unix

jlink调试linux内核?

    来源: 互联网  发布时间:2017-04-29

    本文导语:  JLink + Vmware调试linux内核 2012-06-28 15:10:49 分类: 嵌入式 Jlink 版本:  V4.34d 交叉编译: arm-none-linux-gnueabi-gcc   Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START+0x8000 地址处。在...

JLink + Vmware调试linux内核 2012-06-28 15:10:49
分类: 嵌入式
Jlink 版本:  V4.34d
交叉编译: arm-none-linux-gnueabi-gcc
 
Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START+0x8000 地址处。在跳转时,下列条件要满足: 
1. CPU 寄存器的设置: 
    * R0=0; 
    * R1=机器类型 ID;关于 Machine Type Number,可以参见 linux/arch/arm/tools/mach-types。 
    * R2=启动参数标列表在 RAM 中起始基地址; 
2. CPU 模式: 
    * 必须禁止中断(IRQs和FIQs); 
    * CPU 必须 SVC 模式;
3. Cache 和 MMU 的设置: 
    * MMU 必须关闭; 
    * 指令 Cache 可以打开也可以关闭; 
    * 数据 Cache 必须关闭;
 
4. 设备DMA必须关闭状态
 
要满足以上条件有两种方法
1. 通过初始化脚本
这些内容就是初始化代码所要做的事情,
贴一段gdb + j-link on s3c244x的, 主要就是要配置一下MMU。
#memory init 
mon MemU32 0x48000000 = 0x22111100 
mon MemU32 0x4800001c = 0x18001 
mon MemU32 0x48000024 = 0x8c0514 
mon MemU32 0x48000028 = 0x91 
mon MemU32 0x4800002c = 0x30
#setup mmu 
mon MemU32 0x33f03000 = 0x30000c12 
mon MemU32 0x33f03004 = 0x30100c12 
mon MemU32 0x33f03008 = 0x30200c12 
mon MemU32 0x33f0300c = 0x30300c12 
mon MemU32 0x33f03010 = 0x30400c12 
mon MemU32 0x33f03014 = 0x30500c12 
mon MemU32 0x33f03018 = 0x30600c12 
mon MemU32 0x33f0301c = 0x30700c12 
mon MemU32 0x33f00cfc = 0x33f00c12 
monitor cp15 2 0 0 0 = 0x33f00000
#enable mmu 
monitor cp15 1 0 0 0 = 0x7171 
#wce 0, c1, c0, 0 ,0x7171
#load kernel vmlinux 
load vmlinux 
file vmlinux
#reset kernel boot env 
monitor cp15 1 0 0 0 = 0x7170 
monitor reg pc = 0x30008000 
monitor reg r0 = 0x00000000  #0x00000000 
monitor reg r1 = your_machine_id_here

上边是文章的内容,我实际完整调试脚本如下:
# connect to the J-Link gdb server
target remote localhost:2331

# Set JTAG speed to 30 kHz
monitor endian little
monitor speed 30

# Reset the target
monitor reset
monitor sleep 10

#
# CPU core initialization (to be done by user)
#
# Set the processor mode
monitor reg cpsr = 0xd3

#config MMU
#flush v3/v4 cache
monitor cp15 7, 7, 0, 0 = 0x0
#/* flush v4 TLB */
monitor cp15 8, 7, 0, 0 = 0x0
#disable MMU stuff and caches
monitor cp15 1, 0, 0, 0 =0x1002
#Peri port setup
monitor cp15 15, 2, 0, 4 = 0x70000013
#disable watchdog kangear
monitor MemU32 0x53000000  =  0x00000000
monitor sleep 10
#disable interrupt kangear
monitor MemU32 0x4A000008  =  0xffffffff
monitor MemU32 0x4A00001C  =  0x7fff
 
#set clock 
 
#initialize system clocks --- locktime register
monitor MemU32 0x4C000000 = 0xFF000000
     
#initialize system clocks --- clock-divn register
monitor MemU32 0x4C000014 = 0x5            #CLKDVIN_400_148
     
#initialize system clocks --- mpll register
monitor MemU32 0x4C000004 = 0x7f021    #default clock
 
 
#memory init 
mon MemU32 0x48000000 = 0x22111100 
mon MemU32 0x4800001c = 0x18001 
mon MemU32 0x48000024 = 0x8c0514 
mon MemU32 0x48000028 = 0x91 
mon MemU32 0x4800002c = 0x30
#setup mmu 
mon MemU32 0x33f03000 = 0x30000c12 
mon MemU32 0x33f03004 = 0x30100c12 
mon MemU32 0x33f03008 = 0x30200c12 
mon MemU32 0x33f0300c = 0x30300c12 
mon MemU32 0x33f03010 = 0x30400c12 
mon MemU32 0x33f03014 = 0x30500c12 
mon MemU32 0x33f03018 = 0x30600c12 
mon MemU32 0x33f0301c = 0x30700c12 
mon MemU32 0x33f00cfc = 0x33f00c12 
monitor cp15 2 0 0 0 = 0x33f00000
#enable mmu 
monitor cp15 1 0 0 0 = 0x7171 
#wce 0, c1, c0, 0 ,0x7171
#load kernel vmlinux 
monitor speed auto
load vmlinux 
file vmlinux
#reset kernel boot env 
monitor cp15 1 0 0 0 = 0x7170 
monitor reg pc = 0x30008000 
monitor reg r0 = 0x00000000  #0x00000000 
monitor reg r1 = 1999

可以看到停在了第一条语句,如下图所示:
jlink调试linux内核?[图片]
但是执行下一步,执行的不是第二条指令,就跑得不再停下来。

     我说一下我的整体流程,在load之前,使用GDB脚本进行MMU映射(主要是为了能正常load),load完之后要关闭MMU,因为内核会自己再次打开MMU,内核再次打开MMU之前要用物理地址。
     我实质参考的是这篇文章的第一种方法。如果我load完之后,不关闭MMU目前是可以单步调试的,但是到了用到内存地址的时候就会出错,按照内核的角度是物理地址,但是实质是虚拟地址。
     如果我关闭MMU,用PC打到30008000处,是会停到第一条语句,但是往下单步调试的时候,会跑飞。
目前正在找出原因所在,内核相比u-boot调试显得稍微复杂一些。

|

可以调试,要查看jlink是否支持板子上的CPU。

|

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用jlink烧写u-boot.bin完成后,串口无提示信息


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,