Jlink 软件断点和硬件断点
调试2440 RAM拷贝至SDRAM遇到的问题
汇编代码主要是初始化一些寄存器,关狗,初始化时钟,初始化存储管理器以便访问内存,然后将SoC上4k RAM数据拷贝至SDRAM,然后在SRAM里面运行,由于代码未正常跑起来,于是使用JLinkExe来调试。JLinkExe指定了一个命令文件: JLinkExe -commandfile ./cmd.jlink ,cmd.jlink文件内容如下:
r
loadbin /home/thomas/learn/armasm/addresses/main.bin 0x0
setbp 0x0 a s
setpc 0x0
运行至内存拷贝代码时发现了问题:
copy_steppingstone2sdram:
ldr r0,=0x30000000 @sdram start addr
ldr r1,=(0x30000000+*) @steppingstone length + sdram start addr
mov r2,#0x0 @steppingstone start addr
copy_cycle:
ldr r3,[r2],#
str r3,[r0],#
cmp r0,r1
bne copy_cycle
mov pc,lr
代码反复分析,没发现问题,但是诡异的是:单步至第六行汇编指令时,按道理r3里面值应该是我的main.bin文件的前4个字节,输入:regs 查看各寄存器值,发现r3居然是0xDEEEDEEE,继续下一个字节的拷贝,这下r3的值又正常了。于是怀疑难道是flash这个点坏了?但是 flash不是有坏块标识机制吗?然后进一步确认下,使用命令:mem32 0x0 1,发现输出值又是对的,并不是0xDEEEDEEE。突然觉得0xDEEEDEEE这个值比较有特点,于是直接百度这个值,这下搜到了ARM官方文档,Using EmbeddedICE,这下才明白怎么回事了。主要是由于的cmd.jlink文件里面设置了一个软件断点。一般断点分为2种,1.软件断点 2.硬件断点。
1.硬件断点
硬件断点通过使用一个被称为EmbeddedICE的宏单元来监视写往地址线上的数据,如果地址匹配上则停止执行。这个宏单元是可以配置的,配置为breakpoint或者watchpoint,它会占据这个硬件单元,一般一个芯片上的EmbeddedICE宏单元数量不会太多,比如ARMv5的ARM9只有2个。也就是说至多设置2个硬件断点,如果要设置第三个,那么必须覆盖其中一个。
2.软件断点
软件断点也是通过使用EmbeddedICE宏单元来监测取指时指令是否符合一个特殊的bit-pattern,位模式,就是说取出的指令是否是个特定值,或者指令某几个位是否匹配上。这个bit-pattern会预先存储到下软件断点的位置,也就是说把在内存中哪个位置的值替换为这个bit-pattern,而原来这个位置的指令会被暂存到调试器的存储单元中。因此自修改代码,或者位于ROM中的代码是不能使用这种断点的。ROM中的很好理解,下软件断点必须往里面写bit-pattern,而ROM只读,显然不行了,自修改代码可能出现代码拷贝的动作,从源地址拷贝至目标地址,如果这个时候你在源地址某处下个软件断点,那么你拷贝到目的地址的这条指令变成了bit-paterrn了。
我遇到的问题正是由于在零地址下了个软件断点导致。软件断点个数是没限制的,所有的软件断点占据一个EmbeddedICE宏单元,也就是说对于只有2个宏单元的ARM9,你下过软件断点后就只能下一个硬件断点了。
Jlink 软件断点和硬件断点的更多相关文章
- windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)
bp bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对 ...
- Ollydbg中的内存断点和硬件断点的区别
转载自: https://www.zhihu.com/question/52625624 旅人的回复 作者:旅人链接:https://www.zhihu.com/question/52625624/a ...
- X86逆向10:学会使用硬件断点
本节课我们将学习硬件断点的使用技巧,硬件断点是由硬件提供给我们的一组寄存器,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址上面,这就是硬件断点,硬件断点依赖于寄存器,这些寄 ...
- 硬件断点 DrxHook
硬件断点 DrxHook 硬件断点的实现需要依赖于调试寄存器 DR0~DR7 调试寄存器 DR0~DR3-----调试地址寄存器DR4~DR5-----保留DR6 -----调试状态寄存器 指示哪个 ...
- ring3硬件断点
4个断点寄存器DR0~DR3用来设置断点的线性地址. DR6为状态寄存器,DR7为控制寄存器. DR4和DR5保留.当CR4.DE==1时,访问DR4和DR5产生#UD异常:IF CR4.DE==0, ...
- Xcode中使用数据(硬件)断点调试
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Xcode的GUI界面中只能添加软断点,而无法增加硬断点.但 ...
- 为什么NtReadVirtualMemory 硬件断点无法下断
win7 x64为例 nt!NtReadVirtualMemory ----- nt!MmCopyVirtualMemory NTSTATUS NTAPI MmCopyVirtualMemory(IN ...
- JLink 软件复位、Halt及运行小工具
调试硬件时常常需要复位目标芯片,每次断电上电太麻烦,又不喜欢总打开segger的命令行,于是就搞了这个小工具: QT绿色软件,解压即可运行,打开JLinkRST.exe,点击Connect即可通过 ...
- JLink软件升级到4.92之后,Jlink不能用了
JLink软件升级到4.92之后,Jlink不能用了 情景描述: Jlink软件升级到4.9 ...
随机推荐
- Spring框架中的IOC?
Spring中的org.springframework.beans包和org.SpringframeWork.context包构成了Spring框架IOC容器的基础.BeanFactory接口提供了一 ...
- 前端关于SEO
提高页面加载速度. 能用css解决的不用背景图片,背景图片也尽量压缩大小,可以几个icons放在一个图片上,使用background-position找到需要的图片位置.可以减少HTTP请求数,提高网 ...
- POST和GET请求区别
最新博客站点:欢迎来访 1. 请求长度的限制 在HTTP协议中,从未规定GET/POST的请求长度限制,对于GET,对url的限制来源于浏览器或web服务器,浏览器和服务器限制了url的长度.因此,在 ...
- Mysql存储过程查询结果赋值到变量
# 使用的navicat 编辑的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_student_back`()BEGIN#定义max ...
- Mysql升级过程的问题
升级安装5.6版本mysql linux环境下的yum默认mysql版本是5.1的,由于项目需要保存表情等4个字节的数据,版本受限,需要升级到5.6版本支持utf8mb4格式的编码. 升级过程大概就是 ...
- 微信中h5页面用window.history.go(-1)返回上一页页面不会重新加载问题
问题描述: 在实际开发中遇到这样一个问题,业务需求涉及到返回上一页问题,第一时间想到了window.history.go(-1)方法,这样做本身没有任何问题,但是在微信中,安卓手机还好返回上一页页面会 ...
- python计算MD5
python有自带的MD5模块hashlib,用起来简单很多.Python Hashlib模块的使用说明 http://docs.python.org/2/library/hashlib.htmlfd ...
- Pig关系型运算符例子
1.新建两个文件A.txt与B.txt, A.txt文件的内容如下: 0,1,2 1,3,4 B.txt文件的内容如下: 0,5,2 1,7,8 将这两个文件上传到目录/zwy/soft 2.定义关系 ...
- Linux基础(02)、MTPutty安装和使用
准备工具 1. MTPutty的安装包 2. Putty.exe程序 作用:远程连接操作Centos 安装MTPutty 1.根据提示,一直下一步至下图:选择putty.exe文件的位置即可. 2.选 ...
- oracle杀死锁表的进程(转发+合并+自己实践)
之一: Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作 (1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;sel ...