三线撸豹,神乎其技!​

编程入门 行业动态 更新时间:2024-10-03 00:29:04

三线撸豹,<a href=https://www.elefans.com/category/jswz/34/1768211.html style=神乎其技!​"/>

三线撸豹,神乎其技!​

 多年前曾拟了个书名,叫“管中窥豹”,打算以芯片管脚为视角,介绍芯片原理,特别是与软件密切相关的一些特征。名字中的豹当然就是指芯片。但是始终没有能真正下笔开写。

最近几个月里,格蠹一直在开发ARM架构的硬件调试器。说是硬件调试器,其实大多数开发工作还是在软件上,除了小盒子(下图之红色小盒)中的固件外,还有大量的主机端软件要写。

随着开发过程的不断深入,我们对ARM平台的调试技术也越挖越深。本来萦绕在脑海中的一个个问号逐一被拉直,变成一个个惊叹号。大家时常发出一声:“哇,原来是这么实现的!”

前几天有担任芯片公司CTO的交大校友来格蠹交流,他多次提到“调试这块的技术难度还是很高的”。

诚然,要把风驰电掣的CPU停下来要比把它跑起来更难。 如同把飞机降落在跑道上难于把它飞起来。

使用了几个月的ARM硬件调试器后,给我最大的一个感受是“稳定”。虽然ARM主推的SWD通信方式只有三根很普通的线:时钟、数据、地,但是它工作的非常稳定。能用低廉的硬件把JTAG调试实现的如此稳定,其中的一个主要原因是协议定义的优秀,包括400多页的调试接口协议(ADI),访问内部资源的CoreSight技术,以及散布在整个ARM架构中的调试支持。

对ARM硬件调试技术的另一个感受是“强大”,功能极其丰富。能做的除了读写寄存器、内存,设置断点和单步外,还有很多让人惊叹的功能,比如执行CPU指令。

举例来说,ARM的系统寄存器众多,有些是随着架构演进和不断增加的,比如ARMv7为了满足操作系统保存percpu数据区位置的需要新增了TPIDR这样的“伪段”寄存器(TPIDR_EL1)。这样的寄存器是不在常规的寄存器上下文中的。开源的OpenOCD项目中,也没有访问这个寄存器的代码。

于是,我们便寻找方法,希望可以在调试时读写这样的寄存器。

经过一番调查,我们发现很多调试操作都是通过执行指令来做的。换句话来说,就是在调试模式下让CPU执行指令。

现代CPU的最基本原理也是最强大之处就是执行指令。

可是在调试模式下,CPU已经进入了特殊的被调试模式,通俗地说就是已经被“停”了下来。此时让它再去执行指令不是不可能,但是实现起来不容易。这有点像疫情封控的时候,地铁还要开、快递还要有、最好还能下饭店、逛酒吧......

尽管这个问题想起来就很麻烦,可是英国人做到了。

比如下面是格蠹新增的用来读系统寄存器的代码。

// access sysreg by name, extended by NDB on 2022-6-28

int armv8_get_sysreg(struct target* target, uint32_t reg_encode, uint64_t* val)

{

int retval = 0;

struct armv8_common* armv8 = target_to_armv8(target);

uint32_t instr = ARMV8_MRS_LINUX(reg_encode, 0); // SYSTEM_SCTLR_EL3

retval = armv8->dpm.instr_read_data_r0_64(&armv8->dpm, instr, val);

return retval;

}

其中的instr整数就是要执行的指令,ARMV8_MRS_LINUX宏是用来根据寄存器的编码信息产生著名的MRS指令,指令的机器码便是:

0xd53bd040

最后的0代表把系统寄存器读到普通寄存器x0。

有了机器码之后,需要把这个机器码交给dpm对象,它通过调试通路送到目标SoC中。

什么是DPM呢?这是问题的关键,它的全称是Debug Programmers' Model,似乎可以翻译为“编程器模型”。对于这个关键的模型,ARM的公开文档中只提到了一次。而且是在ARMv7的某个版本中有,在比较新的ARMv8文档中已经没有了。删除的原因是很好理解的。今天的ARM已经不是跟在x86后面的小弟弟了,在很多方面,它已经走在前头。

接下来的关键逻辑是dpmv8_exec_opcode,也就是让停下来的CPU执行指定的操作。

起初这个操作是失败的。于是我们便核对机器码,这刚好可以用NDB调试器自己来帮忙。使用NDB调试Linux内核时,每次停下来刚好会显示Linux内核的几条指令,里面恰好有读tpidr的指令(见下图)。参考这条指令,发现我们手工产生机器码的代码多作了一次移位。

改掉这个bug后,神奇的dpm操作就成功了。不管这个操作如何难,效果就像操作系统中执行这条指令一样,得到的tpidr寄存器的值和驱动里读到的一样。

在包含dpm术语的ARMv7手册中,第三部分(Part C)比较详细地介绍了DPM的工作原理,很值得细细品味。

看到这里,大家应该明白题目的含义了。“三线”代表ARM硬件调试器常用的三根线。撸豹模仿“撸猫”之语。ARM能用三根线把芯片硬件调试实现的如此精湛,举重若轻,把凶猛的CPU控制的服服贴贴,“撸豹”如同“撸猫”一样,真是让人赞叹,神乎其技!。

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以文章和有声读物

也欢迎关注格友公众号

更多推荐

三线撸豹,神乎其技!​

本文发布于:2024-02-28 03:40:48,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767867.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:神乎其技   三线撸豹

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!