在DS-5中,Debugger支持多种形式的内存的访问,在这里分别对其进行一一阐述和说明。
如果简单分类一下,可分为两大类:通过CPU访问和直接通过BUS访问。
这两种访问方式主要的区别在于,通过CPU访问内存,必须要在处理器停止的状态下进行,而通过BUS访问可以在处理器运行的状态下访问内存
通过BUS访问内存仅限于裸机和Linux内核这两种debugger连接状态,而通过CPU访问内存的访问则支持所有的debugger连接
通过CPU访问内存,是Debugger访问内存的基本方式,Debugger直接向CPU发出指令,查询内存中的信息。
内建MMU的处理器通常提供了内存的两组地址:实地址和虚地址。虚地址是MMU做地址转换前的地址,而实地址则是MMU地址转换后内存的真实地址。默认情况下,debugger是通过虚地址来访问内存,但是当MMU被禁用时,或者地址的映射是平的(flat mapping),实地址和虚地址则是相同的。如果要强制debugger通过实地址来访问内存则需要在地址前加入前缀p: 例如 p:0x8000
如果当前的CPU包含ARM的TrustZone 技术,那么则需要声明是要访问安全区域(secure world) 还是普通区域(normal world), 不同区域有不同的虚实地址映射。 安全区域需加入s: 前缀,普通区域要加入n:前缀,例如 ,
在这种情况下实地址的访问p: 前缀是不可用的,必须更改成sp: 或者 np:
实地址的访问是有限制的:
实地址并不是在任何时候都能使用,例如ARM硬件并不支持在实地址上设置断点
当通过实地址访问内存后,debugger 缓存还没有被flush的时候,通过实地址和虚地址访问的同一块内存可能会出现内容不一致的情况
在ARM的系统中,BUS链接了处理器和内存还有外设。
常见的BUS种类有APB (AMBA High-performance Bus) AHB (Advanced Peripheral Bus)和AXI (Advanced eXtensible Interface)
但通过BUS访问内存的方式只能在 裸机的或者Linux 内核的调试中才能被使用,在Linux 应用的调试中是不能使用的。并且对BUS内存的访问可以在CPU运行的时候进行访问。
在Debugger中可以通过使用info memory命令来显示当前系统中,具体有哪几种BUS可供访问。在访问中需要添加ABP:AHB:AXI:等前缀。例如打印出APB地址中的内容 x/1 APB:0x8000
通过BUS访问内存是不需要经过处理器的,所以在处理器运行的情况也也可以访问内存,但其具体细节取决于当前系统的实现方式,通常情况下通过BUS访问的内存是没有经过MMU和虚实地址转换的也没有经过处理器的L1缓存,但至于L2和L3缓存,是否在BUS之前或之后,就取决于具体实现了。
Debugger在访问BUS内存之后,并不会试图同步缓存中的内容。用户在访问后要自行对cache进行 clean或flush操作
memory
设置内存区域的属性和大小
memory auto
重置内存区域的属性为系统默认值
memory debug-cache
控制debugger对内存的缓存
enable memory
启用所有用户自定义内存区域
disable memory
禁用所有用户自定义内存区域
delete memory
删除所有用户自定义内存区域
info memory
显示内存区域的属性
memory fill
使用特定样式填充内存
memory set
写内存
dump
读取内存中信息,并保存到文件
append
读取内存中信息,并保存到已有文件的末尾
restore
读取文件中内存信息,并还原到内存
x
显示特定地址中内存的信息