LINUX内核, 我找到你了

打通了GDK8与主机之间的JTAG连接后,下一个关键任务就是识别上层语义。

JTAG技术是通过固化在芯片内部的边界扫描链条来访问目标系统,一旦建立起连接,就可以把目标系统里的状态一个比特一个比特的移动出来,无论顶层在跑什么软件,都可以把它凝固,然后读出它的细节,看它在干什么。

对于上层软件来说,JTAG技术足够底层,足够剽悍,也足够暴力的。

224ed3002b155f70f5b03e504c403e30.png

但是JTAG技术足够底层的优点也同时是它的缺点,那就是它太底层了,它读到的都是0、1、0、1,它不知道这些0、1、0、1的含义。

因为此,对于今天已经巨型化了的软件世界,要把JTAG技术用好,就必须解决另一个关键问题,那就是要建立上层语义,通过上层语义理解高层行为,然后再定位到关键节点,然后再深挖细节。不然,就如同在茫茫大海中寻找一颗落水的钻石,不仅仅是费力的问题,而是不可行。

多年前,硅谷的一家公司找到我,他们开发了一个名叫CEDT的调试器,售价很贵,大于10万人民币。他们发给我了一些介绍资料和演示版本,其中最打动我的功能就是能自动在内存空间中搜索NT内核。

很久没听说CEDT的新消息了,不知道那几位做CEDT的同行现在做做什么。刚刚搜了一下高端调试网站,上面还保存着几条当年的讨论信息。

df1494d5f0492bd72e176d9a488280f9.png

解决这个搜索问题,一是要有足够的鲁棒性,对于不同版本和存在各种差异的目标系统都要能找到,二是速度要快,因为JTAG的速度比较慢,而且今天的内存空间(物理地址和线性地址空间)都很大,所以蛮力搜索花的时间太长了。

我是基于GDK7上的搜索方法来做GDK8的,本来以为可以复用,但是却不可以,主要原因是Linux内核在X64上和ARM64上的实现有很大差异,内存空间布局不同,很多内核函数也不一样,比如x64上的地址空间是256TB,ARM64虽然也有256TB的支持,但实际用的大多是39位线性地址,地址空间为512GB。

另外,X64上的最高端固定映射(fixmap)在ARM64上也大大不同。

比如,下面是GDK8内核启动时输出的内核空间内存布局。

64a17422949493da39e57dd335a30fca.png

因为此,我不得不为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内核中的模块:

1163d78a61b820ab008ac1b8d8549b56.png

关键功能取得突破后,我在第一时间给GDK8格友群里的同行们发了消息。也为开发中的原型系统拍了个照片。

c5fdec13ef47e9f53dbfdff11390afbd.png

上图中插在GDK8的SD口的为上篇文章提到的转接卡,目前个头比较大,新一版本已经设计好,要小巧很多,希望春节后,软硬件都准备就绪可以让大家来体验使用JTAG调试LINUX内核的独特魅力。

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

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

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

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

6b56f486da67813dacb7a8b176c74845.png

也欢迎关注格友公众号

e69472ec7c4dcd3fff70e6225793f240.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值