打通了GDK8与主机之间的JTAG连接后,下一个关键任务就是识别上层语义。
JTAG技术是通过固化在芯片内部的边界扫描链条来访问目标系统,一旦建立起连接,就可以把目标系统里的状态一个比特一个比特的移动出来,无论顶层在跑什么软件,都可以把它凝固,然后读出它的细节,看它在干什么。
对于上层软件来说,JTAG技术足够底层,足够剽悍,也足够暴力的。
但是JTAG技术足够底层的优点也同时是它的缺点,那就是它太底层了,它读到的都是0、1、0、1,它不知道这些0、1、0、1的含义。
因为此,对于今天已经巨型化了的软件世界,要把JTAG技术用好,就必须解决另一个关键问题,那就是要建立上层语义,通过上层语义理解高层行为,然后再定位到关键节点,然后再深挖细节。不然,就如同在茫茫大海中寻找一颗落水的钻石,不仅仅是费力的问题,而是不可行。
多年前,硅谷的一家公司找到我,他们开发了一个名叫CEDT的调试器,售价很贵,大于10万人民币。他们发给我了一些介绍资料和演示版本,其中最打动我的功能就是能自动在内存空间中搜索NT内核。
很久没听说CEDT的新消息了,不知道那几位做CEDT的同行现在做做什么。刚刚搜了一下高端调试网站,上面还保存着几条当年的讨论信息。
解决这个搜索问题,一是要有足够的鲁棒性,对于不同版本和存在各种差异的目标系统都要能找到,二是速度要快,因为JTAG的速度比较慢,而且今天的内存空间(物理地址和线性地址空间)都很大,所以蛮力搜索花的时间太长了。
我是基于GDK7上的搜索方法来做GDK8的,本来以为可以复用,但是却不可以,主要原因是Linux内核在X64上和ARM64上的实现有很大差异,内存空间布局不同,很多内核函数也不一样,比如x64上的地址空间是256TB,ARM64虽然也有256TB的支持,但实际用的大多是39位线性地址,地址空间为512GB。
另外,X64上的最高端固定映射(fixmap)在ARM64上也大大不同。
比如,下面是GDK8内核启动时输出的内核空间内存布局。
因为此,我不得不为GDK8开发新的搜索方法。这两天里,我和格蠹的小伙伴尝试了多种方法,有的是编译失败,有的是运行失败,比如:
[ 1080.896848] vmapallocation for size 8192 failed: use vmalloc=<size>to increase size
[ 1080.896866] failed to get vmafor KGB
[ 1080.896887] Unable to handlekernel NULL pointer dereference at virtual address 00000018
[ 1080.897789] pgd= ffffffc0f14e6000
[ 1080.898108] [00000018] *pgd=0000000000000000,*pud=0000000000000000
也有的方法是可以工作,但是要搜索的范围太大,花的时间太长。
顺便说一下,这些天我一直是直接使用GDK8做开发机,它启动速度飞快,编译和加载驱动的速度也很快,开发效率还是比较高的。
改进多次后,终于找到了在所谓的VMALLOC区建立地标的方法,也就是把一个特殊的内存页映射到VMALLOC区的中央。这区域有246GB,它的中央大约为120GB,它距离内核基地址也是100多GB,我把这个方法称为VMALLOC中心法。
VMALLOC是内核空间中的一个大虚拟空间,用于满足内核代码的动态内存分配需求,它的起点为VMALLOC_START,终点为VMALLOC_END,但实际大小是受内核参数vmalloc=<size>控制的。
VMALLOC中心法开始工作后,效果很好,在不到1秒的时间里,主机端的NDB就可以扫描到目标系统的NGB地标,进而找到LINUX内核。
找到后,NDB会打印如下消息:
Found NGB marker in target memory at ffffff9ee3ff8000
找到内核地标后,NDB便可以找到内核的关键结构体,包括模块列表,进程列表,PERCPU区域等。
比如,通过列模块命令可以列出GDK8内核中的模块:
关键功能取得突破后,我在第一时间给GDK8格友群里的同行们发了消息。也为开发中的原型系统拍了个照片。
上图中插在GDK8的SD口的为上篇文章提到的转接卡,目前个头比较大,新一版本已经设计好,要小巧很多,希望春节后,软硬件都准备就绪可以让大家来体验使用JTAG调试LINUX内核的独特魅力。
(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)
*************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物
也欢迎关注格友公众号