当前位置: 技术问答>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
可以看到停在了第一条语句,如下图所示:
但是执行下一步,执行的不是第二条指令,就跑得不再停下来。
我说一下我的整体流程,在load之前,使用GDB脚本进行MMU映射(主要是为了能正常load),load完之后要关闭MMU,因为内核会自己再次打开MMU,内核再次打开MMU之前要用物理地址。
我实质参考的是这篇文章的第一种方法。如果我load完之后,不关闭MMU目前是可以单步调试的,但是到了用到内存地址的时候就会出错,按照内核的角度是物理地址,但是实质是虚拟地址。
如果我关闭MMU,用PC打到30008000处,是会停到第一条语句,但是往下单步调试的时候,会跑飞。
目前正在找出原因所在,内核相比u-boot调试显得稍微复杂一些。
分类: 嵌入式
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
可以看到停在了第一条语句,如下图所示:
但是执行下一步,执行的不是第二条指令,就跑得不再停下来。
我说一下我的整体流程,在load之前,使用GDB脚本进行MMU映射(主要是为了能正常load),load完之后要关闭MMU,因为内核会自己再次打开MMU,内核再次打开MMU之前要用物理地址。
我实质参考的是这篇文章的第一种方法。如果我load完之后,不关闭MMU目前是可以单步调试的,但是到了用到内存地址的时候就会出错,按照内核的角度是物理地址,但是实质是虚拟地址。
如果我关闭MMU,用PC打到30008000处,是会停到第一条语句,但是往下单步调试的时候,会跑飞。
目前正在找出原因所在,内核相比u-boot调试显得稍微复杂一些。
|
可以调试,要查看jlink是否支持板子上的CPU。
|
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。